• Блог
  • Разный контент для юзеров

Это решение пригодится тем, кому нужно, чтобы содержание страницы для разных групп пользователей отличалось, т.е. одним пользователям нужно показать одно, другим другое. Решается она простым сниппетом.

Вариант 1

<?php
$output = '';
if ($modx->user->isMember('Group1')) {
    $output = $modx->getChunk('chunk1');
} else if ($modx->user->isMember('Group2')) {
    $output = $modx->getChunk('chunk2');
} else {
    $output = $modx->getChunk('chunk3');
}
return $output;

В сниппете напрямую прописываются группы пользователя и чанки с содержанием, которые нужно вывести для каждого условия. Теперь вызываем сниппет на странице или в шаблоне.

[[!filterContent]]

Для простых случаев этого вполне достаточно.


Вариант 2

А теперь давайте теперь сделаем сниппет более универсальным. Будем передавать через параметры группы и содержание.

<?php
$groups = $modx->getOption('groups',$scriptProperties,'');
$contents = $modx->getOption('contents',$scriptProperties,'');
$firstGroup = $modx->getOption('firstGroup',$scriptProperties,true);
$output = $default = $modx->getOption('default',$scriptProperties,'');

$groups = explode(',',$groups);
$contents = explode(',',$contents);
if ($groups) {
    foreach($groups as $key=>$group){
        if ($modx->user->isMember(trim($group))) {
            $output = isset($contents[$key]) ? $contents[$key] : $default;
            if ($firstGroup) break;
        }
    }
} 

return $output;

В этом сниппете доступны 4 параметра — groups, contents, default и firstGroup.

  • groups — через запятую указываем название групп.
  • contents — через запятую указываем контент, который будет выводится для соответствующий группы. Первое значение будет выведено для первой группы, второе — для второй и т.д.
  • default — контент по-умолчанию, который будет выводится для групп, если для них не передан контент, и для пользователей, которые не входят ни в одну группу. Желательно добавить в параметры сниппета, чтобы не писать его при вызове.
  • firstGroup — Может быть так, что пользователь входит в несколько групп. Тогда выведется контент, переданных для последней группы, в которую он входит, или дефолтное значение из параметра $default, если контента для этой последней группы нет. Если указать 1, то выведется контент первой группы и дальше проверка остановится. Желательно также добавить в параметры сниппета с дефолтным значением, чтобы не писать его при вызове.

Теперь вызов сниппета выглядит так

// В параметре контента можно передавать чанки, теги полей ресурса или строку.
[[!filterContent? &groups=`Group1,Group2,Group3` &contents=`[[*content]],[[$Chunk1]],` &default=`Нет данных` &firstGroup=`0`]]

Для пользователей группы Group1 выведется содержание текущей страницы. Для пользователей группы Group2 — содержание чанка Chunk1. Пользователи группы Group3 и остальные увидят на странице «Нет данных».

Вот такой велосипедик получился.

0   4937

Комментарии ()

  1. Uhogorlonos 21 февраля 2024 # 0
    Спасибо за велосипед, но есть моментик: почему-то контент обрезается в случае если в чанке появляется запятая. [[+content]] при этом запятые переносит спокойно — в чем может быть причина?

    Вы должны авторизоваться, чтобы оставлять комментарии.

    Выделите опечатку и нажмите Ctrl + Enter, чтобы отправить сообщение об ошибке.