0

第一次在stackoverflow上,我会尽量清楚。

我正在使用 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')
);
4

1 回答 1

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( ... 没有用。

于 2013-10-15T16:16:24.527 回答