2013-03-12 4 views
1

В бэкэнде моего веб-магазина Magento я хочу установить шаблон для блоков System-> Config. Поэтому я использую дескриптор макета Mage_Adminhtml_System_ConfigController, который adminhtml_system_config_index Я думаю. Проблема в том, что ничего не происходит. Даже, если хотите, чтобы удалить блоки, ничего не происходит:Установить шаблон в макете дескриптора для Adminhtml

<adminhtml_system_config_index> 
    <reference name="left"> 
     <action method="setTemplate"> 
      <template>myModule/template.phtml</template> 
     </action> 
    </reference> 
</adminhtml_system_config_index> 

ИЛИ извлекая блок:

<adminhtml_system_config_index> 
    <remove name="left" /> 
</adminhtml_system_config_index> 

Что я делаю неправильно? Я даже попробовал system_config_index как макет макета.

ответ

3

Вы делаете здесь три ошибки.

Первый совет: Вы редактируете правый XML-файл?

Многие распространенные проблемы макета возникают из файла XML, который вы редактируете, не являющегося файлом XML, загруженным системой. Включите режим разработчика на своем сайте, установите display_errors на 1, а затем преднамеренно введите неверно сформированную ошибку в ваши XML-файлы и попробуйте загрузить страницу.

<!-- note the trailing greater than sign at the end --> 
<adminhtml_system_config_index> 
    ... 
</adminhtml_system_config_index> > 

Если страница загружается без ошибок, то вы не загружаете XML-файл, который, как вы думаете.

Второй совет: Вы используете правильную рукоятку компоновки?

Я не уверен, что вы находитесь. Несмотря на то, что на странице конфигурации системы по умолчанию используется действие index, это действие фактически пересылает страницу в действие edit.

#File: app/code/core/Mage/Adminhtml/controllers/System/ConfigController.php 
public function indexAction() 
{ 
    $this->_forward('edit'); 
} 

Пересылка означает, что есть внутренняя повторная отправка, но не перенаправление http. Это означает, что фактическая ручка

`adminhtml_system_config_edit` 

Вот почему я использую (отказ от ответственности: и построен, и продать) Commerce Bug. На вкладке «Макет» всегда отображаются текущие дескрипторы, и я могу избежать предположений, которые отправляют мне неправильный путь.

image of layout table showing Commerce Bug handles

Третьего Совет: Вы путаете блок с именем left с левой колонкой?

В общем, контейнерные блоки Magento (в left, content, right и т.д.) не шаблона блоков. Вместо этого они являются контейнерами (text/list блоков, если быть точным), которые содержат и несколько блоков шаблонов.

Это другое место, где я использую Commerce Bug, specifically the new Graphviz feature. Это покажет вам структуру блока для любой конкретной страницы. В системе заводских настроек по умолчанию, вы увидите что-то вроде этого на странице настройки системы

enter image description here

Как вы можете видеть, левый блок не имеет шаблона, поэтому изменение его шаблон не будет иметь никакого эффекта.Вероятно, вам нужен блок left.child1.

Четвертый совет: Является блоком, который вы пытаетесь изменить, добавленным XML-макетом.

Не слишком углубляясь в рендеринг макета (который будет take a book), есть некоторый блок, который добавляется после макет генерирует все его блоки. Если это так, ваш блок не будет доступен в XML-файлах макета.

Если посмотреть на метод editAction, вы можете увидеть, что блок вкладок добавляется послеloadLayout называется (ищите adminhtml/system_config_tabs). Это означает, что он не будет доступен в XML-файлах макета.

public function editAction() 
{ 
    //...  

    //the `loadLayout` method call creates blocks based on layout XML files 
    $this->loadLayout(); 

    $this->_setActiveMenu('system/config'); 
    $this->getLayout()->getBlock('menu')->setAdditionalCacheKeyInfo(array($current)); 

    $this->_addBreadcrumb(Mage::helper('adminhtml')->__('System'), Mage::helper('adminhtml')->__('System'), 
     $this->getUrl('*/system')); 

    //this line add the `child1` block to the layout. (child one is the 
    //name chosen since the block has no explicit name 
    $this->getLayout()->getBlock('left') 
     ->append($this->getLayout()->createBlock('adminhtml/system_config_tabs')->initTabs()); 

    //... 

Это означает, что вы не можете изменить шаблон этого блока из XML-файла макета. Вам нужно будет использовать настраиваемый модуль, который будет прослушивать соответствующее событие, а затем вносить изменения через PHP. Я хотел бы попробовать событие controller_action_layout_render_before или controller_action_layout_render_before_adminhtml_system_config_edit с PHP код, который выглядит примерно

$block = Mage::getSingleton('core/layout')->getBlock('child1'); 
if($block) 
{ 
    $block->setTemplate('foo.phtml'); 
} 
+0

Update: Так что я отлажена в него. Макет xml загружен правильно. Он застревает в Mage_Core_Model_Layout' (Enterprise 1.12.0.2). Если я использую 'left.child1': строка 311' if (! Empty ($ block)) 'не будет выполняться, поэтому' setTemplate' не будет вызываться. Если я использую 'left', он преуспевает, но, как вы уже сказали, вы не можете установить шаблон в« text/list ». Поэтому мне интересно, почему '$ block = $ this-> getBlock ($ parentName);' with $ parentName - 'left.child1' возвращает false? Я попытался ссылаться на 'footer', который работал, потому что он создается напрямую. Почему я не могу это сделать с левой колонкой? – tester

+1

@tester Обновлен ответ. Похоже, что этот блок добавляется через PHP ** после ** макета XML-рендеринга, что означает, что он недоступен через XML-файлы макета. –

+0

один последний вопрос: как я могу добавить файл css в этот 'left.child1'? Я пробовал '$ block-> addCss ('...');' и 'Mage :: getSingleton ('core/layout') -> addCss ('...');', но ничего не получилось. UPDATE: я нашел решение: addCss работает в блоке 'head'. – tester