2009-09-23 4 views
2

Я пытаюсь создать пользовательский поиск, но застрял. Я хочу, чтобы у вас был 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; 
} 

ответ

0

Честно говоря, я не видел много людей реализовать hook_search. Большинство просто используют Views, или, для продвинутых вещей, что-то вроде Faceted Search.

Рассматривали ли вы использование либо для своего текущего проекта? Почему это не сработало?

+0

Я сделал, и я использую представления для других настраиваемых поисков, но это плохо для производительности. Гранитный поиск Я еще не нашел. – eddy147

+0

Это довольно хорошо - как и вся грандиозная концепция поиска. Если вас беспокоит производительность, вы также можете посмотреть Search Lucene или Apache Solr. –

+0

Btw, фасетный поиск также перехватывает представления, поэтому вы можете использовать представления для отображения результата поиска. –

0

Вы также можете использовать комбинацию hook_menu для своих результатов и db_queries с вашими пользовательскими (и оптимизированными так быстро) запросами.

Например:

поиск /% /%

где аргументы могут быть все, что нужно, например, первым по минимальной цене, вторая цена на максимальную цену, третью для минимальных спален ... Ваш URL будет выглядеть всегда так:

поиск/200/400/нуль/3/...

Я использовал нуль, но это может быть все, что вы предпочитаете, чтобы рассмотреть это поле как пустой.

Затем, из выбранной вами формы, вы должны просто перенаправить следующую структуру этого URL-адреса и добавить параметры в правильное место.

Это не самый красивый способ построения URL-адреса, но использование этой техники и hook_theme позволит вам иметь неограниченную гибкость. Я могу показать вам проект, в котором мы используем эту технику, и, я думаю, это выглядит довольно хорошо :-).

Любые комментарии относительно этого были бы значительно оценены :-).

Смежные вопросы