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 — да
Благодарю. Все ок. Насколько это чревато для безопасности?
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.