Fenom не работает с некоторыми сниппетами?
        Не могу понять, почему феном отказывается работать с некоторыми сниппетами наотрез.
Я столкнулся пока что с двумя нерабочими сниппетами, это BabelLinks для переключения языков и Personalize для вывода информации нужным группам.
BabelLinks
Бывший вызов
Для проверки сделал чанк tpl.babelLink.new простейшим, чтобы чисто вывести теги:
Personalize
Тут точно такая же история, один в один. Работает только если вызвать сниппет через MODX, а чанк через Fenom.
Но переписав на Fenom, пришлось убрать это в чанк yes, т.к. "@CODE:" (аналог @INLINE) не работал.
Как можно решить эту проблему? Оба сниппета мне нужны. И оба хочу переписать полностью на 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.
Может есть другой вариант сниппета? Или нужно будет копаться в коде сниппетов и переписать их?
Комментарии: 41
                В $_modx->runSnippet нет ничего хитрого или необычного, это обычный modX::runSnippet.
Думаю, заморочки в самих сниппетах. Возможно, они рассчитывают на рекурсивный парсер или что-то такое.
                    Думаю, заморочки в самих сниппетах. Возможно, они рассчитывают на рекурсивный парсер или что-то такое.
                Я тоже к этому склоняюсь… Попробую сниппеты ковырять, хотя это не совсем кошерно и бьёт по моим воспитанным на обновления привычкам…            
                    
                Ссылку на перевод можно генерировать и своим сниппетом (используется на docs.modx.pro). Personalize и вовсе не нужен.
Не вижу проблем, в общем =)
                    Не вижу проблем, в общем =)
                Да, я забыл про твой сниппет, но у него немного другая специфика работы:
                    Обязательное условие — одинаковые uri ресурсов в разных контекстах. Если нет соответствия, то ссылка будет в корень контекста.А у меня весь сайт повязан жёстко на Babel и у каждого языка свои uri, в завсимости от языка (транслит на русском, а на других уже латиница, типа «o-nas.html» и «about-us.html»)…
                Буду наверное свой сниппет на основе BabelLinks писать, т.к. значения страниц других контекстов хранятся в тв-шке бабела.            
                    
                Да там делов на 15 минут — просто один запрос с join ТВшки.            
                    
                Ага, спасибо что помог по полочкам всё разложить. Буду сниппет писать. У меня уйдёт«чуть» больше 15 минут, но думаю сделать смогу.            
                    
                Сейчас снова проверил @CODE: у Personalize он срабатывает при схеме что выше, сниппет на MODX.            
                    
                А он тебе вообще зачем? $_modx->isAuthenticated() чем не подходит?
                    {if $_modx->isAuthenticated($_modx->context.key)}
	Твой yesChunk
{else}
	Твой noChunk
{/if}            
                Я его использую уже вместо Personalize там, где нужно выводить авторизованным и неавторизованным. 
Но ещё мне нужно выводить чётко по группам. Есть групп 6 пользователей, каждой из которых нужно выводить своё…
                    Но ещё мне нужно выводить чётко по группам. Есть групп 6 пользователей, каждой из которых нужно выводить своё…
                Ага, а про isMember-то я и забыл.
Постараюсь завтра сделать.
                    Постараюсь завтра сделать.
                Ух ты, а за это отдельное спасибо!!! ВЕСЬМА нужная вещь в феноме!            
                    
                Уже можно обновляться =)
                    {if $_modx->isMember('Users')}
	Для юзеров
{else}
	Для всех остальных
{/if}            
                УАУ! Вот это скорость! Спасибо! 
А можно пример использования?
            
                    А можно пример использования?
                А, вижу в логах изменений инструкция!            
                    
                Но инструкцию с примерами на docs.modx.pro тоже жду. А для чего getPlaceholders нужен?
                    - [Fenom] Added {$_modx->isMember($groups, $macthAll)}.
- [Fenom] Added {$_modx->getPlaceholders()}.            
                Ну, там про них как-бы уже написано =) Если хочешь что-то добавить — на здоровье.
А getPlaceholders возвращает массив со всеми текущими плейсхолдерами. Просто для коллекции, мало ли.
                    А getPlaceholders возвращает массив со всеми текущими плейсхолдерами. Просто для коллекции, мало ли.
                Неплохо! Спасибо за быструю реакцию и развитие шаблонизатора, я в него по уши влюбился уже…            
                    
                isMember — злое зло. Он использует modUser::getUserGroupNames(), который группы получает из сессии пользователя. В итоге, не редки ситуации, когда пользоветелю меняешь группы (чтобы права сменить), а у него ничего не меняется, потому что у него уже сессия была начата, и пока он не перелогинется (или ему не сбросят сессию), isMember не увидит изменения групп.
На практике это доставляет не мало хлопот. Потому лучше написать свой небольшой запрос на проверку присутствия в группе, кешируемую, и при изменении прав просто сброс кеша актуализирует информацию.
                    На практике это доставляет не мало хлопот. Потому лучше написать свой небольшой запрос на проверку присутствия в группе, кешируемую, и при изменении прав просто сброс кеша актуализирует информацию.
                Запрос напрямую в базу?            
                    
                Именно так. Оттуда и MODX берет данные для сессии, когда стартует ее. Но какой с этим минус есть, я выше написал.            
                    
                Да, спасибо за ценную информацию!
Я думаю, что можно использовать и isMember в некоторых ситуациях, особенно тогда, когда не планируется частая смена групп — допустим только пару менеджеров. Тогда isMember будет быстрее.
А уже в случае когда нужно более плотно работать с группами и перемещением в них пользователей, тогда да, лучше прямо в базу.
Спасибо за этот ньюанс!
                    Я думаю, что можно использовать и isMember в некоторых ситуациях, особенно тогда, когда не планируется частая смена групп — допустим только пару менеджеров. Тогда isMember будет быстрее.
А уже в случае когда нужно более плотно работать с группами и перемещением в них пользователей, тогда да, лучше прямо в базу.
Спасибо за этот ньюанс!
                Да, я не говорю, что его вообще не стоит использовать. Но вот из-за этого подводного камня действительно можно потом голову сломать почему права не меняются. Потому на заметку. В общем, если юзаете его и что-то идет не так — пробуйте полный сброс всех сессий через админку, потому как пункт «Перезагрузить права доступов» не поможет.            
                    
                Ок, спасибо что показал как он работает. Будем иметь это в виду!            
                    
                Не за что.            
                    
                Боб Рей уже писал как решить данную проблему. Так что не надо никаких сбросов сессий.            
                    
                Спасибо за ссылку! Очень интересно.            
                    
                Это «решение» только для текущего пользователя. А если вы сменили группу тысячи пользователям за раз?
Еще раз: нравится использовать isMember — используйте. У вас ведь, видимо, как минимум пятилетний опыт с MODX и вы уже все возможные шишки набили.
                    Еще раз: нравится использовать isMember — используйте. У вас ведь, видимо, как минимум пятилетний опыт с MODX и вы уже все возможные шишки набили.
                Было дело, долго очень выносила мне мозг эта непонятность с группами. Один из моментов, которые приучили в любой непонятной ситуации читать исходники вместо бессмысленных экспериментов.            
                    
                У меня тоже сниппет BabelLinks через FENOM не работает — плейсхолдеры в чанке для 'tpl' — пустые. Тема, я смотрю, плавно ушла от основного вопроса. Решения нет? Это глюк Fenom? Я просто решил все свои чанки и шаблоны перевести на Fenom, а вот теперь уже сомневаюсь, стоит ли (вдруг какие-то компоненті Modx перестанут нормально работать, вот как Babel...)            
                    
                BabelLinks через FENOM у меня работает
                    {$_modx->runSnippet('!BabelLinks', [ 'showCurrent' => 1, ])}            
                У меня такая запись тоже работает. А вот с использованием шаблона в виде чанка (параметр 'tpl') — не работает! 
Вызов сниппета в голове документа:
                    Вызов сниппета в голове документа:
{$_modx->runSnippet('!BabelLinks', [
	'showCurrent' => 0,
	'tpl' => 'babelLinkAlternate.tpl',
])}Чанк шаблона для вывода результата:<link rel="alternate" hreflang="{$cultureKey}" href="{$url}">Результат вывода:<link rel="alternate" hreflang="" href="">            
                Я для себя решил проблему так: заглянул в код сниппета и повторил его на феноме. 
Получилось что-то похожее:
                    Получилось что-то похожее:
{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}            
                Это костыль. Нужно понять, в чём всё-таки проблема, чтобы исправить её либо на уровне BabelLinks, либо на уровне реализации Fenom в pdoTools. Неясно, каким ещё боком и в каких компонентах эта проблема может проявиться, а это опасно для production.            
                    
                Василий считает что дело в сниппете, т.к. в Fenome ничего особенного нету, обычный вызов сниппета.            
                    
                В BabelLinks вызывается стандартный парсер modx, а не pdoParser, поэтому и не работает, используйте стандартные плейсхолдеры [[+cultureKey]].
Либо в сниппете подключите сервис pdotools и всю обработку чанков производите через него.
                    Либо в сниппете подключите сервис pdotools и всю обработку чанков производите через него.
                Спасибо!            
                    
                Да, сейчас проверил, в сниппете BabelLinks в начале пишете
И все, теперь сниппет поддерживает fenom
                    $pdo = $modx->getService('pdoTools');
//далее в сниппете меняете в трех местах $babel->getChunk на $pdo->getChunkИ все, теперь сниппет поддерживает fenom
                У меня:
                    [pdoTools] Could not load snippet "intval"Подскажите, пожалуйста, как исправить?            
                Разрешить php в fenom. Настройка pdotools_fenom_php — да            
                    
                Благодарю. Все ок. Насколько это чревато для безопасности?            
                    
                            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.