PHP: copiare le immagini principali dei prodotti di Prestashop

PHP: copiare le immagini principali dei prodotti di Prestashop

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);
    }   
}

Torna su