Thêm CRITERIA LỌC trong Chế độ xem theo chương trình


18

Tôi muốn thêm / sửa đổi một filter criteriachương trình.

Ví dụ: để xem, tôi đã thêm bộ lọc "Địa chỉ email" có giá trị cần thiết để thay đổi linh hoạt, cần phải đặt thành id email đã đăng nhập hiện tại của người dùng.

Làm thế nào để đạt được điều đó? Xin vui lòng xem hình ảnh đính kèm để biết thêm chi tiết. Hãy giúp tôi.

nhập mô tả hình ảnh ở đây

Câu trả lời:


24

Sử dụng mô-đun Develdpm($view)dpm($query)sau khi bạn đặt như "test@email.com" vào trường "giá trị" được tìm thấy trong ảnh của bạn. Xem cấu trúc đối tượng / mảng của khung nhìn và truy vấn từ đầu ra phát.

Sau đó, sử dụng chức năng hook_views_query_alter(&$view, &$query)trong mô-đun của bạn để nhắm mục tiêu điều kiện bộ lọc điều kiện WHERE và đặt nó thành giá trị bạn muốn.

Cái gì đó như:

function MYMODULE_views_query_alter(&$view, &$query) {
  global $user;
  dpm($view, __FUNCTION__);
  dpm($query, __FUNCTION__);
  if ($view->name === 'your_view_machine_name') {
    // This will only work as-is if you always have something in the filter by
    // default, I guess. This hook runs always so you could just put
    // 'test@test.com' as the email to filter by in views and this
    // will always override it. I'm sure there is a cleaner way to put
    // the filter dynamically at runtime. But i think thats more complex
    // php that customizes a view.
    //
    // The index 2 below is the index of the condition for the email filter.
    // Your $query structure may be different in your dpm() of the View $query.
    $query->where[1]['conditions'][2]['field']['value'] = $user->email;
  }
}

Cảm ơn nhiều! Bạn có thể vui lòng cho tôi biết nơi đầu tiên tôi viết, viết dpm($view);?
Shafiul

bạn tạo một mô-đun tùy chỉnh và đặt chức năng trên vào đó. Móc sẽ kích hoạt nếu chế độ xem được bật và bạn sẽ thấy truy vấn $ view và $ ở đầu trang sau khi bạn bật mô-đun tùy chỉnh và mô-đun Devel. Sau đó, chỉ cần thay đổi mã của tôi để đặt tên máy của bạn vào ... và làm cho các giá trị truy vấn $ hoạt động với truy vấn chính xác của bạn ...
tenken

Đó là một câu trả lời tuyệt vời. Trong Drupal 7 bạn thực sự làm: $ query-> trong đó [1] ['condition'] [2] ['value'] = $ user-> email
Artur Kędzior

Cá nhân tôi nghĩ rằng câu trả lời bằng cách sử dụng các hook bên dưới là drupal
kbrinner

6

Đây là một thay thế:

$view = views_get_view('view_machine_name');
$view->init_display('default');
$view->display_handler->display->display_options['filters']['your_filter_name']['default_value'] = 'your_value';
$view->is_cacheable = FALSE;  
$view->execute();
print $view->render();

Tôi biết có lẽ bạn nên thiết lập điều này bằng cách sử dụng một số phương pháp bí truyền, phức tạp, nhưng nếu bạn chỉ muốn truy cập nhanh và bẩn mà không làm hỏng điều này sẽ đưa bạn đến đó.


5

Bạn nên thay đổi những cái này trong hook hơn là vào thời gian kết xuất để bạn không làm giảm hiệu suất trang web và bộ nhớ đệm. Mất tuổi tôi để tìm ra hook_view_pre_build () cháy quá muộn, bạn cần hook_view_pre_view () .

Tôi đã tìm thấy tài liệu tham khảo về việc sử dụng $ view-> add_item () nhưng đấu tranh cho các ví dụ, dưới đây là giải pháp của tôi để lọc một tập hợp các thuật ngữ phân loại để chỉ bao gồm một số từ vựng nhất định:

function MODULENAME_views_pre_view(&$view, &$display_id, &$args) {

  if ($view->name == 'VIEWNAME' && $display_id == 'DISPLAYID') {
    // Add all the terms of a vocabulary to the terms listing widget select field
    $vids = array();
    $vocab = taxonomy_vocabulary_machine_name_load('vocab_name');
    $vids[ $vocab->vid ] = $vocab->vid;

    // Get the existing filters
    $filters = $view->display_handler->get_option('filters');

    if (empty($filters['vid'])) {
      // There is no vid filter so we have to add it
      $view->add_item(
        $view->current_display,
        'filter',
        'taxonomy_term_data',
        'vid',
        array(
          'operator' => 'in',
          'value' => $vids,
          'group' => 1
        )
      );
    }
    else {
      // Add to pre-existing filter
      foreach($vids as $vid) {
        $filters['vid']['value'][ $vid ] = $vid;
      }
      $view->display_handler->override_option('filters', $filters);
    }
  }
}

Chỉnh sửa ghi chú : Nhận xét này về nhóm do đã giúp tôi tìm ra cách lấy các bộ lọc chế độ xem bằng cách sử dụng $view->display_handler->get_option('filters')và sau đó ghi đè chúng bằng cách sử dụng $view->display_handler->override_option('filters', $filters);.


2

Tôi đã có một vấn đề tương tự nhưng khi cố gắng chuyển nhiều đối số vào một bộ lọc. Tôi đã sử dụng phương thức "view_get_view", nhưng chuyển các đối số sang dạng xem. Tôi hi vọng nó giúp ích cho ai đó. Bạn có thể thay thế bất kỳ loại đối số hoặc giá trị cho nhu cầu của bạn:

Tôi đã thêm các bộ lọc theo ngữ cảnh vào chính chế độ xem (từ trường cài đặt chế độ xem trước). Cái đầu tiên là "nội dung: có ID thuật ngữ phân loại". Cái thứ hai là "nội dung: nid" với hộp kiểm "cho phép nhiều" được chọn và "loại trừ" được chọn (từ bộ trường 'thêm' trong cửa sổ bật lên bộ lọc theo ngữ cảnh).

lập luận [] = '1'; // ID hạn
lập luận [] = '1 + 2 + 3'; // ID nút để loại trừ / bao gồm

$ view = view_get_view ($ view_name);
$ view-> init ();
$ view-> set_display ($ hiển thị);
$ view-> set_argument ($ args);
$ view-> thực thi ();
$ xem-> kết quả

Cập nhật: Tôi quên đề cập, trong các giá trị bộ lọc theo ngữ cảnh, bạn có thể cần chọn mã php và trả về các đối số xem được truyền vào. Ví dụ:

trả về $ view-> args [1];

1

Trong Drupal 8, bạn có thể sử dụng ViewExecutable::setHandler($display_id, $type, $id, $item)để đặt bộ lọc theo chương trình.


4
Câu trả lời này có thể dài dòng hơn một chút về lý do tại sao điều này hoạt động. Thường thì tôi thích liên kết và trích dẫn các trang tài liệu. Điều này sẽ giúp người hỏi tìm hiểu thêm về API Drupal và giúp tìm thông tin cho chính họ trong tương lai.
mradcliffe

1

Dưới đây là một ví dụ về cách tiêu chí bộ lọc có thể được thêm vào theo chương trình trong Drupal 8:

/**
 * @param ViewExecutable $view
 * @param QueryPluginBase $query
 *
 * Sets a custom custom filter criteria (takes current language into account)
 */
function MODULE_views_query_alter(ViewExecutable $view, QueryPluginBase $query) {
  if ($view->storage->id() === 'my_view_id') {
    $query->addWhere(0, 'node__field_custom_criteria.field_custom_criteria_value', \Drupal::languageManager()->getCurrentLanguage()->getId(), '=');
  }
}

Các truy vấn trên sẽ bổ sung thêm một tiêu chí để lọc các nút nơi field_custom_criteriađồng ruộng bằng ngôn ngữ hiện đang được chọn.

Thông tin thêm có thể được tìm thấy trong các tài liệu: hook_view_query_alter


0

Dựa trên câu trả lời của @ Duncanmoo ở trên mà tôi cảm thấy tốt nhất, tôi đã thêm các bộ lọc sau vào quan điểm của mình - nghĩ rằng đây sẽ là những ví dụ hữu ích trong trường hợp bạn không cố gắng lọc dựa trên phân loại tham chiếu mà thay vào đó là một thực thể được tham chiếu hoặc một NID:

function [MYMODULE]_views_pre_view(&$view, &$display_id, &$args) {
  if (($view->name == '[your view name]') && ($display_id == '[your display id]')) {
    // Get referenced service - example for entity reference.
    $node = menu_get_object();
    $node_wrapper = entity_metadata_wrapper('node', $node->nid);
    $referenced_service = $node_wrapper->field_service_ref->value();
    // Add service id as a filter to view.
    $filters = $view->display_handler->get_option('filters');
    if (empty($filters['field_service_ref_target_id'])) {
      // Only display operations nodes that reference the same service.
      $view->add_item(
        $display_id,
        'filter',
        'field_data_field_service_ref',
        'field_service_ref_target_id',
        array(
          'operator' => '=',
          'value' => ['value' => $referenced_service->id],
          'group' => 1
        )
      );
    }
    // Add nid as a filter to view - example for NID filter
    if (empty($filters['nid'])) {
      // Don't include current operation in list of related operations.
      $view->add_item(
        $display_id,
        'filter',
        'node',
        'nid',
        array(
          'operator' => '!=',
          'value' => ['value' => $node->nid],
          'group' => 1
        )
      );
    }
  }
}
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.