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.

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a magento.stackexchange
scroll top