La méthode de requête n'est pas déclenchée dans le gestionnaire de filtre personnalisé?

9

J'utilise Views 3 .

J'avais besoin de créer un filtre de vues personnalisé qui gère la plage de dates. J'ai donc regardé l'exemple et essayé d'imiter le comportement et j'ai eu des ennuis.

Il semble que lorsque j'étends ma propre classe depuis views_handler_filter, la méthode de requête n'est jamais invoquée, MAIS si j'étends ma classe depuis, disons que views_handler_filter_stringcela fonctionne.

Je dois oublier quelque chose mais je suis coincé ici.

Voici mon code, si quelqu'un peut jeter un coup d'œil et me conseiller sur ce qui s'est passé, je serais très reconnaissant.

Voici mon .views.incdossier:

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

 }
?>

Et mon .moduledossier

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

Et une partie de mon views_dataqui utilise mon filtre personnalisé:

<?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;
}
d4rkfl4sh
la source
À quel champ vous mappez le filtre personnalisé (API de champ ou table personnalisée).
Mathankumar
1
c'est une vue sql (v_tp_voice) prise à partir d'une base de données externe appelée equalone. donc je mappe sur une table personnalisée.
d4rkfl4sh
1
Je ne sais pas comment cela pourrait provoquer l'effet décrit, mais j'ai toujours pensé que la classe de filtre doit être dans un fichier séparé et référencée dans votre fichier .info aussi. La question de savoir si tel est le cas n'est pas claire.
berliner
oui il faut prolonger! (aka quel est votre problème?)
rémy
Pourquoi ne pas utiliser le module de champ de date? Il a une intégration de sous-module avec des vues. Je ne suis pas sûr qu'il fera tout ce que vous voulez, mais cela pourrait valoir la peine d'être essayé.
todinov

Réponses:

1

Comme suggéré par todinov , vous pouvez utiliser les modules contrib Drupal Date avec son sous-module Date Views qui gèrera très probablement tout type de filtre dans les vues. Si cela n'aide pas, vous pouvez y parvenir via du code en implémentant hook_views_query_alter .

Emmanuel Paul
la source