In che modo si può sovrascrivere un controller dell’amministrazione?
Capita a volte di dovere sovrascrivere alcuni controllers dell’amministrazione, ad esempio, come è capitato oggi a me per dovere creare le fatture con un numero a scelta da parte dell’amministratore.
Per sovrascrivere sono necesari 3 passi:
- Creare un modulo
- Configurare il modulo nel suo config.xml in modo da dirgli di sovrascrivere un determinato controller
- Creare un controller che estende un altro controller, ovvero quello che si vuole riscrivere
Il punto 1 ed il punto 2 si risolvono creando un file di configurazione come il seguente:
[sourcecode language=”xml”]
<?xml version="1.0" encoding="utf-8"?>
<config>
<modules>
<Iacopop_Adminhtml>
<version>0.2.0</version>
</Iacopop_Adminhtml>
</modules>
<admin>
<routers>
<adminhtml>
<args>
<modules>
<Iacopop_Adminhtml before="Mage_Adminhtml">Iacopop_Adminhtml</Iacopop_Adminhtml>
</modules>
</args>
</adminhtml>
</routers>
</admin>
</config>
[/sourcecode]
Come si può notare nel file sto indicando che nella sezione routers dell’amministrazione magento (adminhtml) venga caricato prima il modulo Iacopop_Adminhtml (prima di Mage_Adminhtml).
Avendo indicato a Magento di caricare prima il mio modulo non dovrò fare altro che creare un controller che estende il controller che mi interessa. Nel mio caso volevo sovrascrivere il controller che genera la fattura per andare a modificare il numero di fattura prima della sua creazione. Andiamo a vedere come creare il nuovo controller:
[sourcecode language=”php”]
<?php
include_once("Mage/Adminhtml/controllers/Sales/Order/InvoiceController.php");
class Iacopop_Adminhtml_Sales_Order_InvoiceController extends Mage_Adminhtml_Sales_Order_InvoiceController {
/**
* Save invoice
* We can save only new invoice. Existing invoices are not editable
*/
public function saveAction()
{
//questo è il codice originale di magento della action save del controller Mage_Adminhtml_Sales_Order_InvoiceController
//possiamo inserire qua tutto il codice che ci permettere di sovrascrivere il metodo originale
codice ……..
}
}
?>
[/sourcecode]
Includendo il controller originale e estendendolo è possibile sovrascrivere tutti le funzioni e metodi di questo facendo in modo che tutte le azioni passino per il nuovo controller.