Необходимость в ограничении прав пользователей при создании публичных страниц веб-сайта может иметь разные причины, одна из которых — проверка содержания страниц редактором, принимающим решение о публикации материала в открытом доступе. Я предлагаю рассмотреть наиболее простое решение такой задачи, не прибегая к разработке специального плагина.
Как принципиально реализуется ограничение прав пользователей и введение проверки публикуемых материалов веб-сайта в предлагаемом мною методе:
- определён пользователь, обладающий правом редактора веб-сайта;
- пользователи, кроме редактора веб-сайта, могут создавать только приватные страницы;
- только редактор веб-сайта может изменить статус страницы с приватной на публичную;
- при повторном редактировании страницы пользователем, не имеющим права редактора веб-сайта, странице автоматически присваивается статус приватной.
Ключевым элементом практической реализации описанного принципа, является использование плагина sa hook components. Поэтому, если он не установлен, то установите и активируйте его перед началом выполнения следующих шагов.
Затем в файле gsconfig.php
определите константу, содержащую имя пользователя, обладающего правом редактора веб-сайта. Здесь в качестве примера я использую константу SITEEDITOR
и имя пользователя admin
:
define('SITEEDITOR', 'admin');
Теперь следует создать два новых компонента: hook_edit-extras
и hook_changedata-save
. Эти компоненты будут использоваться плагином sa hook components для выполнения заданного PHP кода при наступлении соответствующих событий. Поэтому они не предназначены для включения в файлы шаблонов темы оформления или подключения внутри других компонентов.
В компоненте hook_edit-extras
разместите следующий фрагмент PHP кода, отвечающий за добавление в форму редактора страницы скрытого поля, содержащего значение нового поля страницы authorOriginal
, а также выполняющего автоматический выбор приватного статуса страницы и сокрытие элемента формы редактора страницы, позволяющего изменить её статус пользователю, не обладающему правами редактора веб-сайта:
<?php
if (defined('SITEEDITOR')) {
global $data_edit, $USR;
$authorOriginal = isset($data_edit) ? $data_edit->authorOriginal : '';
if (!$authorOriginal) $authorOriginal = $USR;
echo '<input id="authorOriginal" name="post-authorOriginal" type="hidden" value="'.$authorOriginal.'" />';
if ($USR !== constant('SITEEDITOR')) {
echo '<script>document.getElementById("post-private").options.selectedIndex = 1;document.getElementById("post-private-wrap").style.display = "none";</script>';
}
}
?>
В компоненте hook_changedata-save
разместите следующий фрагмент PHP кода, добавляющий поддержку нового поля страницы authorOriginal
, а также осуществляющий дополнительную проверку отправленных данных с целью исключения возможности умышленного изменения приватного статуса страницы пользователем, не имеющим прав редактора веб-сайта:
<?php
if (defined('SITEEDITOR')) {
global $USR, $xml;
$authorOriginal = isset($_POST['post-authorOriginal']) ? safe_slash_html($_POST['post-authorOriginal']) : $USR;
$xml->addChild('authorOriginal')->addCData($authorOriginal);
if ($USR !== constant('SITEEDITOR')) {
$xml->{'private'} = 'Y';
}
}
?>
Для чего добавлена поддержка нового поля страницы authorOriginal
? При сохранении страницы, GetSimple CMS в качестве имени автора использует в поле author
имя пользователя, производящего сохранение. То есть, автором страницы считается пользователь, сохранивший её последним. Введение нового поля authorOriginal
позволяет сохранить имя первоначального автора страницы - это имя пользователя, создавшего страницу, либо имя пользователя, впервые сохранившего созданную ранее страницу, если страница не содержала поля authorOriginal
. Таким образом, становится известным кто из пользователей создал страницу и кто последним внёс в неё изменения.
Если поддержка поля authorOriginal
не требуется, то в компонентах hook_edit-extras
и hook_changedata-save
можно использовать следующие фрагменты PHP кода:
<?php
if (defined('SITEEDITOR')) {
global $USR;
if ($USR !== constant('SITEEDITOR')) {
echo '<script>document.getElementById("post-private").options.selectedIndex = 1;document.getElementById("post-private-wrap").style.display = "none";</script>';
}
}
?>
<?php
if (defined('SITEEDITOR')) {
global $USR, $xml;
if ($USR !== constant('SITEEDITOR')) {
$xml->{'private'} = 'Y';
}
}
?>
После сохранения компонентов, на вашем веб-сайте начинает работать простая система премодерации: все страницы, созданные пользователями, не могут быть опубликованы для публичного просмотра без участия редактора веб-сайта. Теперь для публикации страницы, созданной пользователем, редактор веб-сайта должен открыть её, вручную изменить статус и произвести сохранение. Не смотря на ограничения публикации страниц, пользователи не лишаются иных стандартных возможностей GetSimple CMS по самостоятельному редактированию страниц веб-сайта.
Рассмотренное решение может быть изменено под конкретные условия и требования сценария использования системы управления контентом GetSimple CMS в качестве основы веб-сайта, путём введения дополнительных условий проверки пользователей и реакций на них.
Отдельно стоит отметить, что приведённое решение предназначено только для использования в GetSimple CMS 3.3.x и не подходит для GetSimple CMS 3.4.x, так как не учитывает новые возможности по управлению публикацией страниц, реализованные в ней.
Не смотря на официальную поддержку многопользовательского режима, в текущей стабильной ветке GetSimple CMS 3.3.x и разрабатываемой 3.4.x полностью отсутствуют возможности назначения ролей и разграничения прав доступа пользователей к функциям системы управления контентом на уровне ядра системы. Это ограничивает варианты использования GetSimple CMS в качестве действительно многопользовательской системы управления контентом, поэтому следует учитывать, что предлагаемое мною решение во многом является вынужденной мерой и компромиссом.
Однако рассмотренный принцип может быть использован в дальнейшем при создании комплексного плагина, реализующего полноценный многопользовательский режим работы в GetSimple CMS.