Diferencia entre las etiquetas raíz "página" y "diseño" en Magento 2

18

En Magento 2, algunos diseños manejan archivos XML abiertos con

<page.../>

etiqueta raíz Otros abren con el

<layout.../>

etiqueta raíz ¿El uso de cualquiera de las etiquetas anteriores introduce alguna diferencia de funcionalidad en un archivo XML de manejo de diseño? ¿O es este puro escaparate? O algo en el medio.

Dos ejemplos

<!-- 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">

y

<!-- 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">
Alan Storm
fuente

Respuestas:

13

Estos asuntos se deben a una configuración XSD diferente. los

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

La declaración dice que queremos usar el diseño con la definición XSD proporcionada en el

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

En el layout_generic.xsdarchivo proporciona la definición de layoutnodo con genericLayouttipo de elemento.

<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>

Teniendo eso, el archivo de diseño ha sido validado por el XSD cuando se carga xml. Además de esto, resalta todos los nodos y atributos de nodo posibles en el archivo layout.xml.

Lo mismo con la page_configuration.xsddefinición de <page />nodo. Este XSD describe nodos que se pueden usar para describir la página.

Espero eso ayude.

Max Pronko
fuente
2
hat ayuda a algunos, +1 para eso, pero aún no está claro por qué existe la diferencia. ¿El diseño es simplemente legado no convertido? ¿O la distinción existe por una buena razón?
Alan Storm
1
Existe por una razón. Solo imagine flexibilidad cuando en lugar de crear archivos phtml o html y si necesita alguna modificación en el archivo existente, tiene que copiarlo, tiene una forma declarativa de definir una página. Con sus elementos html, cuerpo y cabeza. Diseño: es solo otra capa de configuración diferente, donde opera con piezas de contenido como bloque, componente, contenedor, etc.
Max Pronko
1
No estoy seguro de ver la distinción: ¿no <layout/>pueden incluirse los nodos internos de un archivo en un <page/> <body/>por el mismo efecto? ¿O me estoy perdiendo algo?
Alan Storm
Considere este enfoque como una separación de preocupaciones. Incluyendo muchos otros lugares donde Magento 2 dividió clases, configuración, diseños, etc.
Max Pronko
9

Los archivos de diseño que se abren <layout></layout>son diseños de página que declaran la estructura metálica de una página dentro de la <body>sección, por ejemplo, diseño de una columna o diseño de dos columnas.

Los archivos de diseño que se abren <page></page>son archivos de configuración de página que agregan contenido a la estructura definida en un archivo de diseño de página.

Aquí está el documento oficial al respecto, háganos saber si se puede mejorar: http://devdocs.magento.com/guides/v2.0/frontend-dev-guide/layouts/layout-types.html

Alex
fuente
Esto sería mucho más fácil de entender si aclaras, como lo hiciste en tu respuesta, que uno se abre con <layout>otro <page>en este artículo .
jamil
0

Una diferencia que he notado es que, debido a que es una estructura alámbrica de una página dentro del cuerpo , puede recuperar solo una parte de html. Normalmente, si golpeas un controlador, obtienes toda la página comenzando con la etiqueta. Estos controladores están devolviendo objetos de página creados por PageFactory que utiliza el diseño de tipo xml. Pero cuando desea cargar dinámicamente algo de phtml con llamada ajax como forma de filtro, es útil. Magento_ImportExport cambia dinámicamente los filtros de exportación cuando la entidad (producto, cliente) cambia. Este es un ejemplo de cuándo utiliza magento (adminhtml_export_getfilter.xml).

Abhishek Jakhotiya
fuente