Aggiornare la disponibilità dei prodotti in Magento

Logo-magentoProseguiamo 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();}

Lascia un commento

Tutti i campi sono obbligatori.
L'indirizzo email non verrà pubblicato

Commenti

  1. avatarGiampaolo

    Ciao,
    Quando mando in esecuzione lo script, la pagina web appare bianca con una fila di punti interrogativi.
    Dove sbaglio?
    Giampaolo

  2. avatarRoberto Rubino Autore

    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

  3. avatarTheSamu

    Un informazione, capita che si modifichi anche il prezzo, cosa dovrei aggiungere in questo caso?

  4. avatarRoberto Rubino Autore

    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

  5. avatarMarco

    Lo script non funziona in quanto manca il tag di apertura: <?php
    Se si aggiunge il tag all'inizio dello script va tutto ok.

  6. avatarGiampaolo

    Saluti,
    A me appare questo messaggio:

    Parse error: syntax error, unexpected ‘?’ in /home/superarg/public_html/sincroStock.php on line 1
    Giampaolo

  7. avatarRoberto Rubino Autore

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

  8. avatarAlfonso

    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

  9. avatarRoberto Rubino Autore

    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

  10. avatarAlfonso

    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.

  11. avatarRoberto Rubino Autore

    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

  12. avatarAlfonso

    Grande Roberto, tutto ok, lo script funziona alla perfezione!
    Grazie, per la chiarezza e per la disponibilità. Ciao
    Alfonso