Мануал по интеграции плагинов с плагином "Role", на примере плагина "Публикация от чужого имени"

Данный топик является примером интеграции ролей с другими плагинами, и никак не призывом к действию. Предложения и замечания принимаются в комментариях.

Первое что нужно сделать для интеграции — это создать чекбоксы для плагина "Публикация от чужого имени" в добавлении и редактировании ролей.
Плагин "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 комментариев

avatar
Вот он хак моей мечты!
avatar
а тогда аватар в роле зачем? он же дает публиковать от чужого имени, и без этого хака…
avatar
зато этот хак не дает право голосовать от чужого имени.
и читайте топик, в сам начале написано.
Данный топик является примером интеграции ролей с другими плагинами
avatar
Всё равно действительно хороший хак. Был бы рейтинг побольше заплюсовал бы до смерти.
avatar
спасибо очень помогло
avatar
Спасибо, дождались!)
avatar
Скажите пожалуйста. Не совсем понял, новичок ещё. Получается что если приобрету плагин «Role», другие установленные плагины не будут работать и каждый нужно будет интегрировать с плагином «Role» (Глобальные права пользователей)?
avatar
— О, вовсе нет. Все плагины прекрасно уживаются с Role (кроме «Редактирование комментариев» от того же автора. Плагин сей снести надо к Дискорду, ибо «Role» уже реализует необходимый функционал)
avatar
— Хак действительно годный. Спасибо тебе.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.