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'],
        ],