Переопределение экшна в плагинах и поиск шаблона

У меня такая ситуация, что два разных плагина расширяют функциональность одного и того же метода экшна ActionAdmin. В одном плагине переопределяется шаблон contenttypes_fieldadd.tpl и сам экшн, а в другом только экшн.
Проблема в том, что когда я прописываю в делегатах одного плагина экшн ActionAdmin, то переопределённый шаблон из второго плагина перестаёт переопределяться (наверное и методы тоже) без всяких уведомлений о конфликтах. Как это можно обойти (всё-таки расширить экшн)? Я так понимаю, что в обычной ситуации, плагин, переопределяющий уже переопределённые методы, не активировался бы. Но в моем случае оба плагина уже активны. Может, добавить проверку и выводить сообщение в плагине для разработчиков? Это бы пригодилось во время разработки

Похожие статьи


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

+2
Переопределять экшены (как и другие компоненты — модули, сущности, мапперы) можно либо делегированием (прописывается в свойстве $aDelegates), либо наследованием (прописывается в свойстве $aInherits).

Делегирование — это, фактически, «жесткое» переопределение компонента, т.е. вместо исходного компонента используется «делегат». И «делегат» может быть только один (каждое последующее объявление делегата заменяет предыдущее).

Наследование — это нормальное наследование по всем канонам ООП (если быть более точным, то я называю это «динамическим автонаследованием», на Хабре писал об этом: habrahabr.ru/post/247351/). И «наследников» может быть сколько угодно, при этом первый «наследник» становится наследником исходного компонента, а каждый новый становится наследником предыдущего.

Механизм «делегирования» родился гораздо раньше механизма «наследования» (еще в ЛС), и, как правило, сейчас делегирование используется для переопределения файлов шаблонов. А для расширения функциональности следует использовать «наследование» (через $aInherits).
Отредактирован:
0
Спасибо, не знал, что можно добавлять в $aInherits свои экшны, действовал согласно комментариям к самим полям $aDelegates и $aInherits, которые даны в шаблоне плагина. А там написано
// Объявление делегирований (нужны для того, чтобы назначить свои экшны и шаблоны)
public $aDelegates=array(

// Объявление переопределений (модули, мапперы и сущности)
protected $aInherits=array(
+1
Недостаток инфы — самый главный бич в Альто :(
0
Видимо, что-то пошло не так. Шаблон экшна ищется неправильно, если есть 2 плагина, у которых наследуются одни и те же экшны (aInherits или aDelegates, не важно).
У меня вместо actions/admin/action.admin.settings/contenttypes_fieldadd.tpl ищется actions/admin/action.admin.settings-contenttypes-fieldadd.tpl, файла такого конечно нет, поэтому выбрасывается исключение. Именно этот шаблон переопределяется в первом плагине.
Добавил вывод стека вызовов в SetTemplateAction:
protected function SetTemplateAction($sTemplate) {
        if (substr($sTemplate, -4) != '.tpl') {
            $sTemplate = $sTemplate . '.tpl';
        }
        $sActionTemplatePath = $sTemplate;
    // § выводим трейс
        if (strpos($sActionTemplatePath, 'fieldadd')) {
            var_dump((new Exception())->getTraceAsString(), $sActionTemplatePath);
        }

Стектрейс в нормальной ситуации:

string(672) "#0 /var/www/altocms/common/classes/actions/ActionAdmin.class.php(4256): Action->SetTemplateAction('settings/conten...')
#1 /var/www/altocms/common/plugins/contentfieldsx/classes/actions/ActionAdmin.class.php(6): ActionAdmin->EventAddField()
#2 /var/www/altocms/engine/classes/abstract/Action.class.php(202): PluginContentfieldsx_ActionAdmin->EventAddField()
#3 /var/www/altocms/engine/classes/core/Router.class.php(605): Action->ExecEvent()
#4 /var/www/altocms/engine/classes/core/Router.class.php(188): Router->ExecAction()
#5 /var/www/altocms/engine/classes/core/Application.class.php(100): Router->Exec()
#6 /var/www/altocms/index.php(20): Application->Exec()
#7 {main}"
string(34) "settings/contenttypes_fieldadd.tpl"

Стек в моем случае:

string(434) "#0 /var/www/altocms/engine/classes/abstract/Action.class.php(418): Action->SetTemplateAction('settings-conten...')
#1 /var/www/altocms/engine/classes/core/Router.class.php(201): Action->GetTemplate()
#2 /var/www/altocms/engine/classes/core/Router.class.php(189): Router->Shutdown(false)
#3 /var/www/altocms/engine/classes/core/Application.class.php(100): Router->Exec()
#4 /var/www/altocms/index.php(20): Application->Exec()
#5 {main}"
string(34) "settings-contenttypes-fieldadd.tpl"
0
Ясно, проблема была в том, что при определённых условиях не вызывался parent::EventAddField(), в котором назначается шаблон, потому система сама пыталась найти файл.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.