Я пытаюсь создать пользовательский поиск, но застрял. Я хочу, чтобы у вас был dropdownbox, поэтому пользователь может выбрать, где искать. Эти параметры могут означать один или несколько типов контента.Drupal: Создать пользовательский поиск
Так что, если он выберет варианты A, то поиск будет выглядеть в виде узлов P, Q, R. Но он не может дать эти результаты, но только uid, которые затем будут тематизированы для сбора конкретных данных для этого пользователя.
Чтобы сделать его немного яснее, предположим, что я хочу, чтобы люди были людьми. Я ищу в 2 типах профиля контента. Но, конечно, вы не хотите отображать их в результате, но красивую картинку пользователя и некоторые данные.
Я начал с создания формы с текстовым полем и выпадающим списком. Затем в обработчике я создал ключи и перенаправил их на другие страницы с этими ключами в виде хвоста. Эта страница определена в меню, так же, как и поиск.
После этого я хочу позвонить в hook_view
, чтобы сделать фактический поиск по телефону node_search
, и верните его результаты.
К сожалению, все идет не так. Когда я нажимаю кнопку «Поиск», это дает мне 404.
Но я нахожусь на правильном пути? Это способ создания пользовательского поиска?
Thx для вашей помощи.
Вот код для некоторой ясности:
<?php
// $Id$
/*
* @file
* Searches on Project, Person, Portfolio or Group.
*/
/**
* returns an array of menu items
* @return array of menu items
*/
function vm_search_menu() {
$subjects = _vm_search_get_subjects();
foreach ($subjects as $name => $description) {
$items['zoek/'. $name .'/%menu_tail'] = array(
'page callback' => 'vm_search_view',
'page arguments' => array($name),
'type' => MENU_LOCAL_TASK,
);
}
return $items;
}
/**
* create a block to put the form into.
* @param $op
* @param $delta
* @param $edit
* @return mixed
*/
function vm_search_block($op = 'list', $delta = 0, $edit = array()) {
switch ($op) {
case 'list':
$blocks[0]['info'] = t('Algemene zoek');
return $blocks;
case 'view':
if (0 == $delta) {
$block['subject'] = t('');
$block['content'] = drupal_get_form('vm_search_general_form');
}
return $block;
}
}
/**
* Define the form.
*/
function vm_search_general_form() {
$subjects = _vm_search_get_subjects();
foreach ($subjects as $key => $subject) {
$options[$key] = $subject['desc'];
}
$form['subjects'] = array(
'#type' => 'select',
'#options' => $options,
'#required' => TRUE,
);
$form['keys'] = array(
'#type' => 'textfield',
'#required' => TRUE,
);
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Zoek'),
);
return $form;
}
function vm_search_general_form_submit($form, &$form_state) {
$subjects = _vm_search_get_subjects();
$keys = $form_state['values']['keys']; //the search keys
//the content types to search in
$keys .= ' type:' . implode(',', $subjects[$form_state['values']['subjects']]['types']);
//redirect to the page, where vm_search_view will handle the actual search
$form_state['redirect'] = 'zoek/'. $form_state['values']['subjects'] .'/'. $keys;
}
/**
* Menu callback; presents the search results.
*/
function vm_search_view($type = 'node') {
// Search form submits with POST but redirects to GET. This way we can keep
// the search query URL clean as a whistle:
// search/type/keyword+keyword
if (!isset($_POST['form_id'])) {
if ($type == '') {
// Note: search/node can not be a default tab because it would take on the
// path of its parent (search). It would prevent remembering keywords when
// switching tabs. This is why we drupal_goto to it from the parent instead.
drupal_goto($front_page);
}
$keys = search_get_keys();
// Only perform search if there is non-whitespace search term:
$results = '';
if (trim($keys)) {
// Log the search keys:
watchdog('vm_search', '%keys (@type).', array('%keys' => $keys, '@type' => $type));
// Collect the search results:
$results = node_search('search', $type);
if ($results) {
$results = theme('box', t('Zoek resultaten'), $results);
}
else {
$results = theme('box', t('Je zoek heeft geen resultaten opgeleverd.'));
}
}
}
return $results;
}
/**
* returns array where to look for
* @return array
*/
function _vm_search_get_subjects() {
$subjects['opdracht'] =
array('desc' => t('Opdracht'),
'types' => array('project')
);
$subjects['persoon'] =
array('desc' => t('Persoon'),
'types' => array('types_specialisatie', 'smaak_en_interesses')
);
$subjects['groep'] =
array('desc' => t('Groep'),
'types' => array('Villamedia_groep')
);
$subjects['portfolio'] =
array('desc' => t('Portfolio'),
'types' => array('artikel')
);
return $subjects;
}
Я сделал, и я использую представления для других настраиваемых поисков, но это плохо для производительности. Гранитный поиск Я еще не нашел. – eddy147
Это довольно хорошо - как и вся грандиозная концепция поиска. Если вас беспокоит производительность, вы также можете посмотреть Search Lucene или Apache Solr. –
Btw, фасетный поиск также перехватывает представления, поэтому вы можете использовать представления для отображения результата поиска. –