আমি কীভাবে ফিল্টারটির মান পরিবর্তন করতে পারি এবং ভিউ রেন্ডারগুলির আগে আউটপুট পরিবর্তন করতে পারি?


15

ড্রুপাল 7 এবং ভিউ ৩ ব্যবহার করার সময়, কোনও ভিউ ফিল্টার মান পরিবর্তন করার সঠিক উপায় কী তা যাতে এটি কেবলমাত্র রেন্ডার করার মতো সামগ্রীকে প্রভাবিত করে?

আমি এখানে D6 এর জন্য উল্লিখিত সমস্ত কিছু চেষ্টা করেছিলাম ।

যদিও কিছু লোক এটি কাজ করতে পেরেছিল, মের্লিন বলেছেন যে ডিসপ্লে_প্লেশনগুলি পরিবর্তন করা এটি অর্জনের ভুল উপায়, তবে কী করবেন সে সম্পর্কে তার প্রতিক্রিয়ায় তিনি অস্পষ্ট (( http://drupal.org/node/789710#comment- 2927556 )।

আমি চেষ্টা করেছি:

function pages_views_pre_view($view){
    $view = views_get_view('north_carolina');
    $view->set_display('default');

    $view->display_handler->options['filters']['province']['value'] = 'Georgia';
    dsm($view->display_handler->options['filters']['province']);
}

মন্তব্য:

1) আমার কাছে এমন একটি ভিউ তৈরি করা আছে যার মধ্যে north_carolinaদুটি ধরণের প্রদর্শন রয়েছে - একটি পৃষ্ঠা এবং একটি ব্লক (পৃষ্ঠা_1 এবং ব্লক_1)।

2) আমার ফিল্টারগুলি আমার প্রদর্শনগুলিতে সমান তাই আমি 'ডিফল্ট' প্রদর্শনটি পরিবর্তন করার চেষ্টা করছি যাতে এটি তাদের সকলকে প্রভাবিত করে।

3) আমার ফিল্টারটির ডিফল্ট মান হ'ল 'নর্থ ক্যারোলিনা' (যা আমি ভিউআইআইতে সেট করেছি) তবে লক্ষ্য করুন যে আমি এটিকে 'জর্জিয়া'তে পরিবর্তন করার চেষ্টা করছি

4) আমি যদি ডিএসএমের সাথে সাথে চালাই তবে আমি দেখতে পাচ্ছি যে ফিল্টারটি পরিবর্তন করা হয়েছে, তবে আমার ফলাফলগুলি এখনও 'উত্তর ক্যারোলিনা' ফলাফলগুলি দেখায়। ক্যাচিং বন্ধ রয়েছে, এবং ড্রশ সিসি সমস্ত চালানোর পরেও আমি একই জিনিস পেয়েছি।

আমিও মাধ্যমে একই কোড চলমান চেষ্টা করেছি hook_views_pre_buildএবং hook_views_pre_execute

কোনও পরামর্শ?

সম্পাদনা করুন:

প্রস্তাবিত হিসাবে এটি অতিরিক্ত তথ্য পেতে সহায়তা করতে পারে। এখানে দেখার এক ডাম্প রয়েছে:

$view = new view();
$view->name = 'north_carolina';
$view->description = '';
$view->tag = 'default';
$view->base_table = 'node';
$view->human_name = 'North Carolina';
$view->core = 7;
$view->api_version = '3.0';
$view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */

/* Display: Master */
$handler = $view->new_display('default', 'Master', 'default');
$handler->display->display_options['title'] = 'test nc block';
$handler->display->display_options['use_more_always'] = FALSE;
$handler->display->display_options['access']['type'] = 'perm';
$handler->display->display_options['cache']['type'] = 'none';
$handler->display->display_options['query']['type'] = 'views_query';
$handler->display->display_options['exposed_form']['type'] = 'basic';
$handler->display->display_options['pager']['type'] = 'full';
$handler->display->display_options['style_plugin'] = 'default';
$handler->display->display_options['row_plugin'] = 'fields';
/* Field: Content: Title */
$handler->display->display_options['fields']['title']['id'] = 'title';
$handler->display->display_options['fields']['title']['table'] = 'node';
$handler->display->display_options['fields']['title']['field'] = 'title';
$handler->display->display_options['fields']['title']['label'] = '';
$handler->display->display_options['fields']['title']['alter']['word_boundary'] = FALSE;
$handler->display->display_options['fields']['title']['alter']['ellipsis'] = FALSE;
/* Sort criterion: Content: Post date */
$handler->display->display_options['sorts']['created']['id'] = 'created';
$handler->display->display_options['sorts']['created']['table'] = 'node';
$handler->display->display_options['sorts']['created']['field'] = 'created';
$handler->display->display_options['sorts']['created']['order'] = 'DESC';
/* Filter criterion: Content: Published */
$handler->display->display_options['filters']['status']['id'] = 'status';
$handler->display->display_options['filters']['status']['table'] = 'node';
$handler->display->display_options['filters']['status']['field'] = 'status';
$handler->display->display_options['filters']['status']['value'] = 1;
$handler->display->display_options['filters']['status']['group'] = 1;
$handler->display->display_options['filters']['status']['expose']['operator'] = FALSE;
/* Filter criterion: Location: Province */
$handler->display->display_options['filters']['province']['id'] = 'province';
$handler->display->display_options['filters']['province']['table'] = 'location';
$handler->display->display_options['filters']['province']['field'] = 'province';
$handler->display->display_options['filters']['province']['value'] = 'North Carolina';
$handler->display->display_options['filters']['province']['exposed'] = TRUE;
$handler->display->display_options['filters']['province']['expose']['operator_id'] = 'province_op';
$handler->display->display_options['filters']['province']['expose']['label'] = 'State';
$handler->display->display_options['filters']['province']['expose']['operator'] = 'province_op';
$handler->display->display_options['filters']['province']['expose']['identifier'] = 'province';
$handler->display->display_options['filters']['province']['expose']['remember_roles'] = array(
  2 => '2',
  1 => 0,
  3 => 0,
  4 => 0,
);

/* Display: Block */
$handler = $view->new_display('block', 'Block', 'block_1');
$handler->display->display_options['block_description'] = 'test nc block';

নোট করুন যে এই হ্যান্ডলারগুলি অবস্থানের মডিউল দ্বারা সরবরাহ করা হয়েছে। বিশেষত "অবস্থান: প্রদেশ" ফিল্টারটির জন্য আমাকে একটি স্বয়ংক্রিয় পূর্ণ ফর্ম দেওয়া হয়েছে। আমি যখন উত্তর ক্যারোলিনা টাইপ করি তখন তা পপ আপ হয় এবং আমাকে এটি নির্বাচন করতে হবে। যাইহোক, এসকিউএল বিবৃতিতে বিজ্ঞপ্তি দেখুন যে এটি উত্পন্ন করে এটি রাষ্ট্রের জন্য দুটি অক্ষর সংক্ষেপণ ব্যবহার করে:

SELECT node.title AS node_title, node.nid AS nid, node.created AS node_created
FROM 
{node} node
LEFT JOIN {location_instance} location_instance ON node.vid = location_instance.vid
LEFT JOIN {location} location ON location_instance.lid = location.lid
WHERE (( (node.status = '1') AND (location.province = 'NC') ))
ORDER BY node_created DESC
LIMIT 10 OFFSET 0

উত্তর:


8

সংশোধন করার জন্য ভিউজ অবজেক্টের সঠিক অংশটি বের করা শক্ত হতে পারে। আমি সাধারণত ভিউটি প্রথমে রফতানি করি এবং আমাকে শুরু করার জন্য উত্পন্ন কোডটি দেখি।

নীচের স্নিপেটটি আমার কোনও একটি প্রোডাকশন সাইটে আশানুরূপভাবে কাজ করা এবং আশানুরূপভাবে কাজ করছে। আশা করি আপনি সঠিক দিকের দিকে যাওয়াই যথেষ্ট (স্পষ্টতই, এটি নাম অনুসারে একটি কাস্টম মডিউলে রয়েছে offer_select)। আপনি যদি রফতানি করা ভিউ থেকে কোড সরবরাহ করতে পারেন তবে কেউ হয়ত একবার নজর দিতে সক্ষম হতে পারে।

//Alter the End date filter on the offer views
function offer_select_views_pre_view(&$view) {
  if ($view->name == 'active_offers') {
    $view->display['default']->handler->options['filters']['field_end_value']['value']['value'] = time();
  }
}

- আপডেট
- আপনার নির্দিষ্ট দর্শনের জন্য আমি অবস্থান মডিউলটি ইনস্টল করেছি এবং এনসিতে কয়েকটি নোড এবং কয়েকটি জর্জিয়ায় তৈরি করেছি এবং পরীক্ষার জন্য আপনার ভিউ আমদানি করেছি। আমার কাস্টম মডিউলে (নামযুক্ত dev) আমি এই কোডটি দিয়ে শুরু করেছি (ডেভেল ইনস্টল সহ):

function dev_views_pre_view(&$view) {
  if ($view->name == 'north_carolina') {
    dpm($view->display['default']->handler->options['filters']);
  }
}

সেখান থেকে ক্রুমোতে প্রদর্শিত স্পষ্ট মানগুলি অ্যারেতে যোগ না করা পর্যন্ত আমি এখানে চালিয়ে গেলাম:

function dev_views_pre_view(&$view) {
  if ($view->name == 'north_carolina') {
    dpm($view->display['default']->handler->options['filters']['province']['value']);
  }
}

যা কেবল North Carolinaক্রোমোতে মুদ্রিত হয়েছিল। এই মুহুর্তে আমি মানটি মুদ্রণ করা থেকে এটি সেট করে পরিবর্তিত করেছি:

function dev_views_pre_view(&$view) {
  if ($view->name == 'north_carolina') {
    $view->display['default']->handler->options['filters']['province']['value'] = 'Georgia';
  }
}

এবং voila। কৌতুকটি করেছে।


কুল। আমার যখন সুযোগ হবে তখন আমি আপনার দৃষ্টিভঙ্গি নিয়ে ঘুরে দেখব এবং আরও দৃ concrete় উত্তর নিয়ে আসতে পারব কিনা তা দেখুন।
অ্যাডাম বালসাম

@ নীল928 উপরে দেখুন। আমি আপনার প্রশ্নগুলির নির্দিষ্ট উত্তর এবং আমি কীভাবে সেখানে এসেছি সে সম্পর্কে সাধারণ নির্দেশাবলীর সাথে আমার উত্তর আপডেট করেছি।
অ্যাডাম বালসাম

যে দুর্দান্ত কাজ করেছে। সঠিক উত্তর সম্পর্কে নোট: আমার সমস্যার অংশটি হ'ল আমাকে ভিউ_জেট_ভিউ কল করতে বা প্রদর্শনটি সেট করার দরকার পড়েনি।
নীল 928

2

D8- তে একই সমাধান অনুসন্ধানের সময় কেউ এই থ্রেডটি পপ আপ করেছে (যেমনটি আমি করেছি):

নতুন এপিআই এই প্যারামিটারগুলি আরও অনেক সুস্পষ্ট উপায়ে পরিচালনা করতে দেয়। রেফারেন্সের জন্য এই বিভাগটি দেখুন ।

ছোট উদাহরণ

function dev_views_pre_view(ViewExecutable &$view, $display_id, array &$args) {
  if ($display_id === 'my_unique_display_name') {
      $args[0] = 'desired_value';
  }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.