Atualização de layout: não é possível adicionar um bloco filho no XML do layout por referência


8

Estou com um problema no qual não consigo adicionar um bloco filho em um arquivo XML de layout. O que estou fazendo de errado por mylayout.xmlnão conseguir carregar abc? Eu tenho os seguintes arquivos.

onestepcheckout.xml

<onestepcheckout_index_index>
    ...
    <reference name="content">
        <block type="onestepcheckout/checkout" name="onestepcheckout.checkout" template="onestepcheckout/checkout.phtml">
            ...
            <!-- this child block can be loaded -->
             <block type="block/class" template="path/to/template/template.phtml" name="qwe" as="qwe" />
            ...
        </block>
    </reference>
    ...
</onestepcheckout_index_index>

mylayout.xml

<onestepcheckout_index_index>
    <reference name="onestepcheckout.checkout">
        <!-- this child block can not be loaded -->
        <block type="block/class" template="path/to/template/template.phtml" name="abc" as="abc" />
    </reference>
</onestepcheckout_index_index>

checkout.phtml

...
<?php echo $this->getChildHtml('abc') // doesn't work ?>
<?php echo $this->getChildHtml('qwer') // works ?>
...

Respostas:


8

Se for um problema de carregamento do módulo, acho que você deve adicionar uma tag no arquivo de declaração do módulo. como abaixo

<depends> <companyname_modulename/> </depends>

Isso garantirá que seu módulo seja carregado após o nome da empresa_modulename


4

Eu descobri o porquê. Minha extensão é carregada primeiro e a extensão que é carregada em onestepcheckout_index_index é carregada após a minha. Portanto, minha atualização de layout estava se referindo a um identificador que ainda não existe.


4

Apenas para esclarecer isso. Vários passos foram necessários. Primeiro, declare o bloco como um bloco filho.

<action method="setChild"><alias>my_name</alias><child>my.name</child></action>

Em seguida, adicione a dependência ao seu arquivo de declaração do módulo. No meu caso foiIdev_OneStepCheckout

<depends>
    <Idev_OneStepCheckout />
</depends>

Finalmente, no modelo, ele só funcionará se você usar o alias.

echo $this->getChildHtml('my_name')

2

Não sei por que isso também não funciona. Você já tentou declarar explicitamente o bloco quando criança?

<onestepcheckout_index_index>
    <reference name="onestepcheckout.checkout">
        <!-- this child block can not be loaded -->
        <block type="block/class" template="path/to/template/template.phtml" name="abc" as="abc" />
        <action method="setChild"><child>abc</child><alias>abc</alias></action>
    </reference>
</onestepcheckout_index_index>

Eu tentei, mas ainda não funciona. O estranho é que tenho outras atualizações my layout.xmlque usam o mesmo método, e todas elas funcionam.
Musicliftsme

11
Eu descobri o porquê. Minha extensão é carregada primeiro, e a extensão que onestepcheckout_index_indexé carregada é carregada após a minha. Portanto, a minha atualização de layout estava se referindo a um identificador que ainda não existe ..
musicliftsme

@laketuna isso é muito interessante, eu tive um problema semelhante recentemente e usado apenas um observador, mas esta questão provocou a minha curiosidade novamente, graças
pzirkind

1

Se você deseja adicionar um novo bloco, deve referenciar blocos estruturais, não blocos de conteúdo. Experimente algo assim:

<onestepcheckout_index_index>
    <reference name="content">
        <block type="block/class" template="path/to/template/template.phtml" name="abc" as="abc" />
    </reference>
</onestepcheckout_index_index>

11
Referindo-me a contentcarregar meu bloco, mas não posso controlar onde o bloco será colocado se me referir ao `conteúdo.
Musicliftsme

Ele é colocado por<?php echo $this->getChildHtml('abc') ?>
Pronto

Preciso colocar esse bloco em um local específico. Tanto quanto sei, a referência contentcoloca o bloco automaticamente e echo $this->getChildHtml('abc')não tem efeito. Corrija-me se eu estiver errado.
Musicliftsme
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.