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