Import/export in Magento: i profili avanzati

Nelle ultime puntate abbiamo visto come esportare ed importare dati (nello specifico clienti e prodotti) da e verso Magento, utilizzando le funzionalità che ci vengono fornite dal backend. Tramite queste semplici funzionalità siamo in grado efficacemente di creare un file contenente tutto il nostro catalogo, aperto a vari utilizzi, come per esempio il passaggio di dati ad un sistema offline che tiene traccia dei prodotti in vendita, ecc.

Ma se io avessi bisogno di andare un po’ oltre quello che mi viene permesso da queste funzionalità? Se io avessi bisogno per esempio di esportare un’entità che non sia un elenco di prodotti o clienti? Per poter gestire una tale situazione Magento ci offre la possibilità di creare dei profili avanzati.

Che cos’è un profilo avanzato? Un profilo avanzato non è altro che uno dei profili di import/export che abbiamo visto nell’articolo precedente, non realizzato tramite la creazione guidata, ma creato direttamente da noi impostando le azioni del profilo tramite una struttura XML.

Per capire cosa s’intende in questo caso per struttura XML, andiamo in Sistema > Importa/Esporta > Dataflow – Profili e apriamo il profilo “Export All Products”. Nel menu a sinistra clicchiamo su “Azioni profilo XML”, si aprirà una pagina con all’interno un’area di testo chiamata Azioni XML.

azioni xml profilo avanzato

All’interno di tale area vedremo scritti vari blocchi XML. Tali blocchi definiscono le azioni che deve compiere il profilo quando viene eseguito. In sostanza seguendo la procedura della creazione guidata del profilo non abbiamo fatto altro che realizzare questa struttura XML.

In questo articolo vedremo la teoria sulla creazione di un profilo avanzato tramite la definizione delle azioni XML, come introduzione al prossimo articolo dove vedremo un’applicazione pratica personalizzata: l’esportazione dell’albero delle categorie in un file CSV.

Struttura di un profilo avanzato

Vediamo com’è un strutturato un profilo avanzato. Un profilo esegue una serie di azioni. Un azione è definita da:

  • Tipo: il tipo di un’azione indica quale ruolo avrà nel processo d’esecuzione, nel nostro caso d’esportazione. In termini di programmazione indica la classe che contiene il metodo che quest’azione utilizzerà per svolgere il suo compito.
  • Metodo: il metodo indica quale funzione appartenente al tipo dell’azione che verrà utilizzata per la sua esecuzione.
  • Variabili: per ogni azione è possibile definire delle variabili in base al tipo e al metodo dell’azione, per esempio nel nostro caso possiamo definire dove salvare il file d’esportazione, se in locale o in una cartella remota.

I tipi che possiamo impostare alle azioni sono divisi in tre gruppi:

  • Adapter: definisce le azioni che si occupano di ottenere o inviare i dati, per esempio estrarre i dati dal database.
  • Parser: definisce le azioni che si occupano di elaborare i dati, per esempio convertire i dati ottenuti dal database per poterli salvare su un file CSV.
  • Mapper definisce le azioni che si occupano d’impostare e di associare un’etichetta ai valori del file d’esportazione o importazione.

Ecco un esempio di come è strutturato l’XML di un’azione

<action type="dataflow/convert_adapter_io" method="load">
    <var name="type">file</var>
    <var name="path">var/import</var>
    <var name="filename"><![CDATA[products.csv]]></var>
    <var name="format"><![CDATA[csv]]></var>
</action>

Per creare un profilo avanzato andiamo in Sistema > Importa/Esporta > Dataflow – Profili avanzati. Clicchiamo su “Aggiungi Nuovo Profilo”. Si aprirà una pagina con due campi:

azioni xml nuove

  • Nome profilo: il nome del profilo, deve essere univoco.
  • Azioni XML: in quest’area scriveremo le strutture XML che rappresentano le azioni.

Vediamo ora le azioni che imposteremo per il nostro profilo, analizzando i tre componenti che le gestiscono.

Adapter

Un “Adapter” gestisce il caricamento o il salvataggio di dati da o verso una determinata risorsa, che può essere un file locale o remoto, un database, un webservice ecc…
Esistono tre possibili azioni che può eseguire un “Adapter”:

  • Caricare i dati da una risorsa, utilizzando il metodo predefinito “load”.
  • Salvare i dati in una risorsa, utilizzando il metodo predefinito “save”.
  • Elaborare un record convertito tramite un azione di tipo “Parser”, definendo una coppia di variabili “adapter – method” all’interno di un’azione di tipo “Parser”.

In Magento sono già presenti alcune classi “Adapter” che possono essere utilizzate, le potete trovare nella cartella “app/code/core/Dataflow/Model/Convert/Adapter”, però non in tutti casi i due metodi “load” e “save” sono implementati.

Nei casi più comuni, quando dovrete salvare o leggere dati da un file locale o remoto potete utilizzare:

dataflow/convert_adapter_io

Un’azione di questo tipo esegue la lettura e il salvataggio dalla risorsa che indicheremo tramite le variabili della classe.

<action type="dataflow/convert_adapter_io" method="load">
    <var name="type">file</var>
    <var name="path">var/import</var>
    <var name="filename"><![CDATA[products.csv]]></var>
    <var name="format"><![CDATA[csv]]></var>
</action>

Vediamo la lista delle possibili impostazioni:

  • type: definisce il tipo di connessione alla risorsa che vogliamo elaborare. Valori validi: file, ftp.
  • path: definisce il percorso relativo del file.
  • filename: nome del file

I prossimi campi andranno utilizzati nel caso che abbiamo definito “type” con “ftp”

  • host: definisce l’host remoto a cui connettersi.
  • port: definisce la porta ftp; se non viene specificata viene automaticamente utilizzata la porta 21
  • user: definisce lo username dell’account ftp.
  • password: definisce la password dell’account ftp.
  • timeout: definisce dopo quanto tempo di inattività si deve chiudere la connessione; valore predefinito: 90.
  • file_mode: definisce la modalità di lettura del file; valore predefinito “FPT_BINARY”.
  • ssl: se il campo non è vuoto allora viene utilizzata una connessione ssl.
  • passive: definisce la modalità di connessione; valore predefinito “false”.

customer/convert_adapter_customer – catalog/convert_adapter_product

Tramite queste due classi Magento offre due “Adapter” predefiniti per l’estrazione o salvataggio dei dati di clienti o prodotti.
Se per esempio vogliamo estrarre tutti i dati di tutti i clienti di uno specifico store scriveremo un’azione di questo tipo:

<action type="customer/convert_adapter_customer" method="load">
    <var name="store"><![CDATA[0]]></var>
</action>

In questo caso vediamo che nella variabile “store” definiamo l’id numerico dello store che abbiamo selezionato per l’estrazione dei dati.

Inoltre queste due classi ci permettono di filtrare i dati da estrarre, utilizzando delle variabili, definite con questa sintassi:

<varname="filter/id attributo da filtrare"><![CDATA[a]]></var>

la lista degli attributi su cui è possibile filtrare i clienti è:

  • firstname
  • lastname
  • email
  • group
  • addressType (valori validi: both, default_billing, default_shipping)
  • telephone
  • postcode
  • country
  • region
  • created_at/from
  • created_at/to
<action type="customer/convert_adapter_customer" method="load">
    <var name="store"><![CDATA[0]]></var>
    <var name="filter/firstname"><![CDATA[a]]></var>
    <var name="filter/lastname"><![CDATA[a]]></var>
    <var name="filter/email"><![CDATA[a]]></var>
    <var name="filter/group"><![CDATA[1]]></var>
    <var name="filter/adressType"><![CDATA[default_billing]]></var>
    <var name="filter/telephone"><![CDATA[1]]></var>
    <var name="filter/postcode"><![CDATA[7]]></var>
    <var name="filter/country"><![CDATA[BS]]></var>
    <var name="filter/region"><![CDATA[WA]]></var>
    <var name="filter/created_at/from"><![CDATA[09/22/09]]></var>
    <var name="filter/created_at/to"><![CDATA[09/24/09]]></var>
</action>

la lista degli attributi su cui è possibili filtrare i prodotti è:

  • name
  • sku
  • type (valori validi: simple, configurable, grouped, bundle, virtual, downloadable)
  • attribute_set
  • price/from
  • price/to
  • qty/from
  • qty/to
  • visibility
  • status
<action type="catalog/convert_adapter_product" method="load">
    <var name="store"><![CDATA[0]]></var>
    <var name="filter/name"><![CDATA[a]]></var>
    <var name="filter/sku"><![CDATA[1]]></var>
    <var name="filter/type"><![CDATA[simple]]></var>
    <var name="filter/attribute_set"><![CDATA[29]]></var>
    <var name="filter/price/from"><![CDATA[1]]></var>
    <var name="filter/price/to"><![CDATA[2]]></var>
    <var name="filter/qty/from"><![CDATA[1]]></var>
    <var name="filter/qty/to"><![CDATA[2]]></var>
    <var name="filter/visibility"><![CDATA[2]]></var>
    <var name="filter/status"><![CDATA[1]]></var>
</action>

Parser

I parser sono i responsabili per la conversione dei dati tra vari formati, per esempio convertire i dati estratti dal database per poterli salvare su un file CSV.

I metodi che vengono forniti dalle classi di tipo “Parser” sono “parse” e “unparse”. Entrambi i metodi, se appartengono ad una stessa classe, effettuano la medesima conversione, ma nelle due direzioni opposte, quindi se “parse” converte in dati da database a file, “unparse” li dovrà convertire da file a database.

Vediamo ora i “Parser” che Magento offre già pronti per l’utilizzo.

dataflow/convert_parser_csv

Forse uno dei “Parser” più utilizzati che permette di convertire i dati da un file CSV, con il metodo “parse”, o convertirli per un file CSV, con il metodo “unparse”. Questa azione definisce come sono rappresentati i dati nel file CSV e nel caso d’importazione con quale “Adapter” verranno salvati nel database.

Ecco un esempio di un’azione definita con questo tipo

<action type="dataflow/convert_parser_csv" method="parse">
    <var name="delimiter"><![CDATA[,]]></var>
    <var name="enclose"><![CDATA["]]></var>
    <var name="fieldnames">true</var>
    <var name="store"><![CDATA[0]]></var>
    <var name="decimal_separator"><![CDATA[.]]></var>
    <var name="adapter">catalog/convert_adapter_product</var>
    <var name="method">parse</var>
</action>

Vediamo le variabili che questa classe ci fornisce per personalizzare l’azione

  • delimiter: definisce il divisore tra i valori utilizzati nel file CSV; il valore predefinito è la virgola (,).
  • enclose: definisce quale carattere racchiude ogni valore del file CSV; il valore predefinito sono le virgolette (“).
  • escape: definisce il carattere che identifica la fine di un record; il valor predefinito è il doppio backslash (\\).
  • decimal_separator: definisce il carattere che identifica il segno che separa i valori numerici interi dai decimali.
  • fieldnames: se questo campo è settato a “true”, il “Parser” considererà che la prima riga del file CSV conterrà i nomi dei campi, se settato a “false” verrà utilizzata la variabile “map”
  • map: definisce il nome dei campi presenti nella prima riga del file CSV. Per la spiegazione di questa variabile rimando alla sezione “Mapper”.
  • adapter: in caso di profilo d’importazione, definisce quale “Adapter” utilizzerà per ogni riga del file.
  • method: in caso sia definita la variabile “adapter”, definisce quale metodo dell’“Adapter” utilizzare per salvare nel database ogni riga; il metodo predefinito è “saveRow”.

Dall’esempio potete vedere che è presente la variabile “store”. Nel caso che l’“Adapter” che definiamo all’interno dell’azione abbia bisogno di alcune variabili, definendole come variabile all’interno dell’azione esse saranno passate automaticamente dal “Parser” all’“Adapter”.

dataflow/convert_parser_xml_excel

Un altro “Parser” che offre Magento è quello che permette la traduzione dei dati da database ad un file EXCEL XML e viceversa.
Ecco un esempio di un’azione

<action type="dataflow/convert_parser_xml_excel" method="unparse">
    <var name="single_sheet"><![CDATA[products]]></var>
    <var name="fieldnames">true</var>
</action>

Questa classe possiede le stesse variabili di “dataflow/convert_parser_csv”, tranne che naturalmente quelle che definiscono la formattazione dei dati di un file CSV.
La variabile particolare per questa classe è:

  • single_sheet: definisce quale foglio di calcolo utilizzare per l’esportazione o l’importazione, se il campo è vuoto verranno presi tutti i fogli di calcolo presenti nel file.

customer/convert_parser_customer – catalog/convert_parser_product

Nel caso vogliamo lavorare con clienti o prodotti, Magento ci fornisce queste due classi per effettuare la conversione di dati da database a file (CSV, EXCEL XML o altro). La strada contraria viene principalmente gestita dai “Parser” come “dataflow/convert_parser_csv”, quindi il metodo “parse” è deprecato. Per esempio se volessimo convertire tutti i dati che abbiamo in precedenza caricato dei prodotti per il salvataggio in un file dovremmo settare questa azione:

<action type="catalog/convert_parser_product" method="unparse">
    <var name="store"><![CDATA[1]]></var>
</action>

Mapper

Le classi “Mapper” permettono di assegnare un’etichetta particolare ad ogni campo che abbiamo elaborato, per esempio nel nostro caso avremo il campo “name”, possiamo tramite queste classi assegnare a questo campo l’etichetta “nome_categoria”. Ogni “Mapper” possiede la funzione “map”, metodo che si occupa dell’assegnazione dell’etichetta.
Inoltre, caratteristica molto importante, tramite la funzione “map” potremo specificare se verranno esportati o importati solo i campi che verranno mappati.

dataflow/convert_mapper_column

Questo è il “Mapper” più utilizzato e che utilizzeremo anche noi per il nostro profilo avanzato. Vediamo come definire l’azione per il nostro modulo

<action type="dataflow/convert_mapper_column" method="map">
    <var name="map">
        <map name="entity_id"><![CDATA[id_categoria]]></map>
        <map name="name"><![CDATA[nome_categoria]]></map>
        <map name="parent_id"><![CDATA[id_genitore]]></map>
        <map name="level"><![CDATA[livello]]></map>
        <map name="is_active"><![CDATA[attiva]]></map>
        <map name="include_in_menu"><![CDATA[visibile_menu]]></map>
    </var>
    <var name="_only_specified">true</var>
</action>

L’azione possiede due variabili

  • map: variabile che elenca i vari campi che dovranno essere considerati dal “Mapper, all’interno di esso scriveremo un elenco di tag “map” per ogni campo, con questa struttura
    <map name=”nome campo in Magento“><![CDATA[nome campo nel file]]>in caso di esportazione, i due nomi saranno invertiti in caso di importazione.
  • _only_specified: se settato a “true” verranno esportati o importati solo i campi definiti nella variabile “map”

In precedenza abbiamo visto che nel “Parser”, in caso d’importazione, può comparire la variabile “map”. Tale variabile si comporta esattamente come quella appena descritta, definendo quindi per l’importazione l’assegnamento delle etichette dei campi. In questo caso la variabile “_only_specified” viene automaticamente settata a “true”.

Posizionamento Azioni XML

La posizione nell’area di testo dove abbiamo scritto le azioni del nostro profilo è molto importante in quanto indica l’ordine in cui verranno eseguite in fase di elaborazione del profilo. Prendiamo il caso del profilo già presente in Magento, riguardante l’esportazione delle quantità presenti in magazzino dei prodotti.

Estraiamo dal database i dati dei prodotti

<action type="catalog/convert_adapter_product" method="load">
    <var name="store"><![CDATA[0]]></var>
</action>

Convertiamo i dati in un formato per il salvataggio su file

<action type="catalog/convert_parser_product" method="unparse">
    <var name="store"><![CDATA[0]]></var>
    <var name="url_field"><![CDATA[0]]></var>
</action>

Conserviamo i campi definiti e assegniamo le etichette

<action type="dataflow/convert_mapper_column" method="map">
    <var name="map">
        <map name="store"><![CDATA[negozio]]></map>
        <map name="sku"><![CDATA[SKU]]></map>
        <map name="qty"><![CDATA[qta]]></map>
        <map name="is_in_stock"><![CDATA[disponibile]]></map>
    </var>
    <var name="_only_specified">true</var>
</action>

Convertiamo i dati per poterli salvare su un CSV

<action type="dataflow/convert_parser_csv" method="unparse">
    <var name="delimiter"><![CDATA[,]]></var>
    <var name="enclose"><![CDATA["]]></var>
    <var name="fieldnames">true</var>
</action>

Salviamo i dati sul file “var/export/export_product_stocks.csv”

<action type="dataflow/convert_adapter_io" method="save">
    <var name="type">file</var>
    <var name="path">var/export</var>
    <var name="filename"><![CDATA[export_product_stocks.csv]]></var>
</action>

Scriviamo in quest’ordine le azioni nell’area di testo e clicchiamo su “Salva e continua la modifica”. Nel menu a sinistra appariranno le voci “Esegui profilo”, da cui potremo eseguire il nostro profilo e “Cronologia profilo” dove potremo visualizzare quando è stato attivato.

Abbiamo concluso questa guida sulle azioni XML relative alla creazione di un profilo avanzato di import/export in Magento. Nel prossimo articolo vedremo un’applicazione pratica di come utilizzare un profilo avanzato per un’esportazione personalizzata, nel nostro caso vedremo l’esportazione dell’albero delle categorie.

Lascia un commento

Tutti i campi sono obbligatori.
L'indirizzo email non verrà pubblicato

 

Commenti

  1. Pingback: I profili per importazione ed esportazione in Magento - blog.artera.it

  2. avatarFlavio

    Ottimo articolo, complimenti per la chiarezza e la completezza delle informazioni .

  3. avatarirene

    Ciao! complimenti per l’articolo, mi si sono schiariti molti dubbi.

    Ma se volessi aggiungere un campo “data” (giorno dell’esportazione) come dovrei impostare l’azone?

  4. avatarMaurizio Piatti Autore

    Come prima cosa ti ringrazio dei complimenti.
    Per quanto riguarda l’aggiunta di un campo, nello specifico il tuo esempio sulla data d’esportazione, non è possibile solo attraverso la definizione delle action di un profilo. In questo caso andrebbe fatto del lavoro sul codice, riscrivendo quindi la funzione ‘unparse’ del parser, inserendo nella riga che verrà passata al csv un campo ‘data’ che verrà compilato con la data odierna.

  5. avatarirene

    Grazie, non so se sono capace ma provo. Grazie della dritta ;)

  6. avatarMaurizio Piatti Autore

    Di nulla, nel prossimo articolo che pubblicheremo su questo argomento ci sarà un esempio di come riscrivere le classi che vengono utilizzate dalle action dei profili avanzati.

  7. avatarIrene

    Ciao! Alla fine ce l’ho fatta e per non dimenticarmene ne ho scritto un post sul mio blog (non ti voglio spammare se vuoi te lo invio). Grazie ancora

  8. avatarMaurizio Piatti Autore

    Ottimo, mandami pure il link al tuo post.

  9. Pingback: Esportare le categorie di Magento in un file CSV - blog.artera.it

  10. avatarFrancesco

    Ciao a tutti!
    Mi servirebbe un’informazione.
    C’è un modo per fare delle prove d’importazione in locale tramite csv?
    Se si, come posso fare l’export e provare un import?
    Dove devo caricare i file in locale?Su quale cartella?
    Grazie mille in anticipo per l’attenzione,

    Ciao

  11. avatarFrancesco

    Grazie Maurizio, appena inviato il messaggio qui sul blog avevo trovato da solo il percorso.
    Gentilissimo comunque.

    Mi servirebbe capire anche come esportare e importare il “gruppo clienti” e il “prezzo gruppo clienti” per creare dei listini personalizzati ma facendo l’export products non mi vengono fuori quelle colonne.
    Sai per caso quale voce devo esportare?
    Grazie mille ancora!

  12. avatarMaurizio Piatti Autore

    Ciao, facendo l’esportazione dei prodotti dovresti avere questi campi (_group_price_website, group_price_customer, _group_price_price ). Nel caso fai così, crei un prodotto di test con valorizzati questi campi, lo esporti (poi esportare solo lui filtrando per sku) e leggi dal csv che ottieni come sono stati valorizzati questi campi.

  13. avatarmarco

    Con questo articolo ho chiarito molti dubbi, ma ho ho un problema, un fornitore di prodotti mi manda un csv dove non tutti i campi obbligatori sono elencati, senza modificare il csv c’e’ la possibilita di indicarli?
    Per esempio la voce “type” uguale per tutti i prodotti “simple” posso inserirlo in automatico su magento senza creare una colonna nel csv per mapparla?

    Grazie
    Ottimo lavoro

  14. avatarLivio

    Salve, articolo eccellente ! Volevo chiedere una cosa, nel caso in cui volessi eseguire l’operazione di import tramite cron, come dovrei procedere ?