Développer avec RBS Change : Extensibilité de RBS Change : structure des données

  • 44249.1

    03/10/2011 14:25


    Franck Stauffer
    Titre : Responsable produit
    Rang : Expert
    Ce sujet est dédié au guide de découverte Structures de données : modifier les produits. Vous avez des questions sur l'extensibilité (injection, extension, surcharge) ? Nous sommes là pour vous répondre !

    Édité par Jean-Michel 26/03/2012 15:47

  • 44249.2 en réponse à 44249.1 écrit par Franck Stauffer

    27/12/2011 09:49


    flyonne
    Rang : Adepte
    Bonjour,

    Développant un site pour un artisan bijoutier, votre proposition nous à séduit tout de suite et je l'ai implémenté immédiatement avec succès (elle à survécue à la mise à jour 3.5.1 vers 3.5.2).

    Ma seule frustration est de ne pas savoir comment afficher ces valeurs dans la vue détaillée en front-office ?

    Ma deuxième question est de savoir comment en back-office indexer les frais de livraisons et/ou les prix en fonction de poids ?

    développeur web Amateur et passioné, WebMestre du site http://www.opalys-fleurs.com/

  • 44249.3 en réponse à 44249.2 écrit par flyonne

    03/01/2012 11:05


    Gaël Port
    Titre : Développeur RBS Change
    Rang : Expert
    Concernant le frontoffice, ajouter une propriété à un document va générer automatiquement le ou les getters correspondants. Du coup si on reprend l'exemple du champ "weight" ajouté dans le tutoriel, vous aurez un getter getWeight sur le produit.

    Dans le template vous pouvez directement appeler ce getter sur l'instance de votre produit (dans le bloc de détail d'un produit, cette instance est disponible sous le nom "product") via la notation PHPTAL : product/getWeight.

    Référez-vous à la documentation du moteur de templates PHPTAL pour plus de détails sur les notations.



    Concernant votre second point, vous parlez bien de gérer des frais dépendant du poids total du panier, c'est bien ça ? (et pas de moteur de recherche)
  • 44249.4 en réponse à 44249.3 écrit par Gaël Port

    03/01/2012 11:50


    flyonne
    Rang : Adepte
    Bonjour et meilleurs voeux pour cette nouvelle année à l'équipe dév de RBS.

    En effet nous parlons bien de gérer des frais dépendant du poids total du panier.

    développeur web Amateur et passioné, WebMestre du site http://www.opalys-fleurs.com/

  • 44249.5 en réponse à 44249.4 écrit par flyonne

    03/01/2012 16:46


    Gaël Port
    Titre : Développeur RBS Change
    Rang : Expert
    Merci et bonne année à vous aussi.

    Pour utiliser cette nouvelle propriété dans un filtre d'application d'un frais il faudra créer un filtre. Pour cela vous pouvez utiliser la commande filter.add-filter et vous inspirer du filtre order_SommeProductAttributeFilter (dans le module order).

    Ce n'est pas très compliqué de faire un filtre mais il y a quelques choses à savoir pour bien comprendre. Je vais rédiger une page de documentation à ce sujet dans les prochains jours. Je posterai le lien ici quand ce sera fait.

    Édité par Gaël Port 03/01/2012 17:09

  • 44249.6 en réponse à 44249.5 écrit par Gaël Port

    20/03/2012 11:46


    ecoco
    Rang : Membre
    Bonjour,
    J'ai suivi tout le tutoriel cependant la sélection d'une matière fonctionne mais enregistre l'id de l'item de la liste (dans une string) au lieu de sa valeur dans ma table m_catalog_doc_product_i18n, Ainsi comment afficher la valeur de la matière en front ou plutôt enregistrer la valeur a la place de l'id lors de l’édition en BO?

    Merci

    Édité par ecoco 20/03/2012 14:35


    RBS Change Version 3.6.1 - eCommerce Core
  • 44249.7 en réponse à 44249.6 écrit par ecoco

    20/03/2012 17:23


    Jean-Michel
    Titre : Community Manager
    Rang : Expert
    Bonjour,

    Concernant votre premier problème ; sur la non prise en compte de la contrainte, je n'arrive pas à reproduire votre problème, en suivant les indications décrites dans les différentes étapes et en faisant des copier/coller des fragments de codes fournis. Avez-vous rechargé votre interface backoffice après le "compile-all" ou n'y a-t-il pas une faute de frappe dans la déclaration des contraintes?
    A noter : l'ajout de la contrainte ne va pas rendre impossible la saisie d'une valeur négative dans le champ, mais va plutôt empêcher l'enregistrement du document, comme le montrent les zones entourées en rouge dans la capture d'écran ci-jointe.

    Pour le second point, disons que ça n'a pas trop de sens de localiser la propriété "material" mais c'est l'item de la liste qui doit être localisé (le matériel utilisé ne change pas quelque soit la langue que l'on utilise).
    La question soulevée a permis de découvrir un bug sur l'absence du getter adapté (getMaterialLabelAsHtml() dans notre cas) lorsque l'on fait appel à une propriété localisée définie par une liste, ce qui adonné lieu au ticket 56046.

    Deux choix se présentent à vous
    * soit vous souhaitez conserver cette propriété comme localisée (même si ça n'a pas vraiment de sens) et vous ajoutez dans la classe finale du document (modules/project/persistentdocument/product.class.php) le code suivant :
            /**
             * @return String
             */
            public function getMaterialLabelAsHtml()
            {
                    $list = list_ListService::getInstance()->getByListId('modules_project/materiallist');
                    if ($list === null)
                    {
                            return null;
                    }
                    $listItem = $list->getItemByValue($this->getMaterial());
                    if ($listItem === null)
                    {
                            return null;
                    }
                    return f_util_HtmlUtils::textToHtml($listItem->getLabel());
            }
    

    Après avoir modifié la classe finale du document product n'oubliez pas de lancer la commande "php framework/bin/change.php compile-aop" (contenu dans compile-all) afin que ce soit bien pris en compte (exécutez la commande pour chaque modification que vous ferez dans cette classe).

    * soit vous abandonnez le côté localisé de cette propriété en supprimant du modèle l'attribut "localized" de la propriété "material" et vous exécutez la commande "php framework/bin/change.php compile-all" qui fera le nécessaire. A ce moment le getter "getMaterialLabelAsHtml()" est disponible.

    Édité par Jean-Michel 20/03/2012 17:29


    Pour une meilleure réponse, pensez à indiquer la version sur laquelle vous rencontrez des difficultés, ainsi que son type (CMS ou eCommerce core).
    Pour tout problème d'installation indiquez le nom de l'hébergeur et s'il s'agit d'un serveur mutualisé ou dédié.
  • 44249.8 en réponse à 44249.7 écrit par Jean-Michel

    20/03/2012 17:58


    ecoco
    Rang : Membre
    D'accord merci bien, le premier point était du à une erreur de ma part...

    RBS Change Version 3.6.1 - eCommerce Core
  • 44249.9 en réponse à 44249.5 écrit par Gaël Port

    30/06/2012 17:46


    flyonne
    Rang : Adepte
    Bonjour,

    Je reviens vers vous pour avoir les infos dont vous faites références dans le post ci-avant. Nous sommes à la veille de la mise en prod et ce point devient bloquant.

    Dans le même registre (concernant les poids et mode de livraison) comment intégrer dans le calcul du poids total du panier celui de l'emballage, ce dernier répondant à une règle de calcul pré-établie.

    développeur web Amateur et passioné, WebMestre du site http://www.opalys-fleurs.com/

  • 44249.10 en réponse à 44249.9 écrit par flyonne

    09/07/2012 10:33


    Jean-Michel
    Titre : Community Manager
    Rang : Expert
    Bonjour,

    La documentation sur les filtres est disponible dans la référence backoffice du wiki.

    Je suppose que la seconde partie a pour but de spécialiser le calcul des frais, dans ce cas, je vous invite à lire la documentation sur la stratégie d'application des frais disponible dans la référence système des points d'entrée

    Pour une meilleure réponse, pensez à indiquer la version sur laquelle vous rencontrez des difficultés, ainsi que son type (CMS ou eCommerce core).
    Pour tout problème d'installation indiquez le nom de l'hébergeur et s'il s'agit d'un serveur mutualisé ou dédié.
  • 44249.11 en réponse à 44249.10 écrit par Jean-Michel

    31/07/2012 12:20


    jbarnouin
    Rang : Membre
    Bonjour,

    J'aimerais savoir s'il est possible, et comment, d'injecter la classe website_MenuItemPrintFunction pour y modifier l'exécution du bouton imprimer : récupérer des informations sur la page en cours et les utiliser dans un nouveau template, au lieu de l'existant appelé par défaut par le navigateur.

    Jusque-là, je n'ai pas réussi mon injection... J'ai inséré une ligne dans le fichier aop.xml, placé mon fichier dans un dossier monmodule/lib/aop, sans effet. Cette méthode ne marche-t-elle que pour les services ?

    Par ailleurs, j'utiliserai cette nouvelle impression dans deux types de pages différents, soit deux templates... puis-je me servir de cette injection et choisir d'utiliser l'un ou l'autre template, ou serait-il plus utile de créer un nouveau lien "Impressionbis" qui aurait sa propre classe ?

    Je travaille sur la version 3.6.1 de e-commerce e-core,

    Merci d'avance,
  • 44249.12 en réponse à 44249.11 écrit par jbarnouin

    31/07/2012 17:24


    Jean-Michel
    Titre : Community Manager
    Rang : Expert
    Bonjour,

    J'aborderai ici deux manières de faire, ne sachant quel impact cela aura sur votre projet ; l'AOP et l'injection. Il faut préférer l'injection à l'AOP, et si pour des raisons historiques ou de volume d'AOP il est impossible de retirer l'AOP, alors on passera par de l'AOP de type replace.

    Cas de l'AOP
    Lorsque l'on fait de l'AOP, le fichier "aop.xml" doit être déclaré dans le dossier config du projet et être de la forme :
    <?xml version="1.0" encoding="UTF-8"?>
    <aop>
    	<replace pointcut="website_MenuItemPrintFunction" class="monmodule_MaClasseAMoua" />
    </aop>
    

    La classe PHP (située dans monmodule/lib/aop) doit ensuite être du style :
    <?php
    class monmodule_MaClasseAMoua extends website_MenuItemPrintFunction
    {
        public function methodToOverride()
        {
                   .......
        }
    }
    

    Puis on termine par un update-autoload suivi d'un compile-aop. Attention chaque modification de la classe imposera un compile-aop.


    Cas de l'injection
    IMPORTANT : L'injection n'est valable que sur les classes de type services pour le moment.
    On va déclarer l'injection dans le fichier "project.xml" comme suit :
    <?xml version="1.0" encoding="utf-8"?>
    <project>
    ...
      <config>
        <injection>
          <entry name="website_MenuItemPrintFunction">monmodule_MaClasseAMoua</entry>
        </injection>
      </config>
    


    En ce qui concerne la classe PHP, il n'y a pas de différence.


    Puis on termine par un update-autoload suivi d'un compile-aop.

    Ces quelques manipulations devraient être suffisantes pour vous permettre de faire vos modifications.

    Je ne vois pas de contre-indication pour utiliser votre injection dans les deux cas à partir du moment où l'on attend la même chose et que le code le permet, pourquoi le dupliquer? ;)

    Édité par Jean-Michel 01/08/2012 16:31


    Pour une meilleure réponse, pensez à indiquer la version sur laquelle vous rencontrez des difficultés, ainsi que son type (CMS ou eCommerce core).
    Pour tout problème d'installation indiquez le nom de l'hébergeur et s'il s'agit d'un serveur mutualisé ou dédié.
  • 44249.13 en réponse à 44249.12 écrit par Jean-Michel

    01/08/2012 10:31


    jbarnouin
    Rang : Membre
    J'ai besoin de l'AOP, qui me permet de changer le code de ma classe MenuItemPrintFunction en appelant un nouveau template.
    Or mon AOP ne fonctionne pas...

    J'ai remplacé dans la ligne que j'avais insérée dans le fichier aop.xml le nom du fichier par celui de la classe, ce que je trouve logique. Ma classe se trouve toujours dans mon module med, dans lib/aop. Ma classe n'est pas appelée.

    Voici le rendu dans aop.xml :
    <aop>
       <replace pointcut="website_MenuItemPrintFunction" class="med_MenuItemPrintFunction"/>
    </aop>

    Par ailleurs, j'ai réalisé que dans mes scripts d'import, une erreur se déclenche dans le cas de blocs injectés (déclarés injectés dans blocks.xml) dans mon module med et appelés dans mon script dans une balise changeblock.
    L'erreur est : "Class Block[nom du block]Info does not exist".
    Y a-t-il un fichier ou paramètre que j'ai oublié de créer au moment de l'injection de ces blocs ?

    Édité par jbarnouin 01/08/2012 10:44

  • 44249.14 en réponse à 44249.13 écrit par jbarnouin

    03/08/2012 17:08


    Jean-Michel
    Titre : Community Manager
    Rang : Expert
    Il semblerait que votre projet ai pris un coup... :(

    De mon côté j'ai fait les manip suivantes dans un projet vide :
    - création d'un module "project" :
    php framework/bin/change.php add-module project

    - création du dossier "modules/project/lib/aop"
    - création de la classe "project_MenuItemPrintFunction" dans le dossier créé précédemment et telle que :
    <?php
    class project_MenuItemPrintFunction extends website_MenuItemPrintFunction
    {
    	/**
    	 * @param website_MenuEntry $entry
    	 */
    	static function execute($entry)
    	{
    		Framework::fatal("####### AOP project_MenuItemPrintFunction #########");
    	}
    }
    

    - création d'un fichier config/aop.xml tel que :
    <?xml version="1.0" encoding="UTF-8"?>
    <aop>
    	<replace pointcut="website_MenuItemPrintFunction" class="project_MenuItemPrintFunction" />
    </aop>
    

    - compilation de la configuration :
    php framework/bin/change.php compile-config

    - mise à jour de l'autoload :
    php framework/bin/change.php update-autoload

    - tail des fichiers de log :
    tail -f log/default/*.log

    - chargement de la page d'accueil où se trouve le lien imprimer et observation de l'apparition dans les logs de :
    [FATAL]	####### AOP project_MenuItemPrintFunction #########
    

    Ce qui montre bien qu'il est possible de surcharger cette classe.

    Par contre pour le problème sur l'import, il est impossible de dire comme ça si le problème est un effet de bord d'un autoload qui aurait un problème, si c'est une évolution des modèles et que les scripts XML n'ont pas suivi ou encore s'il s'agit d'encore autre chose... :(

    Édité par Jean-Michel 03/08/2012 17:09


    Pour une meilleure réponse, pensez à indiquer la version sur laquelle vous rencontrez des difficultés, ainsi que son type (CMS ou eCommerce core).
    Pour tout problème d'installation indiquez le nom de l'hébergeur et s'il s'agit d'un serveur mutualisé ou dédié.
  • 44249.15 en réponse à 44249.13 écrit par jbarnouin

    06/08/2012 09:51


    Jean-Michel
    Titre : Community Manager
    Rang : Expert
    D'autres considérations qui pourraient être utiles en ce lundi matin, par rapport à l'erreur "Class Block[nom du block]Info does not exist".

    Avez-vous exécuté la commande suivante?
    php framework/bin/change.php compile-blocks



    Par ailleurs, le code que vous avez écrit fait-il bien appel au bloc d'origine? Pour rappel, l'injection de bloc à pour but d'être transparente, ce qui implique que l'on invoque toujours le bloc d'origine, que ce soit dans le code ou dans les imports XML.

    Pour une meilleure réponse, pensez à indiquer la version sur laquelle vous rencontrez des difficultés, ainsi que son type (CMS ou eCommerce core).
    Pour tout problème d'installation indiquez le nom de l'hébergeur et s'il s'agit d'un serveur mutualisé ou dédié.
  • 44249.16

    27/02/2013 09:15


    hioli01
    Rang : Adepte
    Bonjour,

    je me demandes s'il y a un moyen de créer un nouveau document 'YDocument' sous un module 'Y' qui extend d'un document 'XDocument' d'un module X par commande change.

    Merci d'avance.

    Version RBSChange 3.5.2

    Développeur et intégrateur web
    RBSChange V 3.5.2 e-commerce
  • 44249.17 en réponse à 44249.16 écrit par hioli01

    27/02/2013 18:00


    Jean-Michel
    Titre : Community Manager
    Rang : Expert
    Bonjour,

    Oui ceci est possible et ne pose pas de problème. C'est même le comportement par défaut si vous faites une extension de document.

    On peut même faire en sorte de pouvoir éditer le document YDocument dans le backoffice du module X si on le souhaite. Ceci se fait en déclarant les formulaires d'edition et en modifiant la perspective du module X dans l'override du module X.

    Pour une meilleure réponse, pensez à indiquer la version sur laquelle vous rencontrez des difficultés, ainsi que son type (CMS ou eCommerce core).
    Pour tout problème d'installation indiquez le nom de l'hébergeur et s'il s'agit d'un serveur mutualisé ou dédié.
  • 44249.18 en réponse à 44249.17 écrit par Jean-Michel

    28/02/2013 17:33


    hioli01
    Rang : Adepte
    Bonjour,

    Merci pour votre réponse, en fait j'arrive très bien à faire ce que je souhaite faire on faisont les instructions nécessaires à la main, mais ce que je demandais s'il y a des commandes changes qui sont faites pour ce besoin.


    Cordialement.

    Développeur et intégrateur web
    RBSChange V 3.5.2 e-commerce
  • 44249.19 en réponse à 44249.18 écrit par hioli01

    01/03/2013 11:37


    Jean-Michel
    Titre : Community Manager
    Rang : Expert
    Bonjour,

    Hormis les commandes classiques rien n'est fait pour le cas spécifique des surcharges, extensions et injections. Cela dit le travail qu'il reste à faire après avoir utilisé les commandes de base n'est pas si énorme que ca ; modification de la perspective, déplacement des éditeurs dans override et placer extend et/ou inject dans le modèle de document.

    Pour une meilleure réponse, pensez à indiquer la version sur laquelle vous rencontrez des difficultés, ainsi que son type (CMS ou eCommerce core).
    Pour tout problème d'installation indiquez le nom de l'hébergeur et s'il s'agit d'un serveur mutualisé ou dédié.
  • 44249.20

    05/01/2014 00:27


    EITC
    Rang : Membre
    Bonjour,

    Suite à l'aide apportée sur ce sujet (http://www.rbschange.fr/forums/Installation-RBS-Change/Boutique-creee-mais-non-fonctionnelle-82305.html) j'ai tenté d'ajouter une propriétés grâce au tuto...

    Malheureusement après les deux "compile-locales" et "compile-documents", je n'ai plus l'onglet "Propriétés" qui s'affiche dans mes produits.

    Toutes mes compils se sont déroulées correctement, je n'ai pas non plus de nouvelles erreurs dans les logs... Je ne comprends pas.

    Les seules erreurs persitantes sont :
    - Unknown document model task_persistentdocument_plannedtaskmodel. in file (/homez.800/onlineca/www/repository/framework/framework-3.6.8/persistentdocument/PersistentDocumentModel.class.php) line 169
    - Unknown document model users_persistentdocument_usermodel.
    - ListNotFoundException: modules_catalog/orderprocess
    - ListNotFoundException: modules_catalog/axesinlist
    - ListNotFoundException: modules_catalog/axes
    - ListNotFoundException: modules_catalog/billingareabyshop

    Merci d'avance

    PS : Je suis sur RBS Change 3.6.8

    Édité par EITC 05/01/2014 00:28

 
Merci de prendre connaissance et de respecter les règles des forums.
 
1415 membres
Aucun membre connecté