Actualización de diseño: no se puede agregar un bloque secundario en el diseño XML por referencia

8

Tengo un problema en el que parece que no puedo agregar un bloque secundario en un archivo XML de diseño. ¿Qué estoy haciendo mal mylayout.xmlporque no puedo cargar abc? Tengo los siguientes archivos.

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 ?>
...
musicliftsme
fuente

Respuestas:

8

Si se trata de un problema de carga del módulo, creo que debería agregar una etiqueta en el archivo de declaración del módulo. como abajo

<depends> <companyname_modulename/> </depends>

Esto asegurará que su módulo se cargará después de companyname_modulename

Dhanpat Saran
fuente
4

Descubrí por qué. Mi extensión se carga primero, y la extensión que carga onestepcheckout_index_index se carga después de la mía. Por lo tanto, mi actualización de diseño se refería a un identificador que aún no existe ...

musicliftsme
fuente
4

Solo para aclarar esto. Varios pasos fueron necesarios. Primero, declare el bloque como un bloque secundario.

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

Luego agregue la dependencia a su archivo de declaración de módulo. En mi caso fueIdev_OneStepCheckout

<depends>
    <Idev_OneStepCheckout />
</depends>

Finalmente, en la plantilla solo funcionará si usa el alias.

echo $this->getChildHtml('my_name')
Michael Thessel
fuente
2

No estoy seguro de por qué eso tampoco funciona. ¿Has intentado declarar explícitamente el bloqueo como un niño?

<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>
Don
fuente
Lo intenté, pero aún no funciona. Lo extraño es que tengo otras actualizaciones my layout.xmlque usan el mismo método, y todas funcionan.
musicliftsme
1
Descubrí por qué. Mi extensión se carga primero, y la extensión que se carga onestepcheckout_index_indexse carga después de la mía. Por lo tanto, mi actualización de la disposición se refería a un mango que aún no existe ..
musicliftsme
@laketuna eso es muy interesante, tuve un problema similar recientemente y solo utilicé un observador, pero esta pregunta despertó mi curiosidad nuevamente, gracias
pzirkind
1

Si desea agregar un nuevo bloque, debe hacer referencia a bloques estructurales, no a bloques de contenido. Pruebe algo como esto en su lugar:

<onestepcheckout_index_index>
    <reference name="content">
        <block type="block/class" template="path/to/template/template.phtml" name="abc" as="abc" />
    </reference>
</onestepcheckout_index_index>
Pronto
fuente
1
Hacer referencia a contentcarga mi bloque, pero no puedo controlar dónde se coloca el bloque si me refiero a `content.
musicliftsme
Se coloca por<?php echo $this->getChildHtml('abc') ?>
Pronto
Necesito colocar este bloque en una ubicación específica. Hasta donde yo sé, la referencia contentcoloca el bloque automáticamente y echo $this->getChildHtml('abc')no tiene ningún efecto. Corrígeme si estoy equivocado.
musicliftsme