THELIA Forum

Welcome to the THELIA support and discusssion forum

Announcement

Rejoignez la communauté sur le Discord Thelia : https://discord.gg/YgwpYEE3y3

Offline


bonjour à tous,

Je souhaite récupérer le contenu d'un champs remplis par le client afin de l'ajouter dans les caractéristiques du produit avant sa mise au panier mais je n'est aucune idée de comment faire.

Dans l'idée c'est :
- sur la fiche produit : un champs input type texte ou il peut rentrer son texte : OK il faut modifier le template
- récupérer le contenu : NOK
- stocker l'information avec le produit au moment de l'ajout au panier : surcharger les fonctions d'ajout au panier mais comment ?

J'aurais besoin d'aide pour les 2 derniers points.

Merci

Offline


Tu peux t'inspirer du module OrderComment ( https://github.com/thelia-modules/OrderComment ), qui fait un peu la même chose, mais au niveau global d'une commande.

Il faudra transposer ce principe à la form d'ajout au panier, et créer les boucles qui te permettront d'afficher l'information dans le panier (et la commande, la facture, etc.).

Si tu utilise les hooks, tu n'as pas forcément besoin de modifier le template de base.


OpenStudio Toulouse

Offline


1) Non, les plugins V1 n'ont rien à voir avec les modules V2.
2) Pas que je saches, il faudrait chercher.
3) Sans écrire un module spécifique V2, ce n'est pas possible.


OpenStudio Toulouse

Offline


Pour développer (et voir les erreurs), il te faut travailler en mode développement : http://forum.thelia.net/viewtopic.php?id=11787

Je crois qu'il y a déjà un topic où l'on parle de modifier la form d'ajout au panier, je crois. On y parle de l'extension des forms ( cf. http://doc.thelia.net/en/documentation/loop/extend.html )


OpenStudio Toulouse

Offline


Ce n'est pas si simple. Voilà comment programmer une form : http://doc.thelia.net/en/documentation/form/index.html


OpenStudio Toulouse

Offline


Je ne comprend pas. J'ai bien suivit la doc pour le créer. J'ai un builder et un getName dans ma déclaration. Donc je pense que l'erreur ne vient pas de là.

Mon fichier config.xml semble aussi bonne donc je n'est pas d'idée.

Offline


Vider les caches de dev et de prod ?


OpenStudio Toulouse

Offline


Le plus sûr est de supprimer les répertoires cache/prod et cache/dev

Fais aussi attention d'être en dev sur le front et sur le back, sinon tu peux créer des incohérences.

Vaille aussi a activer ton module avant de l'utiliser dans les templates du front.


OpenStudio Toulouse

Offline


Comment est ce que je pourrais écrire une nouvelle valuer dans une déclinaison et l'associer à un produit ?

Je m'explique : je récupère mon champs perso dans une variable grace à l'eventListener et une fonction déclenchée à l'ajout au panier. Je voudrais que cette fonction puisse aussi écrire une nouvelle variable de déclinaison et l'associe au produit en cours.
Comment dois-je procéder dans mon module ? J'ai tenter de regarder l'API mais c'est pas clair.

Offline


Il te faut utiliser une table pour associer de l'information à un produit dans le panier.


OpenStudio Toulouse

Offline


J'ai bien avancé j'ai réussi à implémenter ce que je voulais.

Il me reste un dernier point difficile.J'aimerais que dans la facture PDF générer je puisse afficher mon champs de personnalisation. Le problème est que cette valeur est lié à un item du panier et non à un produit. Or dans le code html du pdf la boucle est une boucle order_product.

Comment puis je récuperer le cartID à partir de ma commande ?

Offline


Pour faire celà, il te faut créer une table spécifique ou tu vas associer le champ de personnalisation et l'order product. Tu mettras cette table à jour au moment de la création de la commande (event TheliaEvents::ORDER_BEFORE_PAYMENT). Il restera à faire une boucle, et le tour sera joué.


OpenStudio Toulouse

Offline


merci bien je voit presque le bout du tunnel.

Dernière question (enfin j'espère) : j'ai éditer le template de la facture pour ajouter des images (logo et autres images haute reslution) mais le probleme est que la génération du pdf pour l'afficher ou le télécharger met un très long moment. Comment optimiser les performances ?

Offline


Si tu enlèves tes modifs, la génération est plus rapide ?


OpenStudio Toulouse

Offline


Oui. En fait c'est dès que je rajoute une image dans la boucle principale que cela devient lent (même si l'image est une petite icone basse def)

Last edited by timmy (15-03-2017 15:38:22)

Offline


Les images sont chargées via une requête HTTP. Peut-être que ton serveur met du temps à répondre ?


OpenStudio Toulouse

Offline


En effet c'est ma conclusion également.

Une autre question : j'essais de changer les selectbox en radio button sur ma fiche produit en gardant la mise à jour dynamique. Mais cela ne marche pas :

Voila mon code :
Fichier thelia.js (juste les functions modifiées) :

function buildProductForm() {
        var pse = null,
            combinationId = null,
            combinationValue = null,
            combinationValueId = null,
            combinations = null,
            combinationName = [],
            i;

        // initialization for the first default pse
        $pse.pseId = $pse.id.val();

        if (PSE_COUNT > 1) {
                var k=0;
                               var checked ="";
                               for (combinationValueId in PSE_COMBINATIONS_VALUE) {
                               k++;
                                   if(k>=2){
                                       checked = "checked=checked";
                                   }
                                   combinationValue = PSE_COMBINATIONS_VALUE[combinationValueId];

                                   $pse.options[combinationValue[1]]
                               .append("<input "+checked+" id='option-"+combinationValue[1]+"' name='option-"+combinationValue[1]+"'  type='radio' value='" + combinationValueId + "'>"+combinationValue[0]);

                               }

                //setPseForm();

        }
    }

function getFormSelection() {
      var selection = [],
                  combinationId;


              var var1 = $('input[name=option-1]:checked').val();
              var var2 = $('input[name=option-2]:checked').val();
              var var3 = $('input[name=option-3]:checked').val();

              selection.push(var1);
               selection.push(var2);
              selection.push(var3);

             // for (combinationId in $pse.options){

              //     selection.push($pse.options[combinationId].val());
              //}
              console.log(selection);

              return selection;
    }

Product.html :

  {* pse *}
                    {form_field field='product_sale_elements_id'}
                    <input id="pse-id" class="pse-id" type="hidden" name="{$name}" value="{$PRODUCT_SALE_ELEMENT}" {$attr} >
                    {/form_field}

                    {if $pse_count > 1}
                        {* We have more than 1 combination: custom form *}
                        <fieldset id="pse-options" class="product-options">
                            {loop name="attributes" type="attribute" product="$product_id" order="alpha"}
                            <div class="option option-option">
                                <label for="option-{$ID}" class="option-heading">{$TITLE}</label>
                                <div class="option-content">
                                    <!--<select id="option-{$ID}" name="option-{$ID}" class="form-control input-sm pse-option" data-attribute="{$ID}"></select>-->
                                    <div id="option-{$ID}" name="option-{$ID}" class="form-control pse-option" data-attribute="{$ID}"></div>
                                </div>
                            </div>
                            {/loop}

                        </fieldset>


                    {/if}

Le probleme réside dans l'affichage ou je n'est pas mes radios. Quand je regarde avec l'inspecteur j'ai bien ma div comme je veux mais mes champs sont des <option> au lieu d'input. Je ne comprend pas pourquoi ?

Offline


je pense avoir une piste : il semble que se soit thelia.min.js de assets/dist qui soit pris en compte. Je ne vois pas pourquoi mais bon. Surtout que je ne vois pas comment modifier ce fichier vu que les fonctions sont différentes.

Last edited by timmy (16-03-2017 14:36:54)

Offline

Offline


je souhaite maintenant afficher une liste de produit en fonction d'une declinaison. J'utilise çà çà comme boucle.
Sauf que je veux pouvoir spécifier l'argument attribute_availabilty dynamiquement. Comment je peux proceder sachant que ma variable est stocké en sessionStorage ?

Offline


Tu peux sans doute utiliser $smarty.session.<nom de ta variable>, reste à trouver le nom exact de la variable en session.

Sinon, tu peux écrire une simple boucle qui renvoie la valeur de la variable en session, ou un petit plugin Smarty, qui fait la même chose.


OpenStudio Toulouse

Offline


$smarty.session.<nom de ta variable> ne marche pas pour un sessionStorage en javascript si ?

Offline


C'est vrai. Si c'est en javascript, tu ne pourras pas utiliser la valeur directement dans une boucle ou quoi que soit d'autre généré sur le serveur.

Mais tu peux passer par une requête Ajax pour envoyer  l'id au serveur et fabriquer un fragment de template.


OpenStudio Toulouse

Offline


J'ai bien avancé mon module et je cherche a faire des améliorations.

J'ai un petit soucis.
Je souhaite pouvoir supprimer un item du panier dans mon controller.

J'ai récupérer l'id de l'item à supprimer mais je n'arrive pas à trouver comment supprimer l'item.

Voila le code que j'appel a l'ajout d'un item au panier (en fait je supprime un ancien item)

  $test=$this->request->get('item');
???

Quelles fonctions utilisées ? J'ai regardé findCartItem( CartEvent $event) mais sans succès. JE pense avoir trouver comment passer un élément à supprimer avec is_disabled(true) ?

Offline


Il te suffit de dispatcher un event CART_DELETEITEM, comme ici : https://github.com/thelia/thelia/blob/m … r.php#L112


OpenStudio Toulouse