사용자 정의 필터 핸들러에서 쿼리 메소드가 트리거되지 않습니까?


9

내가 사용하고 보기 3 .

날짜 범위를 처리 하는 사용자 지정 보기 필터 를 만들어야했습니다 . 그래서 나는 모범을 보았고 행동을 모방하려고했지만 문제가 생겼습니다.

에서 내 클래스를 확장 할 때 views_handler_filter쿼리 메서드가 호출되지 않지만 클래스를 확장 views_handler_filter_string하면 작동 한다고 가정 해 보겠습니다 .

나는 무언가를 잊어야한다. 그러나 나는 여기 붙어있다.

여기 내 코드가 있습니다. 누군가 가보고 무슨 일이 있었는지 나에게 조언 할 수 있다면 매우 감사 할 것입니다.

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

  return $data;
}

사용자 정의 필터 (필드 API 또는 사용자 정의 테이블)를 매핑하는 필드
Mathankumar

1
equalone이라는 외부 데이터베이스에서 가져온 SQL 뷰 (v_tp_voice)입니다. 그래서 나는 사용자 정의 테이블에 매핑하고 있습니다.
d4rkfl4sh 2016 년

1
이것이 효과를 유발할 수있는 방법을 모르지만 필터 클래스는 별도의 파일에 있어야하며 .info 파일에서도 참조되어야한다고 생각했습니다. 그것이 사실인지는 확실하지 않습니다.
베를린

예, 당신은 확장해야합니다! (일명 문제가 무엇입니까?)
rémy

날짜 필드 모듈을 사용하지 않는 이유는 무엇입니까? 뷰와 하위 모듈 통합이 있습니다. 나는 그것이 당신이 원하는 모든 것을 할 것이라고 확신하지는 않지만 시도해 볼 가치가 있습니다.
todinov

답변:


1

todinov 에서 제안한대로 Drupal contrib 모듈 Date 와 하위 모듈 Date Views 를 사용하여 Views의 모든 종류의 필터를 처리 할 수 ​​있습니다. 도움이되지 않으면 hook_views_query_alter 를 구현하여 코드를 통해 달성 할 수 있습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.