Что делает элемент «update» в XML-макете Magento?

#layout #magento

#макет #magento

Вопрос:

Прямо сейчас я изучаю внутренности раздела администрирования Magento и наткнулся на этот фрагмент XML:

Файл: app/design/adminhtml/default/default/layout/catalog.xml , около строки 55

 50            <block type="core/template" template="catalog/wysiwyg/js.phtml"/>
51        </reference>
52    </adminhtml_catalog_product_new>
53    
54    <adminhtml_catalog_product_edit>
55        <update handle="editor"/>
56        <reference name="content">
57            <block type="adminhtml/catalog_product_edit" name="product_edit"></block>
58        </reference>
  

Что делает <update /> тег?

Ответ №1:

В <update> основном используется другой дескриптор.

Предположим, у вас есть это:

 <layout>
   <foo>
      <reference name="header">
          <block type="cms/block" name="some_block" as="someBlock">
              <action method="setBlockId"><block_id>some_block</block_id></action>
          </block>
      </reference>
      <reference name="left">
          <block type="cms/block" name="some_totally_different_block" as="someTotallyDifferentBlock">
              <action method="setBlockId"><block_id>some_totally_different_block</block_id></action>
          </block>
      </reference>
   </foo>
   <bar>
      <update handle="foo" /> 
      <reference name="header">
          <block type="cms/block" name="some_other_block" as="someOtherBlock">
              <action method="setBlockId"><block_id>some_other_block</block_id></action>
          </block>
      </reference>
   </bar>
</layout>
  

Результирующий XML для bar будет:

 <layout>
   <bar>
      <reference name="header">
          <!-- Start of part pulled in from foo -->
          <block type="cms/block" name="some_block" as="someBlock">
              <action method="setBlockId"><block_id>some_block</block_id></action>
          </block>
          <!-- End of part pulled in from foo -->
          <block type="cms/block" name="some_other_block" as="someOtherBlock">
              <action method="setBlockId"><block_id>some_other_block</block_id></action>
          </block>
      </reference>
      <!-- Start of part pulled in from foo -->
      <reference name="left">
          <block type="cms/block" name="some_totally_different_block" as="someTotallyDifferentBlock">
              <action method="setBlockId"><block_id>some_totally_different_block</block_id></action>
          </block>
      </reference>
      <!-- End of part pulled in from foo -->
   </bar>
</layout>
  

tl; dr: update дескриптор в основном представляет собой «объединение этого макета с моим текущим макетом».

Ответ №2:

Этот дескриптор используется для объединения существующих дескрипторов макета с вашим текущим макетом. В вашем примере <update handle="editor"/> будет добавлено <adminhtml_catalog_product_edit> следующее содержимое:

 <editor>
    <reference name="head">
        <action method="setCanLoadExtJs"><flag>1</flag></action>
        <action method="addJs"><script>mage/adminhtml/variables.js</script></action>
        <action method="addJs"><script>mage/adminhtml/wysiwyg/widget.js</script></action>
        <action method="addJs"><script>lib/flex.js</script></action>
        <action method="addJs"><script>lib/FABridge.js</script></action>
        <action method="addJs"><script>mage/adminhtml/flexuploader.js</script></action>
        <action method="addJs"><script>mage/adminhtml/browser.js</script></action>
        <action method="addJs"><script>prototype/window.js</script></action>
        <action method="addItem"><type>js_css</type><name>prototype/windows/themes/default.css</name></action>
        <action method="addItem"><type>js_css</type><name>prototype/windows/themes/magento.css</name></action>
    </reference>
</editor>
  

(дескриптор «editor» определен в app/design/adminhtml/default/default/layout/main.xml )

Комментарии:

1. Как Magento узнает, что дескриптор <editor> находится внутри main.xml ? Что, если другой пользовательский XML-файл содержит дескриптор <editor> ? Это также будет объединено?

2. Я думаю, что Magento объединит эти два дескриптора.

3. Хммм, означает ли это, что Magento будет искать все XML-файлы в папке layout для дескрипторов <editor> ? Извините, но не совсем понимаю.

4. @HashidHameed все XML-файлы загружены и проанализированы уже на этом этапе.

5. @rahmanisback Как возможно, что все XML-файлы анализируются во время выполнения обработчика обновлений, поскольку это сам по себе элемент xml, который еще предстоит проанализировать?