ฉันจะเปลี่ยนค่าของตัวกรองและเปลี่ยนผลลัพธ์ก่อนมุมมองได้อย่างไร


15

เมื่อใช้ Drupal 7 และ Views 3 เป็นวิธีที่ถูกต้องในการปรับเปลี่ยนค่าตัวกรอง Views เพื่อให้มีผลกับเนื้อหาที่กำลังจะแสดงผลอย่างไร

ฉันลองทุกอย่างที่กล่าวถึงที่นี่เพื่อ D6

แม้ว่าบางคนจะใช้งานได้ แต่ Merlin กล่าวว่าการปรับเปลี่ยน display_options เป็นวิธีที่ไม่ถูกต้องในการบรรลุเป้าหมายนี้ แต่เขาคลุมเครือในการตอบสนองต่อสิ่งที่ต้องทำ ( 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) ค่าเริ่มต้นของตัวกรองของฉันคือ 'North Carolina' (ซึ่งฉันตั้งไว้ใน Views UI) แต่สังเกตว่าฉันกำลังพยายามเปลี่ยนเป็น 'Georgia'

4) ถ้าฉันเรียกใช้ DSM ทันทีหลังจากนั้นฉันเห็นว่าตัวกรองได้รับการเปลี่ยนแปลงอย่างไรก็ตามผลลัพธ์ของฉันยังคงแสดงผลลัพธ์ 'North Carolina' การแคชถูกปิดใช้งานและฉันก็ยังคงเหมือนเดิมหลังจากใช้งาน drush cc ทั้งหมด

ฉันยังได้พยายามใช้รหัสเดียวกันกับที่ผ่านและhook_views_pre_buildhook_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';

โปรดทราบว่าตัวจัดการเหล่านี้มีให้ในโมดูลสถานที่ โดยเฉพาะสำหรับตัวกรอง "สถานที่: จังหวัด" ฉันได้รับแบบฟอร์มการกรอกอัตโนมัติ เมื่อฉันพิมพ์ที่นอร์ ธ แคโรไลน่ามันก็ปรากฏขึ้นและฉันต้องเลือกมัน อย่างไรก็ตามการแจ้งเตือนในคำสั่ง SQL ที่มุมมองสร้างขึ้นจะใช้ตัวย่อสองตัวสำหรับสถานะ:

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();
  }
}

- อัปเดต -
สำหรับมุมมองเฉพาะของคุณฉันได้ติดตั้งโมดูลตำแหน่งและสร้างโหนดขึ้นสองสามโหนดใน NC และอีกสองสามในจอร์เจียและนำเข้ามุมมองของคุณเพื่อทดสอบ ในโมดูลที่กำหนดเองของฉัน (ชื่อdev) ฉันเริ่มต้นด้วยรหัสนี้ (พร้อมติดตั้ง devel):

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

จากนั้นฉันยังคงเพิ่มค่าที่ชัดเจนที่แสดงใน krumo ไปยังอาร์เรย์จนกว่าฉันจะได้ที่นี่:

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

ซึ่งพิมพ์North Carolinaใน Krumo ตอนนั้นฉันเปลี่ยนจากการพิมพ์ค่าเป็นการตั้งค่าดังนี้:

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

และ voila นั่นเป็นการหลอกลวง


เย็น. เมื่อฉันมีโอกาสฉันจะเล่นกับมุมมองของคุณและดูว่าฉันจะได้คำตอบที่เป็นรูปธรรมมากขึ้นหรือไม่
Adam Balsam

@ blue928 ดูด้านบน ฉันได้อัปเดตคำตอบของฉันพร้อมคำตอบเฉพาะสำหรับคำถามของคุณและคำแนะนำทั่วไปเกี่ยวกับการไปถึงที่นั่น
Adam Balsam

ที่ใช้งานได้ดี หมายเหตุเกี่ยวกับคำตอบที่ถูกต้อง: ส่วนหนึ่งของปัญหาของฉันคือฉันไม่จำเป็นต้องโทรเรียกดู views_get_view หรือตั้งค่าการแสดงผล
blue928

2

ในกรณีที่บางคนมีเธรดนี้โผล่ขึ้นมาในขณะที่ค้นหาโซลูชันเดียวกันบน D8 (เหมือนที่ฉันทำ):

API ใหม่ช่วยให้สามารถจัดการพารามิเตอร์เหล่านี้ได้อย่างชัดเจนยิ่งขึ้น ดูส่วนนี้สำหรับการอ้างอิง

ตัวอย่างเล็ก ๆ

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.