¿El método de consulta no se activa en el controlador de filtro personalizado?

9

Estoy usando Vistas 3 .

Necesitaba crear un filtro de Vistas personalizado que maneje el rango de fechas. Así que miré el ejemplo e intenté imitar el comportamiento y tuve algunos problemas.

Parece que cuando extiendo mi propia clase desde views_handler_filter, el método de consulta nunca se invoca, PERO si extiendo mi clase desde digamos views_handler_filter_stringque funciona.

Debo olvidar algo pero estoy atrapado aquí.

Aquí está mi código, si alguien puede echar un vistazo y aconsejarme sobre lo que sucedió, estaría muy agradecido.

Aquí está mi .views.incarchivo:

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

 }
?>

Y mi .modulearchivo

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

Y parte de mi views_dataque usa mi filtro personalizado:

<?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
fuente
A qué campo está asignando el filtro personalizado (API de campo o tabla personalizada).
Mathankumar
1
es una vista sql (v_tp_voice) tomada de una base de datos externa llamada equalone. así que estoy mapeando en una tabla personalizada.
d4rkfl4sh
1
No sé cómo eso podría provocar el efecto descrito, pero siempre pensé que la clase de filtro debe estar en un archivo separado y hacer referencia en su archivo .info también. No queda claro a partir de la pregunta si ese es el caso.
berliner el
si tienes que extender! (también conocido como ¿cuál es tu problema?)
rémy
¿Por qué no usar el módulo de campo de fecha? Tiene una integración de submódulo con vistas. No estoy seguro de que haga todo lo que quieras, pero valdría la pena intentarlo.
todinov

Respuestas:

1

Según lo sugerido por todinov , puede usar los módulos de contribución de Drupal Date junto con su submódulo Date Views, que probablemente manejará cualquier tipo de filtro en Views. Si no ayuda, puede lograrlo a través del código implementando hook_views_query_alter .

Emmanuel Paul
fuente