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...
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
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:
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:
La colonna id_attribute è quella che fa riferimento alla tabella ps_attribute di prestashop. Posso perciò resettare gli attributi di tutti i prodotti:
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 colore | cartella | 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, :
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.
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.
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.
E la seconda parte??
RispondiEliminaE' interessante... posso avere tutto il resto?
attualmente sto convertendo tutto per la 1.5 (quando inizai era la 1.4) metto la seconda parte il piu' presto possibile :D
RispondiEliminaCiao matteo,
RispondiEliminada 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
Ciao,
RispondiEliminaho provato a contattarti scrivendo dal modulo contatti del tuo sito ma dopo l'invia mostra pagina bianca. Hai ricevuto il messaggio?
Saluti
Diego
ti ho risposto via mail. contattami pure a info[chiocciola]matteobononi.it
Eliminatra 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
RispondiEliminaCiao, grazie per le info :)
RispondiEliminaAd 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.
Ciao Nandos, no, non mi è chiaro cosa vuoi ottenere, la lista delle categorie "padri" di una categoria?
Eliminanon conviene passare di qua, ma forse è più facile passare dalle webAPI?
Salve Matteo, ho letto con interesse il post, ma mi pare incompleto, possibile?
RispondiEliminaIl file CSV come dovrebbe essere strutturato?
Grazie
Roberto
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.
EliminaAd 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