Creare immagini di varie dimensioni con VirtueMart

A uso e consumo di chi non ha paura di mettere mano al codice di VirtueMart ( e già per questo vi stimo ), ecco un pezzetto di codice che vi permette di inserire al volo nel vostro tema miniature di qualsiasi dimensione, evitando la limitazione di default per cui tutte le miniature sono grandi uguali.

Premessa

In VirtueMart, la situazione di base è che potete configurare una sola possibile dimensione per le miniature dei prodotti: tale dimensione verrà usata poi dappertutto, e cioè:

  • nella lista prodotti
  • nella pagina di dettaglio prodotto
  • negli snapshot (prodotti casuali, ecc…)

Può però essere comodo avere dimensioni diverse per miniature collocate in posti diversi.

La soluzione complicata

Tempo fa, di fronte a una richiesta simile (avere tre possibili dimensioni per le immagini) abbiamo lavorato intervenendo sul codice di salvataggio del prodotto.

In quel momento, infatti, viene creata la prima miniatura: noi abbiamo fatto in modo che ne venissero create altre, alle varie dimensioni, tutte salvate come “immagini aggiuntive” del prodotto.

Questa soluzione ha senz’altro il vantaggio di poter gestire le immagini direttamente dal backend di VirtueMart.

Tuttavia richiede una modifica piuttosto invasiva e comunque rimane relativamente poco flessibile: le dimensioni devono essere specificate in anticipo.

La soluzione semplice

Affidiamoci alle convenzioni: anzichè catalogare a database tutte le miniature, diamo per scontato che se l’immagine originale si chiama ad esempio “immagine_frontale_notebook.jpg“, la relativa miniatura a 250x250px si chiamerà “immagine_frontale_notebook_250x250.jpg“.

Il nostro codice quindi non deve più cercare l’immagine nel database, ma direttamente nel filesystem, e se non la trova la crea.

Utilizzando le user_class, aggiungiamo quindi alla classe ps_product questa funzione:

function makeThumbImage( $product_id, $height, $width ) 
{
jimport( 'joomla.filesystem.file' );
// this constants are available only if we are in 
// VirtueMart component page, so we'd better check
if (! IMAGEPATH ) {
   define ( "IMAGEPATH", JPATH_SITE .DS. 'components'
           .DS. 'com_virtuemart' .DS. 'shop_image' );
}
if (! CLASSPATH ) {
   define ( "CLASSPATH", JPATH_SITE .DS. 'administrator'
   .DS. 'components' .DS. 'com_virtuemart' .DS. 'classes' );
}
// get full image name
$full_image = ps_product::get_field ( $product_id, 
                                     'product_full_image' );
$ext = JFile::getExt( $full_image );
$name = JFile::stripExt( $full_image );
// build resized image path and url 
$resized_image_path = IMAGEPATH.DS.'product' 
                      .DS.'resized'
                      .DS."${name}_${width}x${height}.${ext}";
$resized_image_url = 
JRoute::_( '/components/com_virtuemart/shop_image/product/resized/' 
           . "${name}_${width}x${height}.${ext}" );
 
if ( ! JFile::exists( $resized_image_path ) ) {
// create thumb if it does not already exist
$full_image_path = IMAGEPATH .DS. 'product' .DS. $full_image;
$maxsize = false;
$bgred = 255;
$bggreen = 255;
$bgblue = 255;

require_once( CLASSPATH .DS. "class.img2thumb.php");
$imageResize = new Img2Thumb( $full_image_path, $width, $height,
                              $resized_image_path, $maxsize, 
                              $bgred, $bggreen, $bgblue);
}
// return url
return ( $resized_image_url );
}

Da questo momento in poi, in qualunque punto del nostro tema VirtueMart potremo usare tale funzione per creare una miniatura di dimensione a piacere. Ad esempio, il nostro primo utilizzo è stato nel file productSnapshot.tpl.php, sostituendo la riga

echo ps_product::image_tag( $product_thumb_image, 
                            "alt=\"".$product_name."\"");

con

<img src="<?php 
echo ps_product::makeThumbImage( $product_id, 120, 125 ) 
?> />

Avvertenze

Questo codice non pretende assolutamente di essere completo e applicabile in qualunque circostanza. Meriterebbe di essere testato a fondo, per ora possiamo solo dire che lo stiamo usando su un sito in produzione senza problemi.

Saremo felici di ascoltare eventuali segnalazioni, critiche o suggerimenti, ma non possiamo garantire nessun supporto.

Nota finale

Ci dispiace fornire semplicemente del codice da copiare e incollare, dato che ultimamente preferiamo impacchettare le nostre estensioni e renderle più facili da usare per chiunque.

Ma abbiamo pensato che questo codice potesse essere utile anche così com’è.

programmatore, virtuemart

Commenti (5)

  • Ho inserito il codice come specificato, ma mi sa che sbaglio qualcosa perchè il risultato che mi viene dato è una link lunghissimo con in mezzo testo tipo: “Warning: Division by zero in”.

    Mi sapreste dire dove sbaglio?
    Grazie mille

  • @Maria:
    l’errore sembra indicare che non viene passato correttamente uno dei valori di dimensione; ricordati che devi specificare SIA la larghezza SIA l’altezza.

  • Io ho scritto come qui sopra riportato aggiungendo solo il simbolo ” perchè se no mi dava errore, in questo modo:
    <img src="” />

    Credi che sia quello il problema.

I commenti sono chiusi.