В чем разница между методами remove и unsetChild в макете? - PullRequest
20 голосов
/ 15 июня 2011

Чем отличаются методы remove и unsetChild в макете?

Например (в файле макета poll.xml):

<customer_account_index>
    <reference name="right">
        <action method="unsetChild"><name>catalog_compare_sidebar</name></action>
    </reference>
</customer_account_index>

Почему unsetChild , а не просто remove ?

Ответы [ 2 ]

38 голосов
/ 15 июня 2011

Удаление узлов будет обработано после объединения всех дескрипторов макета, и это хороший способ удалить блок независимо от того, какой дескриптор макета загрузил блок; Вы просто хотите избавиться от этого полностью за некоторые ручки! Он также удаляет рекурсивно, поэтому все, что вам нужно указать, это дескриптор макета.

С другой стороны, вы можете захотеть удалить блок только из ссылки в определенном дескрипторе макета, в этом случае вам следует использовать unsetChild. Он часто используется для удаления блока из ссылки, но затем повторно вставляет тот же блок с другой позицией. Это было бы невозможно при удалении.

В вашем конкретном примере разработчики magento использовали его, чтобы придать magento некоторую гибкость. Допустим, я добавил подстраницу для страницы индекса учетной записи, и были загружены следующие маркеры макета:

  • по умолчанию
  • ...
  • customer_account_index
  • customer_account_index_subpage

А теперь предположим, что на этой подстранице я бы хотел блок 'catalog_compare_sidebar'. Если бы они использовали «удалить», я бы не смог добавить этот блок (с этим конкретным именем), потому что «удалить» будет обработан после того, как я сам добавил блок.

Это позволяет легко вносить изменения из одного файла; local.xml.

1 голос
/ 15 июня 2011

Взяв в качестве примера код, если вы используете unsetchild, сравните блок боковой панели, удаленный из правого столбца, но вы можете использовать его в любом месте, например, в левом столбце, нижнем колонтитуле и т. Д., remove полностью удаляется из шаблона, ине может использоваться нигде.

Удалите боковую панель сравнения, используя remove, и если вы вызовете ее где-то еще, будет выдана ошибка.

...