2013-10-15 3 views
0

Впервые на stackoverflow, поэтому, я постараюсь быть как можно более ясным.drupal custom views filter

Я использую drupal 7 и виды 3. Мне нужно было создать настраиваемый фильтр представлений, который обрабатывает диапазон дат. Поэтому я посмотрел пример и попытался воспроизвести поведение, и у меня возникли проблемы. кажется, что, когда я расширить свой собственный класс от views_handler_filter, метод запроса никогда не вызывается НО, если я продлить мой класс от скажем views_handler_filter_string, он работает Oo ...

я должен что-то забыть, но я застрял здесь ... Вот мой код, если кто-то может взглянуть и посоветуйте мне о том, что случилось, я был бы очень благодарен.

Спасибо всем!

Вот мой .views.inc файл:

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

    } 
?> 

И мой .module файл

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

И часть моих views_data, которые используют свой собственный фильтр:

<?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') 
); 

ответ

0

Я работаю над этой же проблемой. Моя настройка очень похожа на вашу, хотя я вызываю parent::value_form($form, $form_state) в моей функции value_form.

Я обнаружил, что в функции value_form, я должен был что-то вроде

$form['value'] = array(
'#type' => 'checkbox', 
'#title' => "Filter by Date", 
'#default_value' => $this->value, 
); 

для того, чтобы моя query() функция называется. Что-то вроде $form['value']['before'] = array(... не работал.