THELIA Forum

Welcome to the THELIA support and discusssion forum

Announcement

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

Offline

#1 Système de ticket

(12-01-2018 15:24:52)


Bonjour à tous, je suis nouveau sur le forum, et aussi sur Thelia.
Je suis actuellement en stage, et je dois concevoir un site pour un CE. Et je dois donc modifier certaines choses pour parvenir au but final.
Par exemple, pour acheter des tickets de cinéma à pris réduits, il ne faut pas dépasser le cota de 20 par an.
J'aurais donc voulu souhaiter ajouter un champs "nbTicketAchetes" du côté du client, pour que lors d'une commande, l'on puisse vérifier si le client à déjà acheté ses 20 tickets ou non.
J'ai donc regardé la doc ainsi que mes fichiers, mais je suis totalement perdu, et je ne sais pas par où commencer, comment je peux procéder...

Si quelqu'un d'entre vous, pourrait m'aiguiller un peu, ce serait avec grand plaisir ! smile

Offline

#2 Re: Système de ticket

(12-01-2018 17:24:34)


Deux approches possibles :

1) Écrire un module, qui permet de limiter le nombre de produits achetés par client. Tu trouveras de la documentation pour développer ici : http://doc.thelia.net/. Bon, il faut se plonger dans le code, ce qui n'est pas forcément évident.

2) Utiliser un peu de code Smarty et les fameuses boucles Thelia dans ton template pour compter, pour le client connecté, le nombre de produits achetés sur la dernière année, et interdire la validation du panier ou la mise au panier s'il dépasse un certain nombre. Pour ce faire, on va utiliser une boucle "order" pour trouver les commandes passées du client, et une boucle order_product pour compter les produits, et aussi une boucle "cart" pour compter les produits déjà dans le panier.

Par exemple, dans la page product.html, pour interdire la mise au panier du produit affiché, tu peux utiliser le code suivant, qui vérifier que le nombre de produits dans le panier + le nombre de produits déjà commandés n'excède pas 20 :

{$nbProduits = 0}

{* Les produits du panier *}
{loop type="cart" name="lepanier"}
    {if $REF == {product attr='ref'}} 
        {$nbProduits = nbProduits + $QUANTITY}
    {/if}
{/loop}

{* Les produits dejà commandés dans le passé *}
{loop type="order" name="commandes" status_code="paid,processing,sent"}
    {* Déterminer si la commande a été passée dans les 365 derniers jours *}
    {if ((time() - $CREATE_DATE->getTimestamp()) / 86400) < 365}
        {loop type="order_product" name="produits-commandes" order=$ID}
            {if $REF == {product attr='ref'}} 
                {$nbProduits = nbProduits + $QUANTITY}
            {/if}
       {/loop}
    {/if}
{/loop}

{* Ne pas afficher la form d'ajout au panier (vers la ligne 175 de product.html) si le nombre de produits achetés est > 20 *}
{if $nbProduits <= 20}
    {form name="thelia.cart.add" }
       ...
    {/form}
{/if}

Autre possibilité dans la page panier: pour interdire la validation du panier si le client a déjà acheté plus de X produits, on va compter le nombre de produits déjà commandés par le client, et vérifier que le total commandé + ceux dans dans le panier n'excède pas 20, toutes références confondues :

{$nbProduits = 0}
{$listeRef = []}

{loop type="cart" name="lepanier"}
   {$listeRef[] = $REF}
{/loop}

{loop type="order" name="commandes" status_code="paid,processing,sent"}
    {* Déterminer si la commande a été passée dans les 365 derniers jours *}
    {if ((time() - $CREATE_DATE->getTimestamp()) / 86400) < 365}
        {loop type="order_product" name="produits-commandes" order=$ID}
            {if in_array($REF, $listeRef)} 
                {$nbProduits = nbProduits + $QUANTITY}
            {/if}
       {/loop}
    {/if}
{/loop}

{* Afficher le bouton de commande (vers la ligne 244 de cart.html si moins de 20 produits ont déjà été commandés *}
{if $nbProduits <= 20}
      <a href="{url path="/order/delivery"}" class="btn btn-primary pull-right"><i class="fa fa-chevron-right"></i> {intl l="Proceed checkout"}</a>
{else}
< class="pull-right">Didon ! Pas plus de 20 produits !</p>
{/if}

- Des infos sur Smarty : https://www.smarty.net/docs/en/
- $CREATE_DATE est un objet DateTime ( http://php.net/manual/fr/datetime.gettimestamp.php ), qu'on peut manipuler dans Smarty. (time() - $CREATE_DATE->getTimestamp()) / 86400) est une manière à peu près correcte pour calculer le nombre de jours entre la création d'une commande et aujourd'hui.
La doc des boucles utilisées :
- http://doc.thelia.net/en/documentation/loop/order.html
- http://doc.thelia.net/en/documentation/ … oduct.html
- http://doc.thelia.net/en/documentation/loop/cart.html
La doc des substitutions "produit" : http://doc.thelia.net/en/documentation/ … oduct.html

Attention, je n'ai pas testé ce code, il se peut que j'ai laissé (involontairement) des erreurs.


OpenStudio Toulouse

Offline

#3 Re: Système de ticket

(15-01-2018 10:31:22)


Merci beaucoup pour votre réponse très détaillée !

Cela va m'être d'une grande aide pour démarrer !

Je vous tiendrai au courant de l'avancement du projet smile