Proseguiamo la nostra analisi del software per la creazione di siti di ecommerce Magento:
In questo articolo andremo ad analizzare un semplice script php grazie al quale è possibile effetturare l’aggiornamento delle quantità a magazzino dei prodotti del nostro e-commerce Magento.
Vediamo nel dettaglio le operazioni da seguire:
Il file csv
Per prima cosa andiamo a creare il file “stock.csv” all’interno del quale lo script php andrà a leggere le informazioni sulle quantità dei prodotti da aggiornare. Il file dovrà contenere sulla prima colonna lo SKU del prodotto e sulla seconda la quantità che intendiamo inserire a magazzino. Vediamo un esempio:
120304,1000 394103,50 934843,4000 112332,80
Una volta creato il file andiamo a salvarlo all’interno del nostro spazio web nella cartella “/var/import/“. (La scelta è caduta sulla cartella import di Magento in quanto già provvista degli adeguati permessi di lettura richiesti per l’apertura del file da parte dello script)
Lo script php
Salviamo il codice che segue all’interno di un file denominato “sincroStock.php” e carichiamolo all’interno del nostro spazio web. Sarà sufficiente richiamare questo file dal nostro browser per ottenere, in poco tempo, l’aggiornamento dei prodotti del nostro negozio
define('MAGE_BASE_DIR', realpath(dirname(__FILE__)));
require_once(MAGE_BASE_DIR.'/app/Mage.php');
$file = MAGE_BASE_DIR."/var/import/stock.csv";
$handle = @fopen($file, "r");
if ($handle) {
require_once(MAGE_BASE_DIR.'/app/Mage.php');
Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);
while (!feof($handle)) {
$linea = fgets($handle);
$dati = explode(",", $linea);
$sku = trim($dati[0]);
$qta = trim($dati[1]);
$product = Mage::getModel('catalog/product');
$stockItem = Mage::getModel('cataloginventory/stock_item');
$productId = $product->getIdBySku($sku);
if ($productId !== false) {
$product->load($productId);
$stockItem->loadByProduct($productId);
$stockItem->setData('qty', $qta);
$stockItem->setData('is_in_stock', ($qta > 0) ? 1 : 0);
try {
$stockItem->save();
echo "{$sku} elaborato correttamente.";
} catch(Exception $e) {
$countException++;
echo "{$sku} errore ({$e->getMessage()}).";
}
} else {
echo "{$sku} non trovato.";
}
unset($product);
unset($stockItem);
}
fclose($handle);
} else {
echo "Errore apertura file. ({$file})";
exit();}
Ciao,
Quando mando in esecuzione lo script, la pagina web appare bianca con una fila di punti interrogativi.
Dove sbaglio?
Giampaolo
Ciao,
non vorrei che sia stato un problema con il copia e incolla del codice, perchè ho visto che alcuni simboli venivano mal convertiti (es il segno maggiore “>” veniva convertito con la sua corrispondente entità html)… riprova a ricopiarlo ora che ho provveduto a riformattarlo…
Ciao
Un informazione, capita che si modifichi anche il prezzo, cosa dovrei aggiungere in questo caso?
Andrebbe un po’ modificato, comunque a grandi linee, dopo
$product->load($productId);
potresti fare
$product->setPrice(120.30);
oppure per settare il prezzo speciale
$product->setSpecialPrice(120.30);
e dopo assicurati di eseguire
$product->save();
Ciao
Lo script non funziona in quanto manca il tag di apertura: <?php
Se si aggiunge il tag all'inizio dello script va tutto ok.
Saluti,
A me appare questo messaggio:
Parse error: syntax error, unexpected ‘?’ in /home/superarg/public_html/sincroStock.php on line 1
Giampaolo
Ciao,
questo è un normalissimo script php, quindi in cima deve esserci il tag php… quindi le righe 1 e 2 dello script saranno
1 <?php
2 define('MAGE_BASE_DIR', realpath(dirname(__FILE__)));
Salve,
lo script funziona alla perfezione aggiungendo semplicemente i tag php di apertura e chiusura a inizio e fine dello script stesso.
Ora volevo chiedere se era possibile utilizzare lo stesso metodo per aggiornare anche i prezzi degli articoli.
Alfonso
Ciao Alfonso,
più sopra nei commenti trovi un esempio che avevo fatto, rispondendo a una richiesta simile alla tua, con del codice utile a trasformare questo script per aggiornare i prezzi.. te lo riporto per comodità:
$product->setPrice(120.30);
oppure per settare il prezzo speciale
$product->setSpecialPrice(120.30);
e dopo assicurati di eseguire
$product->save();
Ciao
Ciao Roberto,
avevo letto la risposta postata alcuni commenti prima, però non avevo ben capito dove posizionare la stringa “$product->setPrice(120.30);” e la stringa “$product->save();” all’interno dello script.
Se pazientemente e gentilmente potresti spiegarmi come fare te ne sarei davvero grato.
Ne approfitto per fare un augurio generale di un felice e sereno Natale.
Ciao.
ipotizzando di avere un file CSV con in prima colonna il codice del prodotto e in seconda il suo prezzo, questo è il codice che potresti usare:
define(‘MAGE_BASE_DIR’, realpath(dirname(__FILE__)));
require_once(MAGE_BASE_DIR.’/app/Mage.php’);
$file = MAGE_BASE_DIR.”/var/import/price.csv”;
$handle = @fopen($file, “r”);
if ($handle) {
require_once(MAGE_BASE_DIR.’/app/Mage.php’);
Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);
while (!feof($handle)) {
$linea = fgets($handle);
$dati = explode(“,”, $linea);
$sku = trim($dati[0]);
$price = trim($dati[1]);
$product = Mage::getModel(‘catalog/product’);
$productId = $product->getIdBySku($sku);
if ($productId !== false) {
$product->load($productId);
$product->setPrice($price);
try {
$product->save();
echo “{$sku} elaborato correttamente.”;
} catch(Exception $e) {
$countException++;
echo “{$sku} errore ({$e->getMessage()}).”;
}
} else {
echo “{$sku} non trovato.”;
}
unset($product);
}
fclose($handle);
} else {
echo “Errore apertura file. ({$file})”;
exit();
}
Ciao
Grande Roberto, tutto ok, lo script funziona alla perfezione!
Grazie, per la chiarezza e per la disponibilità. Ciao
Alfonso