Какая-то неверная работа PdoMenu

Приветствую!
Сегодня обнаружил не очень приятную штуку, постараюсь объяснить, а потом Вы мне почему оно так))

НеБонятка №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, и происходит обновление текущего ресурса.

С другими сниппетами не пробовал, надеюсь все с ними норм :)

Вот такие непонятные пироги
Объяснить пожалуйста почему так происходит?
Константин Ильин
19 октября 2016, 15:14
modx.pro
2 542
+2

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

Константин Ильин
19 октября 2016, 23:57
+1
Василий, дай пожалуйста комментарий по этому поводу
    Евгений
    20 октября 2016, 00:47
    -5
    Это бесплатный компонент, не нравится, не используй, или дай объявление в раздел объявлений о работе.
      Алексей
      20 октября 2016, 05:26
      +1
      Что значит не используй? Если действительно есть баг, в интересах самого разработчика узнать о нем и исправить. Обратная связь всегда должна быть.
        Константин Ильин
        20 октября 2016, 07:19
        +2
        Это бесплатный компонент, не нравится, не используй, или дай объявление в раздел объявлений о работе.
        Как-то Вы не правильно судите, я пытаюсь разобраться в баге(если конечно он таковой) не только для себя ведь, а Вы говорите бросай и принимай как есть. Странный Вы человек.
          Евгений
          21 октября 2016, 01:10
          -1
          Это был ответ Василия, он так всегда отвечает по всем своим бесплатным компонентам. В т.ч. и по откровенным багам.
            Воеводский Михаил
            21 октября 2016, 01:54
            +2
            Смешно такое видеть в свете комментария Василия ниже.
              Павел Гвоздь
              21 октября 2016, 02:01
              +1
              Ай-яй-яй, какой плохой Василий! Баги не хочет исправлять!
            DimenSi
            20 октября 2016, 08:25
            0
            Что-то ты мне тоже не нравишься, на минус!
          Дмитрий Меркурьев
          20 октября 2016, 13:44
          0
          Мне кажется, что $modx->resource относится к тому документу который вы открываете, и если вы открываете Home, то и меняться description будет у home.
          По второму, возможно текущий документ не проходит через prepareSnippet. Нужно покопаться в исходниках.
            Константин Ильин
            20 октября 2016, 14:21
            0
            Да это так. Я это понимал, но я не понимал почему открыв страницу home запускался сниппет другого ресурса т.е. test 1.
            Дмитрий Меркурьев
            20 октября 2016, 13:59
            0
            По второму пункту повторил у себя ваш вариант, все вывелось без ошибок. Может версия pdoTools устаревшаяя?
              Константин Ильин
              20 октября 2016, 14:13
              0
              На разных хостингах и сайтах пробовал, всегда 1 не обрабатывается. Версия конечно была свежая, до обновления от Василия :)
              Василий Наумкин
              20 октября 2016, 14:02
              +4
              Неприятный сирприз, но при запуске &prepareSnippet весь обрабатываемый массив информации, включая все теги в теле ресурса, проходит через парсер MODX.
              Такое поведение прописано в modScript::process() и отключить его нельзя. Соответственно, все сниппеты всех ресурсов дружно запускаются, что приводит к непредсказуемым последствиям.

              В случае pdoResources content по умолчанию не выбирается, а вот в pdoMenu так делать нельзя, иначе сломается работа ресурсов-ссылок.

              Так что я добавил экранирование всех тегов массива документа при обработке его в prepareSnippet, по типу Tickets, так что ни один тег больше не запустится.
              Думаю, это решит еще массу непонятных глюков при использовании prepareSnippet.

              Новая версия уже в репозитории, можно обновляться.
                Константин Ильин
                20 октября 2016, 14:19
                +1
                Обновился, все решилось.
                ато я 2-а дня мучился(даже вывело из себя немного:) и не понимал где собака зарыта, только вчера нашел проблему.
                Спасибо Василий! и за оперативность конечно огромное спасибо!
                  Константин Ильин
                  15 декабря 2017, 17:30
                  0
                  Василий, подскажи пожалуйста, почему не работает prepareSnippet у pdoField?

                  Код проверочного сниппета
                  $modx->log(1,print_r($row,true));
                  или там не $row?
                  Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                  15