Insira um bloco não definido em uma página CMS (em uma posição específica)
-
13-12-2019 - |
Pergunta
Estou construindo um tema personalizado, usando base/default como base.Quero usar a funcionalidade de inscrição em boletim informativo integrada do Magento, mas não quero que ela apareça no left
bloquear.Para a maioria das páginas, quero que apareça na parte inferior da content
bloco, mas para a página inicial, quero que esteja em algum lugar no meio do content
bloquear.Não consigo descobrir a melhor maneira de posicionar o bloco onde desejo ao adicioná-lo novamente com o layout XML.
Para fazer isso, comecei no meu tema local.xml
para desarmar o left.newsletter
bloquear do left
bloquear:
<layout version="0.1.0">
...
<default>
...
<reference name="left">
<action method="unsetChild"><alias>left.newsletter</alias></action>
</reference>
...
</default>
...
</layout>
Então, como a maior parte do site deveria ter o formulário de inscrição na newsletter no final do content
bloco, novamente em local.xml
, abaixo do código acima, mas ainda dentro do default
identificador de layout, adicionei:
<reference name="content">
<action method="insert">
<block>left.newsletter</block>
<siblingName></siblingName>
<after>true</after>
</action>
</reference>
Hum.Eu esperava que isso posicionasse o formulário de inscrição no boletim informativo no final do content
bloco (com base no meu rastreamento de Mage_Core_Block_Abstract::insert()), mas ele o colocou no início!Então este é um problema - por que o formulário não está sendo renderizado na parte inferior do content
bloquear?
Outro problema que tenho é que apenas para a página inicial, quero mover o bloco de inscrição no boletim informativo para um local específico dentro da página inicial. content
bloco, e eu gostaria de poder fazer tudo isso no Editor de páginas CMS do Magento para que a edição leve e a manutenção do ajuste de layout sejam fáceis.
Aqui está o conteúdo da minha página inicial (inserido na página Content
guia no editor de páginas CMS):
{{block type="cms/block" block_id="home_page_marquee"}}
<!-- PUT NEWSLETTER HERE -->
<div class="inner_container">
{{widget type="my_namespace/slider_customproduct"}}
{{widget type="my_namespace/slider_featuredproduct"}}
{{widget type="my_namespace/slider_blogpost"}}
<div id="about">
{{block type="cms/block" block_id="home_page_about_us"}}
</div>
<div id="team">
{{block type="cms/block" block_id="home_page_team"}}
</div>
</div>
Nesta página, gostaria de obter o bloco de inscrição no boletim informativo onde está esse comentário.
Eu tentei algumas coisas.Primeiro, tentei usar o Editor de páginas CMS Design
guia para inserir algumas atualizações de layout personalizadas:
<reference name="content">
<!-- Re-unset the newsletter block -->
<action method="unsetChild"><alias>left.newsletter</alias></action>
<!-- Re-re-insert the newsletter block -->
<action method="insert">
<block>left.newsletter</block>
<siblingName>home_page_marquee</siblingName>
<after>true</after>
</action>
</reference>
Isso remove novamente com sucesso o bloco de inscrição no boletim informativo da parte inferior da página inicial, mas o insere, ironicamente, no final da página inicial. content
bloquear.Eu tentei algumas dicas para consertar isso, como dar aos meus blocos CMS estáticos uma name
atributo e usando o nome em <siblingName>
, mas isso não funcionou.
Também tentei adicionar o bloco de inscrição no boletim informativo usando um {{block}}
marcação.De volta à página inicial Content
:
{{block type="cms/block" block_id="home_page_marquee"}}
{{block type="newsletter/subscribe" name="left.newsletter" template="newsletter/subscribe.phtml"}}
<div class="inner_container">
{{widget type="my_namespace/slider_customproduct"}}
{{widget type="my_namespace/slider_featuredproduct"}}
...
Esse faz funciona - o formulário de inscrição no boletim informativo aparece onde eu quero - mas tenho a sensação de que não está reinserindo o não definido newsletter.left
bloco, mas sim criando outro newsletter.left
bloquear e deixar o não definido pendurado.
Então, meus problemas são dois:1.O que há de errado com a maneira como estou tentando posicionar o bloco de inscrição no boletim informativo para posicionamento em todo o site no final do content
bloquear?2.Qual é a maneira mais limpa de substituir o posicionamento do bloco de inscrição no boletim informativo em todo o site especificamente para a página inicial e colocá-lo onde eu quiser, por meio do XML de layout da página no Editor de páginas CMS do Magento?
E se eu estiver errado, sinta-se à vontade para me avisar.Magento nunca deixa de me dizer que é mais complicado do que eu imagino.
Solução
Você está no caminho certo.A melhor maneira de mover um bloco existente é com unsetChild e insert, mas também não há problema em recriar o bloco como você fez no CMS.Como você usou o mesmo nome, a instância do bloco criado anteriormente é substituída e nada foi renderizado ainda neste momento.Mas você ainda pode otimizar um pouco, mesmo que não seja realmente necessário, IMHO:Remova o bloco do layout antes de ser instanciado e recrie-o com um nome diferente.
<remove name="left.newsletter" />
<block type="newsletter/subscribe" name="content.newsletter" template="newsletter/subscribe.phtml"/>
Isso deixa o problema de posicionamento.O problema é que o default
handle é processado antes de qualquer identificador específico da página e é aí que o conteúdo real é adicionado.Então na hora em que insert()
é chamado, o bloco é inserido no final, mas no final de uma lista vazia.
Não vejo uma maneira fácil e universal de adiar a adição do bloco ou ajustar a classificação, então sugiro adicionar um novo contêiner depois content
nos modelos de página (1column.phtml
etc.) e anexe o bloco do boletim informativo lá.