Làm cách nào tôi có thể thay đổi giá trị của bộ lọc và thay đổi đầu ra trước khi chế độ xem hiển thị?


15

Khi sử dụng Drupal 7 và Chế độ xem 3, cách chính xác để thay đổi giá trị bộ lọc Chế độ xem để nó ảnh hưởng đến nội dung sắp được hiển thị là gì?

Tôi đã thử mọi thứ được đề cập ở đây cho D6.

Mặc dù một vài người đã làm cho nó hoạt động, Merlin nói rằng sửa đổi display_options là cách không chính xác để đạt được điều này, nhưng anh ta mơ hồ trong phản ứng của mình về việc phải làm ( http://drupal.org/node/789710#comment- 2927556 ).

Tôi đã thử:

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']);
}

Ghi chú:

1) Tôi có một chế độ xem được gọi là north_carolinacó hai loại màn hình - một trang và một khối (trang_1 và block_1).

2) các bộ lọc của tôi giống nhau trên các màn hình của tôi, vì vậy tôi đang cố gắng thay đổi màn hình 'mặc định' để nó ảnh hưởng đến tất cả chúng.

3) Giá trị mặc định của bộ lọc của tôi là 'Bắc Carolina' (mà tôi đã đặt trong Giao diện người dùng) nhưng lưu ý rằng tôi đang cố gắng thay đổi nó thành 'Georgia'

4) Nếu tôi chạy DSM ngay sau đó, tôi thấy rằng bộ lọc đã bị thay đổi, tuy nhiên, kết quả của tôi vẫn hiển thị kết quả 'Bắc Carolina'. Bộ nhớ đệm bị tắt, và tôi vẫn nhận được điều tương tự sau khi chạy tất cả cc.

Tôi cũng đã thử chạy mã tương tự thông qua hook_views_pre_buildhook_views_pre_execute.

Bất kỳ đề xuất?

BIÊN TẬP:

Theo đề xuất, nó có thể giúp có thêm thông tin. Đây là một bãi chứa của chế độ xem:

$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';

Lưu ý rằng các trình xử lý này được cung cấp bởi mô-đun vị trí. Cụ thể cho bộ lọc "Vị trí: Tỉnh" Tôi được cung cấp một biểu mẫu hoàn thành tự động. Khi tôi gõ ở Bắc Carolina, nó bật lên và tôi phải chọn nó. Tuy nhiên, lưu ý trong câu lệnh SQL rằng các khung nhìn tạo ra nó sử dụng chữ viết tắt hai ký tự cho trạng thái:

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

Câu trả lời:


8

Có thể khó khăn để tìm ra phần chính xác của đối tượng khung nhìn để sửa đổi. Tôi thường xuất khung nhìn trước và nhìn vào mã được tạo để bắt đầu.

Đoạn mã dưới đây không được sửa đổi và hoạt động như mong đợi trên một trong những trang sản xuất của tôi. Hy vọng rằng nó đủ để giúp bạn đi đúng hướng (rõ ràng, đây là trong một mô-đun tùy chỉnh có tên offer_select). Nếu bạn có thể cung cấp mã từ chế độ xem được xuất, ai đó có thể xem qua.

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

--UPDATE--
Đối với chế độ xem cụ thể của bạn, tôi đã cài đặt mô-đun Vị trí và tạo một vài nút ở NC và một số ở Georgia và nhập chế độ xem của bạn để kiểm tra. Trong mô-đun tùy chỉnh của tôi (có tên dev), tôi đã bắt đầu với mã này (đã cài đặt devel):

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

Từ đó, tôi tiếp tục thêm các giá trị rõ ràng được hiển thị trong krumo vào mảng cho đến khi tôi đến đây:

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

Mà chỉ đơn giản là in North Carolinabằng Krumo. Tại thời điểm đó tôi đã thay đổi từ in giá trị sang đặt nó như thế này:

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

Và Voila. Điều đó đã lừa


Mát mẻ. Khi tôi có cơ hội, tôi sẽ chơi xung quanh với quan điểm của bạn và xem liệu tôi có thể đưa ra một câu trả lời cụ thể hơn không.
Adam Balsam

@ blue928 xem ở trên. Tôi đã cập nhật câu trả lời của mình với câu trả lời cụ thể cho câu hỏi của bạn và hướng dẫn chung về cách tôi đến đó.
Adam Balsam

Điều đó đã làm việc tuyệt vời. Lưu ý về câu trả lời đúng: Một phần của vấn đề của tôi là tôi không cần gọi view_get_view hoặc đặt màn hình.
blue928

2

Trong trường hợp ai đó có chủ đề này xuất hiện trong khi tìm kiếm cùng một giải pháp trên D8 (như tôi đã làm):

API mới cho phép thao tác các tham số này theo cách rõ ràng hơn rất nhiều. Xem phần này để tham khảo.

Ví dụ nhỏ

function dev_views_pre_view(ViewExecutable &$view, $display_id, array &$args) {
  if ($display_id === 'my_unique_display_name') {
      $args[0] = 'desired_value';
  }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.