Phương thức truy vấn không được kích hoạt trong trình xử lý bộ lọc tùy chỉnh?


9

Tôi đang sử dụng Lượt xem 3 .

Tôi cần tạo bộ lọc Lượt xem tùy chỉnh để xử lý phạm vi ngày. Vì vậy, tôi đã xem xét ví dụ và cố gắng bắt chước hành vi và tôi gặp một số rắc rối.

Có vẻ như khi tôi mở rộng lớp của mình từ đó views_handler_filter, phương thức truy vấn không bao giờ được gọi, NHƯNG nếu tôi mở rộng lớp của mình từ giả sử views_handler_filter_stringnó hoạt động.

Tôi phải quên một cái gì đó nhưng tôi bị mắc kẹt ở đây.

Đây là mã của tôi, nếu ai đó có thể xem và tư vấn cho tôi về những gì đã xảy ra, tôi sẽ rất biết ơn.

Đây là .views.inctập tin của tôi :

<?php
  class v3d_date_custom_filter extends views_handler_filter {
    var $always_multiple = TRUE;

    function value_form(&$form, &$form_state) {
      //parent::value_form($form, $form_state);
      $form['value']['v3d_date']['period'] = array(
        '#type' => 'select',
        '#title' => 'Period',
        '#options' => array(
          '7_days' => 'Last 7 days',
          'yesterday' => 'Yesterday',
          'today' => 'Today',
          'custom' => 'Custom dates'),
        '#default_value' => 'custom',
        '#attributes' => array("onclick" => "period_click(this);"),
      );

      $form['value']['v3d_date']['start_date'] = array(
        '#type' => 'date_popup',
        '#date_format' => 'Y-m-d',
        '#title' => 'Start date',
        '#size' => 30);

      $form['value']['v3d_date']['end_date'] = array(
        '#type' => 'date_popup',
        '#title' => 'End date',
        '#date_format' => 'Y-m-d',
        '#size' => 30);
      }

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

     if(is_null($form_state['values']['start_date']) &&
        is_null($form_state['values']['start_date'])) {
        return TRUE;
     }


    /*
     * If we get array for start_date or end_date
     * errors occured, but the date module will handle it.
     */
     if(!is_string($form_state['values']['start_date']) ||
        !is_string($form_state['values']['end_date'])) {
       return TRUE;
     }


     /* Get day, month and year from start_date string */
     if(!preg_match('/(\d+)-(\d+)-(\d+)/',
        $form_state['values']['start_date'],
        $start_date
        )) {
       return TRUE; }

     /* Get day, month and year from end_date string */
     if(!preg_match('/(\d+)-(\d+)-(\d+)/',
        $form_state['values']['end_date'],
        $end_date
     )) {
       return TRUE; }

     /* Create timestamps and compare */
     $start_date = mktime(0,0,0,$start_date[1],$start_date[2],$start_date[3]);
     $end_date = mktime(0,0,0,$end_date[1],$end_date[2],$end_date[3]);

     if($start_date >= $end_date) {
       form_set_error('start_date','Start date must be anterior to end date.');
     }
   }

   function query() {
     die('fdsfds');
     $this->ensure_my_table();
     $field = "$this->table_alias.$this->real_field";
     dsm($this);
   }

 }
?>

.moduletập tin của tôi

<?php
  function custom_filters_views_api() {
    return array(
      'api'=>3,
      'path' => drupal_get_path('module','custom_filters') . '/views',
    );
  }
?>

Và một phần của tôi views_datasử dụng bộ lọc tùy chỉnh của tôi:

<?php                                                                                      

function voice_views_data() {

  $data['v_tp_voice']['date_utc_agent'] = array(
    'title' => t('date_utc_agent'),
    'help' => 'date_utc_agent',
    'field' => array('handler' => 'views_handler_field'),
    'filter' => array('handler' => 'v3d_date_custom_filter'),
    'sort' => array('handler' => 'views_handler_sort')
  );

  return $data;
}

Trường nào bạn đang ánh xạ bộ lọc tùy chỉnh (Trường api hoặc bảng tùy chỉnh).
Mathankumar

1
đó là chế độ xem sql (v_tp_voice) được lấy từ cơ sở dữ liệu bên ngoài được gọi là Equone. Vì vậy, tôi đang ánh xạ trên một bảng tùy chỉnh.
d4rkfl4sh

1
Không biết làm thế nào điều đó có thể gây ra hiệu ứng được mô tả, nhưng tôi luôn nghĩ rằng lớp bộ lọc phải nằm trong một tệp riêng biệt và cũng được tham chiếu trong tệp .info của bạn. Nó không rõ ràng từ câu hỏi cho dù đó là trường hợp.
berbler

vâng, bạn phải gia hạn! (còn gọi là vấn đề của bạn là gì?)
rémy

Tại sao không sử dụng mô-đun trường ngày? Nó có một tích hợp mô-đun phụ với quan điểm. Tôi không chắc chắn rằng nó sẽ làm mọi thứ bạn muốn, nhưng nó có thể đáng để thử.
todinov

Câu trả lời:


1

Theo đề xuất của todinov , bạn có thể sử dụng các mô-đun đóng góp Drupal Date cùng với mô-đun phụ Date Views của nó có thể sẽ xử lý bất kỳ loại bộ lọc nào trong Chế độ xem. Nếu nó không hữu ích, bạn có thể đạt được nó thông qua mã bằng cách triển khai hook_view_query_alter .

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.