Как создать свой вид топика, используя систему плагинов
49
3 года назад было написано Руководство: Как создать свой вид топика на LiveStreet. В то время ещё не было системы плагинов, и всё делалось «топорно», что в последствии затрудняло обновление движка, т.к. приходилось свои куски кода вставлять опять. С появлением системы плагинов LiveStreet стал более гибким и легко обновляемым. Передо мной встала задача создать новый вид топика, и я решил сделать это плагином. Но в процессе выяснилось, что то ли я чего-то не знаю, толи этого нет. Напишу, что и как я делал, заодно задам вопросы, может быть на них решение уже есть. Надеюсь, совместно у нас получится сделать каркас нового типа топика в форме плагина. Итак, по порядку:
Читаем "Руководство по созданию плагина", ещё, создаём каркас плагина — папочки, конфиг, plugin.xml и т.п.
1. Первая задача, которая перед нами стоит — в базе данных в таблицу «topic» добавить дополнительный новый тип топика в поле «topic_type». Путей решения есть два: (1) Зайти в phpMyAdmin и создать руками, (2) Сделать что-то типа такого в функции активации плагина:
public function Activate() {
$this->addEnumType(Config::Get('db.table.topic'),'topic_type','test');
return true;
} (спасибо ort'у за подсказку)2. Создаём ссылку на создания нового вида топика топика в шаблоне.
В папке "/plugins/test/templates/skin/default/" создаём файл «menu.topic_action.tpl» следующего содержания:
<li {if $sMenuItemSelect=='test'}class="active"{/if}><a href="{router page='test'}{$sMenuSubItemSelect}/">{$aLang.topic_menu_add_test}</a></li>Текстовку «topic_menu_add_test» не забываем разместить в языковом файле "/plugins/test/templates/language/russian.php".
Далее создаём хук "/plugins/test/classes/hooks/HookTest.class.php":
class PluginTest_HookTest extends Hook {
public function RegisterHook() {
$this->AddHook('template_menu_topic_action_add_item', 'Add');
}
// Новый тип при создании топика
public function Add() {
return $this->Viewer_Fetch(Plugin::GetTemplatePath(__CLASS__).'menu.topic_action.tpl');
}
}3. У нас есть ссылка, пропишем для нее путь к экшену.
Для чего создадим файл "/plugins/test/config/config.php" и добавим в него строчку:
Config::Set('router.page.test', 'PluginTest_ActionTest');Далее всё идёт почти как три года назад:
4. Создаем сам экшен.
Создаём "/plugins/test/classes/actions/ActionTest.class.php". Можно скопировать класс ActionTopic, заменив названия переменных.
5. Копируем необходимые шаблоны для нового вида топика.
Так же можно скопировать шаблоны от стандартного топика и отредактировать их.
Структура плагина, план «минимум» :)

Скачать получившийся каркас можно тут.
- +6
- 20 декабря 2011, 12:34
- skachko
А теперь заковыка, которую я не могу решить. Если шаблон «topic_test.tpl» поместить к остальным шаблонам плагина в папку "/plugins/test/templates/skin/default/" получаем вот такую штуку при выводе списка топиков:создайте правильный экшен
в /plugins/test/classes/actions/ActionTest.class.php у Вас class PluginTest_ActionTest extends PluginAction_Inherits_ActionTopic { как я понимаю Вы хотете переопределить экшен топиков но нигде переопределение не обьявили, если Вам нужен был новый экшен то для чего _Inherits_ActionTopic? или описка?
Ну да, можно было так class PluginTest_ActionTest extends ActionPlugin, но тогда пришлось бы ActionTopic целиком забирать в PluginTest. А зачем, к примеру, трогать EventDelete, если он одинаков для любых типов топиков. Я мог неправильно что-то сделать, научите.
А зачем, к примеру, трогать EventDelete, если он одинаков для любых типовно при этом Вы зачем-то все же обьявили этот евент
$this->AddEvent('delete','EventDelete'); можно было в таком случае, не обьявлять их вобще а parent::RegisterEvent(); использовать да и при инициализации тоже. но ведь он (EventDelete) может и отличаться, и например checkTopicFields так же может (и скорее всего будет) отличаться.Я мог неправильно что-то сделать, научите.Недавно было ведь пару топиков об этом, посмотрите в них, вроде многим понравилась реализция
Хм. А как это сделать в конфиге плагина?
$config['block']['rule_topic_type'] = array(
'action' => array(
'link' => array('add','edit'),
'question' => array('add','edit'),
'topic' => array('add','edit'),
'photoset' => array('add','edit'),
'test' => array('add','edit') // Как это сделать в конфиге плагина?
),
'blocks' => array( 'right' => array('block.blogInfo.tpl') ),
);
Комментарии (22)
RSS свернуть / развернуть