Настройка сортировки на Drupal 7 или Фасетный поиск
Умный фильтр или Фасетный поиск — это фильтр по категориям товара , которую можно видеть в крупных интернет магазинах и том же яндекс.маркете. Он помогает последовательно сортировать товары с нужными пользователю свойствами, отсеявая все лишнее. Это очень удобная опция, позволяющая быстро найти нужный товар или материал на сайте.
И так давайте перейдем непосредственно к установке и настройке нужных нам модулей
Установка модулей
Для начала нам понадобятся скачать и установить следующие модули: Search API, Search API Database Search, Entity API и Views.
На странице модулей включаем:
- Search API
- Search views
- Database search
- Entity API
- Views
- Views UI
- Ctools
Создание поискового сервера
Идем в Конфигурация > Поиск и метаданные > Search API (/admin/config/search/search_api) и нажимаем Добавить сервер.
Затем вводим имя сервера, в выпадающем списке Класс сервиса (Service class) выбираем Database service и сохраняем.
Создание индекса
Идем в Конфигурация > Поиск и метаданные > Search API (/admin/config/search/search_api), жмем Добавить сервер (Add index).
Вводим название индекса, в поле Тип элемента (Item type) выбираем ‘Материал‘, в поле Сервер выбираем Database server, жмем Создание индекс.
В открывшейся форме отмечаем галочками поля, по которым будет производится сортировка, и сохраняемся.
Чтобы можно было делать сортировку по названию ноды, включаем title и напротив него в выпадающем списке выбираем тип string, а не fulltext. По fulltext сортировку делать нельзя.
В следующей открывшейся форме Фильтры (workflow) я оставил все по умолчанию, переходим на вкладку Просмотр (Status), и нажимаем Индексировать сейчас (Index Now).
После завершения индексации, создадим страницу поиска.
Создание страницы поиска
Идем в Structure > Views и жмем Добавить новое представление (Add new view).
В новом представление в выпадающем списке Показать (Show) выбираем ранее созданный нами индекс, остальные поля (название, title и путь) заполняете так как вам нужно.
Далее нажимаем Сохранить и настроить (Continue & edit), настраиваем представление как обычно. В критериях фильтрации я добавил показ только опубликованных материалов и нужный тип node и настроил отображение необходимых полей (нужно добавить эти поля в индекс, чтобы иметь возможность фильтровать по ним).
На данном этапе с настройкой представления мы закончили, теперь перейдем непосредственно к фасетному фильтру.
Скачиваем модуль Facet API, устанавливаем его, и на странице модулей включаем два модуля: Facet API и Current Search Blocks. Последний создает блок с со списком активных фильтров и ссылки для их отмены. Также ключаем модуль Search facets он понадобится для интеграции ранее настроенного поиска и facet API.
Теперь идем в Конфигурация > Поиск и метаданные > Search API > Product Index (/admin/config/search/search_api/index/product_index/facets), здесь у нас появилась новая вкладка Фасеты (Facets), где нужно указать поля (проиндексированные ранее) для фильтра и настроить их отображение.
Для каждого от меченого поля будет автоматически создан отдельный блок на странице блоков, так что после того как нужные поля выбраны, идем на страницу блоков и размещаем их в нужном регионе и последовательности.
Current Search Blocks
На странице настройки блоков находим блок Current search: Standard и размещаем его в нужном нам месте. Затем идем в Конфигурация > Поиск и метаданные > Current Search Block > Standart, и в самом низу находим настройки видимости: ставим либо предпоследний , либо последний пункт (Display when either keywords are entered one or more facet items are active).
Отображение фильтра на произвольной странице (отличной от страницы поиска)
По умолчанию блок с ссылками фильтра будет отображается только на странице поиска, но чаще всего нужно, чтобы этот блок также отображался и на других страницах. Сделать это просто, хотя и не очевидно. Идем в ранее созданное нами представление, и добавляем в нем блок — Facets block.
В настройках блока указываем:
- Hide block: Yes
- Search page path: путь к странице поиска
- Facet field: выбираем любое поле
После переходим на страницу настройки блоков, и размещаем только что созданный блок выше блоков фильтра. Теперь блоки фильтра будут отображаться там же, где и данный вспомогательный блок.
Смысл этих действий прост: чтобы блоки фильтра могли отображатся, им нужно получить информацию из базы данных. Вспомогательный блок как раз и производит этот запрос.
Множественный выбор (чекбоксы в фильтре)
Чтобы можно было выбрать одновременно несколько пунктов или категорий в нашем фильтре. Нужен модуль search api db. Поэтому скачиваем и устанавливаем его, после чего в настройках виджета меняем ‘ссылки’ на ‘ссылки с чекбоксами’, а оператор должен быть в положение ‘AND’.
Теперь в блоке фильтра можно выбирать несколько катигорий сразу:
Патчим Jquery UI Slider: исправляем выбор значений
Для выбора диапазона цен существует хороший модуль Search Api ranges, который интегрирует jQuery UI min/max slider в наш фильтр.
По умолчанию модуль имеет странное поведение — диапазон можно только уменьшить, но не увеличить, что несколько не удобно. Существует патч, который исправляет данный недочет. Я применял патч для версии 7x-1.5.
Страница обсуждения проблемы: https://drupal.org/node/1989776
Сам патч: http://drupalcode.org/project/search_api_ranges.git/commitdiff/433bbcd?h…
--- a/search_api_ranges.module
+++ b/search_api_ranges.module
@@ -144,11 +144,8 @@ function search_api_ranges_minmax($variables, $order = 'ASC') {
// otherwise our min/max would always equal user input.
$filters = &$query->getFilter()->getFilters();
foreach ($filters as $key => $filter) {
-
- // Check for array: old style filters are objects which we can skip.
- if (is_array($filter)) {
- if ($filter[0] == $variables['range_field'] || ($filter[0] != $variables['range_field'] && $filter[2] == '<>')) {
- $current_filter = $filters[$key];
+ if( isset($filter->tags) && is_array($filter->tags) ){
+ if( in_array('facet:'.$variables['range_field'], $filter->tags) ){
unset($filters[$key]);
}
}
Патчим JQuery UI Slider: настраиваем редирект
В версии модуля 7х-1.5 я столкнулся с тем, что если виджет слайдера расположен на странице, отличной от страницы поиска, то после изменения диапазона цены проиходило пере направление на текущую страницу, а не на страницу поиска.
Ошибка кроется в функии search_api_ranges_block_slider_view_form_submit() (файл search_api_ranges.module, строка 364).
Я не стал особо разбираться, что там и зачем, просто немного изменил код в строке 427:
- drupal_goto($path, array('query' => array($params), 'language' => $language));
+ drupal_goto($values['path'], array('query' => array($params), 'language' => $language));
после чего проблема решилась.
Новостная лента / лента статей / лента анонсов статей в CMS Drupal
Для создания новостной ленты используем таксономию. Таксономия предназначена для упорядочивания статей сайта в независимости от того, к какому типу материала принадлежит статья.
- Для этого перейдём на страницу администрирования вашего сайта, выбрав в боковом меню — “Управление”. Перейдём по ссылке — “Модули” на страницу управления модулями сайта и активируем модуль – “Taxonomy” (если он у Вас отключен).
- Вернемся на страницу администрирования вашего сайта, выбрав в боковом меню — “Управление”. Перейдём по ссылке — “Таксономия” на страницу управления таксономией на сайте и нажмём ссылку – “Добавить словарь”. Добавим новый словарь в соответствии с изображением ниже.
- “Множественный выбор“ – для того, что бы ваша статья могла относится кнескольким лентам анонсов статей, например, относит как к ленте анонсов статейоб автомобилях, так и к ленте анонсов статей о хобби
- “Обязательно” – для того, что бы вновь создаваемая статья обязательно относиласьк какой либо ленте анонсов статей.
- “Теги” — для того, что бы при создании новой статьи, автор мог сам создавать нужную ленту анонсов статей, если она не существует.
- После создания нового словаря Вы будете перенаправлены на страницу управления таксономией на сайте.
- Нажмём на ссылку – “добавить термин”, для добавления новой ленты анонса статей и добавьте новую ленту анонса статей.
- Перейдём на страницу добавления материалов (статей) на ваш сайт, выбрав в боковом меню — “Создать материал”. Создадим материал типа — “Новости”. При создании нового материала (статьи) Вы увидите на странице создания нового материала новый пункт – “Контейнер для лент анонсов статей, типа — новости”. В этом пункте, вы можете выбрать, к какой именно ленте анонсов статей будет принадлежать данная статья (в данном случае у нас только 1 лента анонсов статей – “Новостная лента сайта”, добавленная вами в предыдущем пункте).
- Добавим 3-4 статьи типа “Новости” с указанием их привязки к ленте анонсов статей – “Новостная лента сайта”.
- Исправим (свяжем её с лентой анонсов статей) созданную ранее новость связанную с меню. Это можно сделать 2 способами:
- выбрать в созданном вами меню сайта, созданный вами пункт меню связанный с данной статьёй и на странице отображения статьи перейдём по ссылке – “Изменить” и изменим статью.
- вернёмся на страницу администрирования вашего сайта, выбрав в боковом меню — “Управление”. Перейдём по ссылке — “Содержание” на страницу управления статьями на сайте и напротив нужной вам статьи нажмём ссылку – “изменить”. После чего изменим статью.18. В анонс, ленты анонса статей, попадает первый абзац статьи.
Создадим для вашей ленты анонсов статей пункт в созданном вами меню. Для этого вернёмся на страницу администрирования вашего сайта, выбрав в боковом меню — “Управление”. Перейдём по ссылке — “Таксономия”. На странице управления таксономией на сайте, перейдём по ссылке – “список терминов”, напротив вашего словаря таксономии. Нажмём на имя вашего термина, Вы будете перенаправлены на страницу отображения данных, данного термина (на страницу отображения новостной ленты сайта). Запомним URL данной страницы (http://mysite.ru/taxonomy/term/1).
- Вернёмся на страницу администрирования вашего сайта, выбрав в боковом меню — “Управление”. Перейдём по ссылке — “Меню”. На странице управления меню сайта, нажмём на имени созданного нами меню сайта, для его просмотра. На странице просмотра созданного вами меню сайта перейдём по ссылке – “добавить пункт”. Добавим новый пункт указав при его создании:
- путь – “taxonomy/term/1” (это производная пути от http://mysite.ru/taxonomy/term/1, так как это ссылка внутри сайта, то URL сайта (http://mysite.ru/) указывать ненужно)
- название ссылки в меню – “Новостная лента сайта” (название на ваше усмотрение)
- родительский пункт – “Меню сайта” (созданное вами меню сайта)
- На рисунке ниже изображена создаваемая вами лента анонсов статей.
Поиск в Drupal с помощью Views
Стандартный поиск в Drupal довольно ограничен и имеет минимум настроек. Модуль Custom Search способен немного расширить арсенал настроек для стандартного поиска , но некоторые вещи не под силу даже ему, к примеру изменить количество результатов поиска на страницу, добавить дополнительные поля для вывода на странице результатов поиска и т.д.
Если вы на ты с кодом можно конечно отредактировать сам модуль поиска который находиться по следующему пути — ваш_сайт/modules/search/ там в файле search.pages.inc можно добавлять переменные, а в файле search-result.tpl.php править их вывод предварительно скопировав его в папку вашей темы.
Но на мой взгляд существует более изящный выход из данной ситуации — оставить модулю Search функцию индексирования, а поиск по индексу и вывод результатов возложить на модуль Views:
Создаём представление:
| Option | Value |
|---|---|
| Имя представления | Search page |
| Машинное имя | search_page |
| Показать | Содержание типа Все отсортировано по несортированный |
| Заголовок страницы | Search page |
| Путь | search-page |
| Формат отображения | Неформатированный список (по умолчанию) |
После сохранения получаем следущий результат
Добавляем новый фильтр в «Критерии фильтрации» найдите фильтр «Поиск: Термины поиска» и нажмите на кнопку «Применить (все отображения)».
На странице конфигурации фильтра, поставьте флажок напротив «Раскрыть этот фильтр для посетителей и позволить его изменять.» и нажмите на кнопку «Применить (все отображения)».
Все, что мы на самом деле сделали добавлен «Поиск: Термины поиска» фильтр и экспонировали его так, чтобы пользователи могли войти в ключевые слова для поиска. В текстовом поле появится над просмотров страницы.
На данный момент, у нас есть страница , рабочий просмотры. Сохранить вид, и перейти к / с поиском страницы .
Если ввести в некоторых ключевых слов в «Поисковые запросы» текстовое поле, страница должна возвращать некоторые результаты.
Назначение блока к региону
Вы можете заметить, что фильтр не отображается над областью контента, это потому, что теперь подвергается как блок. Последний бит работы нам нужно сделать, это добавить в открытый блок фильтра в область, в рамках темы.
- Перейдите в раздел Структура -> блоки и присвоить «разоблачил форму: search_page-страницы» блокировать конкретный регион.
- Теперь, если вы идете на страницу поиска, фильтр должен быть в назначенном блоке
Последний бит требуемой работы является стиль результатов поиска. Но, как вы видели, это довольно легко создать страницу пользовательского поиска, используя только просмотров и модуль поиска.
Результат:
Вывод описания термина таксаноми ( taxonomy term ) в Drupal 7
Добрый день, сегодня мы поговорим о том как вывести описание термина таксаноми на странице словаря таксаномии. И так многие начинающие пользователи Drupal создав свой словарь таксаномии и наполнив его терминами, хотели бы выводить уникальное описание для каждого термина, тем более что на странице термина ( к примеру: ваш_сайт.ru/taxonomy/term/1) нажав на ссылку Редактировать мы увидем поле для ввода текста как и в любом типе материалов, но введя в это поле текст в любом формате по умолчанию на странице термина он выводиться не буде:
Но как известно не поправимых ситуаций не бывает нужно лишь желание, давайте разберемся и с нашей ситуацией. Первым делом перейдем к папке модуля Views который находиться по следующему адресу: /sites/all/modules/views находим и копируем из той папки фаил views-view.tpl.php так как изменения которые мы хотим сделать будут касаться только представления Taxonomy term, можно переименовать фаил views-view.tpl.php в views-view—taxonomy-term.tpl.php . После выполнения всех выше описанных действий откройте ваш фаил любым текстовым редактором и в его начале вставте следующий код:
description}";
} ?>
Сохраняем фаил и переносим его в Вашей теме в папку Templates ( /sites/all/themes/название Вашей темы/templates ).
Но это еще не все, вернемся к выше упомянутому представлению Taxonomy term, на странице Представления ( /admin/structure/views ) проверяем включено ли представление Taxonomy term если нет включаем и переходим к его редактированию.
В разделе Расширеных настроек перейдите по ссылке «Тема оформления: Информация»
В появившемся окне нажмите кнопку — Пересканировать файлы шаблонов:
После сохраняем представление и переходим к добавлению уникальных описаний к вашим терминам таксаномии и проверке результатов.
На этом все, надеюсь статья была Вам полезна.
















