Metodo di query non attivato nel gestore filtro personalizzato?


9

Sto usando Views 3 .

Avevo bisogno di creare un filtro Visualizzazioni personalizzato che gestisse l'intervallo di date. Quindi ho guardato l'esempio e ho cercato di imitare il comportamento e ho avuto qualche problema.

Sembra che quando estendo la mia classe da views_handler_filter, il metodo di query non viene mai invocato, MA se estendo la mia classe da diciamo views_handler_filter_stringche funziona.

Devo dimenticare qualcosa ma sono bloccato qui.

Ecco il mio codice, se qualcuno può dare un'occhiata e darmi consigli su cosa è successo, sarei molto grato.

Ecco il mio .views.incfile:

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

 }
?>

E il mio .modulefile

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

E parte del mio views_datache usa il mio filtro personalizzato:

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

A quale campo stai mappando il filtro personalizzato (campo API o tabella personalizzata).
Mathankumar,

1
è una vista sql (v_tp_voice) presa da un database esterno chiamato equalone. quindi sto mappando su una tabella personalizzata.
d4rkfl4sh,

1
Non so come ciò possa provocare l'effetto descritto, ma ho sempre pensato che la classe del filtro dovesse trovarsi in un file separato e fare riferimento anche nel tuo file .info. Non è chiaro dalla domanda se sia così.
Berlino,

si devi estendere! (alias qual è il tuo problema?)
rémy il

Perché non utilizzare il modulo campo data? Ha un'integrazione del sottomodulo con le viste. Non sono sicuro che farà tutto ciò che vuoi, ma potrebbe valere la pena provarlo.
todinov,

Risposte:


1

Come suggerito da todinov , puoi usare i moduli contrib di Drupal Date insieme al suo sotto-modulo Date Views che molto probabilmente gestirà qualsiasi tipo di filtro in Views. Se non aiuta, puoi ottenerlo tramite il codice implementando hook_views_query_alter .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.