Imagini în Prestashop prin forţă brută

Captură de ecran cu Prestashop 1.2.0.5

v1.2.0.5 - demo pentru Toma

Pe scurt:

Un camarad într-ale Prestashop-ului m-a rugat să îi explic cum încarc imaginile cu forţa în baza de date şi m-am gândit că poate mai foloseşte şi altcuiva. Pe scurt e cam aşa:

  1. importul produselor din fişier .csv (la câmpul “image url” pui “Ignore this column”)
  2. upload-ul imaginilor cu numele corect în folderul “/images/p/”
  3. compunerea şi importul tabelului ps_image
  4. compunerea şi importul tabelului ps_image_lang
  5. Back Office > Preferences > Image > Regenerate thumbnails

Ce este Prestashop? (scurtă introducere)

Este un script PHP pentru comerţ on-line, a cărui caracteristică principală (pentru mine!) este uşurinţa cu care poate fi modificat. Nu mă refer doar la tema grafică – deşi aici m-am convertit eu -, ci şi la cod. Plus că permite crearea unui magazin electronic cu cod curat şi valid fără să schingiuiesc fişierele ca în osCommerce sau să studiez API-uri sau alte limbi chineze ca în Magento. Ca să o comparaţie, osCommerce este un dinozaur (chiar dacă unul agil), Magento este o balenă, iar Prestashop… să zicem un câine. Îmi plac câinii, nu mă interesează dacă se ofuschează cineva. Îmi plac şi programele care fac ce le zic (alt exemplu ar fi MODx, cine ştie cunoaşte).

Are următoarele cerinţe (citez din explicaţiile lor):

- Linux, Unix sau Windows
- Web Server (Apache 1.3 sau mai nou, IIS 6 sau mai nou)
- PHP 5.0* sau mai nou
- MySQL 5** sau mai nou

* Unele versiuni de PHP 5 au probleme şi împiedică funcţionarea corectă a  PrestaShop:
- PHP < 5.2 (fus orar cu dată invalidă)
- PHP 5.2.1 (autentificarea este imposibilă)
- PHP 5.2.6 (autentificarea este imposibilă pe serverele pe 64 de biţi)
- PHP 5.2.9 (administrarea şi încărcarea imaginilor nu funcţionează)
** PrestaShop funcţionează şi cu MySQL versiunea 4.1.14 până la 5.0, dar
unele facilităţi nu funcţionează (de ex., duplicarea produselor) sau au comportamente stranii

Nimic extraordinar. Merge foarte bine şi pe un server partajat (shared hosting, cum ar veni). Magento strâmbă din nas fără server dedicat. Nu zic că nu merge, dar se mişcă cu un dispreţ evident faţă de firmele mici. Ce îl mai deosebeşte de Magento sunt cerinţele de cunoştinţe ale utilizatorului (mă refer aici la cel care vrea să instaleze un magazin electronic, nu la cel care îl foloseşte). Şi anume, nu prea mari.

Se mişcă rapid, are cod valid şi poate fi modificat uşor – ce mai vrei?

Lasă vorbăria, care-i treaba cu pozele alea?

Facilitatea de import produse din fişier .csv în Prestashop

Facilitatea de produse din fişier .csv în Prestashop

Prestashop are o facilitate de import al produselor dintr-un fişier .csv (comma separated values). În teorie, faci un tabel cu datele fişierelor îl încarci pe server şi îl imporţi din Back Office (interfaţa de administrare). Practic însă pot să apară probleme legate mai ales, din câte am văzut,  de permisiunile de care este nevoie pentru manipularea fişierelor pe server. Şi pe serverele partajate asta-i o problemă mare de versiunea de PHP de pe server (în cazul meu, 5.2.9).

Concret, tabelul cu datele produselor (fişierul .csv) are o rubrică pentru calea imaginii principale pentru fiecare produs. Teoretic, este suficient să pui tabelul şi imaginile pe server, iar Prestashop le ia şi le transformă într-un catalog de toată frumuseţea. Nu spun că nu se poate, eu însă, până să rezolv chestiunea, am găsit o variantă mai potrivită cu un om leneş ca mine.

Atenţie! E treaba voastră cum folosiţi ce citiţi aici (şi în orice altă parte, că veni vorba), nu accept nicio responsabilitate pentru diversele nenorociri care credeţi că vă lovesc din cauza articolului meu. Sunteţi oameni în toată firea, fiţi responsabili! Faceţi backup!

Definiţia problemei:

Importul datelor produselor merge foarte bine, primeşti un mesaj de genu’ “Gata, şefu’, să trăiţi, am terminat!” şi intri în front-end sau în catalogul din Back Office, după caz, ca să te bucuri de opera ta. Stupoare! Pozele nu-s! Şi asta se combină cu facilitatea din Prestashop care înlocuieşte cu o imagine generică imaginile lipsă. Arghhh!

Rezolvare? Nu. Da’ funcţionează!

Am încercat şi eu să lămuresc serverul: “Haidi, bre, neşte poze acolea!” Serverul, nu şi nu. Aşa că dacă nu poţi lămuri infractorul, baţi victima (traiul în România te face creativ).

Victima în acest caz este Prestashop, baza de date mai exact.

Tabelele ps_image şi  ps_image_lang conţin legăturile dintre produse şi , respectiv şi legenda lor (sau titlul sau explicaţia). Prefixul ps_ este dat implicit de Prestashop, dacă aţi modificat această configurare la instalare ţineţi cont.

Am fost foarte uimit să aflu că nu există un tabel în care să se salveze calea imaginii corespunzătoare unui produs, cum e de exemplu în osCommerce sau Magento. Asocierea între produs şi imaginea lui se face prin numele produsului – indiferent ce nume ar avea fişierul ce conţine imaginea, Prestashop îl redenumeşte după modelul “IDprodus-IDimagine.jpg“. Sistemul simplifică codul şi impune un anumit grad de organizare. Vestea proastă este că pentru a găsi o anumită imagine trebuie să ai la îndemână un tabel cu numele şi ID-urile imaginilor. Mie îmi convine.

Toate legăturile între imagini sunt în cele două tabele, astfel:

ps_image

Tabelul ps_image din baza de date Prestashop

Tabelul ps_image din baza de date Prestashop

În ps_image sunt 4 câmpuri (sau coloane), dintre care doar primele două contează, id_image şi id_product, pentru că fac joncţiunea între produse şi imagini. Ca să simplific problema, am decis ca produsul să aibă acelaşi ID cu imaginea sa. Astfel, imaginea produsului cu ID-ul 1 va fi fişierul “1-1.jpg”, a produsului cu ID-ul 34 va fi fişierul “34-34.jpg”, ş.a.m.d. Cred că ai prins ideea. Cand sunt mai multe imagini pentru un singur produs se complică treaba, cel mai simplu e să termini cu imaginile principale şi să continui după aceea cu cele secundare (dacă ultimul produs are ID-ul 68 şi imaginea principală “68-68.jpg”, prima imagine secundară va avea ID-ul 69 – de ex. “2-69.jpg” dacă aparţine de produsul cu ID-ul 2).

Celelalte două tabele, position şi cover, reprezintă poziţia în lista cu toate imaginile unui produs, respectiv dacă imaginea va fi folosită ca imagine implicită a produsului. Aşadar, le umplu cu 1 de sus până jos.

Practic vorbind, se poate lucra în Excel sau ceva echivalent. Dacă aţi importat produsele cu ID-uri cu tot, atunci ştiţi care sunt ID-urile şi puteţi pleca de la tabelul vostru. Dacă nu, puteţi lua ID-urile exportând tabelul ps_product_lang.

Şi acum la munca manuală! Ce, credeai c-ai scăpat?

Plecând de la ID-urile produselor, se denumesc imaginile. Manual, da! Eu am dat doar prima parte a numelor (1, 2,…,34,…,65,…) şi am folosit un program capabil de “batch processing” ca XnView sau Total Commander ca să repete prima parte a numelui după o liniuţă (1-1, 2-2,…,34-34,…,65-65,…). Neapărat să aibă extensia jpg! Nu că ar fi practic alt format din moment ce sunt poze ale produselor.

Cand ai terminat, iei la purecat fişierul cu un editor mai capabil (UltraEdit sau Notepad++), să nu aibă resturi de la Excel şi să aibă un delimitator de câmpuri cât mai ciudat. Aici nu este important, nu imporţi decat cifre, dar la celălalt tabel ai legendele imaginilor şi e posibil să conţină şi virgule şi punct-şi-virgulă şi mai ştiu eu ce…

Şi gata! Intri în phpMyAdmin, în baza ta de date, în tabelul ps_image şi dai clic pe Import. Alegi fişierul de importat, dacă ai cap de tabel pui “1″ la “Number of records (queries) to skip from start“, alegi format “CSV” şi delimitatorul pe care îl foloseşti. Şi dai clic pe “Go“.

Şi atât cu tabelul ăsta.

ps_image_lang (altă muncă manuală)

Tabelul ps_image_lang din baza de date Prestashop

Tabelul ps_image_lang din baza de date Prestashop

Acest tabel conţine doar 3 câmpuri: ID-ul imaginii, ID-ul limbii şi explicaţia imaginii. ID-urile limbilor sunt în tabelul ps_lang (pun pariu că nu te aşteptai la asta!). Dacă la joncţiunea produselor cu imaginile puteam să mă gândesc la oareşce automatizări, aici nu este nicio posibilitate. Cineva trebuie să introducă manual explicaţiile pozelor. Stai puţin! Sunt în tabelul primit de la client, nu-i aşa ? Nu mai trebuie decăt atribuite ID-urile şi gata! Iar phpMyAdmin, iar Import şi gata.

Sau nu?

Mai trebuie încărcate pozele cu numele corect în locaţia corectă. Am văzut care este numele corect, locaţia corectă este directorul “\images\p\”din directorul unde ai instalat Prestashop.

Acum avem tot ce ne trebuie în locul corect. Dar! Mai este un pas. Mic. Trebuie ca în Back Office > Preferences > Image să dai clic pe “Regenerate thumbnails”. Prestashop o să rumege puţin şi o să fabrice toate formatele de care are nevoie din pozele tale şi VOALA! E voila, ştiu.

Rugăminte de final către prestaşopişti

Vă rog să lăsaţi în comentarii sugestiile sau nelămuririle voastre, e destul de greu să te pui în locul celui care are nevoie de informaţiile pe care tu le ştii deja. Chiar şi cu geniul meu considerabil.

Doamnelor şi domnilor, sănătate şi virtute!