Какая-то неверная работа 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
Василий, дай пожалуйста комментарий по этому поводу
Это бесплатный компонент, не нравится, не используй, или дай объявление в раздел объявлений о работе.
Что значит не используй? Если действительно есть баг, в интересах самого разработчика узнать о нем и исправить. Обратная связь всегда должна быть.
Это бесплатный компонент, не нравится, не используй, или дай объявление в раздел объявлений о работе.Как-то Вы не правильно судите, я пытаюсь разобраться в баге(если конечно он таковой) не только для себя ведь, а Вы говорите бросай и принимай как есть. Странный Вы человек.
Это был ответ Василия, он так всегда отвечает по всем своим бесплатным компонентам. В т.ч. и по откровенным багам.
Смешно такое видеть в свете комментария Василия ниже.
Ай-яй-яй, какой плохой Василий! Баги не хочет исправлять!
Что-то ты мне тоже не нравишься, на минус!
Мне кажется, что $modx->resource относится к тому документу который вы открываете, и если вы открываете Home, то и меняться description будет у home.
По второму, возможно текущий документ не проходит через prepareSnippet. Нужно покопаться в исходниках.
По второму, возможно текущий документ не проходит через prepareSnippet. Нужно покопаться в исходниках.
Да это так. Я это понимал, но я не понимал почему открыв страницу home запускался сниппет другого ресурса т.е. test 1.
На разных хостингах и сайтах пробовал, всегда 1 не обрабатывается. Версия конечно была свежая, до обновления от Василия :)
Неприятный сирприз, но при запуске &prepareSnippet весь обрабатываемый массив информации, включая все теги в теле ресурса, проходит через парсер MODX.
Такое поведение прописано в modScript::process() и отключить его нельзя. Соответственно, все сниппеты всех ресурсов дружно запускаются, что приводит к непредсказуемым последствиям.
В случае pdoResources content по умолчанию не выбирается, а вот в pdoMenu так делать нельзя, иначе сломается работа ресурсов-ссылок.
Так что я добавил экранирование всех тегов массива документа при обработке его в prepareSnippet, по типу Tickets, так что ни один тег больше не запустится.
Думаю, это решит еще массу непонятных глюков при использовании prepareSnippet.
Новая версия уже в репозитории, можно обновляться.
Такое поведение прописано в modScript::process() и отключить его нельзя. Соответственно, все сниппеты всех ресурсов дружно запускаются, что приводит к непредсказуемым последствиям.
В случае pdoResources content по умолчанию не выбирается, а вот в pdoMenu так делать нельзя, иначе сломается работа ресурсов-ссылок.
Так что я добавил экранирование всех тегов массива документа при обработке его в prepareSnippet, по типу Tickets, так что ни один тег больше не запустится.
Думаю, это решит еще массу непонятных глюков при использовании prepareSnippet.
Новая версия уже в репозитории, можно обновляться.
Обновился, все решилось.
ато я 2-а дня мучился(даже вывело из себя немного:) и не понимал где собака зарыта, только вчера нашел проблему.
Спасибо Василий! и за оперативность конечно огромное спасибо!
ато я 2-а дня мучился(даже вывело из себя немного:) и не понимал где собака зарыта, только вчера нашел проблему.
Спасибо Василий! и за оперативность конечно огромное спасибо!
Василий, подскажи пожалуйста, почему не работает prepareSnippet у pdoField?
Код проверочного сниппета
Код проверочного сниппета
$modx->log(1,print_r($row,true));
или там не $row?
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.