วิธีการค้นหาไม่ถูกเรียกใช้ในตัวจัดการตัวกรองที่กำหนดเอง?


9

ฉันใช้เข้าชม 3

ฉันต้องการสร้างตัวกรอง Views ที่กำหนดเองซึ่งจัดการช่วงวันที่ ดังนั้นฉันจึงดูตัวอย่างและพยายามเลียนแบบพฤติกรรมและฉันมีปัญหา

ดูเหมือนว่าเมื่อฉันขยายคลาสของตัวเองจาก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;
}

คุณกำลังทำการแมปตัวกรองที่กำหนดเองไว้ที่ใด (Field api หรือตารางที่กำหนดเอง)
Mathankumar

1
มันเป็นมุมมอง sql (v_tp_voice) ที่นำมาจากฐานข้อมูลภายนอกที่เรียกว่า equalone ดังนั้นฉันกำลังแมปบนตารางที่กำหนดเอง
d4rkfl4sh

1
ไม่ทราบว่าสิ่งนั้นสามารถกระตุ้นผลที่อธิบายไว้ได้อย่างไร แต่ฉันคิดเสมอว่าคลาสตัวกรองต้องอยู่ในไฟล์แยกต่างหากและถูกอ้างอิงในไฟล์. info ของคุณด้วย มันยังไม่ชัดเจนจากคำถามว่าเป็นเช่นนั้นหรือไม่
berliner

ใช่คุณต้องขยาย! (หรือที่รู้จักสิ่งที่เป็นปัญหาของคุณ?)
Rémy

ทำไมไม่ใช้โมดูลฟิลด์วันที่ มันมีการรวมโมดูลย่อยที่มีมุมมอง ฉันไม่แน่ใจว่ามันจะทำทุกสิ่งที่คุณต้องการ แต่มันอาจจะคุ้มค่าที่จะลอง
todinov

คำตอบ:


1

ตามที่แนะนำโดยtodinovคุณสามารถใช้โมดูลวันที่ของ Drupal พร้อมกับมุมมองวันที่ของโมดูลย่อยซึ่งส่วนใหญ่จะจัดการกับตัวกรองชนิดใดก็ได้ใน Views ถ้ามันไม่ได้ช่วยให้คุณสามารถบรรลุมันผ่านโดยการใช้รหัสhook_views_query_alter

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.