Özel filtre işleyicisinde sorgu yöntemi tetiklenmedi mi?


9

Views 3 kullanıyorum .

Tarih aralığını işleyen özel bir Views filtresi oluşturmam gerekiyordu . Bu yüzden örneğe baktım ve davranışı taklit etmeye çalıştım ve biraz sorun yaşadım.

Görünüşe göre kendi sınıfımı genişlettiğimde views_handler_filter, sorgu yöntemi asla çağrılmaz, ancak sınıfımı genişletirsem views_handler_filter_stringişe yaradığını varsayalım.

Bir şey unutmalıyım ama burada takılı kaldım.

İşte kodum, eğer birisi bir göz atabilir ve neler olduğunu bana bildirebilirse, çok minnettar olurum.

İşte benim .views.incdosya:

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

 }
?>

Ve benim .moduledosyam

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

Ve bunun bir kısmı views_dataözel filtremi kullanıyor:

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

Özel filtreyi (Alan API'si veya özel tablo) hangi alana eşlediğinizi.
Mathankumar

1
equalone adı verilen harici bir veritabanından alınan bir sql görünümüdür (v_tp_voice). bu yüzden özel bir tabloda eşleştiriyorum.
d4rkfl4sh

1
Bunun açıklanan etkiyi nasıl kışkırtabileceğini bilmiyorum, ama her zaman filtre sınıfının ayrı bir dosyada olması ve .info dosyanızda da başvurulması gerektiğini düşündüm. Durumun bu olup olmadığı sorusundan net değil.
berliner

evet uzatmak zorundasın! (aka senin sorunun ne?)
rémy

Tarih alanı modülünü neden kullanmıyorsunuz? Görünümleri olan bir alt modül entegrasyonu vardır. İstediğiniz her şeyi yapacağından emin değilim, ama denemeye değer olabilir.
todinov

Yanıtlar:


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.