Solución:
Por supuesto, es posible:
<referenceBlock name="copyright">
<action method="setTemplate">
<argument name="template" xsi:type="string">Dfr_Backend::page/copyright.phtml</argument>
</action>
</referenceBlock>
El nodo de acción está en desuso, pero puede usar argumentos de bloque
<referenceBlock name="block_to_change">
<arguments>
<argument name="template" xsi:type="string">[Vendor]_[Module]::/path/to/template.phtml</argument>
</arguments>
</referenceBlock>
Para entender la diferencia entre <arguments>
y <action>
debe comprender cómo funcionan los constructores de los objetos de Magento 2. Si anula un constructor en Magento, siempre obtendrá un $data-parameter
que es una matriz. Estos son los datos proporcionados en los archivos XML y traducidos al interno. $_data-array
de MagentoFrameworkDataObject
:
<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;
}
Sin embargo, en el caso de una plantilla, si setTemplate()
se usa en el pseudoconstructor (_construct()
, guión bajo simple), esto significa que el $data
se anula, sin importar si está configurado en el XML.
public function _construct()
{
$this->setTemplate('foo/bar.phtml');
}
En ese escenario, <action>
se prefiere, ya que se ejecuta después del constructor y pseudoconstructor.
<referenceBlock name="catalog.topnav">
<action method="setTemplate">
<argument name="template" xsi:type="string">Foo_Bar::buzz.phtml</argument>
</action>
</referenceBlock>