[Решено] [pdoResources] - не работает параметр context?

Или я чего-то не понимаю, или pdoResources отказывается принимать праметр context.
Кто-нибудь сталкивался с таким поведением?
Если да, то как его обойти, чтобы выводило только из указанного контекста?

Привожу листинг кода:


{'!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-запрос квадратными скобками.
Василий Столейков
03 октября 2018, 07:06
modx.pro
1 516
0
Поблагодарить автора Отправить деньги

Комментарии: 2

Денис
03 октября 2018, 09:22
+2
Исправил. Вся проблема в том, что строится неверный sql запрос.
Изначально он выглядит так (упрощу для читабельности):
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 запросе как раз и будут группировать наши условия и всё будет работать как надо.
    Василий Столейков
    03 октября 2018, 11:45
    0
    Спасибо за помощь!
    Теперь всё отлично работает!
    Всё сложное оказывается просто… Действительно полезная информация!
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    2