Hai trovato ciò che cercavi?

Hai trovato ciò che cercavi?

Clicca sui banner

ci vogliono al massimo 3 secondi.



giovedì 1 novembre 2012

importare articoli in prestashop, con uno script esterno al CMS - Parte 1 : categorie.

Mi è stato chiesto di pensare uno script che inserisca i prodotti in prestashop, senza usare le funzioni native, per fare in modo da gestire automaticamente l'importazione. perciò mi sono studiato un po' prestashop per capire quali erano le tabelle che venivano modificate durante l'inserimento di un articolo. Dopo aver completato lo script che esegue l'importazione degli articoli, la gestione delle categorie, del magazzino e delle quantità disponibili di combinazioni ho realizzato anche uno script per esportare clienti ed ordini. Mi sono reso conto che questo argomento è parecchio discusso e spero di poter contribuire a dissipare alcuni dubbi che anche io all'inizio di questo progetto avevo. il mio caso chiaramente non può essere una generalizzazione, anche se alla fine del progetto le tante richieste e aggiornamenti al programma, lo hanno reso comunque abbastanza generale. ho iniziato a scrivere questo documento in un solo articolo, ma mi sono reso conto di doverlo dividere per capitoli, che di volta in volta cercherò di tenere aggiornati, inoltre la situazione di partenza in cui mi sono trovato è questa:
il file csv che contiene gli articoli contiene una riga per ogni colore articolo, ogni riga ha tutte le informazioni dell'articolo e le giacenze per quel colore, in tutte le taglie e il prezzo. cercherò di descrivere la logica che ho seguito e che ho imparato per inserire tutti i dati.

Ringrazio molto per l'attenzione, se possibile chiederei di cliccare sui banner per sostenere questo blog, grazie.

diciamo che il prefisso per le tabelle di prestashop sia "ps_" (quello di default) questa è la lista delle tabelle coinvolte nel processo:



ps_product
ps_product_attribute
ps_product_attribute_combination
ps_category_product
ps_product_lang
ps_attribute_lang
ps_attribute
ps_category
ps_category_group
ps_category_lang
ps_image

ma prima di continuare...

Piccola premessa sul sistema delle categorie.

inserire categorie a mano su prestashop, non è facile. hanno una logica un po' contorta, che ora cercherò di spiegare:
le categorie si trovano su ps_category, ogni riga, cioè ogni categoria, ha impostato l'id del parent, chiaro fino a qua e per me poteva anche essere sufficiente. ma no, volevano essere un po' incasinati, giustamente. allora, prendiamo ad esempio la categoria "collezione uomo" con le due sotto categorie "guanti" e "sciarpe", tanto per fare un esempio pratico. Collezione uomo avrà id_parent = 0 ma scorrendo fra le colonne, notiamo la presenza di due campi, in fondo, chiamati nleft e nright, diciamo che queste due colonne hanno dei valori numerici che devono contenere i valori dei propri figli, nel nostro esempio "collezione uomo" avrà nleft = 3 (del tutto arbitrario) e nright = 15 (anche lui arbitrario, ma con cognizione di causa, ora vediamo perché) le due categorie "guanti" e "sciarpe" avranno come id_parent l'id di "collezione uomo" diciamo 1, "guanti" avrà nleft = 4 e nright = 5, "sciarpe" avrà id_parent = 1, nleft = 6 e nright = 7. cioe' gli nleft e nright dei figli, sono contenuti in quelli del parent...
usando i colori: 3 4 5 6 7 ... 15 
è macchinoso, poco intuitivo e poco pratico... ma capita l'idea si sfrutta bene, è chiaro che prendendo nleft e nright consecutivi, ci si preclude la possibilità di inserire sotto categorie, ecco perché ho scelto 3 e 15 per la collezione uomo, così mi posso creare un po' di sotto categorie (pensare di spostare e di propagare lo spostamento di uno dei valori per inserire una categoria è fattibile, ma risulta chiaro che diventa un lavoro complesso, si dovrebbe propagare la modifica anche a parents e figli.

Questo per spiegare quali sono state le semplificazioni che ho effettuato, ovvero, nel mio caso ho "bloccato" le macro-categorie, ovvero le ho definite in anticipo, ad ogni importazione effettuo una serie di reset per "allargare" queste macro categorie che conterranno le categorie dei prodotti da importare:
$sql_cat_init0="UPDATE ps_category SET nleft=1, nright=1000 WHERE id_category=1";
$sql_cat_init1="UPDATE ps_category SET nleft=2, nright=99 WHERE id_category=6";
$sql_cat_init2="UPDATE ps_category SET nleft=100, nright=199 WHERE id_category=7";
$sql_cat_init3="UPDATE ps_category SET nleft=200, nright=299 WHERE id_category=8";
$sql_cat_init4="UPDATE ps_category SET nleft=300, nright=399 WHERE id_category=9";
$sql_cat_init5="UPDATE ps_category SET nleft=400, nright=499 WHERE id_category=10";
$sql_cat_init6="UPDATE ps_category SET nleft=500, nright=599 WHERE id_category=11";
 Un'altra esigenza che ho avuto è stata quella di dover aggiornare, cambiare e eliminare quelle combinazioni di attributi di prodotti che subivano aggiornamenti, prodotti che cambiano tessuto, combinazioni non disponibili, come ad esempio una maglia rosso large non più presente, o nuove combinazioni, come ad esempio l'inserimento di una nuova taglia, con i rispettivi colori.
Per questo mi sono preparato delle tabelle di conversione, dove tengo traccia del nome dell'attributo dei prodotti da importare e il suo id in prestashop così ho qualcosa del genere:

nome colorecartella  numero colore  id_attribute
GRIGIO
C 23
134
312
VERDE
D 21
003
163
GIALLO
C 23
233
266
BLU
D 12
543
254

La colonna id_attribute è quella che fa riferimento alla tabella ps_attribute di prestashop. Posso perciò resettare gli attributi di tutti i prodotti:


$sql_del_2 = "TRUNCATE TABLE ps_product_attribute";
 $sql_del_3 = "TRUNCATE TABLE ps_product_attribute_combination";
Li recupero ogni volta dal file csv, li confronto con la mia tabella di attributi e li reinserisco in queste due tabelle per tenerle sempre aggiornate, ogni prodotto che non è più disponibile in una certa misura, non viene "reinserito" e sparisce temporaneamente.

Inizio perciò ad importare le categorie, ovvero, prima di tutto disattivo tutte le categorie, così se non mi vengono passati prodotti per una determinata categoria, non viene neanche riattivata e rimane invisibile; per ogni prodotto che ha una nuova categoria (contenuta in una delle macro categorie che ho fissato all'inizio) inserisco la categoria come figlia della macro categoria giusta, :


"INSERT INTO ps_category (id_parent,level_depth,nleft,nright,active) VALUES (".$cod_linea.",".$level_depth.",".$nleft.",".$nright.",1)"
$cod_linea è il codice della macro categoria che contiene la nuova categoria. $nleft e $nright li prendo consecutivi (non avranno delle sotto categorie nel mio caso), ma se necessario potrei pensare di tenere dei "buchi" per inserire eventuali sotto categorie, attivo subito la categoria, so che il prodotto dalla quale l'ho letta è "attivo", ma anche questo potrebbe essere gestito a parte.

"UPDATE ps_category set active = 1 WHERE id_category=".$cod_linea;
attivo anche la categoria padre, per sicurezza.

$sql_ins_cat_group = "INSERT INTO ps_category_group (id_category, id_group) VALUES (".$new_cat_id.",1)";


le categorie fanno parte di gruppi, nel mio caso uso un solo gruppo di categorie, perciò inserito il record, mi salvo l'id e lo attribuisco al gruppo di default 1.


"INSERT INTO ps_category_lang (id_category, id_lang, name, link_rewrite) VALUES (".$new_cat_id.",".$id_lang_it.",'".$categoria."','".$categoria."')";

inserisco perciò i testi in lingua, cioè il nome della categoria, $id_lang_it è una delle costanti che uso nel programma, so quali sono gli id della lingua in questo caso l'italiano ha 1.

"INSERT INTO ps_conversione_categorie (id_category, codice_categoria, linea) VALUES (".$new_cat_id.",'".$categoria."','".$linea."')";
 inserisco anche la nuova categoria nella tabella di conversione, una delle tabelle che uso per convertire i dati da prestashop al programma che fornisce il file csv da importare, questo mi serve sia durante l'importazione, sia durante la successiva esportazione degli ordini, così da restituire al programma di gestione degli ordini, dati coerenti.



10 commenti:

  1. E la seconda parte??
    E' interessante... posso avere tutto il resto?

    RispondiElimina
  2. attualmente sto convertendo tutto per la 1.5 (quando inizai era la 1.4) metto la seconda parte il piu' presto possibile :D

    RispondiElimina
  3. Ciao matteo,
    da quel che leggo (molto interessante) credo che lo script possa essermi molto utile.
    Uso PS 1.4.9. (sono un neofita) e sto impazzendo con l'aggiornamento delle quantità e dei prezzi..
    puoi aiutarmi?
    grazie,
    Riccardo

    RispondiElimina
  4. Ciao,
    ho provato a contattarti scrivendo dal modulo contatti del tuo sito ma dopo l'invia mostra pagina bianca. Hai ricevuto il messaggio?

    Saluti
    Diego

    RispondiElimina
    Risposte
    1. ti ho risposto via mail. contattami pure a info[chiocciola]matteobononi.it

      Elimina
  5. tra l'altro, grazie per la segnalazione, ho corretto il problema sul sito e dovrebbe mandare le email normalmente adesso, restituendo l'esito o gli errori. :D

    RispondiElimina
  6. Ciao, grazie per le info :)
    Ad ogni modo, se volessi semplicemente esportare l'intero albero della categoria che voglio? Ipotizziamo di voler esportare l'albero "a sinistra" della categoria "VoIP", che io so essere "Home, Telefonia, VoIP", come potrei fare? Devo dire che è molto macchinoso come è strutturato il tutto.

    RispondiElimina
    Risposte
    1. Ciao Nandos, no, non mi è chiaro cosa vuoi ottenere, la lista delle categorie "padri" di una categoria?
      non conviene passare di qua, ma forse è più facile passare dalle webAPI?

      Elimina
  7. Salve Matteo, ho letto con interesse il post, ma mi pare incompleto, possibile?
    Il file CSV come dovrebbe essere strutturato?
    Grazie
    Roberto

    RispondiElimina
    Risposte
    1. Ciao Roberto, non ti sbagli, quando scrissi questa piccola introduzione avrei voluto proseguire e fare una serie di articoli, che poi non ho mai trovato il tempo di fare. Non è automatico rispondere alla tua domanda, tutto dipende da cosa vuoi ottenere con i tuoi dati e da come sono strutturati i tuoi articoli "fuori" prestashop, per fare un esempio, se per il tuo gestionale ogni articolo ha sia colore che taglia, potresti strutturare il csv inserendo un colore per riga e diverse colonne per la taglia oppure esattamente il contrario. In entrambi i casi dovrai comunque normalizzare i dati passati a rpestashop (anche qua, userai le combinazioni di attributi oppure ogni articolo/taglia/colore fa prodotto a se stante? tutto dipende dall'organizzazione dei dati.
      Ad ogni modo se hai bisogno di una mano non esitare a contattarmi, trovi il form sul sito www.matteobononi.it
      magari se mi scrivi più dettagliatamente la tua situazione posso darti qualche dritta o se hai proprio bisogno di sviluppare un modulo di importazione possiamo trovare qualche soluzione.

      info[chiocciola]matteobononi.it

      Elimina