Какая-то неверная работа PdoMenu
Приветствую!
Сегодня обнаружил не очень приятную штуку, постараюсь объяснить, а потом Вы мне почему оно так))
НеБонятка №1
1. Тест сайт на modhost, в нем два ресурса и шаблон в котором только вызывается PdoMenu и плейсходеры

2. Написал простейший сниппет addDescription
3. Вставляем вызов сниппета addDescription в контент страницы test 1, заметьте что description пустой.

4. По логике, открыв эту страницу должны получить одну запись в description. Чтож пробуем открыть на фронте:

Как видно на скриншоте, в результате появляются еще две непонятных записи.
5. Пробуем еще, очищаем description страницы test 1, сохраняем. Теперь открываем на фронте страницу Home.
6. Опять же по логике, сниппет addDescription никак не должен был сработать в принципе, т.к. он вызывается на другой странице. Заходим на страницу test 1:

все ок!
7. Заходим на страницу Home, и видим две записи, что очень странно, как минимум потому что addDescription вызывается на другой странице.

Я так понимаю, что pdoMenu подключает content по умолчанию.
Вот такая непонятная для меня ситуация…
НеБонятка №2
Тут проблема в работе параметра prepareSnippet.
1. Добавляем на тот же сайт еще две страницы — Каталог и Контакты
2. Создаем сниппет pdoChange

4. В этом сниппете происходит подмена menutitle и для достоверности подмена id, результат такой:

Как видим страница Test 1 не подменилась. К слову на другом сайте не подменялась страница с id = 1.
5. Пробуем добавить еще 2-е страницы, результат такой же:

Почему говорю про PdoMenu, заменив вызов PdoMenu на PdoResources с изменением
Добавляется запись только когда есть параметр &includeContent=`1`, добавляется 1 запись, тут еще как-то можно понять потому что я подключаю контент и срабатывает addDescription, и происходит обновление текущего ресурса.
С другими сниппетами не пробовал, надеюсь все с ними норм :)
Вот такие непонятные пироги
Объяснить пожалуйста почему так происходит?
Сегодня обнаружил не очень приятную штуку, постараюсь объяснить, а потом Вы мне почему оно так))
НеБонятка №1
1. Тест сайт на modhost, в нем два ресурса и шаблон в котором только вызывается PdoMenu и плейсходеры
2. Написал простейший сниппет addDescription
$modx->resource->description .= "Запись \n";
$modx->resource->save();3. Вставляем вызов сниппета addDescription в контент страницы test 1, заметьте что description пустой.
4. По логике, открыв эту страницу должны получить одну запись в description. Чтож пробуем открыть на фронте:
Как видно на скриншоте, в результате появляются еще две непонятных записи.
5. Пробуем еще, очищаем description страницы test 1, сохраняем. Теперь открываем на фронте страницу Home.
6. Опять же по логике, сниппет addDescription никак не должен был сработать в принципе, т.к. он вызывается на другой странице. Заходим на страницу test 1:
все ок!
7. Заходим на страницу Home, и видим две записи, что очень странно, как минимум потому что addDescription вызывается на другой странице.
Я так понимаю, что pdoMenu подключает content по умолчанию.
Вот такая непонятная для меня ситуация…
НеБонятка №2
Тут проблема в работе параметра prepareSnippet.
1. Добавляем на тот же сайт еще две страницы — Каталог и Контакты
2. Создаем сниппет pdoChange
$row['id'] = 23;
$row['menutitle'] = 'Страница №'.$row['id'];
return serialize($row);3. В шаблоне добавляем вызов PdoMenu с параметром prepareSnippet.4. В этом сниппете происходит подмена menutitle и для достоверности подмена id, результат такой:
Как видим страница Test 1 не подменилась. К слову на другом сайте не подменялась страница с id = 1.
5. Пробуем добавить еще 2-е страницы, результат такой же:
Почему говорю про PdoMenu, заменив вызов PdoMenu на PdoResources с изменением
замена
$row['pagetitle'] = 'Страница №'.$row['id'];Работает все норм, так же и по первой проблеме, записи не добавляются.Добавляется запись только когда есть параметр &includeContent=`1`, добавляется 1 запись, тут еще как-то можно понять потому что я подключаю контент и срабатывает addDescription, и происходит обновление текущего ресурса.
С другими сниппетами не пробовал, надеюсь все с ними норм :)
Вот такие непонятные пироги
Объяснить пожалуйста почему так происходит?
Комментарии: 15
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
По второму, возможно текущий документ не проходит через prepareSnippet. Нужно покопаться в исходниках.
Такое поведение прописано в modScript::process() и отключить его нельзя. Соответственно, все сниппеты всех ресурсов дружно запускаются, что приводит к непредсказуемым последствиям.
В случае pdoResources content по умолчанию не выбирается, а вот в pdoMenu так делать нельзя, иначе сломается работа ресурсов-ссылок.
Так что я добавил экранирование всех тегов массива документа при обработке его в prepareSnippet, по типу Tickets, так что ни один тег больше не запустится.
Думаю, это решит еще массу непонятных глюков при использовании prepareSnippet.
Новая версия уже в репозитории, можно обновляться.
ато я 2-а дня мучился(даже вывело из себя немного:) и не понимал где собака зарыта, только вчера нашел проблему.
Спасибо Василий! и за оперативность конечно огромное спасибо!
Код проверочного сниппета
или там не $row?