Magento offre due funzionalità normalmente trascurate da sviluppatori e commercianti nonostante le loro potenzialità: le API SOAP e il sistema Cron.
Le API SOAP di Magento permettono di gestire i negozi eCommerce e integrarli con servizi esterni, fornendo accesso a risorse quali clienti, categorie, prodotti e ordini. Consentono inoltre la gestione dei carrelli e dell’inventario.
Molto spesso, però, le API offerte non bastano a soddisfare le esigenze di un commerciante. Grazie alla sua estensibilità, Magento permette di ampliare le funzionalità native delle API, ad esempio per restituire più informazioni riguardanti un prodotto, per aggiungere la possibilità di importare un ordine, o addirittura creare nuove operazioni per manipolare le RMA.
Magento, inoltre, offre alcuni task, come l’aggiornamento automatico delle valute e la generazione di report, e soprattutto consente di programmarne a piacere con una configurazione XML, in modo simile al crontab di UNIX.
L’intervento di Andrea De Pirro è volto a spiegare come creare un semplice modulo per estendere le API Magento esistenti e aggiungerne di nuove, sfruttando al tempo stesso il sistema di Cron. Userà esempi reali corredati da consigli utili per sviluppare estensioni per esportare e importare prodotti, ordini e RMA.
API SOAP e Cron: integrare Magento con servizi esterni
1.
2. @akira28
Chi Sono
• Co-fondatore di Yameveo
• 9 anni sviluppando in PHP
• Più di 3 anni di esperienza con Magento
• Lead developer di progetti Magento per Privalia,
Reckitt Benckiser e Groupalia
• Zend Framework Certified Engineer
3. @akira28
Yameveo
Fondata nel 2012 a Barcellona, Yameveo è una società
giovane, dinamica ed internazionale, specializzata
nell’e-commerce e nello sviluppo di applicazioni web.
!
!
www.yameveo.com
@Yameveo
5. @akira28
Di cosa parleremo
• Intro alle API SOAP di Magento
• Estensione delle API Magento
• Estensione 3rd party
• Creare una nuova chiamata API
• Il sistema Cron di Magento
6. @akira28
Magento SOAP
“Le API SOAP di Magento offrono la possibilità di gestire i
negozi e-commerce, fornendo chiamate per lavorare con
risorse quali clienti, categorie, prodotti e ordini.
Consentono inoltre di gestire i carrelli e l'inventario.”
Documentazione Magento
7. @akira28
Applicazioni
• Integrazione con operatori logistici
• Integrazione con Warehouse
• Integrazione con CRM ed ERP
• Integrazione con altri servizi via middleware
• App mobile
• …
8. @akira28
API Magento
Quando viene effettuata una richiesta HTTP il sistema di
routing standard di Magento invia la richiesta ad una action
del controller del modulo Mage_Api
!
Questa action istanzia un oggetto "Server API", lo inizializza
con il tipo di API (SOAP, XML-RPC, etc.), ed in seguito
chiama il suo metodo “run”
9. @akira28
Come iniziare
• Assicurati che l’endpoint sia accessibile:
www.example.com/api/v2_soap
www.example.com/api/soap
• Definisci Utenti API e le risorse associate:
System -> Web Services
• Dai un’occhiata al WSDL
www.example.com/api/v2_soap?wsdl=1
www.example.com/api/soap?wsdl=1
10. @akira28
Magento API flow
• Crea un Session ID effettuando una richiesta
“login” con username e API key
• Salva il Session ID per effettuare altre chiamate
• Effettua le altre chiamate passando il Session ID
• Termina la sessione con endSession
11. @akira28
Testing API V1
// connect to soap server
$client = new SoapClient('http://apimagento.dev/api/soap?wsdl=1', array('cache_wsdl' => WSDL_CACHE_NONE, 'trace' =>
1));
!
// log in
$session = $client->login('user', ‘password’);
!
$info = $client->call($session, 'catalog_product.info', '4');
!
var_export($client->__getLastRequest());
http://www.php.net/manual/en/class.soapclient.php
16. @akira28
Esempio response V2
array(118) {
[0] =>
class stdClass#2 (9) {
public $product_id =>
string(2) "16"
public $sku =>
string(5) "n2610"
public $name =>
string(16) "Nokia 2610 Phone"
public $set =>
string(2) "38"
public $type =>
string(6) "configurable"
public $category_ids =>
array(1) {
[0] =>
string(1) "8"
}
public $website_ids =>
array(1) {
[0] =>
string(1) "1"
}
public $price =>
double(149.99)
public $available_quantity =>
int(996)
}
[…]
17. @akira28
abstract class Mage_Api_Model_Server_Handler_Abstract
{
public function startSession(){[…]}
!
public function endSession($sessionId){[…]}
!
public function login($username, $apiKey){[…]}
!
public function call($sessionId, $apiPath, $args = array()){[…]}
public function multiCall($sessionId, array $calls = array(), $options = array()){[…]}
public function resources($sessionId){[…]}
public function globalFaults($sessionId){[…]}
public function resourceFaults($sessionId, $resourceName){[…]}
!
}
!
app/code/core/Mage/Api/Model/Server/Handler/Abstract.php
API SOAP Handler
18. @akira28
Differenze API V1 e V2
• V2 è adatta ad applicazioni scritte in linguaggi
tipizzati come Java o .NET
• Il WSDL V2 è molto più grande
• Nella V2 esiste un metodo per ogni chiamata:
V1 - $client->call($sid, ’catalog_product.info’, …);
V2 - $client->catalogProductInfo($sid, …);
20. @akira28
Problemi
• Le chiamate native non contengono abbastanza
informazioni
• Le estensioni di terze parti quasi mai offrono API
• Non esistono call per alcune risorse
42. @akira28
Cos’altro si può fare con le
API
• Esportare ed importare ordini, prodotti, clienti
• Checkout via SOAP per applicazioni esterne
• Creare promozioni
• Gestire il CMS
• ….
• Le possibilità sono infinite!
44. @akira28
Magento Cron
!
• Il meccanismo Cron di Magento viene attivato periodicamente
utilizzando un cronjob del sistema
• La chiamata viene avviata nel file di cron.php
• Il codice in cron.php invoca Mage_Cron_Model_Observer →
dispatch(), che a sua volta provvederà a:
• eseguire le operazioni pianificate
• generare, se necessario, task da eseguire in futuro
• ripulire la history delle operazioni eseguite
45. @akira28
Utilizzi del cron
• Export automatico
• Report ordini giornaliero
• Aggiornamento statistiche
• Invio mail per cart abbandonati
• …
47. @akira28
Creare un task cron - codice
class Yameveo_Export_Model_Observer extends Mage_Core_Model_Observer
{
/**
* Cron method to export the complete product inventory to the configured ftp server
*/
public function inventoryExport()
{
$products = Mage::getModel(‘catalog/product’)->getCollection();
// build data to export
foreach ($products as $product) {
[…]
}
$this->sendToFtp($data);
}
[…]
}
Yameveo/Export/Model/Observer.php
48. @akira28
Configurare cron da
backend
[…]
<settings translate="label" module=“yameveo_export">
[…]
<fields>
<cron_settings translate="label comment" module="yameveo_export">
<label>How often do you want the cron to run?</label>
<frontend_type>text</frontend_type>
<sort_order>70</sort_order>
<comment>Use Crontab Format (Eg. "0 4 * * *" for every day at 4 a.m.)</comment>
<show_in_default>1</show_in_default>
</cron_settings>
</fields>
</settings>
[…]
Yameveo/etc/system.xml