Как можно изменить текст запроса формируемый Views? (Drupal 7)

Аватар пользователя strelkovandreyvalerievich strelkovandreyv... 19 сентября в 14:39

Добрый день, хочу подружить Views с Sphinx поисковым движком.
Т.е. имеется сторонняя база с таблицей у которой в качестве движка таблицы используется SPHINX
Т.е. можно через неё обращаться к индекс с помощью SphinxQL

Хочу эту базу подключить в settings.php и во вьюхе с помощью hook_views_data обращаться к этой таблице.
Однако есть один нюанс, у SphinxQL там параметр фильтра передаются в

query='test;sort=attr_asc:group_id';

И в этом query могут быть как и текст запроса, вид сортировки, кол-во результатов
Получается нужно у вьюхи её WHERE FIELD LIKE как минимум поменять на этот query
И как максимум ORDER BY на sort из query

Т.е. сделать как здесь https://mariadb.com/kb/en/library/about-sphinxse/#search-options

0 Thanks

Комментарии

Аватар пользователя Semantics Semantics 19 сентября в 19:01

Я сначала тоже хотел посоветовать, только если Searchlight.
Но у него сфинкс крутится в Марие, и соответственно, доступ к ней идёт идут по ее протоколу

Аватар пользователя strelkovandreyvalerievich strelkovandreyv... 19 сентября в 19:10

Да, только я хочу использую Views через SphinxQL как бы селектить сторонний индекс, т.е. индекс не имеющий никакого отношения к друпалу

Аватар пользователя bumble bumble 19 сентября в 19:27

Ну, с помощью этого хука можно полностью переписать сам запрос. Прийдется, правда, разобраться во Views'овском бардаке API, Devel - в помощь.

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

Аватар пользователя Andruxa Andruxa 19 сентября в 22:48

Да, может.
Как-то потребовался блок со списком наличия товара в магазинах, наличие бралось запросом к стороннему сервису.
Удобнее было сделать это вьюсом - права доступа, кеширование, порядок следования полей и т.д.
Был сделан альтер вьюсового запроса - чтобы дергать внешний сервис, и добавлять его результаты в выдаче вьюса.
Только пришлось задействовать 2 хука:
hook_views_query_alter() - альтерим запрос и делаем вызов внешнего сервиса
hook_views_pre_render() - добавляем в результаты вьюса данные полученные от сервиса

Аватар пользователя Andruxa Andruxa 20 сентября в 9:44

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

Аватар пользователя Mnilionic Mnilionic 19 сентября в 21:16

Нужно во hook_views_data, где вы описываете поля таблицы, использовать свои хендлеры для чтения/фильтрации/аргументации для каждого поля. В каждом таком хендлере необходимо реализовать query alter и изменить или полностью переписать запрос под нужные требования.
все методы https://api.drupal.org/api/views/handlers%21views_handler_field.inc/clas...

ps Возможно, проще это сделать без вьюса :)

Аватар пользователя gun_dose gun_dose 19 сентября в 22:27

В чём преимущество такого странного решения перед стандартным сфинксом?

Аватар пользователя strelkovandreyvalerievich strelkovandreyv... 19 сентября в 23:11

Тут другой случай, я хочу отображать сторонний индекс, не друпала. Использовать Views как инструмент отображения

Аватар пользователя Orion76 Orion76 20 сентября в 15:04

Когда-то ковырял Сфинкс.. прикольная штука.. У него же вроде почти SQL-совместимый язык запросов.
Т.е. теоретически можно драйвер БД для друпал написать и использовать как родной..
Руки до сих пор чешутся, но пока не актуально.

Аватар пользователя strelkovandreyvalerievich strelkovandreyv... 21 сентября в 13:00

Я вот и думаю, это же по идее нужно просто как то хитро вьюху переделать, свои хэндлеры фильтры сделать (как правильно выше подметили, с помощь hook_views_data указать свои виды хэндлеров для обычных фильтров и контекстных для определенных полей)
И тогда было бы вообще здорово, подключить левую базу (MariaDB + SphinxSE) и с помощью вьюхи обращаться к индексы движка с пулемётной скоростью
Это может не очень применимо в онлайн, я же у себя хочу это на работе сделать, в интранете где полно различных приложений, информации связаной с производством и т.п.
Можно было бы свой поиск сделать по огромным источникам информации и с легкостью его накликать во вьюхе, или ещё больше, сделать мультипоиск по несколько индексам в раз. (google в интранете сделать =) )

Аватар пользователя gun_dose gun_dose 21 сентября в 15:51

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