Совместимости плагинов и наследование классов.

А так же другие вопросы по разработке плагинов.
Кстати, в какой блог этот вопрос правильно разместить?

Первый вопрос:
как правильно наследовать классы, что бы при появлении второго плагина, наследующего тот же класс не возникало конфликтов? Случай переопределения той, или иной функции класса не рассматриваем.
например:

// plugin TopicsFilter
 protected $aInherits=array(
    	'module'=>array('ModuleTopic'=>'_ModuleTopic'),
    );


//Plugin Pokupalka
protected $aInherits=array(       
       'module'  =>array('ModuleTopic'),
       'entity' => array('ModuleTopic_EntityTopic'),
       'action'=> array('ModuleTopic_ActionTopic'),
       'mapper'=> array('ModuleTopic_MapperTopic'),
);


//Plugin NiceURL
protected $aInherits=array(       
       'module'  =>array('ModuleTopic'),       
       'entity'  =>array('ModuleTopic_EntityTopic'),       
	);

В таком варианте вылетает Pokupalka.
Если заменить в плагине Pokupalka
'module'  =>array('ModuleTopic'),

на
'module'  =>array('ModuleTopic'=>'ModuleTopic'),

то все работает.
Объясните, как в ЛС правильно наследовать классы, что бы не было проблем с совместимостью?

Второй вопрос:
Можно ли НЕ наследуя класс ActionBlog, например, добавить экшен по адресу blogs/action/

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

avatar
'module'  =>array('ModuleTopic')


этого достаточно, главное потом


class PluginMyplugin_ModuleTopic extends PluginMyplugin_Inherit_ModuleTopic {

Второй вопрос:
Можно ли НЕ наследуя класс ActionBlog, например, добавить экшен по адресу blogs/action/
Можно
avatar
То, что потом я в курсе.
Меня интересует, из-за чего плагины конфликтуют именно при такой записи 'module'  =>array('ModuleTopic')

2. А как?
avatar
У каких плагинов конфликт?

2. Создайте экшн и в конфиге задайте роутеру правило
avatar
2. Создайте экшн и в конфиге задайте роутеру правило
а что будет со стандартным экшеном?
avatar
Автор вроде спрашивал не про замену стандартного, а про добавление экшна вида
example.com/blogs/adadadsdsd/
avatar
Да, я именно это имел в виду, но несколько некорректно выразился.
avatar
Конфликтуют Pokupalka + TopicsFilter
avatar
'module'  =>array('ModuleTopic'=>'ModuleTopic'),

это неправильный синтаксис, должно были либо
'module'  =>array('ModuleTopic'=>'_ModuleTopic'),

либо
'module'  =>array('ModuleTopic'),
avatar
А почему «неправильно» работает, а «правильно» — не работает?
avatar
Простите за односложные ответы: днем есть возможность писать только с телефона.
В общем, объясните структуру массива $aInherits и принцип его обработки на back-end. Все еще не ясно, как правильно его указать в плагине, ИЛИ из-за чего возникают конфликты?
avatar
я использую полноименное переопределение, чтобы не путаться
protected $aInherits = array(
	'module'	=> array(
		'ModuleText' => 'PluginXtext_ModuleXtext',
		'ModuleSession' => 'PluginXtext_ModuleXsession',
		'ModuleTopic' => 'PluginXtext_ModuleXtopic',
		'ModuleViewer' => 'PluginXtext_ModuleXviewer',
		'ModuleDatabase' => 'PluginXtext_ModuleXdatabase',
		),
...

$aInherits = array('тип класса 1' => array('оригинальный класс' => 'мой новый класс', ...), ...);

а конфликты возникают из-за переопределения шаблонов, методов мапперов, любых методов любых классов без обязательного вызова parent::
avatar
ок, с массивом почти поятно стало, только не понятно, как воспринимается 'module' =>array('ModuleTopic'), где 'мой новый класс' не задан? в теории — как PluginPokupalka_ModuleTopic…

еще раз повторю, именно это 'module' =>array('ModuleTopic'=>'ModuleTopic') написание является единственным, при котором не конфликтуют плагины Pokupalka и Topicsfilter, и которое, по утверждению Ajaxy, является непправильным.
При этом, Topicsfilter установлен последним. это, вероятно, имеет значение.

по коду. объявление наследования я выложил в тексте поста.

// переопределения функций в этом модуле нет. только добавляются новые.
// вот ровно на этом месте я подумал, что тогда павильнее было написать 
//class PluginPokupalka_ModuleTopic extends ModuleTopic - это да.
class PluginPokupalka_ModuleTopic extends PluginPokupalka_Inherit_ModuleTopic {
	public function Init() {
		parent::Init();
		$this -> oUserCurrent = $this -> User_GetUserCurrent();
		# Catch up my mapper
		$this -> oMapperTopic = Engine::GetMapper('PluginPokupalka_ModuleTopic');
	}

//маппер:
 class PluginPokupalka_ModuleTopic_MapperTopic extends ModuleTopic_MapperTopic {
------------------------
//плагин Topicsfilter
 class PluginTopicsfilter_ModuleTopic extends PluginTopicsfilter_Inherit_ModuleTopic {

public function GetTopicsByFilter($aFilter,$iPage=0,$iPerPage=0,$aAllowData=array('user'=>array(),'blog'=>array('owner'=>array(),'relation_user'),'vote','favourite','comment_new')) {
	   $aFilter = $this->ModifyFilter($aFilter);
	   return parent::GetTopicsByFilter($aFilter,$iPage=0,$iPerPage=0,$aAllowData=array('user'=>array(),'blog'=>array('owner'=>array(),'relation_user'),'vote','favourite','comment_new'));

	}

	public function GetCountTopicsByFilter($aFilter) {
	   $aFilter = $this->ModifyFilter($aFilter);
	   return parent::GetCountTopicsByFilter($aFilter);
	}

вот вроде все правильно сделано. оба класса наследуют класс ModuleTopic, соответственно и друг друга тоже, ни одна функция не теряется, а включаешь — не работает.

Class 'PluginPokupalka_ModuleTopic' not found in C:\wamp\www\pokupalka.com\engine\classes\Engine.class.php on line 975

 Fatal error: Class 'PluginPokupalka_Inherit_ModuleTopic' not found in C:\wamp\www\pokupalka.com\plugins\pokupalka\classes\modules\topic\Topic.class.php on line 8
avatar
// переопределения функций в этом модуле нет. только добавляются новые.
// вот ровно на этом месте я подумал, что тогда павильнее было написать
//class PluginPokupalka_ModuleTopic extends ModuleTopic — это да.
если нет переопределения функций то зачем его использовать.
возможно я ошибаюсь, но в коменте мапер у Вас
//маппер:
 class PluginPokupalka_ModuleTopic_MapperTopic extends ModuleTopic_MapperTopic {
и в тоже время в теле топика вы указываете что переопределяли мапер в покупалке
//Plugin Pokupalka
protected $aInherits=array(       
       'module'  =>array('ModuleTopic'),
       'entity' => array('ModuleTopic_EntityTopic'),
       'action'=> array('ModuleTopic_ActionTopic'),
       'mapper'=> array('ModuleTopic_MapperTopic'),
);
avatar
… сор не все…
получается мапер Вы переопределили, но файл с ним не создали
avatar
если нет переопределения функций то зачем его использовать.
возможно я ошибаюсь, но в коменте мапер у Вас
я просто маппер сюда не приложил. он есть, я только заголовок класса запостил.
В моем комментарии не целиком классы, а только те части, которые, как мне кажется, могут иметь отношение к конфликту плагинов.

я не меняю ни одну из стандартных функций, просто дописал свои, некоторые из которых используют стандартные. потому проще было унаследовать класс, да и логично, что поддержка нового вида топика будет вызываться через тот же класс, что и остальные.
avatar
В моем комментарии не целиком классы, а только те части, которые, как мне кажется, могут иметь отношение к конфликту плагинов.
я и имел в виду что мапер вы переопределили 'mapper'=> array('ModuleTopic_MapperTopic'), а в файле мапера название класса оставили
class PluginPokupalka_ModuleTopic_MapperTopic extends ModuleTopic_MapperTopic {
не правильнее ли было бы сделать
class PluginPokupalka_ModuleTopic_MapperTopic extends PluginPokupalka_Inherit_ModuleTopic_MapperTopic
{
avatar
действительно, маппер я зря указал в $aInherits.
на самом деле, я уже точно так же сделал с модулем и entity и все конфликты отпали.
НО
я все еще пытаюсь понять, чем был вызван конфликт именно по ModuleTopic?

еще раз, с фокусом на этот модуль:

//Плагин Pokupalka
//Plugin Pokupalka
protected $aInherits=array(       
       'module'  =>array('ModuleTopic'),
);

class PluginPokupalka_ModuleTopic extends PluginPokupalka_Inherit_ModuleTopic {

//плагин Topicsfilter
protected $aInherits=array(
        'module'=>array('ModuleTopic'=>'_ModuleTopic'),
    );
class PluginTopicsfilter_ModuleTopic extends PluginTopicsfilter_Inherit_ModuleTopic {

Два плагина заявляют о наследовании одного и того же класса, при этом один из них перестает работать.

Есть ли тут логическая ошибка, или стоит принять это как «необъяснимый глюк»?
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.