Мануал по интеграции плагинов с плагином "Role", на примере плагина "Публикация от чужого имени"
Данный топик является примером интеграции ролей с другими плагинами, и никак не призывом к действию. Предложения и замечания принимаются в комментариях.
Первое что нужно сделать для интеграции — это создать чекбоксы для плагина "Публикация от чужого имени" в добавлении и редактировании ролей.
Плагин "Role" имет хуки.
role.add.tpl с содержимым
role.edit.tpl с содержимым
добавляем модуль ACL в котором будет осуществляться проверка доступа к селекту выбора от чьего имени публиковать по созданым в Role правам (при желании и всю проверку доступа можно перенести в этот модуль)
создаем в plugins\publishfrom\classes\modules\ папку acl и в ней файл с именем ACL.class.php и содержимым
в \publishfrom\PluginPublishfrom.class.php добавить наследование модуля ACL (можно конечно сделать модуль ACL непосредственно плагина), после
добавляем
в хук \plugins\publishfrom\classes\hooks\HookPublishfrom.class.php добавляем хуки для чекбоксов. после
добавляем
и перед
добавляем
далее немного подредактируем код хука чтобы доступ к изменению автора имел не только админ.
Находим строчки
и изменяем
на
и отредактировать доступ к селекту выбора автора при добавлении/редактировании топика
(в этом куске — пример доступа к ролям без модуля ACL)
находим строки
и приводим их к такому виду
ну вот пости и все, осталось добавить пару текстовок
открываем plugins\publishfrom\templates\language\russian.php и добавляем в него
теперь все. Вся работа заняла чуть больще 15 минут. Плагин «Публикация от чужого имени» с внесенными изменениями для интеграции можно скачать тут.
небольшой поясняющий момент. те параметры (ключи массивов чекбоксов) которые Вы зададите в интегрированых шаблонах и будут ключами для доступа к заданным правам.
пример:
мы задали имена для чекбоксов в шаблонах
соответсвенно в массиве ролей они будут соответствующими
а уже получить сам массив ролей что в php что в шаблоне очень просто
в php
в smarty
Вот теперь все.
Первое что нужно сделать для интеграции — это создать чекбоксы для плагина "Публикация от чужого имени" в добавлении и редактировании ролей.
Плагин "Role" имет хуки.
- template_roles_role — в шаблоне добавления к списку прав роли
- template_roles_user — в шаблоне добавления к списку прав отдельному пользователю
- template_roles_role_show_end — в шаблоне редактирования к списку прав роли
- template_roles_role_user_show_end — в шаблоне редактирования к списку прав отдельному пользователю
Начнем с добавления новых, необходимых файлов
на эти хуки и вешаем новые чекбоксы. Для этого в плагине «Публикация от чужого имени» длавляем 2 файла role.add.tpl (щаблон для добавления чекбоксов в список прав к роли и к пользователю) role.edit.tpl (щаблон для ребактирования чекбоксов в список прав к роли и к пользователю).role.add.tpl с содержимым
<br />
<label><input type="checkbox" name="role[publishfrom]" id="role_publishfrom" value="1" onclick="sh(this)" /> {$aLang.role_create_publishfrom}</label>
<div id="role_publishfrom_box" class="opt-role">
<label><input type="checkbox" name="role[publishfrom][add]" value="1" id="publishfrom_file_add" /> {$aLang.role_create_publishfrom_add}</label><br />
<label><input type="checkbox" name="role[publishfrom][edit]" value="1" id="publishfrom_file_edit" /> {$aLang.role_create_publishfrom_edit}</label><br />
</div>
role.edit.tpl с содержимым
<br />
<label><input type="checkbox"{if $aRole.publishfrom} checked{/if} name="role[publishfrom]" id="role_publishfrom{$sId}" value="1" onclick="sh(this)" /> {$aLang.role_create_publishfrom}</label>
<div id="role_publishfrom{$sId}_box" class="opt-role"{if $aRole.publishfrom} style="display: block;"{/if}>
<label><input type="checkbox"{if $aRole.publishfrom.add} checked{/if} name="role[publishfrom][add]" value="1" id="role_publishfrom{$sId}_add" /> {$aLang.role_create_publishfrom_add}</label><br />
<label><input type="checkbox"{if $aRole.publishfrom.edit} checked{/if} name="role[publishfrom][edit]" value="1" id="role_publishfrom{$sId}_edit" /> {$aLang.role_create_publishfrom_edit}</label><br />
</div>
добавляем модуль ACL в котором будет осуществляться проверка доступа к селекту выбора от чьего имени публиковать по созданым в Role правам (при желании и всю проверку доступа можно перенести в этот модуль)
создаем в plugins\publishfrom\classes\modules\ папку acl и в ней файл с именем ACL.class.php и содержимым
<?php
class PluginPublishfrom_ModuleACL extends PluginPublishfrom_Inherit_ModuleACL
{
public function Init()
{
parent::Init();
}
/**
* Проверяет можно или нет изменять автора
*
* @param object $oUser
*/
public function IsAllowEditPublishfrom($oUser)
{
if ($oUser->isAdministrator()) {
return true;
}
$aRole = $oUser->getRole();
if ((isset($aRole['publishfrom']['edit']) and $aRole['publishfrom']['edit'] == 1) or (isset($aRole['publishfrom']['add']) and $aRole['publishfrom']['add'] == 1)) {
return true;
}
return false;
}
}
?>
Далее пойдет редактирование файлов плагина
в \publishfrom\PluginPublishfrom.class.php добавить наследование модуля ACL (можно конечно сделать модуль ACL непосредственно плагина), после
class PluginPublishfrom extends Plugin {
добавляем
protected $aInherits = array(
'module' => array(
'ModuleACL',
),
);
в хук \plugins\publishfrom\classes\hooks\HookPublishfrom.class.php добавляем хуки для чекбоксов. после
$this->AddHook('template_publishfrom_theme_select','publishfrom_theme_select');
добавляем
$oUserCurrent = $this->User_GetUserCurrent();
if ($oUserCurrent and $oUserCurrent->isAdministrator()) {
$this->AddHook('template_roles_user', 'RoleAdd');
$this->AddHook('template_roles_role', 'RoleAdd');
$this->AddHook('template_roles_role_show_end', 'RoleEdit');
$this->AddHook('template_roles_role_user_show_end', 'RoleEdit');
}
и перед
public function topic_after($arg)
добавляем
public function RoleAdd()
{
return $this->Viewer_Fetch(Plugin::GetTemplatePath('publishfrom') . 'role.add.tpl');
}
public function RoleEdit($aVar)
{
$this->Viewer_Assign('sId', $aVar['id']);
$this->Viewer_Assign('aRole', $aVar['role']);
return $this->Viewer_Fetch(Plugin::GetTemplatePath('publishfrom') . 'role.edit.tpl');
}
далее немного подредактируем код хука чтобы доступ к изменению автора имел не только админ.
Находим строчки
$oUser = $this->User_GetUserCurrent();
if($oUser->isAdministrator()){
$uid = getRequest(Config::Get('plugin.publishfrom.select_name'));
и изменяем
if($oUser->isAdministrator()){
на
if($oUser->isAdministrator() or $this->ACL_IsAllowEditPublishfrom($oUser)){
и отредактировать доступ к селекту выбора автора при добавлении/редактировании топика
(в этом куске — пример доступа к ролям без модуля ACL)
находим строки
public function template_form_add_topic_topic_end(){
if($this->User_GetUserCurrent()->isAdministrator()){
и приводим их к такому виду
$oUserCurrent = $this->User_GetUserCurrent();
$aRole=$oUserCurrent->getRole();
if($oUserCurrent->isAdministrator() or (!empty($aRole) and $aRole['publishfrom'] and ($aRole['publishfrom']['add'] or $aRole['publishfrom']['edit']))){
ну вот пости и все, осталось добавить пару текстовок
открываем plugins\publishfrom\templates\language\russian.php и добавляем в него
'role_create_publishfrom_edit' => 'в редактированиии топика',
'role_create_publishfrom_add' => 'в добавлении топика',
'role_create_publishfrom' => 'Управлять публикацией от чужого имени',
теперь все. Вся работа заняла чуть больще 15 минут. Плагин «Публикация от чужого имени» с внесенными изменениями для интеграции можно скачать тут.
небольшой поясняющий момент. те параметры (ключи массивов чекбоксов) которые Вы зададите в интегрированых шаблонах и будут ключами для доступа к заданным правам.
пример:
мы задали имена для чекбоксов в шаблонах
role[publishfrom]
role[publishfrom][add]
role[publishfrom][edit]
соответсвенно в массиве ролей они будут соответствующими
$aRole[publishfrom]
$aRole[publishfrom][add]
$aRole[publishfrom][edit]
а уже получить сам массив ролей что в php что в шаблоне очень просто
в php
$aRole = $aRole=$oUserCurrent->getRole();
в smarty
{assign var="aRole" value=$oUserCurrent->getRole()}
Вот теперь все.
9 комментариев
и читайте топик, в сам начале написано.