Не работает fenom
Подскажите. Только недавно столкнулся с fenom. Есть код в начале сайте
$user_role = '';
if (!isset($_SESSION['user_role'])){
$roles = ['student','teacher'];
foreach ($roles as $role){
if ($modx->user->isMember($role)){
$_SESSION['user_role'] = $role;
$user_role = $role;
break;
}
}
} else {
$user_role = $_SESSION['user_role'];
}
$modx->setPlaceholder('user_role',$user_role);
А после этого с помощью fenom пытаюсь получить плейсхолдер и ничего не выводит — пустота{$_modx->getPlaceholder('user_role')}
Скажите в чем может быть проблема? Комментарии: 24
А стандартный синтаксис, выводит?
Ну если напишу [[+user_role]] то да.
А если попробовать
{$user_role}
или {$pls['user_role']}
Тоже ничего.
Опечатался. Надо так
{$_pls['user_role']}
Тут хорошая шпаргалка по fenom в modx igamov.ru/blog/fenom-modx
Нет тоже не работает. А шпаргалку — да, видел уже. Мне понравилось. После нее можно сказать и начал изучать пароль.
Хорошо. Это конечно не принципиально, но все равно вопрос не решен. Я начал это делать через fenom по одной простой причине. Не могу выполнить условие с помощью phx.
И еще вопрос как я понял, если представить, что этот код работоспособен то на сколько я знаю выполняются оба кода и в then и в else но потом выбирается и выводится из них который правильный. Так ли это? И при использовании fenom такого не происходит?
[[+user_role:is=`student`:then=`
[[!getImageList?
&tvname=`migx_contact`
&tpl=`tplContact`
&wrapperTpl=`@CODE:<div id="contacts" class="flx">[[+output]]</div>`
&where=`{ "title:!=":"", "phone:!=":"", "email:!=":"" }`
]]
<h2 class="h1">Преподаватели</h2>
[[!pdoUsers?
&groups=`teacher`
&tpl=`tplTeachers`
&tplWrapper=`@INLINE <div id="teachers">[[+output]]</div>`
]]
`:else=`
[[!pdoUsers?
&groups=`student`
&tpl=`tplStudent`
&tplWrapper=`@INLINE <div id="student">[[+output]]</div>`
]]
`]]
Ну и в результате непонятных мне причин то ли изза кавычек типа (`) не выполняются снипеты. Я конечно понимаю что можно создать чанки и в них уже написать то что содержится в then и в else, но на мой взгляд это глупо делать ради 3х строчек кода. Есть ли решение по этому поводу? И еще вопрос как я понял, если представить, что этот код работоспособен то на сколько я знаю выполняются оба кода и в then и в else но потом выбирается и выводится из них который правильный. Так ли это? И при использовании fenom такого не происходит?
Если рассматривать на fenom, то в похожей ситуации делаю так:
Для getImageList у меня расписывается по другому — через {foreach $migx_contact as $contact}{/foreach}, там уже условия &where=`{ «title:!=»:"", «phone:!=»:"", «email:!=»:"" }`.
Если брать Ваш код то:
Каждый кусок кода записываю в переменную по принципу(посмотри принадлежность к группе, не помню точно код, щас пишу под id) —
Для getImageList у меня расписывается по другому — через {foreach $migx_contact as $contact}{/foreach}, там уже условия &where=`{ «title:!=»:"", «phone:!=»:"", «email:!=»:"" }`.
Если брать Ваш код то:
Каждый кусок кода записываю в переменную по принципу(посмотри принадлежность к группе, не помню точно код, щас пишу под id) —
{var $id=$_modx->resource.id}
{var $imagelist=$_modx->runSnippet('!getImageList', [...]}
,{var $users=$_modx->runSnippet('!pdoUsers', [...]}
{var $users2=$_modx->runSnippet('!pdoUsers', [...]}
, и дальше вывод {if $id}
<div >
{$imagelist}
{$users}
</div>
{else}
<div >
{$imagelist}
{$users2}
</div>
{/if}
Это как идея, возможно коллеги поправят если где то ошибся. users — для преподавателей, users2 — для студентов
Спасибо. Подход очень хороший. Я бы скорее всего переменные для снипетов не создавал — лишняя память. Хотя возможно я не прав. А по поводу выполнения частей не в курсе? Оба куска условия выполняются или только один, который истина?
переменные создаю когда нужна проверка что сниппет дал результат, т.е. {if $users2} и т.д. На 2 вопрос точно не отвечу, скорее всего проверка — потом вызов из нужного куска.
Спасибо большое. Но к сожалению fenom пока еще не работает. Есть варианты почему не показывается плейсхолдер?
А как ты его вызываешь в принципе? а главное зачем? у тебя пользователь авторизовался на сайте, т.е. у тебя есть его id-шник из базы, в базе же есть инфа к какой группе он принадлежит. разве нет?
Ну так то оно так. Но я записываю просто его в сессию. Чтобы лишний раз к БД не обращаться. И после этого создаю плейсхолдер. А так к примеру допустим у меня 3 пользователя. Мне придется 3 условия писать isMember. И опять же это 3 обращения каждый раз.
а как ты вообще с фронтэнда пишешь сессию? и пишешь ли?
попробуй из сессии читать не плейсхолдером, а через глобальную сессию. либо писать js и читать {var $sess_marka = $.cookie['choosed_marka']}.
попробуй из сессии читать не плейсхолдером, а через глобальную сессию. либо писать js и читать {var $sess_marka = $.cookie['choosed_marka']}.
Супер. Вот это уже точно помогло!
В данном случае выполнятся оба куска т.к. сниппеты записаны в переменные, но на мой взгляд разницы в памяти большой не будет.
Все это дело можно оформить в сниппет. С телефона конечно ад всё это набирать
$user_role = '';
if (!isset($_SESSION['user_role'])){
$roles = ['student','teacher'];
foreach ($roles as $role){
if ($modx->user->isMember($role)){
$_SESSION['user_role'] = $role;
$user_role = $role;
break;
}
}
} else {
$user_role = $_SESSION['user_role'];
}
$ur = $modx->setPlaceholder('user_role',$user_role);
$getimage = $_modx->runSnippet('!getImageList', [...]);
$student = $_modx->runSnippet('!pdoUsers', [...]);
$prepod = $_modx->runSnippet('!pdoUsers',[...]);
if($ur == 'student') {
return $getimage.$student;
} else {
return $prepod;
}
Назвать снипет к примеру Users и вывести{'!Users' | snippet}
По желанию можно заморочиться и добавить обработку чанков, но это на быструю руку накидал с телефона.
Да, так и правда проще и красивее чем из наших кусков)) спасибо за компоновку идей)
Спасибо. Но опять не подходит. Сниппет который отдельно у меня написан он в каждом шаблоне почти. Потому что в зависимости от роли пользователя будет выводиться различный контент, ну а соответственно вызываться различные сниппеты или одинаковые сниппеты с разными параметрами. Это все чтобы не плодить шаблоны которых и так не мало. А тут в таком варианте еще и сниппеты(одноразовые) плодить.
почему? у тебя есть 1 сниппет который учитывает сессию и выводит код в зависимости от роли. что мешает написать в этот сниппет все возможные варианты и выводить только его? какие одноразовые сниппеты ты имеешь в виду?
Допустим. Но тогда получается заводить еще один параметр. К примеру работать с ним с помощью switch case в зависимости от шаблона. Так то можно, но это +1 переменная и +1условие. Когда в принципе условием уже является выбор шаблона. Вариант рабочий, но усложненный на мой взгляд.
Не спорю что усложнённый, но сокращает время и даёт больше контроля. на мой взгляд это куда эффективнее чем раскидывать инфу по всем шаблонам. ±1 переменная и ±1 условие для сложного сайта на мой взгляд не критично, если их и так уже больше сотни…
Спасибо большое за помощь.
Не за что)
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.