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

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

Комментарии (22)

RSS свернуть / развернуть
Эм… Вери Вандефул!
0
Может, я чего-то не сделал
не делегировал файл шаблона.
0
  • avatar
  • 1d10t
  • 20 декабря 2011, 14:35
Краткость — сестра таланта. Можно на пальцах, что делать-то?
0

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

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

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