Pull to refresh

Интеграция поиска Google в сайт на Drupal

Reading time6 min
Views5.1K
imageНекоторое время назад появилась необходимость организовать поиск по сайту на друпале с фильтрацией по типам материалов и возможностью поиска по профилям пользователей. Существующие решения не устраивали по ряду причин. На ум сразу пришли 2 варианта: либо писать свой поиск (используя готовые библиотеки типа phpMorphy), либо использовать Google. Остановились на втором.

Логика работы проста: Google позволяет искать по определенному сайту. То есть мы можем искать по www.example.com, по www.example.com/first, по www.example.com/second и т.п. Для поиска материалов определенных типов нам только нужно настроить разные пути для разных типов материалов и встроить на сайт Google Custom Search.

Далее кратко по шагам, как это работает (много кода, нет картинок):

  • Включаем модуль Pathauto (потянет за собой модуль Token)
    1. На странице admin/build/path/pathauto настраиваем разные пути для разных типов материалов (это нужно для корректной работы поиска)
    2. Там же массово переформируем синонимы для всех материалов на сайте

  • Модуль «Google Custom Search»
    1. Хукаем меню (далее не буду приводить весь код, только основные моменты)
      1. function google_custom_search_menu() {
      2.   //Получаем настройки
      3.   $config = variable_get("google_custom_search",array());
      4.  
      5.   $pagelink = "search/google-custom-search";
      6.   $type = MENU_LOCAL_TASK;
      7.   if ($config['page']) {
      8.     $pagelink = $config['page'];
      9.     $type = MENU_SUGGESTED_ITEM;
      10.   }
      11.   $items[$pagelink] = array(
      12.     'title' => ($config['pagename']?$config['pagename']:'Google Custom Search'),
      13.     'page callback' => 'google_custom_search_page',
      14.     'page arguments' => array($config),
      15.     'access arguments' => array('use google custom search'),
      16.     'type' => $type,
      17.   );
      18.   return $items;
      19. }
      * This source code was highlighted with Source Code Highlighter.
    2. Формируем форму выбора типов материалов
      1. function google_custom_search_main_form() {
      2.   // Подключаем Pathauto
      3.   _pathauto_include();
      4.   // Настройки Pathauto
      5.   $all_settings = module_invoke_all('pathauto', 'settings');
      6.   // Типы материалов
      7.   $types = node_get_types('types');
      8.   // В цикле получаем все доступные типы материалов, блоги и пользователей
      9.   foreach ($all_settings as $settings) {
      10.     $module = $settings->module;
      11.     switch($module) {
      12.       case 'user':
      13.         //...
      14.         break;
      15.       case 'node':
      16.         foreach ($settings->patternitems as $itemname => $itemlabel) {
      17.           //...
      18.         }
      19.         break;
      20.       case 'blog':
      21.         //...
      22.         break;
      23.     }
      24.   }
      25.   // Выводим всё на форму
      26.   $form = array();
      27.   $form['materials'] = array(
      28.     '#type' => 'fieldset',
      29.     '#title' => 'Расширенный поиск',
      30.     '#collapsible' => TRUE,
      31.     '#collapsed' => TRUE,
      32.   );
      33.   foreach($final as $i => $v) {
      34.     $form['materials'][$names[$i]] = array(
      35.       '#type' => 'checkbox',
      36.       '#title' => $v,
      37.       '#default_value' => 0,
      38.       '#name' => $i,
      39.       '#attributes' => array('class' => 'google_custom_search_checkbox'),
      40.     );
      41.   }
      42.   return $form;
      43. }
      * This source code was highlighted with Source Code Highlighter.

    3. Формируем поисковую страницу
      1. function google_custom_search_page($config) {
      2.   if (!$config) {
      3.     drupal_set_message("Модуль Google Custom Search не настроен. Пожалуйста обратитесь к администратору.", 'warning');
      4.     return FALSE;
      5.   }
      6.   $output = drupal_get_form('google_custom_search_main_form');
      7.   $key = $config['key'];
      8.   $host = $_SERVER['HTTP_HOST'];
      9.   if ($config['host']) {
      10.     $host = $config['host'];
      11.   }
      12.   $style = $config['style'];
      13.   $string = isset($_POST['google_custom_search_string']) ? htmlspecialchars($_POST['google_custom_search_string']) : "";
      14.   $output .= <<<THIS
      15. <script type="text/javascript" src="http://www.google.com/jsapi?key=$key"></script>
      16. <script type="text/javascript">
      17.   google.load("search", "1", {"nocss" : true});
      18.   function OnLoad() {
      19.     // Загружаем Google CSE
      20.     searchHost = "$host/";
      21.     searchControl = new google.search.SearchControl();
      22.     // Устанавливаем тип вывода результатов
      23.     searchControl.setResultSetSize(google.search.Search.LARGE_RESULTSET);
      24.     var siteSearch = new google.search.WebSearch();
      25.     siteSearch.setUserDefinedClassSuffix("siteSearch");
      26.     siteSearch.setSiteRestriction(searchHost);
      27.     // По умолчанию ищем по всему сайту
      28.     siteSearch.setUserDefinedLabel("Все результаты");
      29.     searchControl.addSearcher(siteSearch);
      30.     var drawOptions = new google.search.DrawOptions();
      31.     // Стиль вывода в зависимости от настроек модуля (табами или друг за другом)
      32.     drawOptions.setDrawMode(google.search.SearchControl.$style);
      33.     searchControl.draw(document.getElementById("searchcontrol"),drawOptions);
      34.     searchControl.execute("$string");
      35.   }
      36.   // Обновляем Google CSE при выборе типа материала (то же самое, но разные табы для разных типов материалов)
      37.   $('.google_custom_search_checkbox').change(function(){
      38.     delete searchControl;
      39.     searchControl = new google.search.SearchControl();
      40.     searchControl.setResultSetSize(google.search.Search.LARGE_RESULTSET);
      41.     var siteSearch = new google.search.WebSearch();
      42.     siteSearch.setUserDefinedClassSuffix('siteSearch');
      43.     siteSearch.setSiteRestriction(searchHost);
      44.     siteSearch.setUserDefinedLabel('Все результаты');
      45.     searchControl.addSearcher(siteSearch);
      46.     // Проходим по всем выбранным типам
      47.     $('.google_custom_search_checkbox').each(function(){
      48.       if($(this).attr('checked')) {
      49.         var siteSearch = new google.search.WebSearch();
      50.         siteSearch.setUserDefinedClassSuffix('siteSearch');
      51.         var newSearchName = $(this).parent().text().replace(/ /g,' ').replace(/(^\s+)|(\s+$)/g, '');
      52.         var newSearchHost = searchHost + $(this).attr('name').replace(/ /g,' ').replace(/(^\s+)|(\s+$)/g, '');
      53.         siteSearch.setSiteRestriction(newSearchHost);
      54.         siteSearch.setUserDefinedLabel(newSearchName);
      55.         searchControl.addSearcher(siteSearch);
      56.       }
      57.     });
      58.     var drawOptions = new google.search.DrawOptions();
      59.     drawOptions.setDrawMode(google.search.SearchControl.$style);
      60.     searchControl.draw(document.getElementById('searchcontrol'),drawOptions);
      61.   });
      62.   google.setOnLoadCallback(OnLoad, true);
      63. </script>
      64. THIS;
      65.  
      66.   return $output;
      67. }
      * This source code was highlighted with Source Code Highlighter.


  • Формируем страницу настроек модуля и прочие мелочи


Скачать результат можно здесь или здесь

Критика приветствуется.
Tags:
Hubs:
+1
Comments10

Articles