Fenom и toPlaceholder

Как я понимаю, феном не сможет прочитать плейсхолдер, установленный сниппетом через toPlaceholder?
Или я что-то упустил?

Мой сниппет:
{$_modx->runSnippet('!pdoField', [
        'id' => $id,
        'field' => 'longtitle',
        'top' => 1,
        'toPlaceholder' => 'placeholder_name',
    ])}
Далее при вызове плейсхолдера:
[[+placeholder_name]] // этот вариант работает
{$placeholder_name} // этот не работает и выбивает весь феном из чанка в сырые теги

И интересно что неважно, каким образом запущен сниппет, через Fenom или обычным способом, плейсхолдер не подхватывается феномом, в то время как другие теги, типа {$pagetitle} работают прекрасно.

В чём может быть загвоздка?
Василий Столейков
29 октября 2015, 05:06
modx.pro
2
8 840
0
Поблагодарить автора Отправить деньги

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

Василий Столейков
29 октября 2015, 08:29
0
Также я заметил, что феном не работает с тв-параметрами, включёнными в &includeTVs сниппета!

Например, есть mFilter2 с параметром:
&includeTVs=`tv_name`
В чанке при вызове
[[+tv_name]] // этот вариант работает
{$tv_name} // этот не работает и выбивает весь феном из чанка в сырые теги

Короче ситуация такая же…
Как решить эту проблему? Или оставить так?
    Василий Наумкин
    29 октября 2015, 08:30
    0
    Если что-то выбивает, то у тебя ошибка синтаксиса, пора бы это уже запомнить.

    Если шаблон не может даже скомпилироваться, то до его выполнения дело вообще не доходит.
      Василий Столейков
      29 октября 2015, 08:44
      0
      Очень странно…
      Не работает никак, ни с получением установленного плейсхолдера, ни с правильным синтаксисом!

      Мне всё же кажется, что проблема в названии плейсхолдера, т.к. он через тире: placeholder-name и tv-name.

      Потому что при подключении тв у mFilter2 без тире, например:
      &includeTVs=`keywords`
      в чанке
      {$keywords} // Работает прекрасно!
        Василий Столейков
        29 октября 2015, 09:01
        0
        Интересно что с нижним подчёркиванием переменной работает:
        {var $placeholder_name = $_modx->getPlaceholder('placeholder-name')}
        {$placeholder_name}
        а с тире нет:
        {var $placeholder-name = $_modx->getPlaceholder('placeholder-name')}
        {$placeholder-name}
          Василий Наумкин
          29 октября 2015, 09:03
          2
          +1
          Ну, наверное так и есть, потому что переменные в PHP (да и вдругих языках) не могут называться через тире. Только через подчёркивание.

          Если речь о ТВ в чанке, то можно так
          Моя ТВшечка: {$_pls['tv-name']}

          Если на странице, то так:
          {var $tv_name = $_modx->getPlaceholder('tv-name')}
          Моя ТВшечка: {$tv_name}
            Василий Столейков
            29 октября 2015, 09:10
            0
            Классно! Спасибо, всё работает!
            Я бы долго ещё думал, пока бы не додумался до тире в сочетании с $_pls[]

            Вопрос полностью решён!
            Василий Столейков
            20 ноября 2015, 09:36
            0
            Интересно что ни один из предложенных вариантов не срабатывает на странице для тв-шки у которой много тире:
            [[*tv-name-of-name-of-other-name]] // работает
            {$_pls['tv-name-of-name-of-other-name']} // не работает
            {$_modx->getPlaceholder('tv-name-of-name-of-other-name')} // не работает
            Никак не завелось. Пришлось переименовывать тв-шку в tv_name_of_name_of_other_name и переписывать все места, где она встречалась.
              Илья Уткин
              20 ноября 2015, 10:58
              +1
              А такой вариант пробовали?
              {$_modx->resource->getTVValue('tv-name-of-name-of-other-name')}
                Василий Столейков
                20 ноября 2015, 11:09
                0
                Ради интереса попробовал. Неа, не работает. Ни с этой тв-шкой ни с другой, нормальной. Доходит до места вызова тега и выдаёт return наверное, т.к. после него ничего не выводит.

                P.S. Хотя по видимому работает, т.к. он спотыкается на сырые теги в вызове Office, видно я там не всё переписал на феном. Удалив его всё заработало, вывело чистый код из базы. Тут я и заметил, что у базы кодировка была неправильной — вывело кракозябры ))).

                Спасибо за ещё один вариант вывода — он обязательно пригодится!
              Василий Столейков
              22 ноября 2015, 16:31
              0
              Как я понимаю, только что установленные плейсхолдеры в феноме не получится ставить в любое место страницы, а строго после вызова сниппета, который устанавливает этот плейсхолдер.
              Вот пример:
              {$_modx->getPlaceholder('totalMy')} // тут НЕ выводит
              
              {$_modx->runSnippet('!getTickets', [
                  'parents' => 0,
                  'totalVar' => 'totalMy',
              ])}
              
              {$_modx->getPlaceholder('totalMy')} // тут выводит
              С modx-плейсхолдерами всё работало, даже если вставить плейсхолдер до вывода сниппета.

              Как обойти этот момент на Феноме? Делать 2 вызова сниппета? Или использовать параметр toPlaceholder (только для pdo-сниппетов)?
                Василий Наумкин
                22 ноября 2015, 16:37
                3
                0
                Парсер MODX работает в цикле до 10 раз, чтобы разобрать все плейсхолдеры. То есть:
                1. Видим [[+totalMy]], значения нет
                2. Видим [[!getTickets]], запускаем, он выставляет значение
                3. Проверяем, что у нас осталось необработанного
                4. Запускаемся еще раз и вот теперь только обрабатываем [[+totalMy]]
                5. Ой, а чего это у меня так всё тормозит?

                Fenom работает один раз и позволяет сохранять работу сниппетов в переменные:
                {set $tickets = $_modx->runSnippet('!getTickets', [
                    'parents' => 0,
                    'totalVar' => 'totalMy',
                ])}
                
                {$_modx->getPlaceholder('totalMy')}
                
                {$tickets}
                  Василий Столейков
                  22 ноября 2015, 16:39
                  0
                  Класс! Супер!
                  Спасибо, всё оказывается проще чем казалось на первый взгляд!
                    TITAN-UZ
                    27 февраля 2019, 12:44
                    0
                    а как указать шаблон на {$_modx->getPlaceholder('totalMy')}
          Василий Наумкин
          29 октября 2015, 08:29
          +2
          В чём может быть загвоздка?
          В том, что только что установленный плейсхолдер нужно получить.
          {var $placeholder_name = $_modx->getPlaceholder('placeholder_name')}
          Как ни странно, это есть даже в документации.
            R2m0x94 (Vasily)
            11 июня 2019, 16:01
            0
            А у меня трудность с чанком вывода
            В чанке mFilter2 установлен {include 'chunk-name'} с множеством модификаторов на замену внутри
            [[+title:replace=`==`:replace=`и==так далее`]]
            Как задать вариацию в таком случае, чтобы не клонировать одни и те же чанки в которых [[+tv.myTV:replace=`==`]] замены уже существуют в чанке с +title? Делаю так — результат по параметру {$_pls['myTV']} не выводит
            {var $title = $_modx->getPlaceholder('myTV')}
            R2m0x94 (Vasily)
            11 июня 2019, 16:27
            0
            {var $title = $_pls['tv.myTV']} // var не работает
            {set $title = $_pls['tv.myTV']} // и set не работает
              Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
              20