Les Dataflow Magento sont pratiques, on peut les construire automatiquement (Dataflow Simple), les construire soit-même (Dataflow Avancés).
Depuis plusieurs jours je travaille sur les Dataflow Avancés, qui me permettent de personnaliser les flux selon les critères du client. Jusque là tout va bien, jusqu’au jour où je décide de faire un cron qui doit lancer deux, voire trois dataflow à la suite…

Plusieurs problèmes se sont posés :
– Dans les flux suivants, les données de mes flux précédents étaient présents.
– Si mes deux flux ont un nombre de colonnes différent, la nouvelle structure n’était pas prise en compte.

Ces deux problèmes devaient être coûtent que coûtent résolus.
Pour le premier j’avais tenté un Mage::getSingleton(‘dataflow/batch’)->setData(array())

Cela me supprimait bien les données précédentes mais j’avais toujours le soucis de structure.
Après plusieurs heures de recherche, j’ai trouvé la solution qui permet de pallier aux deux problèmes, mais aussi de nettoyer les tables contenant les données des flux : dataflow_batch, dataflow_batch_export, dataflow_batch_import. Enfin, il va supprimer les données temporaires dans « var/tmp ».

Le code qui m’a mis la puce à l’oreille dans « app/Mage.php » :

    /**
     * Retrieve model object singleton
     *
     * @param   string $modelClass
     * @param   array $arguments
     * @return  Mage_Core_Model_Abstract
     */
    public static function getSingleton($modelClass='', array $arguments=array())
    {
        $registryKey = '_singleton/'.$modelClass;
        if (!self::registry($registryKey)) {
            self::register($registryKey, self::getModel($modelClass, $arguments));
        }
        return self::registry($registryKey);
    }

Et voici la solution avec deux flux (pour encore plus de flux, la manipulation est la même) :

<?php
// La méthode dans votre classe
public function myExportMethod()
    {
		$profileId = 10 // Perso, je récupère mon ID via le nom du Dataflow, mais ici je met une valeur pour exemple
		if($profileId){
			$profile = Mage::getSingleton('dataflow/profile')->load($profileId);
			$profile->run();
			foreach ($profile->getExceptions() as $e) {
				Mage::log('Profile Info : '.$e->getMessage(),null,'myExportLogs.log',true); // Je force les logs pour tester
			}
		}
		
		// Permet de supprimer les données dans les tables dataflow_batch, dataflow_batch_export, dataflow_batch_import
		Mage::getSingleton('dataflow/batch')->delete();
		
		// On supprime le Singleton soit même
		$registryKey = '_singleton/dataflow/batch';
		if (Mage::registry($registryKey)) {
			Mage::unregister($registryKey);
		}
		
		$profileId = 12 // Un autre ID
		if($profileId){
			$profile = Mage::getSingleton('dataflow/profile')->load($profileId);
			$profile->run();
			foreach ($profile->getExceptions() as $e) {
				Mage::log('Profile Info : '.$e->getMessage(),null,'myExportLogs.log',true); // Je force les logs pour tester
			}
		}
		
		// Idem
		Mage::getSingleton('dataflow/batch')->delete();
		$registryKey = '_singleton/dataflow/batch';
		if (Mage::registry($registryKey)) {
			Mage::unregister($registryKey);
		}
		
		// Et voilà les deux dataflow se sont exécutés correctement et proprement !
		// On termine notre méthode
        return $this;
    }

Il suffit donc de mettre ce bout de code après chaque dataflow appelé (Même le dernier) :

// Permet de supprimer les données dans les tables dataflow_batch, dataflow_batch_export, dataflow_batch_import
 Mage::getSingleton('dataflow/batch')->delete();

// On supprime le Singleton soit même
$registryKey = '_singleton/dataflow/batch';
if (Mage::registry($registryKey)) {
    Mage::unregister($registryKey);
}
Lancer plusieurs Dataflow Magento en séquence dans un Cron
Taggé sur :                

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Nous utilisons des cookies afin de nous assurer de vous proposer la meilleure expérience sur ce site.
Ok