ฉันใช้เข้าชม 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
มันเป็นมุมมอง sql (v_tp_voice) ที่นำมาจากฐานข้อมูลภายนอกที่เรียกว่า equalone ดังนั้นฉันกำลังแมปบนตารางที่กำหนดเอง
—
d4rkfl4sh
ไม่ทราบว่าสิ่งนั้นสามารถกระตุ้นผลที่อธิบายไว้ได้อย่างไร แต่ฉันคิดเสมอว่าคลาสตัวกรองต้องอยู่ในไฟล์แยกต่างหากและถูกอ้างอิงในไฟล์. info ของคุณด้วย มันยังไม่ชัดเจนจากคำถามว่าเป็นเช่นนั้นหรือไม่
—
berliner
ใช่คุณต้องขยาย! (หรือที่รู้จักสิ่งที่เป็นปัญหาของคุณ?)
—
Rémy
ทำไมไม่ใช้โมดูลฟิลด์วันที่ มันมีการรวมโมดูลย่อยที่มีมุมมอง ฉันไม่แน่ใจว่ามันจะทำทุกสิ่งที่คุณต้องการ แต่มันอาจจะคุ้มค่าที่จะลอง
—
todinov