Développer avec RBS Change : Ajout de champs personnalisés compte client

  • 26734.1

    04/02/2011 10:38


    Steven Hartz
    Rang : Expert
    Bonjour,
    Je souhaite rajouter un champ personnalisé, par exemple quand un client vient du papier et possède déjà un numéro client et souhaite ouvrir un compte client sur le site. A ce moment là, qu'il puisse ajouter dans un champ son numéro client qu'il possède déjà.
    Et ce numéro que le client puisse le modifier dans sa gestion de compte client et qu'en backoffice on puisse le visualiser sur la fiche client et éventuellement aussi la modifier.

    Je suppose que c'est possible, si je pouvais avoir les différentes démarches à effectuer ce serait top ^^

    Développeur Web
    Clic et Site
    RBS CHANGE Commerce 3.5.6
  • 26734.2 en réponse à 26734.1 écrit par Steven Hartz

    10/02/2011 15:14


    Alexandre Simon
    Titre : Développeur RBS Change
    Rang : Expert
    Bonjour et pardon pour le temps passé ! Le message est un peu passé "à la trappe" ...

    Si votre champ numéro client est un entier, vous pouvez utiliser le champ existant du document modules_customer/customer "synchroId" et passer les deux prochains paragraphe ;)

    Sinon, de manière générale, pour rajouter un champ à un document existant dans RBS Change, on crée un nouveau document, étendant le document original (ici "modules_customer/customer") et le remplaçant en renseignant l'attribut "inject" à true.

    Exemple : déclaration du document modules_monmodule/customer (modules/monmodule/persistentdocument/customer.xml) :
    <?xml version="1.0" encoding="UTF-8"?>
    <document ... extend="modules_customer/customer" inject="true">
      <properties>
        <add name="numClient" type="String" />
      </properties>
    </document>
    


    Pour que le visiteur puisse ensuite renseigner le nouveau champ, vous devez agir sur le bloc existant (ici customer_BlockCreateaccountAction) et spécialiser (dossier override/) le ou les gabarits utilisés, voir le code du bloc si nécessaire.

    Dans votre cas, le gabarit utilisé est modules/customer/templates/Customer-Block-Createaccount-Input.all.all.html, dans lequel vous pouvez placer le champ pour la propriété customer.numClient (ou customer.synchroId).

    Un passage par le fichier de localisation modules/customer/locale/document/customer.xml vous permettra de renseigner le libellé du champ.

    Etape finale : pour agir sur le backoffice, il faudra spécialiser l'éditeur du document customer. Il s'agit là du fichier modules/customer/forms/editor/customer/properties.xml dans lequel il vous faudra rajouter "<field name="numClient" />" à l'endroit souhaité.
  • 26734.3 en réponse à 26734.2 écrit par Alexandre Simon

    11/02/2011 16:11


    Steven Hartz
    Rang : Expert
    Bonjour,
    J'ai trouvé les différents fichiers mentionnés, j'ai modifié en les mettant à chaque fois dans le dossier override pour ne pas modifier les originaux, mais les modifications ne semblent pas être prise en compte.

    premièrement j'ai modifié le fichier modules/customer/persistantdocument/customer.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <document xmlns="http://www.rbs.fr/schema/change-document/1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xsi:schemaLocation="http://www.rbs.fr/schema/change-document/1.0 http://www.rbschange.fr/static/schema/change-document/1.0.xsd"
    	model-version="3.0" icon="customer" publish-on-day-change="false" has-url="false" extend="modules_customer/customer" inject="true">
    	<properties>
    		<add name="user" type="modules_users/websitefrontenduser" min-occurs="1" inverse="true" />
    		<add name="tarifGroup" type="modules_customer/tarifcustomergroup" inverse="true" />
    		<add name="address" type="modules_customer/address" max-occurs="-1" inverse="true" />
    		<add name="notActivatedReason" type="Integer" />
    		<add name="usedCoupon" type="modules_customer/coupon" max-occurs="-1" />
    		<add name="canBeTrusted" type="Boolean" default-value="false" />
    		<add name="cartSerialized" type="Lob" />
    		<add name="numClient" type="String" />
    		<add name="synchroId" type="Integer" />
    		<add name="lastCartUpdate" type="DateTime" />
    		<add name="lastAbandonedOrderDate" type="DateTime" />
    		<add name="lastOrderId" type="Integer" />
    	</properties>
    	<statuses default="ACTIVE" />
    </document>
    


    Ensuite le fichier modules/customer/templates/Customer-Block-Createaccount-Input.all.all.html
    <h2 change:h="" change:translate="modules.customer.frontoffice.Create-account-title"></h2>
    
    <form change:form="beanClass customer_CustomerWrapperBean; beanName customerWrapper">
    
    	<input change:field="name beanId" hidden="true" />
    
    	<ul change:errors=""></ul>
    
    	<ol>
    
    		<li><input change:field="name customer.user.email" /></li>
    
    		<li><input change:field="name customer.user.titleid" /></li>
    
    		<li><input change:field="name customer.user.firstname" /></li>
    
    		<li><input change:field="name customer.user.lastname" /></li>
    		<li><input change:field="name customer.numClient" /></li>
    
    		<tal:block tal:condition="not: customerWrapper/getBeanId">
    
    			<li><input change:passwordinput="name password" value="" labeled="true" class="passwordinput" /></li>
    
    			<li><input change:passwordinput="name passwordconfirm" value="" labeled="true" class="passwordinput" /></li>
    
    		</tal:block>
    
    	</ol>
    
    	<p>
    
    		<input class="button" change:submit="name save" label="&modules.customer.document.customerwrapperbean.Create-account;" />
    
    	</p>
    
    </form>
    


    Ensuite la locale dans le fichier modules/customer/locale/document/customer.xml
    	<entity id="numClient">
    		<locale lang="fr">Numéro client</locale>
    	</entity>
    


    Après est-ce que j'ai oublié de vider des caches ou de compiler ?
    Parce qu'en ayant modifié c'est trois fichiers je ne vois aucune modification lorsque que je veux créer un nouveau client.

    Développeur Web
    Clic et Site
    RBS CHANGE Commerce 3.5.6
  • 26734.4 en réponse à 26734.3 écrit par Steven Hartz

    16/02/2011 22:01


    Aurélien Ferreira
    Rang : Membre
    Attention : pour ajouter une propriété à votre document 'customer' vous devez injecter cette nouvelle propriété (comme l'a précisé Alexandre dans son post) -> Cela ne se fait pas en copiant simplement le fichier customer.xml dans le répertoire "override/modules/customer/persistentdocument/...".

    Règle général pour injecter une propriété dans un document existant :

    1) Création d'un module spé
    changedev.php add-module <moduleName> <topic|folder>


    2) Création d'un nouveau document (dans le module que nous avons crée précedemment)
    changedev.php create-document <moduleName> <name>


    3) Nous allons préciser à ce document qu'il hérite du document customer en spécifiant extend="modules_customer/customer" et inject="true" pour que ce document vienne "remplacer" le document customer actuel.

    Vous n'avez plus qu'à ajouter votre champ (inutile de recopier les champs existants déjà) :
    <add name="monchampspe" type="String" min-occurs="0" />


    (voir message d'Alexandre plus haut sur la structure du fichier)

    4) Une fois notre nouveau document modifié et sauvegardé, nous l'ajoutons à notre projet:
    changedev.php add-document <moduleName> <name>



    -> Bingo !

    PS : Le champ ne se rajoute pas automatiquement dans vos formulaires backoffice, si cela est nécessaire pensez à les surcharger.

    Édité par Aurélien Ferreira 16/02/2011 22:08

  • 26734.5 en réponse à 26734.4 écrit par Aurélien Ferreira

    22/02/2011 09:15


    Steven Hartz
    Rang : Expert
    Bonjour,
    J'ai fait un mixe des deux posts du coup j'ai
    1/ fait un (mon module je l'ai appelé "numclient")
    changedev.php add-module numclient folder


    2/ créé le nouveau document
    changedev.php create-document numclient customer


    3/ ensuite dans le fichier modules/numclient/persistentdocument/customer.xml, j'ai mis
    <?xml version="1.0" encoding="UTF-8"?>
    <document xmlns="http://www.rbs.fr/schema/change-document/1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xsi:schemaLocation="http://www.rbs.fr/schema/change-document/1.0 http://www.rbschange.fr/static/schema/change-document/1.0.xsd"
    	model-version="3.0" icon="customer" publish-on-day-change="false" has-url="false" extend="modules_customer/customer" inject="true">
      <properties>
        <add name="numClient" type="String" />
      </properties>
    </document>


    4/ exécuté
    changedev.php add-document numclient customer


    5/ j'ai modifié également le fichier Customer-Block-Createaccount-input.all.all.html en ajoutant le champ
    <li><input change:field="name customer.numClient" /></li>

    Ce fichier je l'ai mi dans le dossier override/modules/customer/templates

    Est-ce que je dois compiler quelque chose après ?
    Il y a possibilité d'avoir un cas concret, il doit y avoir une autre étape que j'ai sauté.

    J'ai également un message d'erreur qui survient après le changedev.php add-document

    Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 35 bytes) in /home/<MON_SITE>/web/www/repository/framework/framework-3.0.4-59/builder/generator/PersistentModel.class.php on line 359
    


    Merci pour votre aide.

    Édité par Steven Hartz 22/02/2011 09:19


    Développeur Web
    Clic et Site
    RBS CHANGE Commerce 3.5.6
  • 26734.6 en réponse à 26734.5 écrit par Steven Hartz

    22/02/2011 14:52


    Alexandre Simon
    Titre : Développeur RBS Change
    Rang : Expert
    Bonjour,

    l'erreur sur add-document est dans votre cas fatale : il faut que vous changiez la valeur de memory_limit dans la configuration cli de votre PHP. Une valeur de 256M vous permettra de refaire "changedev.php add-document numclient customer", qui générera l'ensemble de fichiers nécessaires.

    Si vous voulez en plus faire apparaître votre champ dans le backoffice, il faudra agir sur modules/customer/forms/editor/customer/properties.xml (à copier dans override/), comme mentionné dans la première réponse.

    Cordialement,
  • 26734.7 en réponse à 26734.6 écrit par Alexandre Simon

    28/02/2011 14:25


    Steven Hartz
    Rang : Expert
    J'ai arrangé le problème de memory_limit mais je ne comprend toujours pas pourquoi je ne peux pas rajouter mon champ, ni même le synchroId qui est censé être déjà présent comme champ. J'ai mis le mode debug pour voir quel template était utilisé et il se trouve que c'est pas le bon template qu'on m'a dit de modifier, mais le template du module order/Order-Block-IdentifyStep-New.all.all.html

    Je suppose que c'est le même principe. donc j'ai modifié mon fichier xml pour l'injecter dans le module order
    <?xml version="1.0" encoding="UTF-8"?>
    <document xmlns="http://www.rbs.fr/schema/change-document/1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xsi:schemaLocation="http://www.rbs.fr/schema/change-document/1.0 http://www.rbschange.fr/static/schema/change-document/1.0.xsd"
    	model-version="3.0" icon="customer" publish-on-day-change="false" has-url="false" extend="modules_order/order" inject="true">
      <properties>
        <add name="numClient" type="String" />
      </properties>
    </document>

    Mais rien ne se produit. dans le fichier template je dois rajouter simplement
    <li><input required="true" change:field="name numClient"  size="30"/></li>

    ou
    <li><input required="true" change:field="name numclient.numClient"  size="30"/></li>


    Désolé de vous embêter avec ça mais c'est pas encore super clair, pourtant j'utilise bien la commande add-document qui ne me retourne plus d'erreur, mais pas moyen de rajouter le champ dans le formulaire.

    Développeur Web
    Clic et Site
    RBS CHANGE Commerce 3.5.6
  • 26734.8 en réponse à 26734.6 écrit par Alexandre Simon

    04/03/2011 14:39


    Steven Hartz
    Rang : Expert
    Re bonjour,
    Je fais un petit UP, je reste toujours coincé par ce champ.
    J'ai créé mon module numclient, crée ensuite un customer xml ou je lui dis d'injecter le champ.
    Je le rajoute au module customer. Mais je ne peux pas rajouter le champ.
    Au niveau du template c'était pas le bon alors je prends le bon (cité plus haut) j'essaye de rajouter le champ mais pas moyen, il faut l'appeler d'une certaine façon ? je ne connais pas la bonne syntaxe.
    Ce serait sympa d'avoir un exemple concret pour mieux comprendre la mécanique.
    Je vous remercie par avance et bon week-end.

    Développeur Web
    Clic et Site
    RBS CHANGE Commerce 3.5.6
  • 26734.9 en réponse à 26734.8 écrit par Steven Hartz

    18/03/2011 15:12


    Alexandre Simon
    Titre : Développeur RBS Change
    Rang : Expert
    Bonjour,

    Les étapes sont :
    1. Ajout du champ numClient sur le document customer/customer
    2. Prise en charge du champ numClient dans le formulaire de création
    3. Prise en charge du champ numClient lors de la sauvegarde

    1. Ajout du champ numClient sur le document customer/customer

    - On crée un module (numclient comme vous l'avez fait précédemment) : changedev.php add-document numclient folder
    - On crée un document customer dedans, qui étend et remplace l'original en ajoutant le champ "numClient" :
    changedev.php create-document numclient customer
    Edition modules/numclient/persistentdocument/customer.xml :

    <?xml version="1.0" encoding="utf-8"?>
    <document xmlns="http://www.rbs.fr/schema/change-document/1.0"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://www.rbs.fr/schema/change-document/1.0 http://www.rbschange.fr/static/schema/change-document/1.0.xsd"
            model-version="1.0" extend="modules_customer/customer" inject="true">
            <properties>
                    <add name="numClient" type="String" />
            </properties>
    </document>


    changedev.php add-document numclient customer

    2. Prise en charge du champ numClient dans le formulaire de création

    - Surcharge du gabarit Order-Block-IdentifyStep-New.all.all.html dans override/ :
    cp modules/order/templates/Order-Block-IdentifyStep-New.all.all.html override/modules/order/templates/
    - On place un champ de saisie pour numClient :
    <li><input change:textinput="name numClient" size="30" label="Numéro client" /></li>

    3. Prise en charge du champ numClient lors de la sauvegarde

    La sauvegarde des données de ce formulaire est faite dans la méthode executeCreateAccount() du bloc order_BlockIdentifyStepAction; cette méthode ne prévoit actuellement pas de point d'extension => on la redéfinit.

    - Création d'une classe contenant la nouvelle implémentation de executeCreateAccount(). On copie l'originale et on rajoute la gestion du champ numClient :

    class numclient_SaveNumClient
    {
            /**
             * @param f_mvc_Request $request
             * @param f_mvc_Response $response
             * @param order_IdentifyStepBean $identifyStep
             * @return String
             */
            public function executeCreateAccount($request, $response, order_IdentifyStepBean $identifyStep)
            {
                    $website = website_WebsiteModuleService::getInstance()->getCurrentWebsite();
                    $customer = customer_CustomerService::getInstance()->createNewCustomer($website->getId(), $identifyStep->newemail, $identifyStep->firstname, $identifyStep->lastname, $identifyStep->newpassword);
                    if ($customer !== null)
                    {
                            if ($request->hasNonEmptyParameter("numClient"))
                            {
                                    $customer->setNumClient($request->getParameter("numClient"));
                                    $customer->save();
                            }
                            $user = $customer->getUser();
                            $cartInfo = $this->getCurrentCart();
                            $cartInfo->setMergeWithUserCart(false);
                            users_UserService::getInstance()->authenticateFrontEndUser($user);
                            $cartInfo->setCustomerId($customer->getId());
                            $cartInfo->setUserId($user->getId());
                            $cartInfo->save();
                            $this->redirectToNextStep();
                    }
                    $errMsg = f_Locale::translate('&modules.order.document.identifystepbean.CreateAccount-error;');
                    $this->addError($errMsg);
                    $request->setAttribute('identifyStep', $identifyStep);
                    return $this->getCreateAccountInputViewName();
    }


    - Insertion de la nouvelle méthode sur le bloc :
    Dans config/aop.xml :

    <?xml version="1.0" encoding="UTF-8"?>
    <aop>
            <before pointcut="order_BlockIdentifyStepAction::executeCreateAccount"
                    class="numclient_SaveNumClient"  method="executeCreateAccount" />
    </aop>
    


    Suivi de : change.php compile-aop


    Vous pouvez retrouver l'ensemble des fichiers dans l'archive numclient.tgz
  • 26734.10 en réponse à 26734.9 écrit par Alexandre Simon

    22/03/2011 15:05


    Steven Hartz
    Rang : Expert
    Merci pour vos précieux conseils, tout fonctionne correctement, le champ est présent, il me le rajoute dans la bdd et avec l'un des premiers posts j'ai rajouté le champ dans le backoffice.

    C'est plus dans le détail maintenant:
    -Comment rendre le champ non-modifiable. j'ai vu en-dessous un javascript qui modifie les autres champs.
    -Faire apparaître le champ directement dans les commandes aussi, afin d'éviter de retourner sur la fiche client ?

    et pour finir mon client ne passe pas toujours sur l'interface du site et se base surtout sur les notifications par email. Est-il possible de récupérer la variable et l'envoyer par mail?

    Merci pour votre patience et réactivité ^^

    Développeur Web
    Clic et Site
    RBS CHANGE Commerce 3.5.6
  • 26734.11 en réponse à 26734.10 écrit par Steven Hartz

    22/03/2011 18:01


    Alexandre Simon
    Titre : Développeur RBS Change
    Rang : Expert
    Bonjour,

    A quel endroit faut-il que le champ numClient soit non modifiable ?
  • 26734.12 en réponse à 26734.11 écrit par Alexandre Simon

    23/03/2011 10:41


    Steven Hartz
    Rang : Expert
    Etape finale : pour agir sur le backoffice, il faudra spécialiser l'éditeur du document customer. Il s'agit là du fichier modules/customer/forms/editor/customer/properties.xml dans lequel il vous faudra rajouter "<field name="numClient" />" à l'endroit souhaité.

    A cet endroit modules/customer/forms/editor/customer/properties.xml, il apparaît en champ <input> alors qu'en haut et en bas ils apparaissent en texte.
    Bon c'est pas le plus important (c'est pour le détail), c'est surtout maintenant de pouvoir récupérer la valeur du champ et de l'envoyer avec le mail de notification d'une nouvelle commande ou en attente de paiement.

    Développeur Web
    Clic et Site
    RBS CHANGE Commerce 3.5.6
  • 26734.13 en réponse à 26734.12 écrit par Steven Hartz

    23/03/2011 16:40


    Alexandre Simon
    Titre : Développeur RBS Change
    Rang : Expert
    Pour rendre un champ non modifiable, il suffit de rajouter l'attribut disabled :

    <field name="numClient" disabled="disabled" />


    PS : en général on "préfère" mettre les informations "lecture seule" dans l'onglet synthèse du document.
  • 26734.14 en réponse à 26734.13 écrit par Alexandre Simon

    24/03/2011 11:03


    Steven Hartz
    Rang : Expert
    ok merci pour l'astuce, par contre, je voulais juste savoir encore comment on pouvait récupérer la variable pour la faire passer par email dans les notifications ? Je sais pas si vous avez vu la demande ou pas.
    Comme dit le client ne passe pas systématiquement par l'interface et regarde plutôt les mails et il voudrait du coup récupérer le numclient dans le mail.

    Développeur Web
    Clic et Site
    RBS CHANGE Commerce 3.5.6
  • 26734.15 en réponse à 26734.14 écrit par Steven Hartz

    25/03/2011 10:10


    Alexandre Simon
    Titre : Développeur RBS Change
    Rang : Expert
    Les paramètres de notification relatifs à une commande sont gérés par la méthode order_OrderService::getNotificationParameters(). Cette méthode reçoit le document commande ($order) en paramètre et renvoie les paramètres sous la forme d'un tableau associatif.

    Vous pouvez vous greffer sur cette méthode et compléter la valeur retournée :

    Dans config/aop.xml :

    <?xml version="1.0" encoding="UTF-8"?>
    <aop>
    <after-returning pointcut="order_OrderService::getNotificationParameters"
      class="numclient_CompleteOrderNotificationParameters"
      method="getNotificationParameters" />
    </aop>
    


    Avec dans modules/numclient/lib/aop/CompleteOrderNotificationParameters.php :

    <?php
    class numclient_CompleteOrderNotificationParameters
    {
            /**
             * @param order_persistentdocument_order $order
             * @return Array<String=>String>
             */
            public function getNotificationParameters($order)
            {
                    $_returnValue["numClient"] = $order->getCustomer()->getNumClient();
            }
    }
    


    Suivi de change.php update-autoload modules/numclient et change.php compile-aop

    Après ces manipulations, la variable {numClient} sera remplacées dans les notifications du module commande.

    N.B. : la variable numClient ne sera pas encore disponible dans le menu de l'éditeur WYSIWYG. Pour cela, il faudrait encore faire une autre manipulation.
 
Merci de prendre connaissance et de respecter les règles des forums.
 
1471 membres
Aucun membre connecté