Модулей для БэкЕнда не нашлось, поэтому решил внести изменения в стандартный функционал управления правами.
Распишем необходимые доработки стандартного функционала управление правами:
1) При установке прав через опцию "дополнительные редакторы" права должны наследоваться всеми потомками.
2) При создании и редактировании в качестве родителей можно указать только страницы, на изменения которых пользователь имеет право.
Для решения первой задачи необходимо заменить
функцию SetAdditionalEditors в файле Class.content.inc.php
Code: Select all
function SetAdditionalEditors($editorarray, $current = '')
{
/* if ($current = '')
{ */
$allcontent =& ContentOperations::GetAllContent();
global $gCms, $sql_queries, $debug_errors;
$db = &$gCms->GetDb();
if ($allcontent !== FALSE && count($allcontent) > 0)
{
foreach ($allcontent as $one)
{
$curhierarchy = $one->Hierarchy();
if (!strstr($curhierarchy, $current))
{ continue; }
$query = "DELETE FROM ".cms_db_prefix()."additional_users WHERE content_id = ?";
$db->Execute($query, array($one->Id()));
foreach ($editorarray as $oneeditor)
{
$new_addt_id = $db->GenID(cms_db_prefix()."additional_users_seq");
$query = "INSERT INTO ".cms_db_prefix()."additional_users (additional_users_id, user_id, content_id) VALUES (?,?,?)";
$db->Execute($query, array($new_addt_id, $oneeditor, $one->Id()));
}
}
}
/* }
else {$this->mAdditionalEditors = $editorarray;} */
}
а так же заменить вызов этой функции
в файле Editcontent.php (4 замены)
старый код:
Code: Select all
$contentobj->SetAdditionalEditors($addtarray);
новый код:
Code: Select all
$contentobj->SetAdditionalEditors($addtarray, $contentobj->Hierarchy());
Вторая задача решается заменой
функции CreateHierarchyDropdown в файле Class.contentoperations.inc.php
Code: Select all
function CreateHierarchyDropdown($current = '', $parent = '', $name = 'parent_id', $allowcurrent = 0)
{
$result = '';
$allcontent =& ContentOperations::GetAllContent();
if ($allcontent !== FALSE && count($allcontent) > 0)
{
$result .= '<select name="'.$name.'">';
#Если нет глобальных прав - лесом
$permission = check_permission($userid, 'Modify Any Page');
if($permission) {$result .= '<option value="-1">'.lang('none').'</option>';}
$curhierarchy = '';
foreach ($allcontent as $one)
{
$value = $one->Id();
if ($one->Id() == $current)
{
#Grab hierarchy just in case we need to check children
#(which will always be after)
$curhierarchy = $one->Hierarchy();
if( !$allowcurrent )
{
// Then jump out. We don't want ourselves in the list.
continue;
}
$value = -1;
}
#If it's a child of the current, we don't want to show it as it
#could cause a deadlock.
if (!$allowcurrent && $curhierarchy != '' && strstr($one->Hierarchy() . '.', $curhierarchy . '.') == $one->Hierarchy() . '.')
{
continue;
}
# Если не автор и не редактор - пропускаем
$permission = (check_ownership($userid, $one->Id()) || check_authorship($userid, $one->Id()));
if(!$permission) {continue;}
#Don't include content types that do not want children either...
if ($one->WantsChildren() == true)
{
$result .= '<option value="'.$value.'"';
#Select current parent if it exists
if ($one->Id() == $parent)
{
$result .= ' selected="selected"';
}
if( $value == -1 )
{
$result .= '>'.$one->Hierarchy().'. - '.$one->Name().' ('.lang('invalid').')</option>';
}
else
{
$result .= '>'.$one->Hierarchy().'. - '.$one->Name().'</option>';
}
}
}
$result .= '</select>';
}
return $result;
}
Как пользоваться (необходимы права админа):
1) Создаем отдельную группу, в настройке прав для нее включаем два пункта: "Add Pages", "Advanced usage of the the File Manager module"
2) Для открытия доступа к нужному разделу выбираем разводящую страницу раздела и включаем группу в "Дополнительные редакторы" во вкладке "Опции". Так как права наследуются всеми потомками - группа получит управление над всеми страницами раздела
При возникновении ошибок и вопросов - пишите в личку.