답변:
짧은 대답 : 어디에도 없습니다.
그러나 여기저기서 약간의 정보를 찾을 수 있습니다.
가장 먼저 살펴볼 곳은보기 소스, 특히 기존 필터의 구현에서 간단한 필터로 시작하는 것입니다.
개인적으로, 나는 당신이 그것을 읽을 수 있는지 알 수 있듯이 매우 유익하지만 완전히 만족스럽지 않은 이 스레드에 참여 했습니다. 나는 여기에있는 정보가 유용하다고 생각하며, 적어도 그것이 쓰여질 때 그것이 정확하다고 말할 수 있습니다.
나는 같은 질문에 대한 답을 찾으려고 인터넷 주위에 숨어 있었고 이것이 내가 얻은 결과입니다.
사용자 정의 모듈에 여러 후크를 구현하십시오. 교체 modulename
및 filtername
실제 이름.
/**
* Implements hook_views_api().
*/
function modulename_views_api() {
return array(
'api' => 2,
'path' => drupal_get_path('module', 'modulename') . '/inc',
);
}
/**
* Implementation of hook_views_handlers() to register all of the basic handlers
* views uses.
*/
function modulename_views_handlers() {
return array(
'info' => array(
// path to handler files
'path' => drupal_get_path('module', 'modulename') . '/inc',
),
'handlers' => array(
// register our custom filter, with the class/file name and parent class
'modulename_handler_filter_filtername' => array(
'parent' => 'views_handler_filter',
),
),
);
}
function modulename_views_data() {
$data = array();
$data['node']['filtername'] = array(
'group' => t('Custom'),
'real field' => 'my_custom_filter_field',
'title' => t('My custom filter'),
'help' => t('Some more detailed description if you need it.'),
'filter' => array(
'handler' => 'modulename_handler_filter_filtername',
),
);
return $data;
}
라는 이름의 폴더를 생성 inc
모듈 폴더 안에 명명 된 파일을 생성 modulename_handler_filter_filtername.inc
(이 파일에 대한 암시 적 참조 위의 코드를 참조)가있다. 실제 모듈 및 필터 이름을 사용하는 것을 잊지 마십시오.
다음 코드를 해당 modulename_handler_filter_filtername.inc
파일에 붙여 넣습니다 . 이 예제에 사용한 코드는 몇 년이 지난 일련의 라디오 버튼을 만듭니다. 따라서 노드가 작성된 연도 만 사용하여 작성된 연도별로 노드를 필터링 할 수 있습니다.
class modulename_handler_filter_filtername extends views_handler_filter {
/**
* Options form subform for setting exposed filter options.
*/
function value_form(&$form, &$form_state) {
parent::value_form($form, $form_state);
// get list of years from database
$query = db_select('node', 'n');
$query->addExpression("FROM_UNIXTIME(n.created, '%Y')", 'year');
if (isset($this->view->filter['type'])) {
$query->condition('n.type', $this->view->filter['type']->value, 'IN');
}
$result = $query->orderBy('year', 'ASC')
->execute()
->fetchAllAssoc('year');
$years = array(
'0' => t('All'),
);
foreach ($result as $k => $v) {
$years[$k] = $k;
}
// create form element with options retrieved from database
$form['value']['year'] = array(
'#type' => 'radios',
'#options' => $years,
'#default_value' => end($years),
);
}
/**
* Alters Views query when filter is used.
*/
function query() {
// make sure base table is included in the query
$this->ensure_my_table();
// retrieve real filter name from view options
// this requires 'real field' filter option to be set (see code above)
$real_field_name = $this->real_field;
// get the value of the submitted filter
$value = $this->view->exposed_data[$real_field_name];
// finally, alter Views query
if (is_numeric($value) && $value != 0) {
/*
Having several custom exposed filters, make sure subsitution patterns
(e.g. :filtername_value below) don't match across different filters.
I spent some time figuring out why all my filters had the same value.
It looks like the query skeleton is built first and then all replacements
are made in bulk. Prefixing value with filter name looks good imo.
*/
$this->query->add_where_expression($this->options['group'],
"FROM_UNIXTIME(node.created, '%Y') = :filtername_value",
array(':filtername_value' => $value));
}
}
}
이것이 가장 간단한 맞춤형 노출 필터 작동을 위해 필요한 전부입니다!
쿼리 FROM_UNIXTIME
상태에서 사용 SELECT
하면 데이터베이스 속도가 느려질 수 있습니다.
$this->query->add_where($this->options['group'], $real_field_name, $this->value['value'], $this->operator);
. 위의 링크에서 찾을 수 있습니다.