Сниппет проверки прав доступа по группам

Простой сниппет для проверки прав доступа, при выполнении которого выводится чанк.

Может пригодится для вывода кнопок редактирования/добавления страницы соответствующим группам (журналисты, модераторы и тд).
+ существует проверка доступа, если авторизованный пользователь = автор страницы.

Доступные параметры:

&allowGroups — id групп, которые должны получить доступ к чанку
&allowAuthor — 1 или 0, определяет, выдавать ли доступ к чанку автору страницы
&tpl — название подгружаемого шаблона при выполнении условий

Пример вызова:
[[!getAccess? &allowGroups=`1,3` &allowAuthor=`1` &tpl=`gallery.Edit`]]

Сниппет (getAccess):
<?php
	$user = (!empty($userId)) ? $modx->getObject('modUser', $userId) : $modx->user;

	if (is_object($user) && $modx->user->isAuthenticated('web')) {
		$allowGroups = explode(",", $allowGroups);
		
		$userGroups = array();
		$userGroups = $modx->user->getUserGroups();
		
		if ($allowAuthor == '1' && $modx->resource->get('createdby') == $user->get('id')) {
			return $modx->getChunk($tpl);
			break;
		}

		foreach($allowGroups as $check) {
			if (in_array($check, $userGroups)) {
				return $modx->getChunk($tpl);
				break;
			}
		}
		
		return;
	}
	else {
		return;
	}

P.s. Буду рад любым советам по оптимизации кода.)
Razer
25 сентября 2014, 08:50
modx.pro
7
2 994
0

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

Виталий Киреев
25 сентября 2014, 13:00
+1
В принципе это урезанный аналог modx.com/extras/package/personalize

$modx->resource->getOne('CreatedBy')->get('id')
— в этом нет смысла, т.к. createdby это итак id, т.е. достаточно
$modx->resource->get('createdby')
    Razer
    25 сентября 2014, 13:12
    0
    спасибо, поправил.)
    Василий Столейков
    25 сентября 2014, 14:11
    0
    Очень удобная штука! Попробую её использовать у себя, спасибо!
    Можно вопрос: а почему вы решили свой сниппет написать, а не использовать Personalize?
      Razer
      25 сентября 2014, 14:48
      +1
      Если честно, просто не знал о нем, а поставленная цель казалась не слишком сложной, чтобы искать решение извне.

      Да и атмосфера modx'а и написания сайта на нем способствует написанию своих решений, как по мне..)
        Василий Столейков
        25 сентября 2014, 15:01
        0
        Понимаю, я тоже вначале подобное (но более корявое) решение сделал, пока не нашел Personalize…
      Василий Столейков
      31 октября 2014, 08:54
      0
      В Personalize есть удобная штука @CODE:, которая позволяет писать код прямо в вызове, а не плодить чанки. Похожее есть и у pdoTools@INLINE
      Тут такой возможности нету, да?
        Николай
        31 октября 2014, 09:54
        2
        +1
        Я понимаю, сниппет функциональнее, но там где нужно просто проверить группу пользователя будет проще использовать
        [[+modx.user.id:memberof=`Administrator`:then=`[[$chunk-or-code]]`]]
          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
          7