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

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


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


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')

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>

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>

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.