É possível remover elementos em um layout de página no Magento2?

8

Quando leio a documentação em layouts de página ( http://devdocs.magento.com/guides/v2.0/frontend-dev-guide/layouts/layout-types.html#layout-types-page ), vejo que o as seguintes instruções neste documento XML são permitidas:

  • <container>
  • <referenceContainer>
  • <move>
  • <update>

Como <referenceBlock name="block.name" remove="true" />não é uma das instruções permitidas, como posso remover um determinado elemento em um layout de página específico?

O que eu quero para as principais categorias é um design de página totalmente diferente. Não preciso de certos contêineres e blocos para este design. Para essas categorias, quero mostrar apenas categorias filho e não os produtos.

O que eu fiz agora é adicionar as seguintes linhas no layout da minha página: (in design\frontend\Vendor\Name-of-theme\Magento_Theme\page_layout\catalog-blocks.xml)

<move element="category.image" destination="delete"></move>
<move element="category.description" destination="delete"></move>
<move element="category.products" destination="delete"></move>
<move element="page.main.title" destination="delete"></move>

No design\frontend\Vendor\Name-of-theme\Magento_Theme\layouts.xmleu adicionei:

<layout id="catalog-blocks">
    <label translate="true">Catalog Blocks</label>
</layout>

Dei a todas as categorias principais este catálogo - bloqueia o layout da página no administrador.

Depois, no layout principal ( design\frontend\Vendor\Name-of-theme\Magento_Theme\layout\default.xml), adicionei:

<referenceBlock name="delete" remove="true" />

Portanto, todo o bloco de exclusão será excluído, com todas as coisas que mudei para cá, no layout da página. Isso funciona bem! Consegue exatamente o que eu quero, mas a coisa toda me parece um pouco tola.

Isso é considerado uma boa prática? Caso contrário, qual seria uma boa alternativa?

Edit 1 : Modificado o remove-tag na minha pergunta com o caminho certo para evitar confusão.

Editar 2 : Mais algumas informações sobre os arquivos e os locais dos arquivos.

11mb
fonte

Respostas:

12

A respeito:

  • criando um novo contêiner (em vez de um bloco)
  • mova seus blocos para o container
  • remova o recipiente

Algo assim:

<container name="delete" htmlTag="div" htmlClass="delete"/>

<move element="category.image" destination="delete"></move>
<move element="category.description" destination="delete"></move>
<move element="category.products" destination="delete"></move>
<move element="page.main.title" destination="delete"></move>

<referenceContainer name="delete" remove="true" />
Raphael na Digital Pianism
fonte
Sim, foi exatamente o que eu fiz. O que quero dizer é: isso parece estranho. Essa é a única solução alternativa? Por que o Magento não incorporou esse recurso nos page_layouts e há um bom motivo para não conseguir remover os blocos?
11mb
@ 11mb é um pouco diferente do que você fez no meu post. Estou criando e referenciando um contêiner em um único arquivo (o layout da página xml), enquanto na sua pergunta você está usando um bloco e vários arquivos XML. No entanto essa é uma ótima pergunta que eu não sei por que Magento não construir esse recurso nas page_layouts
Raphael em Digital pianismo
@ 11mb sensação livre para criar um problema no repo Magento 2 GitHub para resolver esse problema, é definitivamente uma questão interessante e eu tenho certeza que há uma boa razão por trás disso
Raphael em Digital pianismo
11
Eu vejo o que você fez aqui. Eu acho que é uma abordagem um pouco melhor. Vou testá-lo e voltar aqui.
11mb
6

Esta é a melhor prática para remover qualquer bloco ou contêiner no magento 2. Você pode passar name attributedentro namedo elemento abaixo.

<referenceBlock name="block.name" remove="true" />

Você pode pesquisar dentro do sistema magento 2; você encontrará muitos lugares com a mesma sintaxe acima.

Sua maneira de recomendação do magento. Se o atributo remove = "true", adicione o elemento a ser removido da lista desse layout.

No magento 1 <remove> elementé válido, mas no Magento 2 você deve definir a sintaxe igual à anterior.

Rakesh Jesadiya
fonte
Valeu! Eu acho que tenho que reformular a pergunta um pouco. É possível usar <referenceBlock name="block.name" remove="true" />(eu estava errado sobre a removetag) em um layout de página diretamente, pois referenceBlocktambém não é permitido. Eu ainda devo moveum elemento para um 'delete-container' e depois o excluo no arquivo de layout principal. O que me parece estranho.
11mb
referenceBlock é usado quando o bloco já está definido com o nome. caso contrário, não é útil. ex. <block class="Magento\Framework\View\Element\Html\Links" name="top.links">, neste caso, você pode usar<referenceBlock name="top.links" remove="true" />
Rakesh Jesadiya
Estou ciente de que o bloco deve existir antes. Porém, em um layout de página, não posso usar todas as instruções genéricas de layout, conforme descrito aqui: devdocs.magento.com/guides/v2.0/frontend-dev-guide/layouts/… . (Eu editei a minha pergunta), então eu não posso usar referenceBlock
11mb
em qual página você está trabalhando agora e qual elemento deseja excluir?
Rakesh Jesadiya
Eu adicionei mais algumas informações na pergunta. Obrigado por seu apoio!
11mb
1

Os layouts de página devem ser usados ​​apenas para criar uma estrutura de arame / estrutura da página e não para modificações menores, como a remoção de blocos.

Para remover um bloco apenas para seu novo layout, acho que a melhor maneira é criar seu próprio identificador de layout e fazer as modificações nele. Por exemplo, você pode criar catalog_category_toplevel.xml que usa seu novo wireframe / layout e remover os blocos.

Como essa é mais uma tarefa de back-end, não me sinto à vontade para fornecer instruções para esta desculpa :( Estes dois artigos de Alan Storm podem ajudá-lo com isso:

TL: DR

Se você desejar fazer isso e seguir as práticas recomendadas, precisará criar um novo identificador de layout.

Ben Crook
fonte