Magento 2: modifica del modello di un blocco


52

In Magento 1, come sviluppatore di moduli è possibile modificare il modello di un blocco usando un codice XML di layout simile a questo

<reference name="block_to_change">
    <action method="setTemplate">
        <param>/path/to/template.phtml</param>
    </action>
</reference>

e quindi aggiungendo il modello al tema di base.

app/design/frontend/base/default/template/path/to/template.phtml

È possibile, come sviluppatore di moduli, fare qualcosa di simile in Magento 2? O dovrei usare il codice XML o PHP del layout per rimuovere il blocco che mi interessa e inserire un nuovo blocco con un modello diverso (la cui classe estende la classe del blocco originale)

So che potrei creare un tema personalizzato che sostituisce un modello, ma sono interessato a creare un modulo che cambi il modello predefinito, ma permetta comunque a un tema personalizzato di sostituire quel modello.

Risposte:


60

Certo che è possibile:

<referenceBlock name="copyright">
    <action method="setTemplate">
        <argument name="template" xsi:type="string">Dfr_Backend::page/copyright.phtml</argument>
    </action>
</referenceBlock>

Puoi spiegare i passaggi come posso cambiare il layout, in realtà voglio aggiornare l'aggiunta al file addtocart.phtml in base alla configurazione del sistema e anche voler aggiornare questo utilizzando il modulo personalizzato
Deepak Mankotia,

5
La soluzione KAndy non ha funzionato per me, ma questa sì
csmarvz,

Ho cambiato il modello del nome del blocco "account_account_dashboard_top" <body> <nome_blocco_blocco = "account_dashboard_top"> <metodo di azione = "setTemplate"> <nome argomento = "modello" xsi: tipo = "stringa"> Namespace_Modulename :: ordine /recentorder.phtml </argument> </action> </referenceBlock> </body> "ma non funziona, controlla gentilmente e fammi sapere i tuoi commenti
senthil,

43

Il nodo di azione è obsoleto, ma è possibile utilizzare gli argomenti di blocco

<referenceBlock name="block_to_change">
    <arguments>
        <argument name="template" xsi:type="string">[Vendor]_[Module]::/path/to/template.phtml</argument>
    </arguments>
</referenceBlock>

Puoi spiegare i passaggi come posso cambiare il layout, in realtà voglio aggiornare l'aggiunta al addtocart.phtmlfile in base alla configurazione del sistema e voglio anche aggiornarlo utilizzando il modulo personalizzato
Deepak Mankotia


4
Grazie - Lascio un riferimento a una segnalazione di bug qui github.com/magento/magento2/issues/3356 - il metodo pubblicato in questa risposta, mentre forse il modo futuro di fare le cose, non funziona ancora come pubblicizzato
Kristof a Fooman il

2
@KAndy Il tuo esempio di codice è corretto al 100%? L'ho provato e non riesco a farlo funzionare in alcun modo. L'altra risposta di @ Mage2.PRO (che utilizza <action method='setTemplate'>) funziona senza problemi.
maginfortis,

1
Questo non funziona La risposta accettata lo fa però.
Milano Simek,

29

Per capire la differenza tra <arguments>e <action>devi capire come funzionano i costruttori degli oggetti Magento 2. Se esegui l'override di un costruttore in Magento, otterrai sempre $data-parameterun array che è un array. Questi sono i dati forniti nei file XML e tradotti all'interno $_data-arraydi \Magento\Framework\DataObject:

<referenceBlock name="catalog.topnav">
    <arguments>
        <argument name="template" xsi:type="string">Foo_Bar::buzz.phtml</argument>
    </arguments>
</referenceBlock>    

...

public function __construct(array $data = [])
{
    // $_data is populated with the arguments from XML:
    // so $_data['template'] is now 'Foo_Bar::buzz.phtml'
    $this->_data = $data;
}

Tuttavia, nel caso di un modello, se setTemplate()utilizzato nello pseudo costruttore ( _construct(), singolo trattino basso), ciò significa che $dataviene sovrascritto, indipendentemente dal fatto che sia impostato nell'XML.

public function _construct()
{
    $this->setTemplate('foo/bar.phtml');
}

In quello scenario, <action>è preferito, poiché questo viene eseguito dopo il costruttore e lo pseudo costruttore.

<referenceBlock name="catalog.topnav">
    <action method="setTemplate">
        <argument name="template" xsi:type="string">Foo_Bar::buzz.phtml</argument>
    </action>
</referenceBlock> 

10

Quanto segue ha funzionato per me in Magento EE 2.2.3

<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
    <body>
        <referenceBlock name="core.module.block.name" template="[Vendor]_[Module]::path/to/your/template.phtml" />
    </body>
</page>

Nota: se stai usando un modulo personalizzato per cambiare il modello di un core e stai diventando pazzo perché il codice precedente snipped non funziona, assicurati che il tuo modulo sia caricato dopo il modulo core che stai provando a cambiare (module.xml) e tu eseguito bin/magento setup:upgrade:)


Questo è il modo più pulito secondo me.
Ben Crook,

2

Non so perché, ma trovo che questo sia il migliore:

<referenceBlock name="sales.order.items.renderers.default" template="Foo_Bar::sales/order/items/renderer/default.phtml"/>

1
<referenceBlock name="sales.order.items.renderers.default" template="Foo_Bar::sales/order/items/renderer/default.phtml"/>

Funzionerà solo se il tuo blocco non è stato sovrascritto prima di usare il setTemplatemetodo. Magento 2.2.xe versioni successive.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.