
Логика работы проста: Google позволяет искать по определенному сайту. То есть мы можем искать по www.example.com, по www.example.com/first, по www.example.com/second и т.п. Для поиска материалов определенных типов нам только нужно настроить разные пути для разных типов материалов и встроить на сайт Google Custom Search.
Далее кратко по шагам, как это работает (много кода, нет картинок):
- Включаем модуль Pathauto (потянет за собой модуль Token)
- На странице admin/build/path/pathauto настраиваем разные пути для разных типов материалов (это нужно для корректной работы поиска)
- Там же массово переформируем синонимы для всех материалов на сайте
- Модуль «Google Custom Search»
- Хукаем меню (далее не буду приводить весь код, только основные моменты)
- function google_custom_search_menu() {
- //Получаем настройки
- $config = variable_get("google_custom_search",array());
- $pagelink = "search/google-custom-search";
- $type = MENU_LOCAL_TASK;
- if ($config['page']) {
- $pagelink = $config['page'];
- $type = MENU_SUGGESTED_ITEM;
- }
- $items[$pagelink] = array(
- 'title' => ($config['pagename']?$config['pagename']:'Google Custom Search'),
- 'page callback' => 'google_custom_search_page',
- 'page arguments' => array($config),
- 'access arguments' => array('use google custom search'),
- 'type' => $type,
- );
- return $items;
- }
- Формируем форму выбора типов материалов
- function google_custom_search_main_form() {
- // Подключаем Pathauto
- _pathauto_include();
- // Настройки Pathauto
- $all_settings = module_invoke_all('pathauto', 'settings');
- // Типы материалов
- $types = node_get_types('types');
- // В цикле получаем все доступные типы материалов, блоги и пользователей
- foreach ($all_settings as $settings) {
- $module = $settings->module;
- switch($module) {
- case 'user':
- //...
- break;
- case 'node':
- foreach ($settings->patternitems as $itemname => $itemlabel) {
- //...
- }
- break;
- case 'blog':
- //...
- break;
- }
- }
- // Выводим всё на форму
- $form = array();
- $form['materials'] = array(
- '#type' => 'fieldset',
- '#title' => 'Расширенный поиск',
- '#collapsible' => TRUE,
- '#collapsed' => TRUE,
- );
- foreach($final as $i => $v) {
- $form['materials'][$names[$i]] = array(
- '#type' => 'checkbox',
- '#title' => $v,
- '#default_value' => 0,
- '#name' => $i,
- '#attributes' => array('class' => 'google_custom_search_checkbox'),
- );
- }
- return $form;
- }
- Формируем поисковую страницу
- function google_custom_search_page($config) {
- if (!$config) {
- drupal_set_message("Модуль Google Custom Search не настроен. Пожалуйста обратитесь к администратору.", 'warning');
- return FALSE;
- }
- $output = drupal_get_form('google_custom_search_main_form');
- $key = $config['key'];
- $host = $_SERVER['HTTP_HOST'];
- if ($config['host']) {
- $host = $config['host'];
- }
- $style = $config['style'];
- $string = isset($_POST['google_custom_search_string']) ? htmlspecialchars($_POST['google_custom_search_string']) : "";
- $output .= <<<THIS
- <script type="text/javascript" src="http://www.google.com/jsapi?key=$key"></script>
- <script type="text/javascript">
- google.load("search", "1", {"nocss" : true});
- function OnLoad() {
- // Загружаем Google CSE
- searchHost = "$host/";
- searchControl = new google.search.SearchControl();
- // Устанавливаем тип вывода результатов
- searchControl.setResultSetSize(google.search.Search.LARGE_RESULTSET);
- var siteSearch = new google.search.WebSearch();
- siteSearch.setUserDefinedClassSuffix("siteSearch");
- siteSearch.setSiteRestriction(searchHost);
- // По умолчанию ищем по всему сайту
- siteSearch.setUserDefinedLabel("Все результаты");
- searchControl.addSearcher(siteSearch);
- var drawOptions = new google.search.DrawOptions();
- // Стиль вывода в зависимости от настроек модуля (табами или друг за другом)
- drawOptions.setDrawMode(google.search.SearchControl.$style);
- searchControl.draw(document.getElementById("searchcontrol"),drawOptions);
- searchControl.execute("$string");
- }
- // Обновляем Google CSE при выборе типа материала (то же самое, но разные табы для разных типов материалов)
- $('.google_custom_search_checkbox').change(function(){
- delete searchControl;
- searchControl = new google.search.SearchControl();
- searchControl.setResultSetSize(google.search.Search.LARGE_RESULTSET);
- var siteSearch = new google.search.WebSearch();
- siteSearch.setUserDefinedClassSuffix('siteSearch');
- siteSearch.setSiteRestriction(searchHost);
- siteSearch.setUserDefinedLabel('Все результаты');
- searchControl.addSearcher(siteSearch);
- // Проходим по всем выбранным типам
- $('.google_custom_search_checkbox').each(function(){
- if($(this).attr('checked')) {
- var siteSearch = new google.search.WebSearch();
- siteSearch.setUserDefinedClassSuffix('siteSearch');
- var newSearchName = $(this).parent().text().replace(/ /g,' ').replace(/(^\s+)|(\s+$)/g, '');
- var newSearchHost = searchHost + $(this).attr('name').replace(/ /g,' ').replace(/(^\s+)|(\s+$)/g, '');
- siteSearch.setSiteRestriction(newSearchHost);
- siteSearch.setUserDefinedLabel(newSearchName);
- searchControl.addSearcher(siteSearch);
- }
- });
- var drawOptions = new google.search.DrawOptions();
- drawOptions.setDrawMode(google.search.SearchControl.$style);
- searchControl.draw(document.getElementById('searchcontrol'),drawOptions);
- });
- google.setOnLoadCallback(OnLoad, true);
- </script>
- THIS;
- return $output;
- }
- Хукаем меню (далее не буду приводить весь код, только основные моменты)
- Формируем страницу настроек модуля и прочие мелочи
Скачать результат можно здесь или здесь
Критика приветствуется.