ufo44 25 января 2014 0 9
Подскажите пожалуйста, как разрешить контент менеджеру редактирование только определённых ресурсов (и их подресурсов) в дереве.

Например дать право управлять только новостями и не показывать разделы относящиеся к каталогу.

Доступ контент менеджеру настроил по этому мануалу bayguzin.ru/main/uroki/uroki-modx-revolution/nastrojka-admin-paneli-klienta-modx-revo.html
9 комментариев
Fi1osof1
Fi1osof 25 января 2014г в 20:15 #
Если делать по тому мануалу, и по общей системе, как это заведено в MODX-е, то только определив документы в различные группы ресурсов. Да, это крайне не удобно по многим причинам, но только так.
Другой же, более разумный в этом случае способ — это разруливание на уровне плагина в момент попытки открытия документа для редактирования. Вот пример такого плагина:

<?php 

switch($modx->event->name){
     
    
    case 'OnManagerPageBeforeRender':
        
        switch($scriptProperties['controller']->config['controller']){
            
            /*
                Проверяем права на редактирование документов
            */
            case 'resource/update':
                
                // Проверяем наличие настройки allow_to_update (задается в настройках пользователя)
                // В ней мы перечисляем, какие документы пользователю можно редактировать
                // Если настройка задана, но id документа отсутствует в перечисленных разрешенных,
                // То возвращаем ошибку доступа 
                if($allow_to_update = $modx->getOption('allow_to_update')){
                    if(!is_array($allow_to_update)){
                        $allow_to_update = explode(",", $allow_to_update);
                        $allow_to_update = array_map('trim', $allow_to_update);
                    }

                    //
                    if(!in_array($scriptProperties['controller']->scriptProperties['id'], $allow_to_update)){
                        $scriptProperties['controller']->failure('Доступ запрещен');
                        return;
                    }
                }
                
                break;
            
        }
        
        //print_r($scriptProperties['controller']->config);
        //print_r($scriptProperties['controller']->scriptProperties);
        
        break;
    
}


Но это, что называется, «защита от дурака», то есть этот метод позволяет на уровне интерфейся рулить что можно открывать, а что нельзя (для удобства менеджера), но ничто не мешает ему отправлять Ajax-запрос на редактирование с указанием произвольного id. То есть этот метод не до конца защищает. Защита же на уровне разделения по группам ресурсов более надежная, ибо работает на уровне самого объекта ресурса, где би и как бы его не получили, а не просто на уровне рендеринга страницы редактирования.

Для вас этот плагин просто как пример. Там вам придется свои более сложные условия писать, типа перебрать всех родителей ресурса, и если это новость, то ее редактировать можно.

А так же не забудьте таким манагерам отключить разрешение быстрого редактирования страниц, ибо этот плагин там не сработает.
Fi1osof1
Fi1osof 25 января 2014г в 22:14 #
Кстати, есть еще вариант: если предполагается, что контент-менеджер будет работать только с одним конкретным разделом, можно в настройках пользователя задать tree_root_id = id раздела. Тогда он в дереве будет видеть только этот раздел и его дочерние документы. Указать сразу несколько разделов не получится.
u
ufo44 26 января 2014г в 09:37 #
Вот в данном случае подходящий вариант. А где это в настройках пользователя запрятано? Не могу найти
Fi1osof1
Fi1osof 26 января 2014г в 18:04 #
Открываете пользователя для редактирования, переходите во вкладку Настройки, и там создаете эту настройку.

А
Андрей Незваный 29 декабря 2014г в 05:27 #
Можно указывать несколько id через запятую.
rtfm.modx.com/revolution/2.x/administering-your-site/settings/system-settings/tree_root_id
b
barvitol 24 декабря 2015г в 09:45 #
Здравствуйте. Подскажите можно ли разделить права всех менеджеров контента, чтобы каждый из них мог работать только с тем что сам создал. Вот почему я задаю такой вопрос: один менеджер удалил контент другого, а тот отредактировал в отмездку статью удалившего. Да и вообще я считаю, что такое разделение необходимо, чтобы каждый отвечал только за свой контент. Единственное, я использую Tickets в качестве ресурсов для написания постов, но думаю это принципиально не важно.
Fi1osof1
Fi1osof 24 декабря 2015г в 09:58 #
Особо глубоко не стал копать, но, думаю, можно писать плагин-проверку на событие OnBeforeDocFormSave. Там проверять кто владелец ресурса, есть ли права и т.п., и если что, возвращать ошибку. Но это в случае с редактированием. А вот в удалении не увидел событий, в которые можно было бы вклиниться и прервать удаление. Но, во-первых, удаление — это еще только пометка на удаление. Не давайте прав на очистку корзины. А в плагине на удаление можно навесить событие с проверкой, и если удаляет не свое, то слать уведомление админу. А еще можно навесить событие на контроллер страницы редактирования документа, и если пытается открыть не свой документ — запрещать. Но это только если не разрешено быстрое редактирование документов, там такой фокус не пройдет.
b
barvitol 24 декабря 2015г в 10:06 #
Спасибо, буду учиться кодить, думал это можно решить настройками и правами. Быстрое редактирование отключено, так что видимо это мой вариант.
Fi1osof1
Fi1osof 24 декабря 2015г в 10:34 #
Не за что.
Авторизуйтесь или зарегистрируйтесь (можно через соцсети ), чтобы оставлять комментарии.