Integrare Magento

Integrare Magento

Tool di integrazione Magento

Magento (link ufficiale) è uno dei software più potenti e completi al mondo per la gestione del proprio e-commerce.
Nella gestione quotidiana dell’e-commerce entrano in gioco diversi applicativi e fonti dati: il gestionale aziendale, file di esportazione dei cataloghi, connessione con store pubblici come Amazon, etc.
Spesso, le attività per integrare tutti i diversi prodotti presentano difficoltà tecniche e processi elaborati di manipolazione dei dati.
E’ possibile integrare Magento sia con modalità classica, ovvero con l’opportuna scrittura di classi PHP, oppure con Deep Connector.
La novità è che grazie al’esperienza di Into Deep l’integrazione è rapida e sicura.

Integrare un export cataloghi

Il gestionale aziendale, solitamente, esporta il catalogo con prodotti e prezzi.
L’integrazione con Magento deve essere effettuata giornalmente e deve essere:

  • Affidabile: non sono ammessi errori nell’importazione del catalogo prodotti, né tantomeno nei prezzi
  • Veloce: l’importazione (spesso di molti record) deve essere immediata per pubblicare tempestivamente il catalogo online
  • Interattiva: eventuali errori devono essere comunicati via email per far sì che gli operatori possano intervenire tempestivamente se qualche operazione non va a buon fine

La modalità classica per l’integrazione di Magento consiste nel creare un modulo custom, in modo da mantenere ordinato il codice secondo lo standard dell’applicativo.

Prima di vedere come richiamare il nostro import, vediamo a grandi linee come deve essere strutturato.

Recupera il file per l’importazione

Anche se siamo nell’era dell’IoT e dei device costantemente connessi, quando si parla di integrazione dati, i “vecchi” file CSV sono ancora molto utilizzati presso i clienti.
E’ bene allora definire le caratteristiche del file, per evitare errori di interpretazione.
Una volta definito il tracciato record, per leggere il file CSV si può utilizzare la seguente funzione PHP:

public function loadCsvData(){
	$dir = Mage::getBaseDir('var') . DS . 'import';
	$file = $dir . DS . "nome_file.csv";
	if(!file_exists($file))
		exit("file not exist");
	
	$csvFile = new Varien_File_Csv();
	$csvFile->setDelimiter(",");
	
	$fileData = $csvFile->getData($file);
	return $fileData;
}

Viene pertanto stabilito che nella cartella /var/import dell’installazione Magento è inserito un file nome_file.csv che sarà la base per il nostro import.
E’ facile recuperare i dati del file, sfruttando la classe di Magento

Varien_File_Csv

ed impostando il delimitatore. Una volta fatto questo è sufficiente recuperare i dati in un oggetto PHP, mediante il metodo getData(“nome_file”)

Imposta un file di log

Punto fondamentale per fornire un’importazione affidabile è quello di prevedere un file di log.
Per fare questo, utilizzare una funzione PHP del tipo:

public function log($msg, $fileName){
	if(!is_string($msg)){
		$msg = print_r($msg, true);	
	}
	
	Mage::log($msg, null, $fileName);
}

che è semplicissimo grazie all’utilizzo del metodo statico log di Magento.
Prevedere sempre un nome di file variabile consente di non dover cambiare questa funzione in corsa. Per questo la funzione accetta un parametro $fileName con il nome del file.

Crea un punto di accesso

Crea un metodo run() per l’elaborazione delle informazioni. Il metodo run() sarà il punto di ingresso del processo di integrazione e sarà il punto da cui chiamerai tutte le funzioni necessarie per l’import.
Se possibile, il metodo run() avrà meno logica possibile e richiamerà singole funzioni che realizzano operazioni semplici e specifiche.

public function run(){
	    
	try {
		// scrivi a video l'ora di inizio import (per i test)
		echo "Inizio" . now() . "\n\r";

		// imposta il nome del file di log
		$logFile = 'import_catalog.log';
		// inizia subito con il log di "start"
		$this->log("start Magento import", $logFile);
		// recupera il file CSV di input
		$csvData = $this->loadCsvData();
		
		// inizializza gli array che ti serviranno durante l'elaborazione
		$products = [];
		$wishlist = [];
		$wishlist_item = [];

		foreach ($csvData as $data){	
			// logica del metodo per ogni riga di file csv letta
		}
	}catch(Exception $ex){
		echo "ERRORE: " . $ex->getMessage();
	    $this->log("*** ERRORE IMPORT *** : " . $ex->getMessage(), $logFile);
	}
...
}

Cattura sempre le eccezioni

Come indicato nel paragrafo precedente, il metodo run() deve sempre prevedere la gestione delle eccezioni.
Per un import da file, conviene gestire l’eccezione in maniera generica in un unico blocco try catch, come indicato nel seguente codice:

try{
...
}catch(Exception $ex){
	echo "ERRORE: " . $ex->getMessage();
	$this->log("*** ERRORE IMPORT *** : " . $ex->getMessage(), $logFile);
}

che scrive a video l’errore, utilissimo durante i test ed inoltre scrive anche nel file di log, nel caso di importazioni batch.

Lavora in memoria

La logica di esecuzione del nostro import non deve essere quella di accedere continuamente al DB.
Uno dei punti fondamentali è infatti la velocità.
Per fare questo, conviene leggere il file CSV e scrivere tutto in array. Questo ha il “side-effect” di aumentare la memoria RAM richiesta dall’elaborazione, ma, se ben strutturato, l’import durerà poco tempo e non appesantirà il sistema:

...
foreach ($csvData as $data){	
	// logica del metodo run() per ogni riga di file CSV
	// recupera id cliente dal file csv
   	$customerId = $this->getCustomerByUserCode($data[0]);
  	if ($customerId == null){
    	$this->log("*** CUSTOMER NON TROVATO PER CODICE INPUT DA FILE CSV ***" . $data[0] , $logFile);
    	continue;
    }
    
	// recupera id prodotto dal file csv
    $productId =   $this->getProductByProductCode($data[3]);
    if ($productId == null){
    	$this->log("*** PRODUCT NON TROVATO PER CODICE INPUT DA FILE CSV ***" . $data[3] , $logFile);
    	continue;
    }
	
    // popola array dei prezzi per inserimento dei dati
    if (!array_key_exists($customerId . "_" . $productId, $prices)){
    	$prices [$customerId . "_" . $productId] = [
    		                    "customer_id"       => $customerId,
    		                    "product_id"        => $productId,
    		                    "store_id"          => 1,
    		                    "qty"               => 1,
    		                    "price"             => $data[4],
    		                    "special_price"     => 0.0,
    		                    "created_at"        => now(),
    		                    "updated_at"        => null,
    		                    "customer_email"    => $data[1]
    		                ];
    }else{
		$this->log("prices -> chiave duplicata per: " . $data[0] . "_" . $data[3] . " chiave array: " . $customerId . "_" . $productId, $logFile);
    	continue;
	}
}
...

Sfrutta la funzione insertMultiple

Magento permette di gestire l’inserimento massivo di record in maniera molto semplice, grazie all’utilizzo della funzione insertMultiple.
Per sfruttare questa funzionalità, solo dopo aver strutturato correttamente l’array per l’inserimento, basta scrivere la riga di codice riportata di seguito.

$this->getConnection()->insertMultiple('customerprices_prices', $prices);

per recuperare la connessione al database di Magento, è sufficiente scrivere un metodo ad-hoc di questo tipo:

public function getConnection(){
	return Mage::getSingleton('core/resource')->getConnection('core_write');
}

Per qualsiasi dubbio, seguire la guida ed il forum di Magento. Vedere ad esempio questo link.

Conclusione

Come si è visto in questo breve articolo, strutturare un’importazione da Magento in modalità classica è semplice ed efficace se si seguono le linee guida viste sopra.
E’ possibile strutturare un import in poco tempo creando un modulo opportuno di Magento e richiamare la funzionalità direttamente da browser, oppure schedularla con gli strumenti classici di Magento.
E’ possibile utilizzare anche Deep Connector per questo scopo, ma questo sarà argomento di un altro post del nostro blog!
Buona integrazione di Magento a tutti!

Ti è piaciuto il nostro articolo? Hai ancora dubbi su come integrare Magento?
Sentiti libero di contattarci per una consulenza.

 

0 Commenti

Lascia una risposta

Il tuo indirizzo email non sarà pubblicato.