Не работает 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')}
Скажите в чем может быть проблема?
Евгений Лазарев
23 августа 2018, 18:30
modx.pro
1 408
0

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

Баха Волков
23 августа 2018, 19:22
0
А стандартный синтаксис, выводит?
SEQUEL.ONE
24 августа 2018, 10:41
+1
А если попробовать
{$user_role}
или

{$pls['user_role']}
    Евгений Лазарев
    24 августа 2018, 11:05
    0
    Тоже ничего.
      SEQUEL.ONE
      24 августа 2018, 11:34
      0
      Опечатался. Надо так

      {$_pls['user_role']}
      Тут хорошая шпаргалка по fenom в modx igamov.ru/blog/fenom-modx
        Евгений Лазарев
        24 августа 2018, 11:41
        0
        Нет тоже не работает. А шпаргалку — да, видел уже. Мне понравилось. После нее можно сказать и начал изучать пароль.
    Евгений Лазарев
    24 августа 2018, 11:33
    0
    Хорошо. Это конечно не принципиально, но все равно вопрос не решен. Я начал это делать через fenom по одной простой причине. Не могу выполнить условие с помощью phx.
    [[+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 такого не происходит?
      Илья
      24 августа 2018, 11:46
      0
      Если рассматривать на fenom, то в похожей ситуации делаю так:
      Для 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 — для студентов
        Евгений Лазарев
        24 августа 2018, 11:51
        0
        Спасибо. Подход очень хороший. Я бы скорее всего переменные для снипетов не создавал — лишняя память. Хотя возможно я не прав. А по поводу выполнения частей не в курсе? Оба куска условия выполняются или только один, который истина?
          Илья
          24 августа 2018, 11:54
          0
          переменные создаю когда нужна проверка что сниппет дал результат, т.е. {if $users2} и т.д. На 2 вопрос точно не отвечу, скорее всего проверка — потом вызов из нужного куска.
            Евгений Лазарев
            24 августа 2018, 11:56
            0
            Спасибо большое. Но к сожалению fenom пока еще не работает. Есть варианты почему не показывается плейсхолдер?
              Илья
              24 августа 2018, 11:58
              0
              А как ты его вызываешь в принципе? а главное зачем? у тебя пользователь авторизовался на сайте, т.е. у тебя есть его id-шник из базы, в базе же есть инфа к какой группе он принадлежит. разве нет?
                Евгений Лазарев
                24 августа 2018, 12:03
                0
                Ну так то оно так. Но я записываю просто его в сессию. Чтобы лишний раз к БД не обращаться. И после этого создаю плейсхолдер. А так к примеру допустим у меня 3 пользователя. Мне придется 3 условия писать isMember. И опять же это 3 обращения каждый раз.
                  Илья
                  24 августа 2018, 12:09
                  0
                  а как ты вообще с фронтэнда пишешь сессию? и пишешь ли?
                  попробуй из сессии читать не плейсхолдером, а через глобальную сессию. либо писать js и читать {var $sess_marka = $.cookie['choosed_marka']}.
          Илья
          24 августа 2018, 11:56
          0
          В данном случае выполнятся оба куска т.к. сниппеты записаны в переменные, но на мой взгляд разницы в памяти большой не будет.
      SEQUEL.ONE
      24 августа 2018, 12:04
      +1
      Все это дело можно оформить в сниппет. С телефона конечно ад всё это набирать

      $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}
      По желанию можно заморочиться и добавить обработку чанков, но это на быструю руку накидал с телефона.
        Илья
        24 августа 2018, 12:11
        0
        Да, так и правда проще и красивее чем из наших кусков)) спасибо за компоновку идей)
          Евгений Лазарев
          24 августа 2018, 12:11
          0
          Спасибо. Но опять не подходит. Сниппет который отдельно у меня написан он в каждом шаблоне почти. Потому что в зависимости от роли пользователя будет выводиться различный контент, ну а соответственно вызываться различные сниппеты или одинаковые сниппеты с разными параметрами. Это все чтобы не плодить шаблоны которых и так не мало. А тут в таком варианте еще и сниппеты(одноразовые) плодить.
            Илья
            24 августа 2018, 12:16
            0
            почему? у тебя есть 1 сниппет который учитывает сессию и выводит код в зависимости от роли. что мешает написать в этот сниппет все возможные варианты и выводить только его? какие одноразовые сниппеты ты имеешь в виду?
              Евгений Лазарев
              24 августа 2018, 12:20
              0
              Допустим. Но тогда получается заводить еще один параметр. К примеру работать с ним с помощью switch case в зависимости от шаблона. Так то можно, но это +1 переменная и +1условие. Когда в принципе условием уже является выбор шаблона. Вариант рабочий, но усложненный на мой взгляд.
                Илья
                24 августа 2018, 12:26
                0
                Не спорю что усложнённый, но сокращает время и даёт больше контроля. на мой взгляд это куда эффективнее чем раскидывать инфу по всем шаблонам. ±1 переменная и ±1 условие для сложного сайта на мой взгляд не критично, если их и так уже больше сотни…
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        24