Вариант строки поиска с автоподстановкой без использования Search API

Главные вкладки

Аватар пользователя VasyOK VasyOK 17 ноября 2016 в 12:55
6

Как уже многие начали составлять методички о внедрении поиска с автоподстановкой на сайт.
http://drupal.ru/node/130905 gun_dose предлагает внедрять подобное на сайт с Search API, я пишу от поиске без Search API. Результат тут http://ukrigrushka.com.ua/

Понадобятся модули:
search_autocomplete
better_exposed_filters
mefibs
views_selective_filters
views_block_filter_block - не обяз

Поехали.

1. Вьюха, которая выводит товары. Помещена на отдельную страницу.

main-view

Ставим 2 блока для вывода фильтров

1) Строка поиска (в шапке, то для чего вы это читаете) - блок defaul
2) Фильтры производитель, материала, тип товара - блоки с фильтрами. Необязательно, но я поставил.

2_-_main-view_-_blocks.png
3_-_main-view_-_blocks_-_def.png

Будут выглядеть так:
primer1
primer2

Расставляем фильтры вьюхи по блокам.

1) Строка поиска ищет по заголовку товара, поэтому Заголовок в блок default
2) Каталог, Производитель, материал и т.п. - в блок с фильтрами. Внимание! Использован views_filters_selective.

4_-_main-view_-_filter_1.png
5_-_main-view_-_filter_5.png

Настройки Better Exposed Filters

6_main-view_-_bef1.png
7_main-view_-_bef2.png

Расставляем блоки в теме

1) Блок строки поиска - в "шапку". У меня регион для телефонов.
2) Блок остальных фильтров в содержимое. Показывать блок только на странице product-search* - путь главной вьюхи (крутим вверх.)
8_blocks_1.png
9_blocks_2.png

2. Вьюха автоподстановки. Выпадает в строке поиска.

В автоподстановке строки поиска будут выводиться:
- название товара
- его картинка
но можно выводить любые поля.
10_autocompl-view.png
11_autocompl-view-row-sett.png

3. Настройки автоподстановки.

Собственно настройки модуля search_autocomplete. Находяться по адресу admin/config/search/search_autocomplete
Добавляем форму. Я уже добавил, поэтому редактирую свою.
12_-_autocompl_-_base.png
13_-_autocompl_-_sett_1.png
14_-_autocompl_-_sett_2.png

Самое главное тут:
Use an existing view: - вьюха автоподстановки.
ID-селектор этой формы - Инпут строки поиска в "шапке". Firebug в помощь. Либо временно на странице настроек модуля включить "Use autocompletion helper tool for Search Autocomplete administrators."

Осеннее обострение

18.10.2017
Дорогие товарищи, если хотите пользоваться модулем mefibs, вам нужно иметь нехило прокаченный навык JS / Jquery. Если вынесите строку поиска в отдельный mefibs-блок - может вылезти проблема - поиск не переходит на товар, если этот товар в поиске выскакивает всего один. При повторном вводе поискового запроса, проставленые галочки не сбрасываются, что тоже плохо.

На данный момент оптимальный вариант -
1. На странице поиска - все как сверху, но "Раскрытая форма в блоке: Нет"
2. Стилями скрываем строку поиска из фильтра.
3. Блок поиска - обычный HTML код:

<form action="/product-search?title" method="get">                    
      <input type="search" name="title">                  
</form>

Если кто-то пользуется похожими методами просьба написать о результатах.

Комментарии

Аватар пользователя serj7 serj7 13 июля 2017 в 12:28

На мультиязычном сайте из Entity Translation не приходилось такое делать ?
В ишьюсах модуля пишут что мультиленг не работает. https://www.drupal.org/node/2596775
Сам пытался связи у вьюхе накрутить, для второго языка автокомплит не работает никак.

Аватар пользователя VasyOK VasyOK 13 июля 2017 в 12:51

не приходилось. Попробуйте для нод указать выбор языка нейтрально. Ну на карйняк разные блоки поиска для разных языков.

Аватар пользователя serj7 serj7 13 июля 2017 в 12:58

Разные блоки поиска для разных языков я и не могу сделать, когда в настройках вьюхи указываю только второй язык, ничего не работает.
Могу вывести редакции всех языков ноды сразу, но если фильтровать только второй язык, выдача не работает.
Сейчас думаю над вариантом Search API, может там получится.

Аватар пользователя serj7 serj7 13 июля 2017 в 16:22

Сделал все таки.
1. Вьюха, которая выводит товары.
1.1. Делам клон страницы для каждого языка.
1.2. Добавляем связь "Содержимое: Entity translation: translations".
1.3. Поля добавляем через "Entity translation:", Например: "Entity translation: Заголовок". В настройках этого поля указываем язык.
1.4. Добавляем фильтр "Entity translation: Язык" из связью "Translations" и выбираем нужный язык.
Пример: "(Translations) Entity translation: Язык (= Английский)".

2. Вьюха автоподстановки. Выпадает в строке поиска.
2.1. Для каждого языка полностью клонируем вьюху, и настраиваем отдельно. (Полный клон нужен для настроек форм у "Search Autocomplete settings").
2.2. Добавляем связь "Содержимое: Entity translation: translations".
2.3. Поля добавляем через "Entity translation:", Например: "Entity translation: Заголовок". В настройках этого поля указываем язык.
2.4. Добавляем фильтр "Entity translation: Язык" из связью "Translations" и выбираем нужный язык.

3. Настройки автоподстановки.
3.1. Для каждого языка отдельная форма с указанием вьюхи автокомплита и селектора поисковой формы.

4. Вывод блоков
4.1. Включаем модуль Block languages из пакета i18n.
4.2. В настройках каждого блока указываем для какого языка его отображать.

Аватар пользователя smeshariki smeshariki 23 сентября 2017 в 8:08

Подскажи пожалуйста, что за настройка во вьюхе на первой картинке - exposed form blocks default+1
Не могу найти где это включается.

Аватар пользователя smeshariki smeshariki 23 сентября 2017 в 18:58

Устанавливал через drush, не заметил что модуль не установился. Хотел изобразить из себя профи и немного лажанулся.

Под выпадающим списком есть ссылка "все результаты для *запрос*"
Например на твоём сайте если перейти, то попадаешь на страницу с релевантными продуктами. Я попадаю на страницу вьюхи, но никакие продукты не выводятся. Что за секрет может быть?

П.С. Кажется понял. Поиск через форму, которую создала вьюха, производится только по полю "заголовок", а чтобы искать по всем полям, придётся использовать стандартную форму, похоже.

Аватар пользователя VasyOK VasyOK 24 сентября 2017 в 10:51

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

Если нужно чтобы поиск шел не только по полю заголовка, нужно создать "скрытое" поле для ноды, куда подтянуть Заголовок и другие поля (по которым предполагается поиск, можно термины таксономии). И искать по этому "скрытому" полю.

Как подтянуть значения других полей в это поле? Попробуйте модули
https://www.drupal.org/project/field_default_token
https://www.drupal.org/project/field_token_value

Аватар пользователя smeshariki smeshariki 24 сентября 2017 в 12:55

--==удалено==--

В общем, сейчас проблема такая: когда нажимаешь "поиск", то выдаёт какие-то результаты только если полностью написал весь заголовок, а у тебя поиск по кусочку слова, даже если оно написано не очень точно, по типу как описано у андеда http://xandeadx.ru/blog/drupal/686
Вымучиваю решение.
Благодарю.

Аватар пользователя VasyOK VasyOK 24 сентября 2017 в 12:37
1

smeshariki wrote:

В общем, сейчас проблема такая: когда нажимаешь "поиск", то выдаёт какие-то результаты только если полностью написал весь заголовок,

Сюда смотри внимательно. Все модули поставил?
http://drupal.ru/files/4_-_main-view_-_filter_1.png
http://drupal.ru/files/13_-_autocompl_-_sett_1.png

smeshariki wrote:

а у тебя поиск по кусочку слова, даже если оно написано не очень точно, по типу как описано у андеда

у меня такого (увы) нет, а у Андеда, через Search API

Аватар пользователя VasyOK VasyOK 18 октября 2017 в 0:17

Дорогие товарищи, если хотите пользоваться модулем mefibs, вам нужно иметь нехило прокаченный навык JS / Jquery. Если вынесите строку поиска в отдельный mefibs-блок - может вылезти проблема - поиск не переходит на товар, если этот товар в поиске выскакивает всего один. При повторном вводе поискового запроса, проставленные галочки не сбрасываются, что тоже плохо.

На данный момент оптимальный вариант -
1. На странице поиска - все как сверху, но "Раскрытая форма в блоке: Нет"
2. Стилями скрываем строку поиска из фильтра.
3. Блок поиска - обычный HTML код:

<form action="/product-search?title" method="get">                    
      <input type="search" name="title">                  
</form>