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?


18

Tôi đang cố gắng tìm hiểu cách tạo bộ lọc tiếp xúc tùy chỉnh cho mô-đun đóng góp (chọn hoặc khác). Tôi đã tìm thấy hướng dẫn này cho Drupal 6 nhưng mã không xuất hiện để hoạt động bên ngoài trên Drupal 7.

Tôi cũng đã thử xem mã trong mô-đun chọn phân cấp nhưng có vẻ phức tạp hơn nhiều so với những gì tôi đang cố gắng thực hiện.

Có ai có bất kỳ đề xuất nào cho các hướng dẫn hoặc mô-đun triển khai các bộ lọc tiếp xúc tùy chỉnh theo cách tương đối đơn giản (ví dụ: không phải là một số lượng lớn trình xử lý tùy chỉnh như mô-đun vị trí) mà tôi có thể học hỏi không?

Câu trả lời:


6

Câu trả lời ngắn gọn: hư không.

Nhưng bạn có thể tìm thấy bit thông tin ở đây và ở đó.

Nơi đầu tiên để tìm là trong các nguồn Lượt xem, đặc biệt là việc triển khai các bộ lọc hiện có, bắt đầu bằng các bộ lọc đơn giản hơn.

Cá nhân, tôi đã tham gia vào chủ đề này rất hướng dẫn nhưng không hoàn toàn thỏa đáng, như bạn sẽ thấy nếu bạn đi đọc nó. Tôi nghĩ rằng thông tin ở đây là hữu ích, và ít nhất tôi có thể nói rằng nó đã được hiệu quả tại thời điểm nó được viết.


2
Đây là một hội nghị từ Drupalcon cuối cùng mà tôi vừa khám phá và bao gồm thông tin cực kỳ hữu ích, bao gồm đề cập đến phần Lượt xem của tài liệu api.drupal.org mà tôi không biết. Đây là nơi khởi đầu tốt nhất để phát triển Lượt xem mà tôi biết từ trước đến nay.
Countzero

10

Tôi đang rình rập trên mạng cố gắng tìm câu trả lời cho cùng một câu hỏi và đây là kết quả mà tôi đã nhận được:

  1. Thực hiện một số móc trong mô-đun tùy chỉnh của bạn. Thay thế modulenamefilternamevới tên thực tế của bạn.

    /**
     * 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;
    }
  2. Tạo thư mục có tên inctrong thư mục mô-đun của bạn và tạo tệp có tên modulename_handler_filter_filtername.incở đó (xem mã ở trên để tham chiếu ngầm đến tệp này). Đừng quên sử dụng tên mô-đun và bộ lọc thực tế.

  3. Dán mã sau vào modulename_handler_filter_filtername.inctập tin đó . Mã tôi đã sử dụng cho ví dụ này tạo ra một tập hợp các nút radio hiện tại nhiều năm. Vì vậy, bạn có thể lọc các nút theo năm được tạo, chỉ sử dụng các năm trong đó các nút được tạo.

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

Đó là tất cả những gì bạn cần để bộ lọc tiếp xúc tùy chỉnh đơn giản nhất hoạt động!

Lưu ý rằng sử dụng FROM_UNIXTIMEtrong điều kiện SELECTtruy vấn có thể làm chậm cơ sở dữ liệu của bạn.


đầu tiên: cảm ơn! hướng dẫn tuyệt vời nhất !, thứ hai: dành cho những ai đang tìm kiếm một cách sử dụng tiên tiến hơn của truy vấn (), xem views_handler_filter_numeric.inc
hkoosha

Ngoài ra, có một cách sử dụng thanh lịch hơn mà bạn không phải viết truy vấn và thay thế bằng tay, như : $this->query->add_where($this->options['group'], $real_field_name, $this->value['value'], $this->operator);. Nó có thể được tìm thấy trong các liên kết ở trên.
hkoosha

2
Nó hoạt động với tôi trên Drupal 7. Tuy nhiên, để thực hiện công việc này, tôi đã phải 1) Xóa việc thực hiện hàm hook_view_handler và 2) Thêm tệp này vào tệp .info: files [] = inc / modulename_handler_filter_filtername.inc 3) Tôi dựa trên hai thay đổi này trên bài này 4) Rất cám ơn!
Roger

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.