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
2
3 349
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
            2
            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 не работает
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.