Как решить конфликт where и level в pdoMenu?

Всем привет!
Натолкнулся на странную особенность работы pdoMenu с параметрами where и level.
Нужно вывести двухуровневое меню, при этом исключив вывод детей одного из разделов.

Обычный вызов (без исключения детей) pdoMenu срабатывает ожидаемо правильно:
{$_modx->runSnippet('!pdoMenu', [
            'parents' => 0,
            'level' => 2
])}

0.0262520: pdoTools loaded
0.0000300: xPDO query object created
0.0002210: Added selection of modResource: SQL_CALC_FOUND_ROWS `id`, `type`, `contentType`, `pagetitle`, `longtitle`, `description`, `alias`, `link_attributes`, `published`, `pub_date`, `unpub_date`, `parent`, `isfolder`, `introtext`, `content`, `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.0000401: Processed additional conditions
0.0005202: Added where condition: modResource.parent:IN(1,6,7,8,9,10,11,4,3,2), OR:modResource.id:IN(1,6,7,8,9,10,11,4,3,2), modResource.published=1, modResource.hidemenu=0, modResource.deleted=0, modResource.context_key=web
0.0000892: Sorted by modResource.menuindex, ASC
0.0006011: SQL prepared "SELECT SQL_CALC_FOUND_ROWS `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`.`content`, `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 `modx_site_content` AS `modResource` WHERE  (  ( `modResource`.`parent` IN (1,6,7,8,9,10,11,4,3,2) OR `modResource`.`id` IN (1,6,7,8,9,10,11,4,3,2) )  AND `modResource`.`published` = 1 AND `modResource`.`hidemenu` = 0 AND `modResource`.`deleted` = 0 AND `modResource`.`context_key` = 'web' )  ORDER BY modResource.menuindex ASC "
0.0011301: SQL executed
0.0003099: Total rows: 12
0.0001092: Rows fetched
0.0001609: Returning raw data
0.0000179: Tree was built
0.0000150: Start template tree
0.0014200: Created inline "modChunk" with name "ad22a6773e8643db35baf6e56fa79c5d"
0.0016170: Created inline "modChunk" with name "f740ee02c84d926aea0dd1da693c7bc4"
0.0002789: Created inline "modChunk" with name "9a702cd93356447e6788156aba8d7d10"
0.0033052: End template tree
0.0363512: Total time
4 194 304: Memory usage


А теперь произойдет неожиданное:
При добавлении параметра where, что-то ломается и pdoMenu игнорирует level:
{$_modx->runSnippet('!pdoMenu', [
            'parents' => 0,
            'level' => 2,
	    'where' => '{"parent:!=":9}',
])}

0.0096920: pdoTools loaded
0.0000279: xPDO query object created
0.0002291: Added selection of modResource: SQL_CALC_FOUND_ROWS `id`, `type`, `contentType`, `pagetitle`, `longtitle`, `description`, `alias`, `link_attributes`, `published`, `pub_date`, `unpub_date`, `parent`, `isfolder`, `introtext`, `content`, `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.0000250: Processed additional conditions
0.0002391: Added where condition: parent:!==9, modResource.published=1, modResource.hidemenu=0, modResource.deleted=0, modResource.context_key=web
0.0000770: Sorted by modResource.menuindex, ASC
0.0002990: SQL prepared "SELECT SQL_CALC_FOUND_ROWS `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`.`content`, `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 `modx_site_content` AS `modResource` WHERE  ( `modResource`.`parent` != 9 AND `modResource`.`published` = 1 AND `modResource`.`hidemenu` = 0 AND `modResource`.`deleted` = 0 AND `modResource`.`context_key` = 'web' )  ORDER BY modResource.menuindex ASC "
0.0007300: SQL executed
0.0000939: Total rows: 16
0.0002019: Rows fetched
0.0001600: Returning raw data
0.0000160: Tree was built
0.0000091: Start template tree
0.0007699: Created inline "modChunk" with name "ad22a6773e8643db35baf6e56fa79c5d"
0.0013142: Created inline "modChunk" with name "f740ee02c84d926aea0dd1da693c7bc4"
0.0001838: Created inline "modChunk" with name "496d0378e05b9873977cb2610f9aadf5"
0.0029252: End template tree
0.0172060: Total time
4 194 304: Memory usage

Это баг, фича или собственный затуп?
Роман Ильин
04 сентября 2017, 08:21
modx.pro
1
1 363
0

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

Алексей Ерохин
04 сентября 2017, 12:05
+1
Это фича.
Просто параметр where в вашем случаем перекрывает parent, который формируется из level.

Используйте
'parents' => '-9',
    Роман Ильин
    04 сентября 2017, 12:12
    0
    Понял, спасибо!

    Но вариант:
    'parents' => '-9',
    не подходит, т.к. он убирает пункт из меню целиком, а надо только скрыть его детей.

    С какой стороны к этому можно красиво подойти кроме как всем подпунктам ставить «не показывать в меню»?
      Алексей Ерохин
      04 сентября 2017, 12:44
      +1
      Вы можете в parents подставлять первый уровень через pdoResources c вычетом 9 ресурса и указать displayStart=1 в вызове pdoMenu
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    3