J'essaie de créer une recherche personnalisée mais je suis coincé. Ce que je veux, c'est avoir une liste déroulante afin que l'utilisateur puisse choisir où chercher. Ces options peuvent signifier 1 ou plusieurs types de contenu. Donc, s'il choisit les options A, la recherche portera sur le type de nœud P, Q, R. Mais il ne peut pas donner ces résultats, mais seulement les uid qui seront alors thématisés pour rassembler des données spécifiques pour cet utilisateur.Drupal: Créer une recherche personnalisée
Pour que ce soit un peu plus clair, Supposons que je veuille que les gens m'appellent. Ce que je recherche est de 2 types de profils de contenu. Mais bien sûr, vous ne voulez pas les afficher en conséquence, mais une belle image de l'utilisateur et des données.
J'ai commencé par créer un formulaire avec un champ de texte et la liste déroulante. Puis, dans le gestionnaire de soumission, j'ai créé les clés et redirigé vers d'autres pages avec ces clés comme queue. Cette page a été définie dans le menu hook, tout comme la recherche le fait. Après cela, je veux appeler hook_view
pour faire la recherche proprement dite en appelant node_search
, et rendre les résultats.
Malheureusement, cela ne va pas. Quand je clique sur le bouton de recherche, il me donne un 404.
Mais suis-je sur la bonne voie? Est-ce le moyen de créer une recherche personnalisée?
Merci pour votre aide.
Voici le code pour une clarté:
<?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;
}
Je l'ai fait, et j'utilise des vues pour d'autres recherches personnalisées, mais c'est mauvais pour la performance. Faceted Search Je n'ai pas encore découvert. – eddy147
C'est très bien - tout comme le concept de recherche à facettes. Si vous êtes préoccupé par les performances, vous pouvez également consulter Search Lucene ou Apache Solr. –
Btw, la recherche à facettes se connecte également dans les vues, de sorte que vous pouvez utiliser les vues pour afficher le résultat de la recherche. –