xandeadx.ru Блог музицирующего веб-девелопера

Drupal → Поиск с помощью Views

Опубликовано в

Стандартный поиск достаточно уныл и плохо поддаётся изменению. Немного скрашивает ситуацию модуль Custom Search, но например изменить количество результатов на страницу не способен даже он.

Выход — оставить модулю Search функцию индексирования, а поиск по индексу и вывод результатов возложить на Views:

  1. Создаём представление по содержимому.
  2. Добавляем дисплей Page.
  3. Меняем путь страницы на search2, чтобы не было конфликтов с модулем Search.
  4. Добавляем раскрытый фильтр по Search: Search Terms
  5. Удаляем сортировку по дате.
  6. Добавляем сортировку по Search: Score с типом Sort descending.
  7. По желанию — меняем стиль, добавляем/удаляем поля, добавляем новые фильтры, выносим форму с раскрытыми фильтрами в блок.

Результат:

Похожая статья на английском: How To Create Search Pages Using Views In Drupal 7.
Полезное: Поиск с морфологией.

Написанное актуально для Views 3
Похожие записи

Комментарии RSS

а если сюда еще прикрутить search_api, search_api_facets и search_api_sorts вобще красота получается.

Возможно не совсем в тему, но все же: подскажите пожалуйста, каким образом можно организовать форму поиска в виде блока, как, например на httр://auto.ria.ua/ (форма красненького цвета)?

воспользоваться раскрытыми фильтрами, вынести фильтры в блок

Ну в общем разобрался кроме одного: как задать интервал, например, цена от и до в фильтре. Может подскажете еще и куда здесь копать?

оператор Is between

Хм... Этот оператор вроде работает только если цену ручками вбивать в поле фильтра, а вот можно ли сделать для цены внесенной в БД в виде текстового поля аналогичный выпадающий список, как при выборе терминов таксономии в фильтре для views?

для текстовых полей нет

Например, задача, сделатьсайт объявлений по продаже автомобилей на Drupal 7. Организовываем поиск марок, моделей, региона и т.п. + кнопочка "Применить"(Поиск) с помощью фильтров Views в виде блока на главной.
Это несколько неудобно, нам требуется отобразить много информации кроме результатов поиска машин, например еще свежие новости, краткий каталог сервисов и т.п. ...
Поэтому пытаемся создать для этой же Views страницу, куда бы перекидывало с такого блока при выборе определенных фильтров и клика по кнопочке "Применить фильтр", причем сам данный блок поиска машин на главной странице выводился бы только с одними фильтрами и без результатов, а страница, сделанная с помощью views, все параметры фильтров брала бы из URL, переданных от фильтра с главной страницы, но не имела видимых фильтров.
Пытаясь решить данную задачу зашел в тупик, ибо:
1) форма поиска в виде блока (фильтры Views) на главной странице отображается только если используется AJAX, причем результаты фильтрации отлично выводятся тут же на главную, а как заставить показываться только саму форму с фильтрами без результатов в виде полей, причем при клике по кнопочке применить шла переадресация на страницу с результатами поиска(страница Views того же представления) так и не понял;
2) страница (не блок!), где должны отображаться результаты нашего поиска без видимых фильтров, действительно показывает все нужные поля без фильтров, вот только нивкакую не хочет из URL (GET-запрос) брать параметры для фильтрации, и тупо отображает все результаты.
Подскажите, кто-нибудь, что я делаю не так?

вынесите раскрытые фильтры в блок
выведите блок в регион
profit

Т.е. оставить в блоке одни фильтры без полей для результатов, так?
А как тогда настроить фильтры для страницы, чтобы она принимала значения фильтров из блока упомянутого выше блока и обрабатывала результаты согласно значениям в фильтрах?

ничего настраивать не нужно, результаты будут выведены на отдельной странице

Да что-то не выходит...
Вот настройки блока, а вот настройки страницы.
Пытаюсь убрать поля в блоке- вьюха говорит ошибка, блок не может быть без полей, ну и, соответственно, т.е. одни фильтры оставить не получается.
Уже мозги закипать начали, а просвета нет...

А если AJAX отменить то вообще ничего блок не показывает, ни формы с фильтрами, ни результатов... А с включенным AJAX форма показывается вместе с результатами...

дисплей должен быть один - страница

А для блока другую вьюху создавать, так получается?

нет. в настройках вынесите фильтры в блок

Ага! щас попробуем!

Огромное спасибо, таки получилось то, что хотелось благодаря вашей помощи!

Кста, насчет раскрытых фильтров в блоке созданном views. Если использовать Глобальный: Dependent filter, и выводить раскрытую форму в блоке, то фильтр работает нормально, а если усложнить задачу и в этой вьюхе добавить еще страничку клонированием предыдущей, только изменить 1 скрытый фильтр и адрес страницы, и вывести обе раскрытых формы в блоке на главной странице (получим поиск аналогичных параметров по 2 скрытым категориям), то в верхней форме в блоке Глобальный: Dependent filter работает правильно, а для второй формы в блоке на той же странице Глобальный: Dependent filter работает уже неправильно, т.к. не открывает скрытые с помощью него раскрытые фильтры.
Причем при смене последовательности отображения этих 2 блоков с раскрытыми фильтрами ошибка с Глобальный: Dependent filter повторяется, и нормально работает тот блок, который окажется выше в структуре регионов.
Как бы заставить этот Глобальный: Dependent filter работать корректно с 2 аналогичными формами на одной странице, есть соображения?

столкнулся с той же проблемой..
уже третьи сутки долбусь - никак не выходит создать блок, который бы не выводил результаты поискового запроса в своем теле...
можно поподробней о том, как в настройках вынести фильтры в блок???

Advanced - Exposed form - Exposed form in block - Yes

Как в воду глядел - вся загвоздка в нюансе. Но не думал - ни гадал, что в таком элементарном! Спасибо!

Здравствуйте, подскажите а как можно сделать чтобы этот поиск искал по буквам и частям слова?

добавьте раскрытый фильтр

А где он находится, а то я не вижу? Спосибо

Здравствуйте!
Ничего не понимаю, сделал всё так как вы написали, захожу на страницу /search2/ а там у меня пусто - только один заголовок, а формы поиска никакой нет, что делать то??

значит не всё сделали

Великолепно!! Спасибо, ещё раз всё сначало сделал повнимательней и заработало!!!
Подскажите пожалуйста - есть ли модуль для друпала смысл которого:
пользователь заполняем поля в своей анкете - и отображается % заполнение анкеты.
Извините, если не в том месте пишу.

не встречал

Здравствуйте xandeadx, хотел заменить стандартный поиск на views по вашей статье, но не радуют результаты поиска. К примеру слово "ручка" находит а вот "ручку" уже нет.
Использую раскрытый фильтр "Search: Search Terms"
Для этого, как вариант - добавить несколько раскрытых фильтров, но строка поиска должна быть одна, что посоветуете для таких случаев??

гуглите по фразе "поиск с морфологией"

Ищет только по заголовку материалов?

нет

Блин, полдня убил на эту тему. Для тех, кто не может понять почему артикул товаров ubercart не индексируется модулем поиска drupal (ну и для гугла): search module индексирует всё, что будет выводиться в node.tpl.php (но перед отправкой в node.tpl.php). Так что надо в отображение полей товара в настройках уберкарта добавить артикул, чтобы он попал в индекс, ну а скрыть его, если он не нужен, можно с помощью CSS или в шаблоне node.tpl.php

Добрый день, столкнулся с той же проблемой, что и evgeniy - на странице отсутствует форма поиска, только мне метод "сделать заного и повлнимаьтельнее" не помог.
Можете что-нибудь подсказать?

к посту выше http://s019.radikal.ru/i643/1302/6a/3b4edc144439.png
тут ничего не надо менять?

все гениальное простоо! СПАСИБО!!!! расцеловала бы автора!

Подскажите, а есть возможность кастомизировать саму форму? в плане разметки? Например, плейсхолдеры к инпутам добавить, заменить -Any- в селектах?

hook_form_views_exposed_form_alter

Спасибо, работает)

Здравствуйте, а можно как-то в выдаче результатов выделять совпадения с словами запроса?

Спасибо огромное! Давно искал способ объединить поисковый алгоритм модуля Search и гибкость вывода результатов модуля Views.

Здравствуйте, в русской версии не могу найти "Search: Search Terms"
есть только вот это:
Поиск: Ссылки на
Другие материалы, ссылающиеся на этот.
Поиск: Ссылки от
Другие материалы, на которые ссылается этот.
Поиск: Условия поиска
Условия поиска
полагаю это не ОНО

из-за этого у меня результат поиска все содержимое сайта
подскажите где что не доделал

переключите интерфейс на английский язык

Спасибо за оперативность "Search: Search Terms" нашел сделал как у вас "Search: Search Terms (required)", но теперь вообще нет результата поиска, слово в поиске совпадает 100%
м.б. в настройках Custom Search что-то натворил :(

Статья гуд! Коротко и ясно - спасибо! А подсветку найденного слова(как у стандартного search) как замутить?

еще, кстати, имеется косячок с выводом в виде нумерованного списка с использованием пагинатора - получается при переходе на последующие страницы, список начинается с еденицы, не знаете как избежать? Что бы при переходе, номер был продолжением предыдущего.

хотя допер))) предыдущее сообщение можно удалить))) нужно добавить поле счетчика, и не использовать нумерованный список)

Как я могу вывести критерий по которому происходил поиск! Кто знает подскажите!!!!

Как к этому полю добавить autocomplete, что поиск был по совпадениям.
Например набираю
ав - мне выдавалось:
авто
автомобили
автозапчасти
тоесть тот материал который уже есть на сайте.
Заранее спасибо за ответ.

Спасибо за ответ, а как добавить не новое поле, а уже к существующему
полю (фильтру) во views - Search: Search Terms, я его уже вывел на страницу с вьюхой.

Подскажите.
Создал представление "Страницу" - назвал test
Поставил в ней "Раскрытая форма в блоке:Да"
Появился блок в "блоках" смотрю его название -exp-test-page
Как его теперь вывести программно? Все перепробовал!
Вот так не выходит.

$block = module_invoke('views','block_view','_exp_test_page-block');
echo render($block['content']);

"-exp-test-page" и "_exp_test_page-block" как бы не совсем одно и тоже

Я правда пробовал по разному, прошу помощи.

По сути это же блок значит дописывать _block?

Так ничего не выводит

$block = module_invoke('views','block_view','-exp-test-page');

И вроде как надо использовать "_"?

Так тоже :(

$block = module_invoke('views','block_view','-exp-test-page-block');

Доброго времени.
У меня проблема возникла, может кто поможет.
Зависимые фильтры не работают во вкладках quick tabs, кроме первой вкладки.
Все перерыл, никаких патчей и вообще упоминаний об этой проблеме не много.

Здравствуйте!
Сделал поиск как в статье. Все работает. Только один момент: При вводе в поле поиска слова длиной 1 или 2 символа выдает сообщение:

Необходимо указать не менее одного ключевого слова, состоящего из 3 или более букв.
Notice: Undefined index: nid в функции views_handler_field_term_node_tid->pre_render() (строка 88 в файле M:\home\MirChild02\www\sites\all\modules\views\modules\taxonomy\views_handler_field_term_node_tid.inc).

Предупреждение справедливое. Только вот на сайте это выглядит как недоработка.
Подскажите как сделать обработку поискового запроса до его отправки на исполнение.
Например так:

if (strlen($input_text)<3)
{
    $input_text = "";
    print "Необходимо указать не менее одного ключевого слова, состоящего из 3 или более букв.";
}
return $input_text;

И еще заметил что при вводе цифры длиной 1 или 2 символа предупреждение не выводится и может даже выдать результат поиска. Это нормально или тоже аномалия?
Заранее спасибо.

Оставить комментарий

Содержимое этого поля является приватным и не будет отображаться публично. Если у вас есть аккаунт в Gravatar, привязанный к этому e-mail адресу, то он будет использован для отображения аватара.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступные HTML теги: <a> <i> <b> <strong> <code> <ul> <ol> <li> <blockquote> <em> <s>
  • Строки и параграфы переносятся автоматически.
  • Подсветка кода осуществляется с помощью тегов: <code>, <css>, <html>, <ini>, <javascript>, <sql>, <php>. Поддерживаемые стили выделения кода: <foo>, [foo].

Подробнее о форматировании