Fenom не работает с некоторыми сниппетами?

Не могу понять, почему феном отказывается работать с некоторыми сниппетами наотрез.
Я столкнулся пока что с двумя нерабочими сниппетами, это BabelLinks для переключения языков и Personalize для вывода информации нужным группам.

BabelLinks
Бывший вызов
<ul class="lang"> 
    [[!BabelLinks?
        &tpl =`tpl.babelLink.new`
        &showCurrent = `1`
        &ignoreSiteStatus = `1`
    ]] 
</ul>
переделан на
<ul class="lang">
    {$_modx->runSnippet('!BabelLinks', [
        'tpl' => 'tpl.babelLink.new',
        'showCurrent' => 1,
        'ignoreSiteStatus' => 1,
    ])}  
</ul>
где чанк tpl.babelLink.new переделан под свои нужды. Первый вариант рабочий, второй нет.
Для проверки сделал чанк tpl.babelLink.new простейшим, чтобы чисто вывести теги:
{$url} - {$_modx->getPlaceholder('url')} - {$_pls['url']} // все 3 варианта выводят одно и то же
Так вот сниппет через MODX выводит правильные урлы, а через Fenom выводит пустоту.

Personalize
Тут точно такая же история, один в один. Работает только если вызвать сниппет через MODX, а чанк через Fenom.
[[!Personalize?
    &yesChunk=`yes`
    &allowedGroups=`Administrator`
]]
Раньше у меня было &yesChunk=`@CODE: код чанка`. Но переписав на Fenom, пришлось убрать это в чанк yes, т.к. "@CODE:" (аналог @INLINE) не работал.

Как можно решить эту проблему? Оба сниппета мне нужны. И оба хочу переписать полностью на Fenom.
Может есть другой вариант сниппета? Или нужно будет копаться в коде сниппетов и переписать их?
Василий Столейков
24 ноября 2015, 16:01
modx.pro
2
5 807
+1
Поблагодарить автора Отправить деньги

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

Василий Наумкин
24 ноября 2015, 19:24
0
В $_modx->runSnippet нет ничего хитрого или необычного, это обычный modX::runSnippet.

Думаю, заморочки в самих сниппетах. Возможно, они рассчитывают на рекурсивный парсер или что-то такое.
    Василий Столейков
    24 ноября 2015, 19:27
    0
    Я тоже к этому склоняюсь… Попробую сниппеты ковырять, хотя это не совсем кошерно и бьёт по моим воспитанным на обновления привычкам…
      Василий Наумкин
      24 ноября 2015, 19:31
      0
      Ссылку на перевод можно генерировать и своим сниппетом (используется на docs.modx.pro). Personalize и вовсе не нужен.

      Не вижу проблем, в общем =)
        Василий Столейков
        24 ноября 2015, 19:35
        0
        Да, я забыл про твой сниппет, но у него немного другая специфика работы:
        Обязательное условие — одинаковые uri ресурсов в разных контекстах. Если нет соответствия, то ссылка будет в корень контекста.
        А у меня весь сайт повязан жёстко на Babel и у каждого языка свои uri, в завсимости от языка (транслит на русском, а на других уже латиница, типа «o-nas.html» и «about-us.html»)…
          Василий Столейков
          24 ноября 2015, 19:38
          0
          Буду наверное свой сниппет на основе BabelLinks писать, т.к. значения страниц других контекстов хранятся в тв-шке бабела.
            Василий Наумкин
            24 ноября 2015, 19:40
            +1
            Да там делов на 15 минут — просто один запрос с join ТВшки.
              Василий Столейков
              24 ноября 2015, 19:43
              0
              Ага, спасибо что помог по полочкам всё разложить. Буду сниппет писать. У меня уйдёт«чуть» больше 15 минут, но думаю сделать смогу.
      Василий Столейков
      24 ноября 2015, 19:25
      0
      Сейчас снова проверил @CODE: у Personalize он срабатывает при схеме что выше, сниппет на MODX.
        Василий Наумкин
        24 ноября 2015, 19:29
        0
        А он тебе вообще зачем? $_modx->isAuthenticated() чем не подходит?
        {if $_modx->isAuthenticated($_modx->context.key)}
        	Твой yesChunk
        {else}
        	Твой noChunk
        {/if}
          Василий Столейков
          24 ноября 2015, 19:32
          0
          Я его использую уже вместо Personalize там, где нужно выводить авторизованным и неавторизованным.
          Но ещё мне нужно выводить чётко по группам. Есть групп 6 пользователей, каждой из которых нужно выводить своё…
            Василий Наумкин
            24 ноября 2015, 19:33
            +1
            Ага, а про isMember-то я и забыл.

            Постараюсь завтра сделать.
              Василий Столейков
              24 ноября 2015, 19:37
              0
              Ух ты, а за это отдельное спасибо!!! ВЕСЬМА нужная вещь в феноме!
                Василий Наумкин
                24 ноября 2015, 19:43
                3
                +3
                Уже можно обновляться =)

                {if $_modx->isMember('Users')}
                	Для юзеров
                {else}
                	Для всех остальных
                {/if}
                  Василий Столейков
                  24 ноября 2015, 19:44
                  0
                  УАУ! Вот это скорость! Спасибо!
                  А можно пример использования?
                    Василий Столейков
                    24 ноября 2015, 19:45
                    0
                    А, вижу в логах изменений инструкция!
                      Василий Столейков
                      24 ноября 2015, 19:47
                      0
                      Но инструкцию с примерами на docs.modx.pro тоже жду. А для чего getPlaceholders нужен?
                      - [Fenom] Added {$_modx->isMember($groups, $macthAll)}.
                      - [Fenom] Added {$_modx->getPlaceholders()}.
                        Василий Наумкин
                        24 ноября 2015, 19:53
                        +1
                        Ну, там про них как-бы уже написано =) Если хочешь что-то добавить — на здоровье.

                        А getPlaceholders возвращает массив со всеми текущими плейсхолдерами. Просто для коллекции, мало ли.
                          Василий Столейков
                          24 ноября 2015, 19:55
                          +1
                          Неплохо! Спасибо за быструю реакцию и развитие шаблонизатора, я в него по уши влюбился уже…
                    Fi1osof
                    25 ноября 2015, 16:03
                    1
                    +1
                    isMember — злое зло. Он использует modUser::getUserGroupNames(), который группы получает из сессии пользователя. В итоге, не редки ситуации, когда пользоветелю меняешь группы (чтобы права сменить), а у него ничего не меняется, потому что у него уже сессия была начата, и пока он не перелогинется (или ему не сбросят сессию), isMember не увидит изменения групп.
                    На практике это доставляет не мало хлопот. Потому лучше написать свой небольшой запрос на проверку присутствия в группе, кешируемую, и при изменении прав просто сброс кеша актуализирует информацию.
                      Василий Столейков
                      25 ноября 2015, 16:05
                      0
                      Запрос напрямую в базу?
                        Fi1osof
                        25 ноября 2015, 16:08
                        0
                        Именно так. Оттуда и MODX берет данные для сессии, когда стартует ее. Но какой с этим минус есть, я выше написал.
                          Василий Столейков
                          25 ноября 2015, 16:10
                          0
                          Да, спасибо за ценную информацию!

                          Я думаю, что можно использовать и isMember в некоторых ситуациях, особенно тогда, когда не планируется частая смена групп — допустим только пару менеджеров. Тогда isMember будет быстрее.
                          А уже в случае когда нужно более плотно работать с группами и перемещением в них пользователей, тогда да, лучше прямо в базу.

                          Спасибо за этот ньюанс!
                            Fi1osof
                            25 ноября 2015, 16:13
                            0
                            Да, я не говорю, что его вообще не стоит использовать. Но вот из-за этого подводного камня действительно можно потом голову сломать почему права не меняются. Потому на заметку. В общем, если юзаете его и что-то идет не так — пробуйте полный сброс всех сессий через админку, потому как пункт «Перезагрузить права доступов» не поможет.
                              Василий Столейков
                              25 ноября 2015, 16:15
                              0
                              Ок, спасибо что показал как он работает. Будем иметь это в виду!
                                Fi1osof
                                25 ноября 2015, 16:15
                                0
                                Не за что.
                            Сергей Шлоков
                            25 ноября 2015, 16:58
                            1
                            +2
                            Боб Рей уже писал как решить данную проблему. Так что не надо никаких сбросов сессий.
                              Василий Столейков
                              25 ноября 2015, 17:02
                              0
                              Спасибо за ссылку! Очень интересно.
                                Fi1osof
                                25 ноября 2015, 17:10
                                -1
                                Это «решение» только для текущего пользователя. А если вы сменили группу тысячи пользователям за раз?

                                Еще раз: нравится использовать isMember — используйте. У вас ведь, видимо, как минимум пятилетний опыт с MODX и вы уже все возможные шишки набили.
                          Воеводский Михаил
                          25 ноября 2015, 16:56
                          +1
                          Было дело, долго очень выносила мне мозг эта непонятность с группами. Один из моментов, которые приучили в любой непонятной ситуации читать исходники вместо бессмысленных экспериментов.
                  Олег
                  20 июня 2017, 16:26
                  0
                  У меня тоже сниппет BabelLinks через FENOM не работает — плейсхолдеры в чанке для 'tpl' — пустые. Тема, я смотрю, плавно ушла от основного вопроса. Решения нет? Это глюк Fenom? Я просто решил все свои чанки и шаблоны перевести на Fenom, а вот теперь уже сомневаюсь, стоит ли (вдруг какие-то компоненті Modx перестанут нормально работать, вот как Babel...)
                    Владимир
                    20 июня 2017, 16:31
                    0
                    BabelLinks через FENOM у меня работает
                    {$_modx->runSnippet('!BabelLinks', [ 'showCurrent' => 1, ])}
                      Олег
                      20 июня 2017, 17:04
                      0
                      У меня такая запись тоже работает. А вот с использованием шаблона в виде чанка (параметр 'tpl') — не работает!
                      Вызов сниппета в голове документа:
                      {$_modx->runSnippet('!BabelLinks', [
                      	'showCurrent' => 0,
                      	'tpl' => 'babelLinkAlternate.tpl',
                      ])}
                      Чанк шаблона для вывода результата:
                      <link rel="alternate" hreflang="{$cultureKey}" href="{$url}">
                      Результат вывода:
                      <link rel="alternate" hreflang="" href="">
                        Василий Столейков
                        20 июня 2017, 17:10
                        0
                        Я для себя решил проблему так: заглянул в код сниппета и повторил его на феноме.
                        Получилось что-то похожее:
                        {set $babel = $_modx->resource.id|resource:'babelLanguageLinks'}
                                        {if $babel}
                                            {set $ctx_explode = $babel|split:';'}
                                            {foreach $ctx_explode as $ctx_res}
                                                {set $res_explode = $ctx_res|split:':'}
                                        		{set $contextKey = $res_explode.0 }
                                        		{set $resourceId = intval($res_explode.1) }
                                        		
                                        		{if $contextKey == 'web'}{set $cultureKey = 'ru'}
                                        		{elseif $contextKey == 'com-stil-ro'}{set $cultureKey = 'ro'}
                                        		{elseif $contextKey == 'com-stil-en'}{set $cultureKey = 'en'}{/if}
                                        		
                                        		{if $resourceId}
                                            		        <li><a href="{$resourceId|url}" {if $_modx->context.key == $contextKey} class="active"{/if}><span>{$cultureKey}</span></a></li>
                                            	        {/if}
                                            	
                                            {/foreach}                    
                                        {/if}
                          Олег
                          20 июня 2017, 17:20
                          0
                          Это костыль. Нужно понять, в чём всё-таки проблема, чтобы исправить её либо на уровне BabelLinks, либо на уровне реализации Fenom в pdoTools. Неясно, каким ещё боком и в каких компонентах эта проблема может проявиться, а это опасно для production.
                        Андрей
                        20 июня 2017, 17:39
                        0
                        В BabelLinks вызывается стандартный парсер modx, а не pdoParser, поэтому и не работает, используйте стандартные плейсхолдеры [[+cultureKey]].

                        Либо в сниппете подключите сервис pdotools и всю обработку чанков производите через него.
                          Олег
                          20 июня 2017, 17:56
                          0
                          Спасибо!
                            Андрей
                            20 июня 2017, 18:13
                            1
                            +1
                            Да, сейчас проверил, в сниппете BabelLinks в начале пишете

                            $pdo = $modx->getService('pdoTools');
                            
                            //далее в сниппете меняете в трех местах $babel->getChunk на $pdo->getChunk

                            И все, теперь сниппет поддерживает fenom
                              Владимир Ребров
                              13 апреля 2018, 12:18
                              0
                              У меня:
                              [pdoTools] Could not load snippet "intval"
                              Подскажите, пожалуйста, как исправить?
                                Володя
                                13 апреля 2018, 13:15
                                +1
                                Разрешить php в fenom. Настройка pdotools_fenom_phpда
                                  Владимир Ребров
                                  13 апреля 2018, 15:03
                                  0
                                  Благодарю. Все ок. Насколько это чревато для безопасности?
                    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                    41