Come estendere i webservice in PrestaShop
Ci sono due modi per estendere i webservice prestashop. Il primo è un po’ invasivo ed effettua un override dalle classi core standard. Il secondo invece genera un web service aggiuntivo utilizzando un hook.
Primo metodo, override
E’ necessario identificare la classe core a cui vogliamo aggiungere i dati. Nel mio caso è AddressCore presente nel file Address.php.La modifica che effettuerò non fa altro che andare ad aggiungere i campi SDI e PEC relativi alla fatturazione elettronica su PrestaShop. Questa modifica è collegata al modulo sul controllo partita iva e codice fiscale per PrestaShop.La tecnica dell’override di una classe standard di PrestaShop la potete trovare sulla documentazione standard per lo sviluppo su PrestaShop.Per aggiungere i campi SDI e PEC è necessario creare due campi virtuali e poi implementare il metodo relativo a questi campi virtuali.All’interno della classe AddressCore c’è una proprietà $webserviceParameters. Questa proprietà è da estendere. Questo è il codice originale.
protected $webserviceParameters = [
'objectsNodeName' => 'addresses',
'fields' => [
'id_customer' => ['xlink_resource' => 'customers'],
'id_manufacturer' => ['xlink_resource' => 'manufacturers'],
'id_supplier' => ['xlink_resource' => 'suppliers'],
'id_warehouse' => ['xlink_resource' => 'warehouse'],
'id_country' => ['xlink_resource' => 'countries'],
'id_state' => ['xlink_resource' => 'states'],
],
'associations'=>[
'electronic_invoice'=>[
'resource'=>'electronic_invoice',
'virtual_entity'=>true,
'fields'=>[
'sdi'=>['required'=>true],
'pec'=>['required'=>true],
]
]
]
Nell’array associations dichiaro un nuovo set di record, 1 o più, chiamati electronic_invoice la cui risorsa collegata si chiama electronic_invoice. Inoltre definisco questa risorsa come virtuale. Successivamente alla definizione della risorsa, dichiaro i campi da aggiungere. I campi sono contenuti sotto l’array fields. Avviando i webservice senza nessun ulteriore implementazione ecco il risultato:
{"address": {"id": 5,"id_customer": "2","id_manufacturer": "0","id_supplier": "0","id_warehouse": "0","id_country": "21","id_state": "12","alias": "My address","company": "My Company","lastname": "DOE","firstname": "John","vat_number": "","address1": "16, Main street","address2": "2nd floor","postcode": "33133","city": "Miami","other": "","phone": "0102030405","phone_mobile": "","dni": "","deleted": "0","date_add": "2021-01-07 11:07:08","date_upd": "2021-01-07 11:07:08",
"associations":
{
"electronic_invoice": [
** {**
"sdi": null,
"pec": null
}
]
}
}}
Per valorizzare i campi aggiuntivi è necessario implementare un metodo che deve chiamarsi come il nome dell’associazione virtuale electronic_invoice.
Il metodo deve essere public e il nome deve avere il prefisso getWs. Quindi nel nostro caso sarà public function getWsElectronicInvoice(). Non c’è nessun parametro aggiuntivo.
Ecco il codice finale:
public function getWsElectronicInvoice()
{
return [
['sdi'=>'aaaaa','pec'=>'bbbbb']
];
}
Attenzione: è un array di array in quanto la nostra associazione è un’entità aggiunta.
In alternativa alle association che permettono di inserire uno o più record, è possibile aggiungere a fields della proprietà $webserviceParameters i campi con l’aggiunta di *getter *e *setter * per recuperare o inserire i valori.
protected $webserviceParameters = [
'objectsNodeName' => 'addresses',
'fields' => [
'id_customer' => ['xlink_resource' => 'customers'],
'id_manufacturer' => ['xlink_resource' => 'manufacturers'],
'id_supplier' => ['xlink_resource' => 'suppliers'],
'id_warehouse' => ['xlink_resource' => 'warehouse'],
'id_country' => ['xlink_resource' => 'countries'],
'id_state' => ['xlink_resource' => 'states'],
'pec'=>['getter'=>'getPec', 'setter'=>'setPec'],
'sdi'=>['getter'=>'getSdi', 'setter'=>'setSdi'],
], 