Problemi di cancellazione categorie su Prestashop

scs ingegneria dei sistemi prestashop161

Questo articolo spiega come gestire gli errori che si possono generare a seguito di cancellazione di negozi e relative categorie su Prestashop

 

Il prodotto di riferimento è Prestashop 1.6.1.1 versione in italiano.

Prestashop è un ottimo sistema di gestione di un e-commerce. Io lo uso quotidianamente per la gestione di saladecommerce, e quindi mi trovo molto spesso ad affrontare problematiche tecniche abbastanza strane.

Fra le mie attività mi sono trovato a cancellare dei dati, passando da un multinegozio ad un negozio semplice.

Uno dei tanti problemi che mi hanno fatto passare pomeriggi preoccupati è stata la cancellazione delle categorie.

Il problema è semplice: in ambiente di multinegozio ho inserito una serie di categorie, con sotto categorie, attributi ecc.. ; per un qualsiasi motivo devo cancellare tutti i negozi e tornare ad un sistema mononegozio, quindi avere un solo negozio. Non voglio reinstallare tutto perché mi perderei una serie importante di personalizzazioni già fatte.

L’ambiente permette la cancellazione, e apparentemente tutto sembra funzionare.

Una volta cancellato tutto e tornato all’ambiente con un solo negozio, nel momento in cui inserisco una categoria mi accorgo che il sistema mi da un errore in fase di inserimento. Sembra non riconoscere correttamente la categoria Root, e se si cerca di accedervi viene generato un errore, recuperabile a video o nel file di log (basredir/log/*.log) che dice qualcosa di criptico “Root category must be an integer value” con una linea di errore in un file che non è di alcuno aiuto.

Quindi, una volta caricata la categoria, questa non viene visualizzata nella lista delle categorie, ma nel pannello delle statistiche risulta comunque essere presente, ma non collegata a nulla.

Apro una parentesi per invitarvi a correggere le label in italiano, nel pannello statistiche, in alto nella pagina di visualizzazione delle categoria. Cambiate “Disattiva Categorie” in “Categorie Disattivate” e “Svuota categorie” in “Categorie Vuote” ……

Ho svuotato e ricaricato, a livello di DB, le 5 tabelle delle categorie, ps_category, ps_category_group, ps_category_lang, ps_category_product, ps_category_shop, ma niente e’ cambiato. Ho inoltre controllato la consistenza di queste tabelle, e tutto mi sembrava a posto.

Non e’ servito a nulla attivare il debug a livello di configurazione di Prestashop, modificando il valore della variabile _PS_MODE_DEV_ nel file defines.inc.php ( a proposito, ma cosa si dovrebbe vedere con questa variabile settata ??? a me nessuna info di debug è mai apparsa….).

A niente e’ servito anche l’utilizzo del modulo database cleaner, che viene consigliato dal vendor.

Mi ha messo sulla buona strada, dopo molti tentativi e studio del codice, l’analisi della query che genera l’elenco delle categorie, che si può ottenere, nella schermata di gestione delle categorie, cliccando in altro sulla sinistra, sull’icona “>_” .

Questa mi ha dato la seguente query

“SELECT a.`id_category`, `name`, `description`, sa.`position` AS `position`, `active` , sa.position position FROM `ps_category` a LEFT JOIN `ps_category_lang` b ON (b.`id_category` = a.`id_category` AND b.`id_lang` = 1 AND b.`id_shop` = 1) LEFT JOIN `ps_category_shop` sa ON (a.`id_category` = sa.`id_category` AND sa.id_shop = 1) WHERE 1 AND `id_parent` = 42 ORDER BY sa.`position` ASC LIMIT 0, 50”

Analizzandola nel dettaglio mi sono accorto che c’e’ un “id_parent=42” che non centra assolutamente nulla !!!

L’id_parent è riferito alla categoria padre della categoria in oggetto, e nella query può avere senso per rafforzare i controlli di integrità, solo che in questo caso il valore 42 si riferiva evidentemente al vecchio ambiente multinegozio, molto complesso, e niente ha a che vedere con l’ambiente attuale, praticamente vuoto.

 

scs ingegneria dei sistemi debug

Sono andato a fare debug del file che genera questa query, con un sistema banale ed efficiente, che però può far rizzare i capelli ai puristi del genere. Mi sono fatto stampare il valore delle variabili in un file…..

Il comando semplice in php e’ il seguente :

“file_put_contents(‘/tmp/pippo1234567890’, ‘aaa\n’, FILE_APPEND);”

Al posto di ‘aaa\n’ ci può ovviamente essere messa qualsiasi striga o variabile, per cui va bene anche

“file_put_contents(‘/tmp/pippo1234567890’, print_r($this, TRUE), FILE_APPEND);”

Il contenuto del file può essere visto in tempo reale con un banale quanto utile

“tail –f /tmp/pippo1234567890”

Questo mi ha permesso di capire dal codice php che la query andava a pescare questo valore in una tabella che con le categorie non c’entrava nulla, e cioè la tabella che descriveva i negozi, ps_shop. In questa tabella, per ogni negozio, si sono poche informazioni fondamentali tra le quali anche la categoria padre del negozio. Probabilmente i programmatori l’hanno messa per accelerare la ricerca della categoria, ma poi evidentemente si sono dimenticati di gestire il campo anche in fase di cancellazione, per cui qua resta un valore sporco dopo le cancellazioni che coinvolgono negozio e categoria.

Nel dettaglio il file php è “controllers/admin/AdminCategoriesController.php”, mentre la linea, che in questa versione di Prestashop 1.6.1.1 è la linea numero 139, nella parte di inizializzazione della classe è

“$id_parent = $this->context->shop->id_category;”

Il campo a cui mi riferisco e’ quindi id_category nella tabella ps_shop.

Ho sistemato a mano il campo, mettendo il valore della categoria Root del negozio, nel mio caso ‘1’, e tutto è tornato a posto.

Per cui, per riassumere, se, in Prestashop versione 1.6.1.1 o precedenti, dopo delle cancellazioni di categorie qualcosa non torna più, a livello di DB dovete anche verificare che il campo ps_shop.id_parent abbia un valore coerente, perché non è detto che lo sia.

Ho guardato nel codice, e tra l’altro questo campo è utilizzato in più punti, per cui auspico che in futuro metteno a posto il codice, per adesso questa e’ la soluzione.

 

 

TAG: Prestashop, problem, categories, delete, Root, id_parent, parent

© 2020 SCS di Alberto Montanari & C. s.a.s. | ScrollMe by AccessPress Themes