Измените вывод результатов поиска


Я хотел бы изменить вывод страницы результатов поиска.

Например, у меня есть 3 разных типа контента: foo, bar и т. Д. Я хотел бы сгруппировать результаты поиска по этим типам контента, чтобы для каждого типа контента отображались первые три или около того результата, за которыми следует ссылка: "Просмотреть дополнительные результаты для типа контента foo", которая приведет вас на страницу, где показаны все результаты этого конкретного типа контента.

Я провел некоторое исследование и не смог найти модуль, который делает что-то вроде этого. Наверное, мне нужно написать свой собственный модуль, но я не знаю, с чего начать. У вас есть какие-нибудь советы для меня (какие крючки для реализации и т. Д.)

 1
Author: Chapabu, 2011-08-02

2 answers

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

Потенциально вы можете переопределить результаты поиска в своей теме с помощью search-results.tpl.php . Более сложным и, возможно, лучшим способом было бы написать пользовательский модуль, который реализует hook_menu_alter и перенаправляет обратный вызов поиска по умолчанию в пользовательское представление в вашем модуль.

Я уже делал что-то подобное раньше, и это не тривиальное начинание (взгляните на модуль apachesolr_search, если вам нужен полный пример).

Что-то вроде (непроверенный)...

function mymodule_menu_alter(&$menu) {
  if (isset($menu['search/mymodulesearch/%menu_tail'])) {
    // redirect default search to this module's view
    $menu['search']['page callback'] = 'mymodule_search_view'; 
    // create a menu linkspecifically for this view
    $menu['search/mymodulesearch/%menu_tail']['page callback'] = 'mymodule_search_view';
    $menu['search/mymodulesearch/%menu_tail']['weight'] = -20;
  }
}

function mymodule_search_view() {
  $keys = search_get_keys();

  // do something with views_embed_view here
}
 1
Author: hross, 2011-08-02 13:37:47

Я думаю, что правильный код будет:

function custom_preprocess_search_results(&$variables) {
global $base_path;
drupal_add_library('system', 'ui.tabs');
drupal_add_js('jQuery(document).ready(function(){jQuery("#tabs").tabs();});', 'inline');
$variables['search_results'] = '';
// get a list of node types
$nodeTypes = node_type_get_types();
// loop through results, group by type
$resultTypes = array();
foreach ($variables['results'] as $result) {
    $resultTypes[$result['node']->type][] = $result;  
}

// create fieldsets for each type
    $output = '<div id="tabs">';
$i = 0;
$output .= '<ul>';

foreach ($resultTypes as $resultType => $resultTypeResults) {
    $i++;
    $value = "";
    // loop through entries
    foreach ($resultTypeResults as $result) {
        $value .= theme('search_result', array('result' => $result, 'module' => $variables['module']));
    }
    $output .=  '<li><a href="#tabs-'.$i.'">';
    $output .=  $nodeTypes[$resultType]->name.'</a></li>';

}
$output .= '</ul>';

$i = 0;
foreach ($resultTypes as $resultType => $resultTypeResults) {
    $i++;
    $value = "";
    // loop through entries
    foreach ($resultTypeResults as $result) {
        $value .= theme('search_result', array('result' => $result, 'module' => $variables['module']));
    }

    $output .=  '<div id="tabs-'.$i.'">';
    $output .=  $value;
    $output .=  '</div>';

}
    $output .= '</div>';

     $variables['search_results'] = $output;

}

 1
Author: user807964, 2012-04-02 08:53:46