Разница между «страницей» и «макетом» корневых тегов в Magento 2

18

В Magento 2 некоторые макеты обрабатывают файлы XML, открытые с помощью

<page.../>

корневой тег Другие открыты с

<layout.../>

корневой тег Вносит ли использование одного из приведенных выше тегов какие-либо функциональные различия в XML-файл дескриптора макета? Или это чистая витрина? Или что-то среднее.

Два примера

<!-- File: vendor/magento/module-weee/view/frontend/layout/default.xml -->
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">

и

<!-- File: vendor/magento/module-widget/view/adminhtml/layout/adminhtml_widget_loadoptions.xml -->
<layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/layout_generic.xsd">
Алан Сторм
источник

Ответы:

13

Эти вопросы связаны с другой конфигурацией XSD.

<layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/layout_generic.xsd">

Объявление говорит, что мы хотим использовать макет с определением XSD, предоставленным в

lib/internal/Magento/Framework/View/Layout/etc/layout_generic.xsd

В layout_generic.xsdфайле содержится определение layoutузла с genericLayoutтипом элемента.

<xs:complexType name="genericLayout">
    <xs:sequence minOccurs="0" maxOccurs="unbounded">
        <xs:element ref="referenceContainer" minOccurs="0" maxOccurs="unbounded"/>
        <xs:element ref="container" minOccurs="0" maxOccurs="unbounded"/>
        <xs:element ref="block" minOccurs="0" maxOccurs="unbounded"/>
        <xs:element ref="referenceBlock" minOccurs="0" maxOccurs="unbounded"/>
        <xs:element ref="update" minOccurs="0" maxOccurs="unbounded"/>
        <xs:element ref="move" minOccurs="0" maxOccurs="unbounded"/>
        <xs:element ref="uiComponent" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
</xs:complexType>

Имея это, файл макета был проверен XSD при загрузке XML. В дополнение к этому он выделяет все возможные узлы и атрибуты узлов в файле layout.xml.

То же самое с page_configuration.xsdопределением для <page />узла. Этот XSD описывает узлы, которые можно использовать для описания страницы.

Надеюсь, это поможет.

Макс Пронько
источник
2
Шляпа помогает некоторым, +1 за это, но до сих пор не ясно, почему существует разница. Является ли макет просто необращенным наследием? Или существует различие по уважительной причине.
Алан Шторм
1
Это существует по причине. Просто представьте себе гибкость, когда вместо создания phtml или html файла и если вам нужно внести некоторые изменения в существующий файл, вы должны скопировать его, у вас есть декларативный способ определения страницы. С его HTML, тела и головы элементов. Макет - это просто еще один, другой уровень конфигурации, где вы оперируете с такими частями контента, как блок, компонент, контейнер и т. Д.
Макс Пронько
1
Не уверен, что вижу различие - нельзя <layout/>ли включить внутренние узлы файла в один и <page/> <body/>тот же эффект? Или я что-то упустил?
Алан Шторм
Рассматривайте этот подход как разделение интересов. В том числе во многих других местах, где Magento 2 разделяет классы, конфигурацию, макеты и т. Д.
Макс Пронько
9

Компоновка файлы , которые открываются с <layout></layout>являются макеты страниц , которые объявляют на каркас страницы внутри <body>секции, например , расположение одного столбца или две колонки.

Файлы макета, которые открываются с помощью, <page></page>являются файлами конфигурации страницы, которые добавляют контент в каркас, определенный в файле макета страницы.

Вот официальный документ об этом, пожалуйста, сообщите нам, если это может быть улучшено: http://devdocs.magento.com/guides/v2.0/frontend-dev-guide/layouts/layout-types.html

Alex
источник
Это было бы намного легче понять , если вы уточнить, как вы делали это в своем ответе, что один открывается <layout>и один с <page>по этой статье .
Джамил
0

Одно отличие, которое я заметил, заключается в том, что, поскольку это каркас страницы внутри тела , вы можете ajax получить только часть html. Обычно, если вы нажмете на контроллер, вы получите всю страницу, начиная с тега. Эти контроллеры возвращают объекты страницы, созданные PageFactory, которая использует макет типа xml. Но когда вы хотите динамически загружать некоторые phtml с помощью ajax-вызовов, таких как форма фильтра, это полезно. Magento_ImportExport динамически меняет фильтры экспорта при изменении сущности (продукта, клиента). Это пример использования magento (adminhtml_export_getfilter.xml).

Абхишек Джахотия
источник