18
Como criar arquivos de layout Magento 2
A visualização (view) faz parte da camada de controle do padrão de arquitetura de software MVC (Model-Controller-View).
A camada de visualização é responsável por uma interface, onde o usuário pode interagir, e exibir os dados da camada de modelo (Model). Os dados, quando alterados na camda de modelo, devem refletir os novos valores na camada de visualização.
O Layout é o principal caminho da camada de visão no módulo. O arquivo de layout fornece a estrutura para páginas web usando um arquivo XML que identifica todos os contêineres e blocos que compõem a página, deve ser localizado como: \{Vendor}\{Module}\view\{area}\layout\{route_id}_{controller_directory}_{controller_name}.xml
.
O caminho da área pode ser frontend ou adminhtml que define onde o layout será aplicado. Para inserir blocos no painel administrativo do Magento utilizá-se a área adminhtml, e para inserir blocos na parte visual da loja do site utilizá-se a área frontend. Existe um arquivo de layout especial, o default.xml
, que é utilizado quando é necessário fazer uma alteração em todas as páginas da sua área.
<?xml version="1.0"?>
<layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/layout_generic.xsd">
<body>
<referenceContainer name="{container_name}">
<uiComponent name="{ui_component_name}"/>
<block class="{Vendor}\{Module}\Block\{Directory}\{Class}" name="{block_name}" template="{Vendor_Module}::{path}/{file_name}.phtml" />
<block name="{block_name}" template="{Vendor_Module}::{path}/{file_name}.phtml">
<arguments>
<argument name="{view_model_name}" xsi:type="object">{Vendor}\{Module}\ViewModel\{ClassName}</argument>
</arguments>
</block>
<referenceBlock name="{block_name}" template="Vendor_Module::{path}/{file_name}.phtml"/>
<container name="{container_name}" as="{alias_name}" label="{Label Name}" htmlTag="{tag_name}" htmlClass="{class-name}" htmlId="{idName}">
<uiComponent name="{ui_component_name}"/>
<block class="{Vendor}\{Module}\Block\{Directory}\{Class}" name="{block_name}" template="{Vendor_Module}::{path}/{file_name}.phtml" />
<block name="{block_name}" template="{Vendor_Module}::{path}/{file_name}.phtml">
<arguments>
<argument name="{view_model_name}" xsi:type="object">{Vendor}\{Module}\ViewModel\{ClassName}</argument>
</arguments>
</block>
<referenceBlock name="{block_name}" template="Vendor_Module::{path}/{file_name}.phtml"/>
</container>
</referenceContainer>
</body>
</layout>
O arquivo layout fornece a estrutura para páginas web usando um arquivo XML que identifica todos os contêineres e blocos que compõem a página.
O nó <move>
muda a ordem de um bloco ou contêiner específico já declarado como filho de outro específico elemento. Caso o elemento não for definido, este nó será ignorada na renderização. Durante a geração do layout, o nó <move>
é processado antes do nó <remove>
. Isso significa que se algum elemento for movido para outro elemento programado para ser removido, o elemento movido será removido junto.
Se o atributo as
não for definido, o valor atual do alias do elemento será usado. Se isso não for possível, o valor do nome do atributo usado em seu lugar.
Name | Descrição | Valor | Obrigatório? |
---|---|---|---|
element | Nome do elemento que será movido. | Nome do elemento. | true |
destination | Nome do elemento pai que receberá o elemento. | Nome do elemento. | true |
as | Alias ou nome do elemento na nova localização. | 0-9, A-Z, a-z, sublinhado (_), ponto (.), sinal de menos (-). Deve iniciar com letras. Case-sensitive. | false |
after | Específica a posição do elemento relativa aos seus irmãos. Use o sinal de menos (-) para posicionar o elemento depois de todos os outros elementos irmãos do mesmo nível de aninhamento. Se o atributo for omitido, o elemento será exibido depois de todos os elementos irmãos. | Nome do elemento. | false |
before | Específica a posição do elemento relativa aos seus irmãos. Use o sinal de menos (-) para posicionar o elemento antes de todos os outros elementos irmãos do mesmo nível de aninhamento. Se o atributo for omitido, o elemento será exibido depois de todos os elementos irmãos. | Nome do elemento. | false |
O nó <remove>
é usado somente para remover os recursos estáticos vinculados a uma seção <head>
da página (CSS, JS, etc). Para remover blocos ou contêineres, use o atributo remove
nos nós <referenceBlock>
e <referenceContainer>
.
O nó <update>
inclui um específico arquivo de layout. O atributo handle
específica qual layout será incluído.
Contêineres atribuem a estrutura do conteúdo para a página usando nós dentro do arquivo layout XML. Um contêiner não possui conteúdo adicional, exceto o conteúdo incluído no elemento, mas que encapsula os elementos de blocos e outros contêineres.
Um contêiner renderiza um elemento filho durante a geração da saída de visualização. O elemento gerado pode estar vazio ou pode conter um conjunto arbitrário de elementos <block>
, <container>
, <referenceBlock>
e <referenceContainer>
. Se o contêiner estiver vazio e não houver filhos disponíveis, o contêiner não será exibido no código fonte do navegador.
Atributo | Descrição | Valor | Obrigatório? |
---|---|---|---|
name | Nome que poderá ser usado para endereçar o contêiner. O nome deve ser único por página gerada. Se não for especificado, será gerado automaticamente. | 0-9, A-Z, a-z, sublinhado (_), ponto (.), sinal de menos (-). Deve iniciar com letras. Case-sensitive. | false |
label | Descreve a finalidade do contêiner. | Qualquer um. | false |
before | Usado para posicionar o contêiner antes de um elemento com o mesmo pai. O nome do elemento ou alias é especificado como valor. Use o sinal de menos (-) para posicionar o contêiner antes de todos os outros elementos do mesmo nível de aninhamento. | Nome do elemento ou sinal de menos (-). | false |
after | Usado para posicionar o contêiner depois de um elemento com o mesmo pai. O nome do elemento ou alias é especificado como valor. Use o sinal de menos (-) para posicionar o contêiner depois de todos os outros elementos do mesmo nível de aninhamento. | Nome do elemento ou sinal de menos (-). | false |
as | Um alias que serve para identificar no escopo o elemento. | 0-9, A-Z, a-z, sublinhado (_), ponto (.), sinal de menos (-). Deve iniciar com letras. Case-sensitive. | false |
output | Define se o elemento root deve ser gerado. Se sim, o elemento será adicionado à lista de saída (se não for especificado, o elemento pai é responsável por renderizar seus filhos). | Qualquer valor, exceto toHtml obsoletos ("1" é o valor recomendado). | false |
htmlTag | Parâmetro de saída. Se especificado, a saída é agrupada dentro da tag HTML especificada. | aside, dd, div, dl, fieldset, main, nav, header, footer, ol, p, section, table, tfoot e ul | false |
htmlId | Parâmetro de saída. Se especificado, a saída é agrupado. Se não houver nenhum elemento agrupado, este atributo não tem efeito. | Qualquer id válido para HTML5. | false |
htmlClass | Parâmetro de saída. Se especificado, a saída é agrupado. Se não houver nenhum elemento agrupado, este atributo não tem efeito. | Qualquer id válido para HTML5. | false |
Blocos renderizam conteúdos dos elementos da interface dos usuários na página utilizando nós <block>
dentro do arquivo layout XML. Blocos usam templates para gerar o HTML e serem inseridos no pai da estrutura do bloco.
O nó block
é uma unidade de saída da página que renderiza algum conteúdo (qualquer coisa visualmente tangível para o usuário final).
Blocos são uma unidade de construção fundamental para layouts no Magento. Eles são o link entre a classe de Bloco do PHP (que contém o lógica do negócio) e o template (que renderiza o conteúdo). Blocos podem ter diversas ramificações (filhos, netos, etc).
É recomendável sempre adicionar um atributo
name
ao bloco, ou o Magento nomeará aleatoriamente.
Se não for especificado, um nome automático será atribuído no formato ANONYMOUS_{n}.
Atributo | Descrição | Valor | Obrigatório? |
---|---|---|---|
before | Usado para posicionar o bloco antes de um elemento com o mesmo pai. O nome do elemento ou alias é especificado como valor. Use o sinal de menos (-) para posicionar o bloco antes de todos os outros elementos do mesmo nível de aninhamento. | Nome do elemento ou sinal de menos (-). | false |
after | Usado para posicionar o bloco depois de um elemento com o mesmo pai. O nome do elemento ou alias é especificado como valor. Use o sinal de menos (-) para posicionar o bloco depoi de todos os outros elementos do mesmo nível de aninhamento. | Nome do elemento ou sinal de menos (-). | false |
template | Um template que representa a funcionalidade do bloco para o qual o atributo é atribuído. Se o atributo for omitido, o bloco não renderizará nenhuma saída, a menos que o bloco (ou pai) tenha a variável $_template definida corretamente. | {Vendor}_{Module}::{pastas}/{arquivo}.phtml | false |
as | Um alias que serve para identificar no escopo o elemento. | 0-9, A-Z, a-z, sublinhado (_), ponto (.), sinal de menos (-). Deve iniciar com letras. Case-sensitive. | false |
cacheable | Define se o emento bloco é cacheavel. Isto não pode ser usado para fins de desenvolvimento e tornar dinâmicos os elementos necessários da página. | true (padrão) / false | false |
ifconfig | Faz a visibilidade do bloco depender de uma configuração. | Caminho da configuração. | false |
Dados podem ser passados do arquivo layout XML para o bloco usando o nó <arguments>
no nó filho. Os valores dos argumentos definidos em um arquivo de layout podem ser acessados em templates usando os métodos $block->getData('{argument_name}')
e $block->hasData('{argument_name}')
(retorna um valor boleano verificando se o valor foi definido). O {argument_name}
é obtido do atributo name
do nó <argument>
.
Atributo | Descrição | Valor | Obrigatório? |
---|---|---|---|
name | Nome do argumento. | 0-9, A-Z, a-z, sublinhado (_), ponto (.), sinal de menos (-). Deve iniciar com letras. Case-sensitive. | true |
shared | Se falso, cria uma nova instância do bloco. | false | false |
translate | Específica se a valor (deve ser tipo string) será traduzido. | true (padrão) / false | false |
xsi:type | Tipo do argumento. | string, boolean, object, number, null, array, options, url, helper | true |
Para atualizar contêineres e blocos são utilizados os nós <referenceBlock>
e <referenceContainer>
. O nó <referenceBlock>
contém todos os atributos do nó <block>
e o nó <referenceContainer>
contém todos os atributos do nó <container>
.
Atributo | Descrição | Valor | Obrigatório? |
---|---|---|---|
remove | Permite remover ou cancelar a remoção do elemento. Quando um contêiner é removido, os elementos filhos são removidos também. | true / false | false |
display | Permite desabilitar a renderização de um específico bloco ou contêiner com todos os seus filhos. Os objetos PHP do bloco, contêiner ou seus filhos ainda serão gerados e disponibilizados para manipulação. | true / false | false |
Valores entre chaves (
{test}
) devem ser alterados na implementação do código.
Execute o comando PHP para limpar todos os caches de armazenamento em cache do processos.
php bin/magento cache:clean
php bin/magento flush
Segue a a lista de diretórios e arquivos que devem ser criados.
- app/
- code/
- {Vendor}/
- {Module}/
- etc/
- module.xml
- view/
- {area}/
- layout/
- {route_id}_{controller_directory}_{controller_name}.xml
- registration.php
- composer.json
18