Запрет на редактирование прав при редактировании страницы для группы пользователей

Материал из Umicms
Перейти к:навигация, поиск

Актуально для версии 2.9.5

Задача

Иногда необходимо оставить пользователям возможность изменять только контент страниц, но что бы они не могли ни удалить ее, ни переместить. Стандартными средствами системы можно только ограничить группе пользователе или конкретному пользователю доступные для просмотра или редактирования модули, но нету возможности например включив возможность редактировать страницы ограничить права на изменение прав доступа для данных страниц. Наглядно видно это если таким пользователем прокрутить страницу в самый низ где мы увидим блок "Права доступа" и доступные ячейки для галочек.


Решение

Для решения данного вопроса мы сделаем новый обработчик события который будет срабатывать каждый раз когда кто-либо будет сохранять страницу через административный интерфейс. В данном обработчике нам необходимо первым делом проверить к какой группе пользователей принадлежит тот кто сохраняет изменения на странице. Если это та группа пользователей которая не должна менять "Права доступа" к странице мы проверяем наличие галочек для тех прав которые мы не хотим давать пользователю.

Сначала в файле \classes\modules\events\__custom.php мы добавляем код обработчика события:

<?php
	abstract class __custom_events {
		//TODO: Write here your own macroses
		
		public function changePagePermission ( iUmiEventPoint $event ) {
		
			//Проверяем вызывается ли событие сохранения изменений на странице через админку
			if($event->getMode() == 'before') {
				
				//Получаем ID пользователя который вызвал сохранение изменений на странице через админку
				$user_id = $event->getParam('user_id');
				
				//Получаем объект пользователя
				$user_object = umiObjectsCollection::getInstance()->getObject($user_id);
				
				// Получаем группу, в которую входит объект с ранее найденным id
				$groups = $user_object->getValue("groups");
				
				foreach ($groups as $val){
					//Проверяем по ID является ли группа пользователя супервайзер
					$svPermission = permissionsCollection ::getInstance()->isSv($val);
					if (!$svPermission) {
						//Делаем запрос передачи изменения прав на пользование страницей
						//и сохраняем данные в массив
						$permiss['perms_create'] = getRequest('perms_create');
						$permiss['perms_delete'] = getRequest('perms_delete');
						$permiss['perms_move'] = getRequest('perms_move');
						
						//Проверяем были ли изменения прав на странице 
						if ($permiss['perms_create'] != NULL || $permiss['perms_delete'] != NULL || $permiss['perms_move'] != NULL) {
							//Делаем перенаправление на страницу с которой был отправлен запрос на сохранение
							def_module::redirect(getServer('HTTP_REFERER'));
							
							//завершаем обработку скрипта без сохранения данных
							exit();
						}
					}
				}
			};
		}
	};
?>

в переменной $val указывается ID группы пользователей поэтому мы проверяем та ли эта группа пользователей которая может менять "Права доступа" для страницы.

Теперь нам надо добавить перехватчик данного события который будет срабатывать каждый раз когда кто то сохраняет страницу в административном интерфейсе. Добавляем в файле \classes\modules\events\custom_events.php необходимый код:

<?php

	$pageExchangePermission = new umiEventListener( "systemModifyElement", "events", "changePagePermission" );

?>

где systemModifyElement это стандартная точка вызова.

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