<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
			<channel>
			<title>Переопределение экшна в плагинах и поиск шаблона / Вопросы, проблемы и их решения / Alto CMS</title>
			<link>http://79.174.14.219/comments/1297/</link>
			<description><![CDATA[У меня такая ситуация, что два разных плагина расширяют функциональность одного и того же метода экшна ActionAdmin. В одном плагине]]></description>
			<language>ru</language>
			<managingEditor>noreply@altocms.ru</managingEditor>
			<webMaster>noreply@altocms.ru</webMaster>
			<generator>Alto CMS v.1.5.0b1</generator>
							<item>
					<title>Переопределение экшна в плагинах и поиск шаблона (comment #23187)</title>
					<guid isPermaLink="true">http://79.174.14.219/t/1297/#comment23187</guid>
					<link>http://79.174.14.219/1297.html#comment23187</link>
					<author>vshemarov@gmail.com</author>
					<description><![CDATA[Переопределять экшены (как и другие компоненты — модули, сущности, мапперы) можно либо делегированием (прописывается в свойстве <strong>$aDelegates</strong>), либо наследованием (прописывается в свойстве <strong>$aInherits</strong>).<br/>
<br/>
Делегирование — это, фактически, «жесткое» переопределение компонента, т.е. вместо исходного компонента используется «делегат». И «делегат» может быть только один (каждое последующее объявление делегата заменяет предыдущее).<br/>
<br/>
Наследование — это нормальное наследование по всем канонам ООП (если быть более точным, то я называю это «динамическим автонаследованием», на Хабре писал об этом: <a href="http://habrahabr.ru/post/247351/" rel="nofollow" >habrahabr.ru/post/247351/</a>). И «наследников» может быть сколько угодно, при этом первый «наследник» становится наследником исходного компонента, а каждый новый становится наследником предыдущего.<br/>
<br/>
Механизм «делегирования» родился гораздо раньше механизма «наследования» (еще в ЛС), и, как правило, сейчас делегирование используется для переопределения файлов шаблонов. А для расширения функциональности следует использовать «наследование» (через <strong>$aInherits</strong>).]]></description>
					<pubDate>Mon, 24 Aug 2015 15:26:20 +0300</pubDate>
									</item>
							<item>
					<title>Переопределение экшна в плагинах и поиск шаблона (comment #23188)</title>
					<guid isPermaLink="true">http://79.174.14.219/t/1297/#comment23188</guid>
					<link>http://79.174.14.219/1297.html#comment23188</link>
					<author>alto@hitagi.ru</author>
					<description><![CDATA[Спасибо, не знал, что можно добавлять в $aInherits свои экшны, действовал согласно комментариям к самим полям $aDelegates и $aInherits, которые даны в шаблоне плагина. А там написано <br/>
<blockquote>// Объявление делегирований (нужны для того, чтобы назначить свои <strong>экшны и шаблоны</strong>)<br/>
public $aDelegates=array(<br/>
<br/>
// Объявление переопределений (<strong>модули, мапперы и сущности</strong>)<br/>
protected $aInherits=array(<br/>
</blockquote>]]></description>
					<pubDate>Mon, 24 Aug 2015 15:38:09 +0300</pubDate>
									</item>
							<item>
					<title>Переопределение экшна в плагинах и поиск шаблона (comment #23189)</title>
					<guid isPermaLink="true">http://79.174.14.219/t/1297/#comment23189</guid>
					<link>http://79.174.14.219/1297.html#comment23189</link>
					<author>vshemarov@gmail.com</author>
					<description><![CDATA[Недостаток инфы — самый главный бич в Альто :(]]></description>
					<pubDate>Mon, 24 Aug 2015 15:40:20 +0300</pubDate>
									</item>
							<item>
					<title>Переопределение экшна в плагинах и поиск шаблона (comment #23191)</title>
					<guid isPermaLink="true">http://79.174.14.219/t/1297/#comment23191</guid>
					<link>http://79.174.14.219/1297.html#comment23191</link>
					<author>alto@hitagi.ru</author>
					<description><![CDATA[Видимо, что-то пошло не так. Шаблон экшна ищется неправильно, если есть 2 плагина, у которых наследуются одни и те же экшны (aInherits или aDelegates, не важно). <br/>
У меня вместо actions/admin/action.admin.settings/contenttypes_fieldadd.tpl ищется actions/admin/action.admin.settings-contenttypes-fieldadd.tpl, файла такого конечно нет, поэтому выбрасывается исключение. Именно этот шаблон переопределяется в первом плагине.<br/>
Добавил вывод стека вызовов в <a href="https://github.com/altocms/altocms/blob/b46633a360d8b07ddcd366bf53222612e8c827b7/engine/classes/abstract/Action.class.php#L345" rel="nofollow" >SetTemplateAction</a>:<br/>
<pre class="prettyprint"><code>protected function SetTemplateAction($sTemplate) {
        if (substr($sTemplate, -4) != '.tpl') {
            $sTemplate = $sTemplate . '.tpl';
        }
        $sActionTemplatePath = $sTemplate;
    // § выводим трейс
        if (strpos($sActionTemplatePath, 'fieldadd')) {
            var_dump((new Exception())-&gt;getTraceAsString(), $sActionTemplatePath);
        }</code></pre><br/>
Стектрейс в нормальной ситуации:<br/>
<pre class="prettyprint"><code>
string(672) &quot;#0 /var/www/altocms/common/classes/actions/ActionAdmin.class.php(4256): Action-&gt;SetTemplateAction('settings/conten...')
#1 /var/www/altocms/common/plugins/contentfieldsx/classes/actions/ActionAdmin.class.php(6): ActionAdmin-&gt;EventAddField()
#2 /var/www/altocms/engine/classes/abstract/Action.class.php(202): PluginContentfieldsx_ActionAdmin-&gt;EventAddField()
#3 /var/www/altocms/engine/classes/core/Router.class.php(605): Action-&gt;ExecEvent()
#4 /var/www/altocms/engine/classes/core/Router.class.php(188): Router-&gt;ExecAction()
#5 /var/www/altocms/engine/classes/core/Application.class.php(100): Router-&gt;Exec()
#6 /var/www/altocms/index.php(20): Application-&gt;Exec()
#7 {main}&quot;
string(34) &quot;settings/contenttypes_fieldadd.tpl&quot;</code></pre><br/>
Стек в моем случае:<br/>
<pre class="prettyprint"><code>
string(434) &quot;#0 /var/www/altocms/engine/classes/abstract/Action.class.php(418): Action-&gt;SetTemplateAction('settings-conten...')
#1 /var/www/altocms/engine/classes/core/Router.class.php(201): Action-&gt;GetTemplate()
#2 /var/www/altocms/engine/classes/core/Router.class.php(189): Router-&gt;Shutdown(false)
#3 /var/www/altocms/engine/classes/core/Application.class.php(100): Router-&gt;Exec()
#4 /var/www/altocms/index.php(20): Application-&gt;Exec()
#5 {main}&quot;
string(34) &quot;settings-contenttypes-fieldadd.tpl&quot;</code></pre>]]></description>
					<pubDate>Mon, 24 Aug 2015 16:41:41 +0300</pubDate>
									</item>
							<item>
					<title>Переопределение экшна в плагинах и поиск шаблона (comment #23193)</title>
					<guid isPermaLink="true">http://79.174.14.219/t/1297/#comment23193</guid>
					<link>http://79.174.14.219/1297.html#comment23193</link>
					<author>alto@hitagi.ru</author>
					<description><![CDATA[Ясно, проблема была в том, что при определённых условиях не вызывался parent::EventAddField(), в котором назначается шаблон, потому система сама пыталась найти файл.]]></description>
					<pubDate>Mon, 24 Aug 2015 17:34:58 +0300</pubDate>
									</item>
					</channel>
	</rss>
