Еще раз о переопределении шаблонов через плагин

Здравствуйте собственно вопрос.
Есть новый тип топика, который требует переработки некоторых элементов шаблона (скажем комментариев).
Если я доработал комментарии вставил их в плагин и переопределил их через $aDelegates то этот шаблоно переопределяется ДЛЯ ВСЕХ видов топиков.
Как сделать так чтобы он переопределялвся только ДЛЯ КОНКРЕТНОГО ВИДА топика?
Спасибо.

Вопрос: Переопределение метода класса ядра в плагине

Уважаемые коллеги,

Каким образом можно (правильно :)) переопределить (делегировать) методы классов ядра в плагине? В частности, я хотел бы перегрузить методы класса Router (Exec и RewriteRequest в частности).

Насколько я пока нашёл (статьи по похожей теме были найдены здесь, тут и там) можно делегировать Actions (но это не action), и методы классов модулей — но вроде бы Router не является частью модуля (или я что-то упустил). Эксперименты (методом тыка) с разными названиями хуков результата не дали, мой код не вызывается.

В API определена функция AddDeletageFunction, но я не могу понять, как сформировать к ней правильное название хука — найденные примеры, опять таки, опираются на экшины и модули.

Заранее благодарю за любые конструктивные подсказки и помощь.

Некоторые вопросы по разработке плагинов

Написал около десятка плагинов, но мне кажется я не все понял о наследовании в 0.4.2

1) как в шаблоне использовать данные конфига для foreach, elseif?
Пример:
{if {cfg name='path.root.web'}}
    это естественно не работает, как правильно?
    если мы делегируем только шаблон и у нас нет возможности присвоить
    переменной значение конфига в блоке/экшене/хуке
{/if}

я пока решаю эту проблему таким костылем

{php}
if ((Config::Get('plugin.name.value')) && $oUserCurrent {
    {/php}
    вот такой костыль
    {php}
}
{/php}


2) Как обстоят дела с наследованием экшенов?
Если мне приходится вмешаться в регистрацию, чтобы добавить проверку, мне приходится переопределять метод класса регистрации, должен быть лучший путь

class PluginExample extends Plugin {

    /**
     * Делегирование регистрации
     */
    public $aInherits = array(
        'action' => array('ActionLogin', 'ActionRegistration', 'ActionTalk'),
    );

    ...
}


class PluginExample_ActionRegistration extends PluginExample_Inherit_ActionRegistration {

    protected function EventIndex() {
    ...
    $this->PluginAntistatist_Antistatist_addLogin($oUser->getLogin());
    ...
    }

выдирать ради этого целый метод это большой костыль. вроде можно повесить свой код на конец или начало выполнения метода модуля регистрации, но что, если надо вывести сделать проверку и в экшене регистрации вывести ошибку, совать ее в модуль не правильно?

3) вот если мне необходимо изменить голосование за топики, строчку

<li class="minus"><a href="#" onclick="lsVote.vote({$oTopic->getId()},this,-5,'topic'); return false;"></a></li>

как мне это лучше сделать? каким образом переопределить файл аякса, принимающий запрос на изменение рейтинга топика, а так же можно ли изменить саму эту строчку, не делегируя целиком шаблоны topic.tpl и topic_list.tpl и закрывая тем самым эти шаблоны от изменения другими плагинами?

Вопрос про делегириование

Мне нужно делегировать 3 различных экшена, а точнее наследовать, чтобы изменить в них ивенты


protected $aDelegates = array(
                        'action' => array('ActionTopic'=>'PluginAntispam_ActionTopic')
                        );


Проблема в том, что тут можно прописать только один экшен, иначе каждый последующий перезапишет элемент action массива $aDelegates,
так как же мне несколько делегатов сделать?

Новые возможности по переопределению/наследованию классов LiveStreet

В LS появилась новая возможность для разработчиков плагинов — наследование классов. Идея была высказана еще avadim'ом здесь.
Эта возможность позволит удобно переопределять различные методы одного класса (модуля, экшена, сущности, маппера) разными плагинами без конфликтов.
Главное отличие от делегирование — не происходит блокировки переопределения класса для других плагинов. Также есть возможность переопределения одного метода разными плагинами, но здесь разработчикам нужно быть очень осторожными и делать так, чтоб свести вероятность конфликта к минимуму.

Как использовать.
Например, нужно переопределить метод получения пути до аватара у сущности пользователя в плагине Test. В плагине необходимо объявить те классы, которые будут наследоваться. Объявление происходит в свойстве $aInherits:
<?php
class PluginTest extends Plugin {
    
    protected $aInherits=array(
       'entity'  =>array('ModuleUser_EntityUser'=>'_ModuleSide_EntityUser')
    );

    public function Activate() {        
        return true;
    }
    
    public function Init() {        
    }
}
?>

Читать дальше →

Плагин aceAdminPanel – новые возможности для разработчиков плагинов

Прямо так и хочется начать: «Кролики – это не только ценный мех, но и три-четыре килограмма легкоусвояемого мяса» :)

А все потому, что плагин админки (aceAdminPanel) – это не только облегчение работы администратора сайта, но и новые возможности для разработчиков, пишущих различные расширения для движка. Здесь я расскажу об одной интересной фиче, которую я смог реализовать в плагине, и которая дает гораздо больше возможностей при создании плагинов, чем стандартные средства.
Читать дальше →

Переопределение методов модулей с помощью ...Hook'ов!

В LiveStreet 0.4 появилась возможность переопределять не только целиком модули, но и отдельные методы. Это позволить разным плагинам бесконфликтно переопределять разные методы одного модуля.

Принцип действия этого механизма основан на Hook'ах:
  1. Вызов каждого метода сопровождается выполнением хуков — module_ModuleName_MethodName_before и module_ModuleName_MethodName_after, соответственно ДО и ПОСЛЕ вызова метода модуля. В первом случаи в хук передаются параметры вызова метода, во втором передается результат выполнения метода модуля.
  2. На module_ModuleName_MethodName_before можно повесить специальный хук — delegate, результат выполнения которого и будет «результатом» выполнения метода модуля

Пример:
<?php 
class HookTest extends Hook {
	public function RegisterHook() {
		$this->AddDelegateHook('module_text_parser_before','testHook',__CLASS__,-3);
	}

	public function testHook($aVars) {
		return 'Topic text > '.$aVars[0];
	}
}
?>

Читать дальше →

Помогите разобраться с делегированием (или хуками)

Сделал я плагин для своего сайта. Плагин очень специфический, и вряд ли кому пока пригодится в том виде, какой есть. Но, если есть пожелания по его доработке — пишите, если наши пожелания совпадут, то допилю и поделюсь бесплатно. Вроде как все работает как надо, но для того, чтобы добавить в информацию о пользователе информацию из плагина, мне пришлось дописывать строчки в системные модули, что совсем нехорошо.
Читать дальше →

Помогите с написанием плагина

Хочу аккуратно подкорректировать LS под свои нужды. Решил использовать LS 0.4 и сделать плагин.

Я добавил новый тип топика и для этого типа топика хочу допилить (посредством плагина) TopicEntity_Topic парой функций, т.е. расширить его. Тыкаюсь, тыкаюсь и ничего не получается…

На сколько я понимаю, мне нужно делегировать «entity» и создать свой(внутри плагина) Topic.entity.class.php с таким содержанием:

require_once(Config::Get('path.root.server').'/classes/modules/topic/entity/Topic.entity.class.php');

class PluginMyTopic_TopicEntity_Topic extends TopicEntity_Topic
{
    public function setMyData($data) {
        if ($this->getType()!='myTopicType') {
    		return;
    	}
    	$this->extractExtra();
    	$this->aExtra['mydata']=$data;
    	$this->setExtra($this->aExtra);
    }
........


Вобщем, туплю я и ничего у меня не получается… Можете подсказать, как точно должно выглядеть делегирование и описание класса?