Запретить редактировать чужие ресурсы

Задача: Запретить контент менеджеру редактирование чужих статей. Разрешить редактирование своих ресурсов.
Есть несколько вариантов решений, быстрое и правильное.
Ниже опишу быстрый вариант. Правильный вариант можно найти тут

Итак, предположим что у вас уже созданы все необходимые группы, созданы пользователи, им назначены свои права.
Как по итогу оно должно выглядеть


Создаем плагин, называем как угодно, вешаем на 2 события:
OnDocFormPrerender
OnBeforeDocFormSave

<?php
        
// id текущего пользователя
$user_id = $modx->user->get('id');  

switch($modx->event->name) {
    
    // прячем от пользователя контент и показываем ошибку
    case 'OnDocFormPrerender':   
        
        // Проверка что пользователь является контентщиком, а не админом (админу все можно)
        // проверка что ресурс редактируется, а не создание нового
        // проверка что пользователь не является создателем ресурса
        // ну и проверка на шаблон
        
        if($modx->user->isMember('Content Manager') && $mode == modSystemEvent::MODE_UPD && $resource->get('createdby') != $user_id &&  $resource->get('template') == 3) {
    
            // html заглушка, можете заверстать свою, это родная
            $html = '<div class="modx_error">
                        <h2><i class="icon icon-exclamation-triangle"></i> Доступ запрещен...</h2>
                        <div class="error_container"><p>Вы не являетесь автором данной статьи</p></div>
                    </div>';

            // прячем от пользователя панель с кнопками и панель с формой  ресурса
            $modx->regClientStartupHTMLBlock('
            <script type="text/javascript">
                Ext.onReady(function() {
                    var buttons = Ext.getCmp("modx-action-buttons"); // панель кнопок
                    var resource = Ext.getCmp("modx-panel-resource"); // панель ресурса
           
                    buttons.hide();
                    resource.hide();
                });
            </script>'); 
            
            // показываем пользователю ошибку
            $modx->event->output($html);            
        }     
        
    break;   
    
    // проверяем что пользователь не пытается сохранить чужой ресурс, категорию например или еще что-то
    // Проверка что пользователь является контентщиком
    // проверка что это не шаблон статьи
    // проверяем что пользователь не автор
    // ... любое условие на ваш вкус

    case 'OnBeforeDocFormSave':
        
        if ($modx->user->isMember('Content Manager') && $resource->get('template') != 3 && $resource->get('createdby') != $user_id) {        
            $modx->event->output("Вам запрещено редактирование данной страницы");           
        }        
    break;

}
Помните, что такая защита является защитой от дураков и призвана только для того, чтобы обычные контентщики не открывали лишнее.
Евгений Webinmd
08 февраля 2022, 15:41
modx.pro
2
428
+13

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

Руслан Алеев
08 февраля 2022, 20:24
0
В MODX есть «блокировка ресурса», может можно его менять и не нужно элементы скрывать.
Или это не сработает?
    Евгений Webinmd
    08 февраля 2022, 22:19
    +1
    По идее должно сработать. В посте не описал задачу полностью, необходимо было скрывать статью полностью. А так даже в голову не пришло использовать этот функционал
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    2