Làm cách nào để tạo bộ lọc tiếp xúc tùy chỉnh?


7

Tôi cố gắng tạo bộ lọc phơi sáng tùy chỉnh trong chế độ xem 3 của Drupal 7

Tôi có thể tìm hiểu về cách tạo bộ lọc phơi sáng tùy chỉnh cho Chế độ xem 3 và D7 ở đâu?

Ai đó đặt một số ví dụ mã trong URL ở trên, nhưng có vẻ như nó ở chế độ xem 2!? Có ai biết làm thế nào để làm cho nó trong Lượt xem 3.

Trong mô-đun:

/**
 * Implements hook_views_api().
 */
function modulename_views_api() {
  return array(
    'api' => 2,
    'path' => drupal_get_path('module', 'modulename') . '/inc',
  );
}

/**
 * Implementation of hook_views_handlers() to register all of the basic handlers
 * views uses.
 */
function modulename_views_handlers() {
  return array(
    'info' => array(
      // path to handler files
      'path' => drupal_get_path('module', 'modulename') . '/inc',
    ),
    'handlers' => array(
      // register our custom filter, with the class/file name and parent class
      'modulename_handler_filter_filtername' => array(
        'parent' => 'views_handler_filter',
      ),
    ),
  );
}

function modulename_views_data() {
  $data = array();

  $data['node']['filtername'] = array(
    'group' => t('Custom'),
    'real field' => 'my_custom_filter_field',
    'title' => t('My custom filter'),
    'help' => t('Some more detailed description if you need it.'),
    'filter' => array(
      'handler' => 'modulename_handler_filter_filtername',
    ),
  );

  return $data;
}

Trong modulename_handler_filter_filtername.inc

class modulename_handler_filter_filtername extends views_handler_filter {

  /**
   * Options form subform for setting exposed filter options.
   */
  function value_form(&$form, &$form_state) {
    parent::value_form($form, $form_state);

    // get list of years from database
    $query = db_select('node', 'n');
    $query->addExpression("FROM_UNIXTIME(n.created, '%Y')", 'year');
    if (isset($this->view->filter['type'])) {
      $query->condition('n.type', $this->view->filter['type']->value, 'IN');
    }
    $result = $query->orderBy('year', 'ASC')
      ->execute()
      ->fetchAllAssoc('year');

    $years = array(
      '0' => t('All'),
    );
    foreach ($result as $k => $v) {
      $years[$k] = $k;
    }

    // create form element with options retrieved from database
    $form['value']['year'] = array(
      '#type' => 'radios',
      '#options' => $years,
      '#default_value' => end($years),
    );
  }

  /**
   * Alters Views query when filter is used.
   */
  function query() {
    // make sure base table is included in the query
    $this->ensure_my_table();

    // retrieve real filter name from view options
    // this requires 'real field' filter option to be set (see code above)
    $real_field_name = $this->real_field;
    // get the value of the submitted filter
    $value = $this->view->exposed_data[$real_field_name];

    // finally, alter Views query
    if (is_numeric($value) && $value != 0) {
      /* 
        Having several custom exposed filters, make sure subsitution patterns
        (e.g. :filtername_value below) don't match across different filters.
        I spent some time figuring out why all my filters had the same value.
        It looks like the query skeleton is built first and then all replacements
        are made in bulk. Prefixing value with filter name looks good imo.
      */
      $this->query->add_where_expression($this->options['group'],
        "FROM_UNIXTIME(node.created, '%Y') = :filtername_value",
        array(':filtername_value' => $value));
    }
  }
}

Câu trả lời:


12

Có một mô-đun cung cấp một số ví dụ ở đây: https://www.drupal.org/project/view_plugin_examples . Nó bị giới hạn nhưng có một ví dụ bộ lọc tiếp xúc.

Thảo luận chung tại đây: https://api.drupal.org/api/view/view.api.php/group/view_plugins/7

Trong phác thảo rộng:

  1. Tạo một mô-đun tùy chỉnh, với thư mục con được gọi là "lượt xem"

  2. Trong tệp .info của bạn, thêm một dòng: files[] = views/MODULE_handler_filter_FILTERNAME.incBộ lọc của bạn sẽ không bao giờ hiển thị nếu bạn quên điều này!

  3. Trong tệp .module, thêm triển khai hook_view_api ():

    function MODULE_views_api() {
      return array(
        'api' => 3,
        'path' => drupal_get_path('module', 'MODULE') . '/views',
      );
    }
  4. Trong thư mục con khung nhìn, bạn sẽ cần tạo hai tệp, MODULE.view.inc và MODULE_handler_filter_FILTERNAME.inc

  5. Trong MODULE.view.inc, bạn sẽ cần phải thực hiện:

hook_view_data_alter () - cho bộ lọc mới trên loại thực thể hiện có đã tích hợp chế độ xem, phổ biến hơn HOẶC

hook_view_data () - để cung cấp tích hợp lượt xem cho thực thể tùy chỉnh của bạn, bao gồm các bộ lọc.

Tài liệu API có sẵn cho cả hai chức năng.

Một ví dụ nhanh:

    function MODULE_views_data_alter(&$data) {
       if ( isset($data['users']) && !isset($data['users']['FILTERNAME']) ) {
        $data['users']['FILTERNAME'] = array(
          'real field' => 'uid', // name of entity field to which filter applies
          'title' => t('HUMAN READABLE NAME OF FILTER'),
          'help' => t('HELP TEXT'),
          'filter' => array(
            'handler' => 'MODULE_handler_filter_FILTERNAME',
          ),
        );
      }
    }
  1. Tất cả các công việc thực sự xảy ra trong MODULE_handler_filter_FILTERNAME.inc. Tệp này xác định một lớp mới thực hiện bộ lọc của bạn, lớp MODULE_handler_filter_FILTERNAME.

Bạn thường sẽ muốn mở rộng một trong các lớp trình xử lý bộ lọc chế độ xem hiện có để nhận được lợi ích của mã hiện có. Nhiều trong số này có thể được tìm thấy trong các thư mục con của thư mục mô-đun khung nhìn. Các bộ lọc cơ bản nằm trong thư mục con "trình xử lý", nhưng nhiều bộ lọc phức tạp hơn có thể được tìm thấy bị chôn vùi trong các thư mục con của thư mục con "mô-đun". Các trình xử lý bộ lọc chế độ xem mà bạn tìm thấy có tài liệu tốt nhất về cách triển khai bộ lọc, cũng như cách mở rộng bộ lọc hiện có và bạn nên đọc qua chúng.

Thông thường, lớp bộ lọc tùy chỉnh của bạn sẽ a) thêm các trường vào biểu mẫu cài đặt của bộ lọc mở rộng, b) trong trường hợp bộ lọc bị lộ, sửa đổi tiện ích được hiển thị và sau đó c) thực hiện phương thức truy vấn () thực hiện công việc thực, dựa trên các cài đặt đã lưu và đầu vào từ widget được hiển thị.


1
Có nhiều lời giải thích trên web về quy trình này nhưng tôi luôn quay lại vấn đề này vì nó rõ ràng và súc tích nhất.
Blake Frederick

0

Chạy vào cùng một vấn đề và tìm ra nó, có vẻ như op ban đầu có cùng một vấn đề.

Trong trường hợp bạn xác định biểu mẫu bộ lọc được hiển thị của mình trong value_form (), khóa bạn sử dụng trong mảng phải là cùng một khóa được sử dụng trong view_data (hoặc view_data_alter).

ví dụ trong trường hợp của tôi:

function value_form(&$form, &$form_state) {

  parent::value_form($form, $form_state);

  $form['users']['welcome_email_sent'] = array(
    '#type' => 'select',
    '#options' => array(
      0 => '- Any -',
      1 => 'Welcome Email',
      2 => 'Notification Email',

    ),
    '#title' => t('Email History'),
  );

  return $form;

}

Và ..

function ca_email_history_views_data_alter(&$data) {

  $data['users']['welcome_email_sent'] = array(
    'title' => t('Welcome email sent'),
    'help' => t('Filter based on e-mails the user has received'),
    'filter' => array(
      'handler' => 'ca_email_history_welcome_email_sent_handler',
    ),
  );

  return $data;

}

Lưu ý rằng cả hai đều có khóa là 'welcome_email_sent', nếu tôi thay đổi chúng để chúng không còn khớp với vấn đề mà hàm truy vấn () không bao giờ được gọi lại xảy ra nữa.

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.