Fare riferimento a un blocco nella pagina statica
-
16-10-2019 - |
Domanda
Ho una pagina statica in cui io chiamo un blocco dinamico:
{{block type="custommodule/search" name="custommodule_search" template="custommodule/search.phtml" }}
Nel file di layout del mio modulo personalizzato che sto aggiungendo due figli del mio blocco custommodule_search:
<layout>
<default module="custommodule">
<reference name="custommodule_search">
<block type="custommodule/search_bysize" name="search_by_size" template="custommodule/search/by-size.phtml" />
<block type="custommodule/search_byvehicle" name="search_by_vehicle" template="custommodule/search/by-vehicle.phtml" />
</reference>
</default>
Tutto quello che voglio è quello di essere in grado di chiamare questi due blocchi con questo:
$this->getChildHtml('search_by_size')
o questo:
$this->getChildHtml('search_by_vehicle')
in qualsiasi parte del modello del blocco dinamico principale.
Il problema è che essi vengono visualizzati solo se il riferimento non è quello di "custommodule", ma di "contenuto", ma in questo modo stanno mostrando agli inizi del blocco "contenuto", non dove voglio ....
Soluzione
Blocchi istanziato dalla direttiva {{block}}
in non può essere referenziato da file di layout XML.
Questo è perché sono istanziati durante l'elaborazione della fase renderLayout()
, che chiama ogni metodo blocchi toHtml()
.
L'XML layout viene elaborato prima che, durante l'esecuzione del passo loadLayout()
.
Per ovviare a questo, dichiarare i blocchi bambino senza un blocco padre nel layout XML
<layout>
<default>
<block type="custommodule/search_bysize" name="search_by_size" template="custommodule/search/by-size.phtml" />
<block type="custommodule/search_byvehicle" name="search_by_vehicle" template="custommodule/search/by-vehicle.phtml" />
</default>
</layout>
Poi, nel blocco custommodule/search
Usa modello getBlockHtml()
invece di getChildHtml()
.
<?php echo $this->getBlockHtml('search_by_size') ?>
<?php echo $this->getBlockHtml('search_by_vehicle') ?>
Altri suggerimenti
Nel file di modello per l'utilizzo da blocco custommodule/search.phtml
personalizzato seguente per mostrare i blocchi di bambini e di evitare il cambio di layout:
<?php
echo Mage::app()->getLayout()->createBlock('custommodule/search_bysize')->setTemplate('custommodule/search/by-size.phtml')->toHtml();
echo Mage::app()->getLayout()->createBlock('custommodule/search_byvehicle')->setTemplate('custommodule/search/by-vehicle.phtml')->toHtml();
?>