Oggi vi regalo uno snippet per l'aggiunta di prodotti "configurable" direttamente da codice Php. Tenetelo bene di conto perché online ho trovato diversi script incompleti o mal funzionanti, potrete risparmiare parecchio tempo
L'aggiunta di un prodotto di tipo "configurable" in Magento (attraverso codice Php) è un'operazione complessa. In rete esistono diversi snippet ma incompleti o incompatibili con tutte le versioni di Magento. Oggi vi regalo uno snippet che ho creato -e testato- con cui creare i vostri prodotti con taglie e colori.
I prodotti di tipo "configurable" sono utilizzati da Magento per gestire le varianti di acquisto (ad esempio taglie e colori di un capo di abbigliamento). Per ulteriori informazioni vi rimando alla guida che ho scritto tempo fa sui tipi di prodotto in Magento, invitandovi a verificare se oltre a questo tipo di prodotti può fare al caso vostro anche il tipo "grouped".
Vediamo ora come creare prodotti configurabili da codice php.
Il concetto da capire quando si ha a che fare con questo tipo di prodotto, è che tutto ruota attorno agli attributi. Nel nostro esempio aggiungeremo al catalogo un paio di scarpe da corsa con due varianti di colore. Questo significa che dovremo:
- creare (se non esiste già) un attributo di tipo "colore" nel set di attributi che useremo per i nostri prodotti;
- creare i due prodotti-varianti colore (sono prodotti semplici ma "nascosti" per evitare che finiscano all'interno delle categorie o dei risultati della ricerca, mentre vogliamo che appaiano solo come opzioni all'interno della pagina del prodotto principale)
- creare un prodotto principale (prodotto di tipo "configurable" sulla cui pagina appariranno gli altri due, come opzioni di scelta)
Il primo step è gestibile direttamente da pannello Magento. Dobbiamo entrare in amministrazione e sotto "Catalog/ Attributes" scegliere "Manage attributes".
L'attributo che interessa il nostro esempio è evidentemente il colore e vediamo che Magento lo ha già installato di default.
Se invece avete bisogno di un attributo non compreso tra quelli già creati, potete aggiungerlo cliccando su "add new attribute". Ricordatevi di impostare queste tre opzioni:
- scope = global
- input type = dropdown
- create configurable product = yes
Il secondo step è quello di verificare che il prodotto sia presente all'interno del set di attributi che vogliamo usare (sotto "Catalog/ Attributes" scegliere "Manage attribute set".). Nel mio caso ho un unico set di attributi, "default". Cliccare e trascinare da destra a sinistra l'attributo, se non ancora presente.
Creiamo ora il file php nel quale inserire il codice per la gestione dei 3 prodotti. Per comodità lo salviamo nella root del nostro ecommerce, poi ovviamente adattate la soluzione alle vostre esigenze.
Dichiariamo subito due funzioni accessorie. La prima ci serve per salvare l'immagine da un server remoto:
function copyFromUrl($url,$saveto){
$ch = curl_init ($url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_BINARYTRANSFER,1);
$raw=curl_exec($ch);
curl_close ($ch);
if(file_exists($saveto)){
unlink($saveto);
}
$fp = fopen($saveto,'x');
fwrite($fp, $raw);
fclose($fp);
}
La seconda ci consentirà di aggiungere il nome del colore delle scarpe al set di attributi appena visto. Ovviamente se non avete a che fare con scarpe e colori ma con altri attributi (ad esempio le taglie di una camicia o di un paio di scarpe stesse), potete usare ugualmente questa funzione; il nome dell'attributo è tra i parametri che vedremo in seguito, quindi copiate/incollate senza modifiche questa funzione:
function setAttribute($attributeCode, $attributeValue){
$attribute = Mage::getModel('eav/config')->getAttribute('catalog_product', $attributeCode);
$flag=0;
foreach ( $attribute->getSource()->getAllOptions(true, true) as $option )
{
if($attributeValue == $option['label'])
{
unset($attribute);
$flag=1;
return $option['value'] ;
}
}
if($flag==0){
$attribute_model = Mage::getModel('eav/entity_attribute');
$attribute_options_model= Mage::getModel('eav/entity_attribute_source_table') ;
$attribute_code = $attribute_model->getIdByCode('catalog_product', $attributeCode);
$attribute = $attribute_model->load($attribute_code);
$attribute_table = $attribute_options_model->setAttribute($attribute);
$options = $attribute_options_model->getAllOptions(false);
$value['option'] = array($attributeValue,$attributeValue);
$result = array('value' => $value);
$attribute->setData('option',$result);
$attribute->save();
$attribute = Mage::getModel('eav/config')->getAttribute('catalog_product', $attributeCode);
foreach ( $attribute->getSource()->getAllOptions(true, true) as $option )
{
if($attributeValue == $option['label'])
{
unset($attribute);
return $option['value'] ;
}
}
}
}
Chiudiamo le operazioni preliminari includendo il framework Magento:
require 'app/Mage.php';
$app = Mage::app('default');
Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);
Finalmente, creiamo i nostri 3 prodotti. Iniziamo con le due varianti, una per colore. Per comodità, illustrerò il codice nei commenti presenti nelle varie righe:
$product = Mage::getModel('catalog/product');
$product->setSku('BROOKSLN001'); //codice sku, univoco
$def_attribute_set = Mage::getModel('catalog/product')->getResource()->getEntityType()->getDefaultAttributeSetId();
$product->setAttributeSetId($def_attribute_set); // need to look this up
$product->setName('Brooks Launch Nightlife Electric Blue');
$product->setMetaTitle('Brooks Launch Nightlife Electric Blue');
$product->setShortDescription('The adaptive BioMoGo DNA midsole provides custom cushioning.');
$product->setDescription('BROOKS LAUNCH 2 B [BRITEPINK MIDNIGHT]With the Brooks Launch you will be ready for lift-off ... (qui la descrizione)');
$product->setWeight(0.222);
$color = setAttribute('color','Electric Blue'); //questa è la variante!!! Inserire il codice attributo, visibile nel pannello Magento -nel mio caso "color"- e aggiungere il valore della variante (nel mio caso il nome del colore)
$product->setColor($color);
$product->setCreatedAt(strtotime('now'));
$product->setTypeId(Mage_Catalog_Model_Product_Type::TYPE_SIMPLE);
$product->setTaxClassId(2);
$stock_data=array( 'use_config_manage_stock' => 1, 'qty' => 100, 'min_qty' => 0, 'use_config_min_qty'=>1, 'min_sale_qty' => 0, 'use_config_min_sale_qty'=>0, 'max_sale_qty' => 0, 'use_config_max_sale_qty'=>1, 'is_qty_decimal' => 0, 'backorders' => 0, 'notify_stock_qty' => 1, 'is_in_stock' =>1 );
$product->setData('stock_data',$stock_data);
$product->setVisibility(Mage_Catalog_Model_Product_Visibility::VISIBILITY_NOT_VISIBLE); //importante, il prodotto-variante non deve essere visibile altrimenti un prodotto con 20 taglie/colori risulterebbe visibile 20 volte diverse!
$product->setPrice(109.95);
$product->setPriceView(109.95);
$product->setCategoryIds(array(2858,2868,2886)); //attenzione: personalizzare questa riga con gli id delle vostre categorie
$product->setWebsiteIds(array(1));
$product->setStatus(Mage_Catalog_Model_Product_Status::STATUS_ENABLED);
$image = 'http://ecx.images-amazon.com/images/I/61PU%2B2lUMmL._UL1500_.jpg'; //nome dell'immagine
$nome = md5($image);
$nome = $nome.'.jpg';
copyFromUrl($image,'media/tmp/'.$nome);
$product->addImageToMediaGallery('media/tmp/'.$nome, array('image', 'small_image', 'thumbnail'), false, false);
$product->save();
Ricordate quindi di personalizzare, oltre alle opzioni descrittive (nome, sku, descrizione ecc) queste due fondamentali istruzioni:
$color = setAttribute('color','Electric Blue'); //questa è la variante!!! Inserire il codice attributo, visibile nel pannello Magento -nel mio caso "color"- e aggiungere il valore della variante (nel mio caso il nome del colore)
$product->setCategoryIds(array(2858,2868,2886)); //attenzione: personalizzare questa riga con gli id delle vostre categorie
attenzione anche a
$product->setTaxClassId(2);
che va personalizzata con l'id della vostra tassa (iva?)
Ripetete l'operazione per il secondo prodotto variante, che verosimilmente sarà uguale a questo tranne per il codice SKU e probabilmente per la quantità in stock o per il prezzo.
A proposito del prezzo, ricordate che se avete prezzi complessi (per gruppi) dovete impostarli per ogni gruppo.
Infine non ci rimane che creare il terzo prodotto. Prendiamo nota, da pannello, degli id dei prodotti appena inseriti ed eseguiamo -dopo averlo personalizzato, vedere i commenti- questo snippet:
$product = Mage::getModel('catalog/product');
$product->setSku('BROOKSLN000');
$def_attribute_set = Mage::getModel('catalog/product')->getResource()->getEntityType()->getDefaultAttributeSetId();
$product->setAttributeSetId($def_attribute_set);
$product->setName('Brooks Launch');
$product->setMetaTitle('Brooks Launch');
$product->setShortDescription('The adaptive BioMoGo DNA midsole provides custom cushioning.');
$product->setDescription('BROOKS LAUNCH 2 B [BRITEPINK MIDNIGHT]With the Brooks Launch you will be ready for lift-off ... (qui la descrizione)');
$product->setWeight(0.222);
$product->setCreatedAt(strtotime('now'));
$product->setTypeId(Mage_Catalog_Model_Product_Type::TYPE_CONFIGURABLE,false);
$product->setTaxClassId(2);
$stock_data=array( 'use_config_manage_stock' => 1, 'is_in_stock' =>1 );
$product->setData('stock_data',$stock_data);
$product->setVisibility(Mage_Catalog_Model_Product_Visibility::VISIBILITY_BOTH);
$product->setPrice(109.95);
$product->setPriceView(109.95);
$product->setCategoryIds(array(2858,2868,2886)); //ricordare di usare gli id delle proprie categorie
$product->setWebsiteIds(array(1));
$product->setStatus(Mage_Catalog_Model_Product_Status::STATUS_ENABLED);
$product->setCanSaveCustomOptions(true);
$colorAttributeId = Mage::getModel('eav/entity_attribute')->getIdByCode('catalog_product', 'color');
$product->getTypeInstance()->setUsedProductAttributeIds(array($colorAttributeId));
$image = 'http://ecx.images-amazon.com/images/I/81eaSNKm9oL._UL1500_.jpg';
$nome = md5($image);
$nome = $nome.'.jpg';
copyFromUrl($image,'media/tmp/'.$nome);
$product->addImageToMediaGallery('media/tmp/'.$nome, array('image', 'small_image', 'thumbnail'), false, false);
$simpleProducts = Mage::getResourceModel('catalog/product_collection')
->addIdFilter(array(10237,10238)) //importante: inserire qui gli id dei prodotti-variante appena creati
->addAttributeToSelect('color') //inserire qui il codice dell'attributo usato
->addAttributeToSelect('price');
$configurableProductsData = array();
$configurableAttributesData = $product->getTypeInstance()->getConfigurableAttributesAsArray(); //attenzione che il colore sia nel set di attributi!
foreach ($simpleProducts as $simple) {
$simpleProductsData = array(
'label' => $simple->getAttributeText('color'), //inserire qui il codice dell'attributo usato
'attribute_id' => $colorAttributeId,
'value_index' => (int) $simple->getColor(),
'is_percent' => 0,
//'pricing_value' => $simple->getPrice(),
'pricing_value' => 0,
);
$configurableProductsData[$simple->getId()] = $simpleProductsData;
$configurableAttributesData[0]['values'][] = $simpleProductsData;
}
$product->setConfigurableProductsData($configurableProductsData);
$product->setConfigurableAttributesData($configurableAttributesData);
$product->setCanSaveConfigurableAttributes(true);
$product->save();
Ecco il risultato finale. Poi sarà il tema a gestire le varianti, alcuni dispongono di funzioni avanzate come l'anteprima immagine che cambia non appena viene scelta l'opzione. L'esempio riportato qui sopra è volutamente semplice per consentirvi di adattarlo alle vostre procedure; è ovvio che alcuni parametri (id categoria, id prodotti varianti) in uno script a regime vengono gestiti direttamente dal codice.
Vi segnalo questo articolo che ho scritto successivamente con una versione pià avanzata della funzione di copia file/ immagini in php, migliorata nella gestione degli errori.