[Решено] [pdoResources] - не работает параметр context?
Или я чего-то не понимаю, или pdoResources отказывается принимать праметр context.
Кто-нибудь сталкивался с таким поведением?
Если да, то как его обойти, чтобы выводило только из указанного контекста?
Привожу листинг кода:
1. Блог (10) — Статья 1 (en)
2. Блог (10) — Статья 2 (en)
3. Блог (6) — Статья 1 (ru)
4. Блог (6) — Статья 2 (ru)
5. Блог (2) — Статья 1 (web)
6. Блог (2) — Статья 2 (web)
а showLog показывает следующее:
UPD для потомков: для решения проблемы достаточно сгруппировать where-запрос квадратными скобками.
Кто-нибудь сталкивался с таким поведением?
Если да, то как его обойти, чтобы выводило только из указанного контекста?
Привожу листинг кода:
{'!pdoResources'|snippet:[
'parents' => 0,
'context' => 'web',
'sortby' => '{ "context_key":"ASC" }',
'tpl' => '@INLINE {$idx}. {$parent|resource:\'pagetitle\'} ({$parent}) - {$pagetitle} ({$context_key})
',
'limit' => 0,
'showLog' => 1,
'where' => '{
"pagetitle:LIKE":"%' ~ $.get.query ~ '%",
"OR:longtitle:LIKE":"%' ~ $.get.query ~ '%",
"OR:description:LIKE":"%' ~ $.get.query ~ '%",
"OR:content:LIKE":"%' ~ $.get.query ~ '%"
}',
]}
Выводит следующее:1. Блог (10) — Статья 1 (en)
2. Блог (10) — Статья 2 (en)
3. Блог (6) — Статья 1 (ru)
4. Блог (6) — Статья 2 (ru)
5. Блог (2) — Статья 1 (web)
6. Блог (2) — Статья 2 (web)
а showLog показывает следующее:
0.0000348: pdoTools loaded
0.0000081: xPDO query object created
0.0000620: Added selection of modResource: `id`, `type`, `contentType`, `pagetitle`, `longtitle`, `description`, `alias`, `link_attributes`, `published`, `pub_date`, `unpub_date`, `parent`, `isfolder`, `introtext`, `richtext`, `template`, `menuindex`, `searchable`, `cacheable`, `createdby`, `createdon`, `editedby`, `editedon`, `deleted`, `deletedon`, `deletedby`, `publishedon`, `publishedby`, `menutitle`, `donthit`, `privateweb`, `privatemgr`, `content_dispo`, `hidemenu`, `class_key`, `context_key`, `content_type`, `uri`, `uri_override`, `hide_children_in_tree`, `show_in_tree`, `properties`
0.0000110: Processed additional conditions
0.0000780: Added where condition: pagetitle:LIKE=%статья%, OR:longtitle:LIKE=%статья%, OR:description:LIKE=%статья%, OR:content:LIKE=%статья%, modResource.published=1, modResource.deleted=0, modResource.context_key=web
0.0000288: Sorted by modResource.context_key, ASC
0.0001621: SQL prepared "SELECT `modResource`.`id`, `modResource`.`type`, `modResource`.`contentType`, `modResource`.`pagetitle`, `modResource`.`longtitle`, `modResource`.`description`, `modResource`.`alias`, `modResource`.`link_attributes`, `modResource`.`published`, `modResource`.`pub_date`, `modResource`.`unpub_date`, `modResource`.`parent`, `modResource`.`isfolder`, `modResource`.`introtext`, `modResource`.`richtext`, `modResource`.`template`, `modResource`.`menuindex`, `modResource`.`searchable`, `modResource`.`cacheable`, `modResource`.`createdby`, `modResource`.`createdon`, `modResource`.`editedby`, `modResource`.`editedon`, `modResource`.`deleted`, `modResource`.`deletedon`, `modResource`.`deletedby`, `modResource`.`publishedon`, `modResource`.`publishedby`, `modResource`.`menutitle`, `modResource`.`donthit`, `modResource`.`privateweb`, `modResource`.`privatemgr`, `modResource`.`content_dispo`, `modResource`.`hidemenu`, `modResource`.`class_key`, `modResource`.`context_key`, `modResource`.`content_type`, `modResource`.`uri`, `modResource`.`uri_override`, `modResource`.`hide_children_in_tree`, `modResource`.`show_in_tree`, `modResource`.`properties` FROM `baOPfGlXPveQ_site_content` AS `modResource` WHERE ( `modResource`.`pagetitle` LIKE '%статья%' OR `modResource`.`longtitle` LIKE '%статья%' OR `modResource`.`description` LIKE '%статья%' OR `modResource`.`content` LIKE '%статья%' AND `modResource`.`published` = 1 AND `modResource`.`deleted` = 0 AND `modResource`.`context_key` = 'web' ) ORDER BY modResource.context_key ASC "
0.0003328: SQL executed
0.0000150: Rows fetched
0.0000820: Created inline "modChunk" with name "f8aa447cc62e8e2db6ab0339d42e0254"
0.0004041: Compiled Fenom chunk with name "modchunk/f8aa447cc62e8e2db6ab0339d42e0254"
0.0022340: Returning processed chunks
0.0030320: Total time
6 291 456: Memory usage
UPD для потомков: для решения проблемы достаточно сгруппировать where-запрос квадратными скобками.
Поблагодарить автора
Отправить деньги
Комментарии: 2
Исправил. Вся проблема в том, что строится неверный sql запрос.
Изначально он выглядит так (упрощу для читабельности):
По этому запросу у нас выходит, что мы получаем любые ресурсы, в которых содержится подстрока запроса, а если его нет, то вообще все ресурсы. Для того чтобы такого не происходило, нам нужно все условия для фильтрации по запросу сгруппировать, чтобы запрос выглядел так:
Т.е. мы просто оборачиваем наши условия в скобки. Но построением запроса у нас занимается pdoResources. Для того, чтобы он составил такой запрос нам нужно вместо:
написать так:
Изначально он выглядит так (упрощу для читабельности):
SELECT * FROM `modx_site_content` AS `modResource` WHERE ( `modResource`.`pagetitle` LIKE '%%' OR `modResource`.`longtitle` LIKE '%%' OR `modResource`.`description` LIKE '%%' OR `modResource`.`content` LIKE '%%' AND `modResource`.`published` = 1 AND `modResource`.`deleted` = 0 AND `modResource`.`context_key` = 'ru' )
По этому запросу у нас выходит, что мы получаем любые ресурсы, в которых содержится подстрока запроса, а если его нет, то вообще все ресурсы. Для того чтобы такого не происходило, нам нужно все условия для фильтрации по запросу сгруппировать, чтобы запрос выглядел так:
SELECT * FROM `modx_site_content` AS `modResource` WHERE ( ( `modResource`.`pagetitle` LIKE '%%' OR `modResource`.`longtitle` LIKE '%%' OR `modResource`.`description` LIKE '%%' OR `modResource`.`content` LIKE '%%' ) AND `modResource`.`published` = 1 AND `modResource`.`deleted` = 0 AND `modResource`.`context_key` = 'ru' )
Т.е. мы просто оборачиваем наши условия в скобки. Но построением запроса у нас занимается pdoResources. Для того, чтобы он составил такой запрос нам нужно вместо:
'where' => '{
"OR:pagetitle:LIKE":"%' ~ $.get.query ~ '%",
"OR:longtitle:LIKE":"%' ~ $.get.query ~ '%",
"OR:description:LIKE":"%' ~ $.get.query ~ '%",
"OR:content:LIKE":"%' ~ $.get.query ~ '%"
}'
написать так:
'where' => '[{
"OR:pagetitle:LIKE":"%' ~ $.get.query ~ '%",
"OR:longtitle:LIKE":"%' ~ $.get.query ~ '%",
"OR:description:LIKE":"%' ~ $.get.query ~ '%",
"OR:content:LIKE":"%' ~ $.get.query ~ '%"
}]'
Квадратные скобки в json запросе как раз и будут группировать наши условия и всё будет работать как надо.
Спасибо за помощь!
Теперь всё отлично работает!
Всё сложное оказывается просто… Действительно полезная информация!
Теперь всё отлично работает!
Всё сложное оказывается просто… Действительно полезная информация!
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.