Export des clients invités ayant leur commande « terminée » sous Magento

Dans: Magento

2 mar 2010

L’export des clients invités à des fins de mailing ou autre n’est pas possible en natif depuis l’interface de gestion des clients ou des commandes.

Pour exporter simplement les clients il existe 3 méthodes :

  1. Récupération des clients via une requête SQL (exécution rapide / difficile à mettre en place)
  2. Récupération des clients via les collections de Magento (exécution lente, facile à mettre en place)
  3. Récupération des clients via les Web Services (exécution lente / difficile à mettre en place)

Pourquoi via une requête SQL ? Car le serveur utilisé n’avait pas les ressources nécessaires pour traiter au delà des 2000 commandes. Le temps d’exécution maximum d’un script étant limité dans le php.ini inaccessible à cause d’un serveur dédié partagé. La requête SQL ne bronche pas, et encaisse les milliers de commandes en quelques secondes.

Dans nos cas, le script va balayer toutes les commandes passées et extraire les clients invités ayant leur commande « Terminée » (qui ne sont stockés que de cette façon en base de données, d’où le « invité »). Une fois les données récupérées, nous créons un fichier .CSV (via un fichier externe, donc hors module Magento) accessible uniquement aux administrateurs du site.

En avant :

<?php
require_once 'app/Mage.php';
Mage::app('default');
umask(0);
Mage::getSingleton("core/session", array("name" => "adminhtml"));
if( Mage::getSingleton("admin/session")->isLoggedIn() ):
header("Content-type: application/vnd.ms-excel");
header("Content-disposition: attachment; filename=\"Export-Guests-Customers-" . date('d/m/Y') . ".csv\"");
try{
$resource = Mage::getSingleton('core/resource');
$read= $resource->getConnection('core_read');
$userTable = $resource->getTableName('contact');
$select = $read->select()
->from(array('s2' => 'sales_flat_quote_address'))
->join(array('s1' => 'sales_flat_quote'), 's1.entity_id = s2.quote_id')
->join(array('s3' => 'sales_order'), 's3.increment_id = s1.reserved_order_id')
->join(array('s4' => 'sales_order_varchar'), 's4.entity_id = s3.entity_id')
->where('s1.customer_is_guest = 1')
->where('s2.address_type = \'billing\'')
->where('s4.attribute_id = 98')
->where('s4.value = \'complete\'')
;
$rows = $select->query()->fetchAll();
print("Numéro Commande;E-mail;Prénom;Nom;Civilite\n");
foreach( $rows as $row )
{
print( $row['reserved_order_id'] . ';' . $row['email'] . ';' . $row['firstname'] . ';' . $row['lastname'] . ';' . $row['suffix']);
print( "\n" );
}
}catch (Exception $e){
die($e->getMessage());
}
exit();
else:
header('location: /no-route');
endif;
?>

Note :

L’attribut en varchar pour savoir si la commandé a été terminée « complete » est trouvée via l’identifiant de l’attribut (ici 98). Normalement, une jointure de plus aurait permis au script d’accéder à cet identifiant (via le nom de l’attribut). Cependant ce script étant spécifique au Magento en cours (1.2.*.*), il n’était pas nécessaire de pousser le vice à ce point. De plus je doute que l’identifiant de valeur de la commande soit différent suivant les versions de Magento.

Amélioration :

Ensuite il est possible d’automatiser cet export chaque semaine par exemple en lui assignant une tache CRON. Cependant il est nécessaire :

  • d’enlever la détection de session administrateur
  • donc de déplacer le fichier hors de la visibilité d’un visiteur lambda (../)
  • de modifier le chemin vers Mage.php
  • de modifier le script pour créer un fichier .CSV (fopen / fputcsv / fclose) et non d’utiliser les sorties (header), et d’envoyer l’e-mail avec le fichier en pièce jointe
<?php
require_once ‘app/Mage.php’;
Mage::app(‘zappeal’);
umask(0);
Mage::getSingleton(« core/session », array(« name » => « adminhtml »));
if( Mage::getSingleton(« admin/session »)->isLoggedIn() ):
header(« Content-type: application/vnd.ms-excel »);
header(« Content-disposition: attachment; filename=\ »Export-Guests-Customers- » . date(‘d/m/Y’) . « .csv\ »");try{
$resource = Mage::getSingleton(‘core/resource’);
$read= $resource->getConnection(‘core_read’);
$userTable = $resource->getTableName(‘contact’);

$select = $read->select()
->from(array(‘z2′ => ‘zap_sales_flat_quote_address’))
->join(array(‘z1′ => ‘zap_sales_flat_quote’), ‘z1.entity_id = z2.quote_id’)
->join(array(‘z3′ => ‘zap_sales_order’), ‘z3.increment_id = z1.reserved_order_id’)
->join(array(‘z4′ => ‘zap_sales_order_varchar’), ‘z4.entity_id = z3.entity_id’)
->where(‘z1.customer_is_guest = 1′)
->where(‘z2.address_type = \’billing\ »)
->where(‘z4.attribute_id = 98′)
->where(‘z4.value = \’complete\ »)
;

$rows = $select->query()->fetchAll();

print(« Numéro Commande;E-mail;Prénom;Nom;Civilite\n »);

foreach( $rows as $row )
{
print( $row['reserved_order_id'] . ‘;’ . $row['email'] . ‘;’ . $row['firstname'] . ‘;’ . $row['lastname'] . ‘;’ . $row['suffix']);
print( « \n » );
}

}catch (Exception $e){
die($e->getMessage());
}

exit();
else:
header(‘location: /no-route’);
endif;
?>

Formulaire pour Commenter

Si vous en avez besoin, entourez votre code :

PHP : [php]echo $variable[/php]
XML : [xml]<default></default>[/xml]

Je m'appelle Frédéric Martinez.

Je suis Freelance Magento, fondateur de l'agence web e-commerce PH2M et anciennement étudiant en Master MIAGE à Toulouse.

Ce site présente mes réalisations professionnelles, personnelles et universitaires.

Magento Certified Developer Plus

rss_32 twitter_32 Magento

  • Vincent MARMIESSE: Bonjour, Attention depuis Magento 1.9.2.0, les blocs CMS sont en cache ! Cela ne pose pas de pro [...]
  • Java2dev: Bonjour, pour l'Etape 1 a quel niveau on met les codes? dans quel folder et c'est un fichier a edit [...]
  • manuel: Bonjour Frédéric, j'aimerais savoir comment enlever l'option de ( signature obligatoire ) de mon m [...]
  • Arsene: Bonjour a tous, j'aimerais savoir comment créer un module qui propose des options d'assurance su [...]
  • Frédéric Martinez: @Thomas : Il y aura toujours de la perte sur les personnes ne retournant pas sur la page de success. [...]