Ajouter un champ supplémentaire dans la commande (attribut commande).

amahi

Expert Magento chez S3i Business
Ahmed MAHI, Développeur/ intégrateur Magento depuis 2009 ( 6 ans de bonheur avec Magento :))

Supposant qu’on aime avoir une information supplémentaire sur la commande de notre client par exemple : “Heur de livraison souhaitée”, “au nom de”, commentaire….
Cette information qui doit être bien sur affiché dans les détailles de la commande et qu’on veut envoyer aussi pas les emails…
Aujourd’hui on va crée un petit module qui gère ca.
La structure de notre petit module :
attribut commande magento
Donc la première chose à faire est de penser comment stocker cette information
dans la BD Magento :
On va utiliser un attributs :) (heur_livraison)!
Dans notre fichier mysql4-install-0.1.0.php on va ajouter :


Vous remarquez que ce n’est pas assez simple comme pour les attributs clients, pour les commandes on a obligé d’ajouter une ligne dans la table «sales_flat_order» ou utiliser addAttribute des deux class Mage_Sales_Model_Mysql4_Setup et Mage_Sales_Model_Entity_Setup.
Donc cela va crée un attribut « commande ».
Maintenant je passe à la façon d’enregistrer la valeur de cet attribut.
Puisque c’est information déponde du mode de livraison donc je vais ajouter mon champ à la fin du fichier : checkout/ shipping_method/ available.phtml

Résultat dans onepage :
attribut heure livraison commande

L’action concernée est saveShippingMethod de la class Mage_Checkout_OnepageController :
Donc on peut surcharger la méthode ce que je ne préfère pas comme je dit toujours :) ou utiliser un observer, puisque il s’agit d’une action je vais utiliser l’event controller_action_postdispatch c’est mon préféré :).
Est donc dans le fichier config.xml :

Il y’a en fait 2 observer que je vais utiliser car le premier de l’event controller_action_postdispatch c’est juste pour conservé la valeur du champ dans la session c’est le deuxième qu’on va utiliser pour l’enregistrement dans la commande
Les 2 observers sont lié au 2 méthodes de mon fichier Observer.php suivants :

Le rôle de la première méthode est d’enregistré la valeur du champ si elle existe dans la session en attendant qu’avant directement le passage de la commande « sales_order_place_before » la méthode setHeurLivraison affecte la valeur de la session vers l’attribut commande.
Et enfin pour afficher la valeur dans les détails de la commande dans le backoffice on a qu’ajouter par exemple dans :
Design/adminhtml/default/default/template/sales/order/view/tab/info.phtml (ligne 79).

Résulta :
attribut commande magento
Et pour les emails on peut utiliser dans les gabaries la variable {{var order.heur_livraison }}

Noubliez pas de vider le cache et se déconnecté puis faites votre première commande test :).

Testé sur 1.4.1.0 et 1.4.1.1
Télécharger les fichiers

12 comments

  1. J’ai essaye d’intégrer ce module a mon Back office magento mais sans succès.
    Tout d’abord j’ai du mettre la balise … dans appdesignadminhtmldefaultdefaulttemplatesalesordercreateshippingmethod car sinon je ne l’avais pas dans l’édition de facture. Même avec cette modification, la date de livraison ne se sauvegarde pas dans la base de données, du moins, il ne s’affiche pas lors du visionnage de la commande. J’ai suivi vos explications a la lettre, je ne vois pas pourquoi ca marche pas.
    Néanmoins merci pour toutes les explications de votre site.

    1. est ce que vous avez vidé le cache et se déconnecté de l’admin?si c’est le cas la date ne va pas être sauvegardé? sinon quel est votre version de Magento?

  2. Je suis en 1.4.1.1.
    Je suis arrive a faire marche le module en modifiant l’observer. Dans le setHeurLivraison, j’ai remplace le “if ($session->hasHeurLivraison())” par “if (isset($_POST[‘heur_livraison’]))”, et ca fonctionne.

  3. Bonjour
    Je voudrais savoir si je peux utiliser ce code pour ajouter un champs d’un attribut créé et renseigné dans la fiche produit pour qu’il apparaisse dans la commande puis facture?

    En fait j’ai un attribut délai de livraison (10 jours,4 semaines…) je le renseigne donc le client le voit en passant la commande mais je souhaiterais qu’il apparaisse sur les documents

    Merci

    1. Oui certainement ce code va vous aidez au moine pour la création d’attribut et l’affichage dans la commande reste a modifier l’observer pour affecté la bonne valeur de l’attribut produit a la commande et modifier les classe de l’impression des facture….

  4. Salut
    merci pour ce tuto
    j’ai mis les fichiers dans l’archive vérifier que le module est active dans l’admin , ajouter le bloc dans available juste avant le bouton validation et dans info.phtml pour l’admin , ajouter dans le template mail vider le cache déconnecter et fait deux commandes
    mais ca ne marche pas :( on vérifiant dans la base la colonne “heur_livraison” dans “mgsales_flat_order” est NULL pour les deux commandes passés malgré que j’ai belle est bien mis une heure dy type “22:20″
    j’ai aussi essayé le changement « if ($session->hasHeurLivraison()) » par « if (isset($_POST[‘heur_livraison’])) »
    mais sans succès non plu je suis sous magento 1.5.1 je pense que certains trucs pour les observer ont changé pouvez vous m’aider?
    Merci d’avance

  5. en faite pour être plus précis impossible de faire fonctionner le script en mettant le bloc de la saisie d’heure dans le fichier available.phtml le bloc s’affiche belle est bien mais quand on clique sur poursuivre rien ne se passe il n’avance plus vers l’étape suivant j’ai beau essayé de mettre le code au début ou à la fin du fichier même chose j’ai après essayé en mettant dans review.phtml la commande se termine avec succès mais la valeur n’est pas enregistré que faire? :(

  6. fausse alerte pour le dernier commentaire je suis arrivé à le faire fonctionner avec le fichier available.phtml mais le même problème est toujours la :( la valeur est NULL

  7. j’ai refait une installation vierge de mag 1.4.2 mis tout les fichiers et suivi les insctructions à la lettre et passé plusieurs commande en regarde dans la base de donnée la colonne heur_livraison est toujours NULL :( j’ai aussi reassayez l’astuce
    remplace le « if ($session->hasHeurLivraison()) » par « if (isset($_POST[‘heur_livraison’])) »
    même chose la valeur n’est toujours pas enregistré je vais devenir fou ! merci pour votre aide

  8. Bonjour, Etant novice,
    quand on parle du fichier mysql4-install-0.1.0.php
    a quel moment on execute le fichier ,
    lors d’une nouvelle installation ou il suffit tous simplement recopier le fichier a l’emplacement mentionner ci dessus.

    Bien à vous

Leave a Reply to Aexponent2 Cancel Reply

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

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">