Как создать свой вид топика, используя систему плагинов

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. Копируем необходимые шаблоны для нового вида топика.

Так же можно скопировать шаблоны от стандартного топика и отредактировать их.

Структура плагина, план «минимум» :)


Скачать получившийся каркас можно тут.

37 комментариев

avatar
Эм… Вери Вандефул!
avatar
Может, я чего-то не сделал
не делегировал файл шаблона.
avatar
Краткость — сестра таланта. Можно на пальцах, что делать-то?
avatar

public $aDelegates = array(
        'template' => array(
            'topic_test.tpl' => '_topic_test.tpl'
        ),
    );

Оно?
avatar
да
avatar
А теперь заковыка, которую я не могу решить. Если шаблон «topic_test.tpl» поместить к остальным шаблонам плагина в папку "/plugins/test/templates/skin/default/" получаем вот такую штуку при выводе списка топиков:
создайте правильный экшен
в /plugins/test/classes/actions/ActionTest.class.php у Вас class PluginTest_ActionTest extends PluginAction_Inherits_ActionTopic { как я понимаю Вы хотете переопределить экшен топиков но нигде переопределение не обьявили, если Вам нужен был новый экшен то для чего _Inherits_ActionTopic? или описка?
avatar
Ну да, можно было так class PluginTest_ActionTest extends ActionPlugin, но тогда пришлось бы ActionTopic целиком забирать в PluginTest. А зачем, к примеру, трогать EventDelete, если он одинаков для любых типов топиков. Я мог неправильно что-то сделать, научите.
avatar
А зачем, к примеру, трогать EventDelete, если он одинаков для любых типов
но при этом Вы зачем-то все же обьявили этот евент
$this->AddEvent('delete','EventDelete');
можно было в таком случае, не обьявлять их вобще а
parent::RegisterEvent();
использовать да и при инициализации тоже. но ведь он (EventDelete) может и отличаться, и например checkTopicFields так же может (и скорее всего будет) отличаться.
Я мог неправильно что-то сделать, научите.
Недавно было ведь пару топиков об этом, посмотрите в них, вроде многим понравилась реализция
avatar
Можно ссылку или что искать?
avatar
сори ошибся, это про дополнительные поля было
avatar
topic_extra? Тоже хотелось бы разобраться, что там к чему.
avatar
ну это вобще просто, все лежит в сущностях топика
avatar
тогда нужно наследовать от ActionTopic
avatar
хотя могут возникнуть проблемы с шаблонами экшена, т.к. в плагинах нужно наследовать от ActionPlugin
avatar
Сделал class PluginTest_ActionTest extends ActionTopic, всё проверил — работает. Перезалил.
В общем и целом, меня лично каркас устраивает. Пошёл делать основной функционал…
Спасибо!
avatar
по первому пункту — не нужно городить код, достаточно использовать метод
$this->addEnumType('prefix_topic','topic_type','test')
  • ort
  • +1
avatar
Спасибо!
avatar
Очень полезно. Спасибо за ваш труд.
avatar
Хм. А как это сделать в конфиге плагина?
$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') ),
);
avatar
Вопрос снимается. :)

Config::Set('block.rule_topic_type.action.test', array('add','edit'));
avatar
Спасибо за каркас, попробую использовать его в своих целях
  • Mail
  • 0
avatar
Учюсь делать плагины, взял за основу этот.
Проблема при выводе топика этого плагина в котором использовались html теги они не обрабатываются, как решить?
Разве ни у кого не возникала эта проблема?
avatar
вопрос по этому плагину не могу понять что такое

если написать топик в этом плагине то получает при выводе

Программа обновления для салонов должна в себе заключать след: <ul> <li>Обновление программы k3</li> <li>Обновление прайсов</li> <li>Уведомление в новостях на сайте</li> </ul>


если написать в обычном топике то получаем

Программа обновления для салонов должна в себе заключать след:

• Обновление программы k3
• Обновление прайсов
• Уведомление в новостях на сайте



Что я не так делаю?
avatar
$oTopic->setTextShort(htmlspecialchars(getRequest('topic_text')));

вот это убивает список привращая его в
<ul>
<li>1</li>
<li>1<...
avatar
я разобрался убейте мои сообщения
avatar
public function RegisterHook() {
        $this->AddHook('template_write_item', 'Add');
        }

На всякий случай, в версии 1.0.1 хук называется по другому не
avatar
menu_topic_action_add_item
а
template_write_item
в любом случае можно хук смотреть в window_write.tpl
avatar
Почему window_write.tpl, когда за создание топика отвечает menu.create.content.tpl
и там хук называется menu_create_topic_item

Правда вызвать его пока не получилось((
avatar
А нет, отставить панику!
Слово template_ откуда-то копировал, а там буква «e» русская оказалась. Убил бы!
avatar
Здравствуйте, что-то не получается загрузить шаблон по хуку:
public function Add() {
        return $this->Viewer_Fetch(Plugin::GetTemplatePath(__CLASS__).'menu.topic_action.tpl');
    }

выдает пустую строку, хотя проверил файл menu.topic_action.tpl — на месте, текст в нем тоже есть. Немогу понять где проблема
avatar
Вопрос снят
avatar
Принцип для 1.0.x остался тот же? Нет подобного туториала для текущей ветки?
Спасибо!
avatar
Меня тоже интересует! Нет такого пока?
avatar
принцип тот же
avatar
А не могли бы выложить снова каркас плагина, который в конце топика? А то ссылка устарела.
avatar
Спасибо за труды! Присоединяюсь, ссылка не рабочая! Хотелось бы посмотреть что внутри. Обновите, пожалуйста, ссылку, буду признателен.
avatar
Сделал по инструкции, при попытке опубликовать топик выскакивает ошибка:
SQL Error: Column 'topic_text_hash' cannot be null at Z:\home\qwer\www\classes\modules\topic\mapper\Topic.mapper.class.php line 50
Подскажите, в чем может быть проблема?
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.