dimayakovlev.ru


Ограничение пользователей в создании публичных страниц в GetSimple CMS

Необходимость в ограничении прав пользователей при создании публичных страниц веб-сайта может иметь разные причины, одна из которых — проверка содержания страниц редактором, принимающим решение о публикации материала в открытом доступе. Я предлагаю рассмотреть наиболее простое решение такой задачи, не прибегая к разработке специального плагина.

Как принципиально реализуется ограничение прав пользователей и введение проверки публикуемых материалов веб-сайта в предлагаемом мною методе:

  • определён пользователь, обладающий правом редактора веб-сайта;
  • пользователи, кроме редактора веб-сайта, могут создавать только приватные страницы;
  • только редактор веб-сайта может изменить статус страницы с приватной на публичную;
  • при повторном редактировании страницы пользователем, не имеющим права редактора веб-сайта, странице автоматически присваивается статус приватной.

Ключевым элементом практической реализации описанного принципа, является использование плагина 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.