Esiste una soluzione semplice per salvare le immagini principali dei prodotti di Prestashop con PHP.
I percorsi delle immagini dei prodotti
In Prestashop l'ID di un'immagine di un prodotto viene scomposto nel file system e quindi ricomposto nell'URL. Ad esempio se un'immagine ha il seguente ID:
1234
nel file system avremo:
DOCUMENT_ROOT/img/p/1/2/3/4/1234.jpg
Ovviamente oltre all'immagine originale avremo anche le altre dimensioni dell'immagine in altrettanti file separati.
Immagine principale vs cover
Ciascun prodotto può mostrare una o più immagini. L'immagine principale non è la cover (copertina) del prodotto ma rappresenta quell'immagine che nel database ha posizione uguale ad 1.
Nello specifico si tratta dei campi numerici position
e cover
.
La soluzione
Il seguente codice copia le immagini principali dei prodotti in una directory specifica organizzandole in directory il cui nome è l'ID di ciascun prodotto.
function copy_image_file_cover($idproduct, $id) {
if(is_numeric($id)) {
$base = $_SERVER['DOCUMENT_ROOT'] . '/img/';
$dest = $_SERVER['DOCUMENT_ROOT'] . '/immagini-principali-prodotti/';
$start = $base . 'p/';
$dir = '';
if(strlen($id) == 1) {
$dir = $id;
} else {
$parts = str_split($id);
$dir = implode('/', $parts);
}
$start_dir = $start . $dir;
$d = $dest . $idproduct;
if(file_exists($start_dir)) {
if(!file_exists($d)) {
mkdir($d, 0755);
}
$files = array_diff(scandir($start_dir), array('..', '.'));
foreach($files as $file) {
if( stristr($file, 'default') === false ) {
copy( $start_dir . '/' . $file, $d . '/' . $file);
}
}
}
}
}
function copy_product_image_cover() {
global $db; // Classe di utility per il database
$query = "select id_image, id_product from ps_image where position = 1";
$products = $db->getResults($query);
foreach($products as $prod) {
$img_id = $prod['id_image'];
$prod_id = $prod['id_product'];
copy_image_file_cover($prod_id, $img_id);
}
}