2009-09-23 12 views
2

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; 
} 

Répondre

0

Pour être honnête, je ne l'ai pas vu beaucoup de gens mettent en œuvre hook_search. La plupart utilisent juste Views, ou, pour les choses avancées, quelque chose comme Faceted Search. Avez-vous envisagé d'utiliser pour votre projet actuel? Pourquoi ça n'a pas marché?

+0

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

+0

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. –

+0

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. –

0

vous pouvez également utiliser une combinaison de hook_menu pour vos résultats, et db_queries avec vos requêtes personnalisées (et optimisées si rapidement).

Par exemple:

Recherche /% /%

où les arguments pourraient être tout ce que vous avez besoin, par exemple, le premier pour le prix minimum, le deuxième prix au prix maximum, troisième pour les chambres minimum ... Votre URL regarderait toujours comme ça:

recherche/200/400/null/3/...

Je l'ai utilisé une valeur nulle, mais il pourrait être tout ce que vous préférez considérer ce domaine comme vide. Puis, à partir de votre formulaire de sélection, vous avez juste à rediriger en suivant la structure de cette URL et en ajoutant les paramètres à sa place correcte.

Il n'est probablement pas la plus belle façon de construire une URL, mais l'utilisation de cette technique et hook_theme vous permettra d'avoir une flexibilité illimitée. Je peux vous montrer un projet où nous utilisons cette technique et, je pense que ça a l'air plutôt bien :-).

Tout commentaire à ce sujet serait très appréciable :-).

Questions connexes