Proposer un devis en ligne

Le but ici est de mettre en place une gestion de caddie, ce qui permet à l’internaute de réaliser un devis en ligne, tout ça grâce à des boucles Spip et un poil de PHP. J’ai utilisé une certaine façon de faire, qui n’est surement pas la meilleure, mais que vous pourrez aisément adapter pour votre usage.

Avant de mettre les mains dans le cambouis voyons un peu la théorie :

La théorie

Sur votre site, vous présentez vos produits (qui sont en fait des « articles » au sens de Spip). Chacun des produits a un lien qui permet de l’amener à une page « Ajouter au bon de commande », où on lui réaffiche le produit, son image, son prix, etc, et là l’utilisateur peut entrer la quantité du produit qu’il souhaite... Si il souhaite l’ajouter, il valide et le produit est ajouté parmi les autres déjà sélectionnés dans son bon de commande. On lui affiche donc son bon de commande avec tous les produits, les quantités, leur prix, les totaux, et le total des Totaux.

Ma façon de faire

Le but du jeu est de sauvegarder dans une variable de session php un tableau à 2 colonnes, la premiere étant pour les id des articles, la seconde pour la quantité de chacun des articles.

J’ai fait le choix de stocker le prix de chaque produit dans le chapeau de l’article qui lui correspond. Cela reste un choix, vous pourriez créer un champ extra rien que pour ça, il faudra changer quelques éléments, mais la façon de faire reste la même.

Grâce à cette variable de session et aux chapeaux, on peu donc calculer pour chaque article le cout total (quantité * prix) puis le total de la commande , qui est en fait la somme des couts totaux...

Mise en pratique

On va y aller pages par pages :

- page(s) « Produit » :
Vous créer les pages que vous voulez comme vous voulez, l’important étant de faire en sorte de pouvoir envoyer l’Id de l’article à la page « Ajouter au bon de commande ». Dans mon cas, j’ai choisi un formulaire, donc je POSTE ma variable et je la récupère en $_POST.

-  page « Ajouter au Bon de Commande » :
Cette page récupère l’Id posté précédemment, et réaffiche les éléments concernant le produit ayant l’Id posté. On utlise pour cela une boucle ARTICLES :

<BOUCLE_bouteille_a_ajouter(ARTICLES){id_article=[(#ENV{id_dernier,.})]}>
</BOUCLE_bouteille_a_ajouter>

Le #ENV permet d’utiliser la variable postée comme argument pour la boucle. Dans mon cas j’ai nommé la variable postée id_dernier, donc je l’appelle ici par le nom que je lui ai donné.

Lorsque je réaffiche les infos du produit, j’inclus un formulaire où la personne peut choisir la quantité qu’il désire pour le produit en question.

Quand le client a tout régler, il clique sur valider pour ajouter effectivement ce produit et cette quantité à son bon de commande. Pour ce faire je poste l’Id du produit et sa quantité vers la page « Bon de Commande ».

-  page « Bon de Commande » :
Le squelette de cette page permet d’afficher le bon de commande, qui est un récapitulatif des différents produits et de leur quantités associées, leurs prix et par la suite tout calculer.

Le traitement des infos se fait quand à lui dans le fichier php lui même. Pourquoi donc ? J’y viens...
Le but est de se servir des boucles de spip pour afficher le bon de commande. Pour ce faire, une boucle du type ferait l’affaire :
<BOUCLE_(ARTICLES){id_article == ^(12|25|45|3}>
(Cette boucle affiche les éléments des articles 12, 25,45 et 3.

Or, nous stockons les Id dans une variable de session de php.
Mais, ô désespoir, Spip interprète d’abord les boucles et ensuite le php est interprété sur le serveur...
Heureusement il y a une contrib expliquant comment utiliser des variables php dans des boucles et c’est son principe que j’applique ici. (En résumé, la variable que vous voulez utiliser dans votre boucle doit être présente dans le tableau $_GET et être appelée par

#ENV{le nom de la variable}

Donc le fichier php Bon de Commande (bdc.php) gère l’ajout du dernier produit, la suppresion d’un produit, la mise à jour d’une quantité. Tout est très bien commenté dedans.

Le fichier squelette quand à lui gère l’affichage et le calculs des différents totaux.

On aurait pu s’arrêter là, mais dans mon cas j’ai rajouté un bouton permettant de vider le bon de commande (toute la session en fait).
J’ai rajouté aussi un bouton qui conduit vers une ultime page qui réaffiche le bon de commande en version imprimable puis lance un javascript pour imprimer.

Je l’utilise sur ce site

Discussion

11 discussions

  • Pour ceux qui veulent adapter ce script à SPIP 1.9.2d, mettez le code php de la page bon-de-commande.php dans le fichier mes_options.php (à créer si vous n’en avez pas) dans le dossier squelettes. Pour moi, ça a été tout bon, j’arrive à récupérer les variables... Ca doit marcher pour toutes les version 1.9.x de SPIP, je suppose...

    Répondre à ce message

  • 1

    J’ai fait le choix de stocker le prix de chaque produit dans le chapeau de l’article qui lui correspond. Cela reste un choix, vous pourriez créer un champ extra rien que pour ça, il faudra changer quelques éléments, mais la façon de faire reste la même.

    Ah ouais on peut ?!
    J’envisage de plancher sur ces script (... quand j’aurais un peu mieux intégré SPIP. J’ai mis le nez dedans la semaine dernière ;-) pour un catalogue de T-shirts.
    C’est imaginable de permettre de choisir, sa couleur, sa taille , etc via des elements de formulaires (listbox, boutons radio) ?
    Et dans ce cas comment on integre leurs “choix possibles” aux informations concenant l’article ?

    Pour se faire un idée : un vague brouillon laissé en plan en juillet dont j’ai rebossé que le css.

    • Pardon, je voulais dire, pour 1 visuel=1 article naturellement.

      Avec la contrainte que les couleurs proposées sont pas les mêmes à chaque fois

      La page T-shirts c’est mieux pour se faire une idée.

      Tout aiguillage est le bienvenu, je travaille à ce que les petits drapeaux au coin de la page soient vraiment clicalbles

    Répondre à ce message

  • Aurélien

    toujours rien ?

    Répondre à ce message

  • Aurélien

    Bonjour,

    Existe t’il une version 1.9.2 ?

    J’essaye de bosser sur les fichiers actuels mais je n’y arrive pas :(

    Répondre à ce message

  • Je prends des nouvelles du travail fait par yvon.
    Peut on trouver les sources quelques part pour que nous puissions tous en profiter.

    mail : olivier.humbert[at]gmail.com

    Merci d’avance.

    Répondre à ce message

  • 5

    D’abord merci pour cette contrib qui correspondait à un réel besoin, en particulier l’idée d’utiliser les sessions php pour fair un « panier anonyme » court-circuitant la base de donnée.

    Ayant voulu adapter ton travail sur spip 1.9.1, je me suis moi aussi heurté au problème de #ENV qui ne prend pas en compte les paramètres de post modifiés dans la même page.

    Finalement j’ai décidé de tout faire en php (les 2 pages « bdc » et « devis-print ») ; c’est d’ailleurs plus simple et ça marche très bien.

    On peut d’ailleurs se poser plus généralement la question : quand quelques lignes de php permettent de résoudre son problème, est-ce bien nécessaire de chercher des grandes contorsions pour essayer de faire la même chose en « tout SPIP » ?

    En tout cas merci encore de nous avoir fait profiter de ton travail.

    • Hello ^^ !
      Avant toute chose je voudrais te féliciter d’avoir réussi !
      C’est déjà un premier pas de franchi !
      Maintenant faudra qu’on voit si on peut en faire un plugin par la suite !(mais est ce que ça vaut vraiment le coup d’en faireun plug in ?)
      En attendant, il faudrait pouvoir partager tes sources au plus grand nombre,
      peux tu mettre en ligne quelque part tes fichiers qui fonctionnent ? Ou sinon si tu le souhaite j’ai mon site perso sur lequel on pourrait héberger les fichiers, tiens moi au courant ^^ !
      Encore merci de tes efforts !

    • Puisque ta boucle :

      <BOUCLE_bouteilles_validees(ARTICLES){id_article == #ENV{mes_ids}}> 

      ne fonctionne pas, j’ai construit ce tableau de commande en php à partir de la variable
      $_SESSION.

      Tu peux voir le résultat sur cette page (il s’agit d’un site expérimental non diffusé) :

      http://www.apmep.levillage.org/spip/spip.php?rubrique26

      en cliquant sur le lien « nouvelles brochures », puis sur « voir la fiche » afin d’accéder à l’article ; le formulaire de commande est en bas de la page.
      Les prix sont entrés dans le champ chapeau de l’article mais je ne les ai pas tous entrés ; s’ils n’y sont pas, il y a écrit « brochure non disponible » dans le bon de commande.

      Je peux bien sûr te passer mes sources, mais elles sont adaptées à ma situation bien sûr, et il faudrait faire un « nettoyage » ; si tu veux le faire... (moi en ce moment je n’ai pas le temps).
      A ce moment là tu me passe une adresse mail et je te les envoie.

    • bien sur ! envoie à flashmaster [at] andurance [point] net.
      Merci d’avance.
      J’ai essayé de faire tourner sur ton site et ça a l’air de tourner impec !

    • OK, je t’envoie ça tout de suite.

      Je ne pense pas qu’on puisse aller beaucoup plus loin avec ce genre de programme ; une contribution ne serait pas acceptée (trop de php).

      Peut-être qu’avec la version 192 et les balises de tableau on peut faire quelque chose. A voir.

      Ce qui est bien avec SPIP c’est qu’il y a toujours matière à bien s’occuper !

    • ohumbert

      Je suis interressé aussi...
      Merci de nous tenir au courant.

      Mes competences en programmation sont limités mais si on peut aider en faisant des tests...

    Répondre à ce message

  • 8

    Bonjour
    Tout d’abord merci pour cette contrib ;-)
    J’essaye de l’adapter à Spip 1.9.1
    Dans la page bdc (1) je me heurte à cet injure du compilo

    (articles)
    Erreur MySQL
    articles.id_article, articles.titre, articles.surtitre, articles.descriptif, articles.soustitre, articles.chapo, articles.lang FROM spip_articles AS articles WHERE (articles.id_article REGEXP ’’) AND (articles.statut = « publie »)
    Got error ’empty (sub)expression’ from regexp

    J’ai l’intuition que ça viens de la ligne suivante
    <!-- #ENV{mes_ids,' '})$}> -->
    Qu’en pensez-vous ?

    (1) j’ai regroupé les pages de spip 1.8 « bdc.html »+« bon-de-commande.php » dans une seule page appelée par « spip.php ?page=bdc »

    • Bonjour ! ^^
      Cette contrib a été réalisée à la base sur une 1.8.2.g, je ne l’ai pas testé « telle quelle » sur une 1.9. Effectivement, vu le message d’erreur il semblerait que le

    • Rebonjour et merci pour ta réponse
      J’ai bien mis tout le PHP de « bon-de-commande.php » dans la page « bdc.html » de spip 1.9 (hélas, c’eut été une piste...). Et effectivement #ENV{mes_ids]} n’est pas prise en compte

      Si j’affiche #ENV dans le squellette :
      -  avec Spip 1.8 j’ai bien a:6:{s:7:"mes_ids";s:11:"^(6|5|636)$";.... dans la page squelette « bdc.html »
      -  mais rien d’équivalent dans Spip 1.9 alors que les autres variables (qte_dernier, id_dernier, ...) passent bien dans #ENV

      Pour commencer à éliminer des pistes : je ne suis pas certaine de bien comprendre la syntaxe de <!-- #ENV{mes_ids,' '})$}> --> et ce que c’est sensé faire. Peut-tu me l’expliquer ?

      Merci

      Françoise

    • le code php de bon-de-commande.php serait plus à mettre dans spip.php que dans le html. As tu essayé cette piste ?

      Concernant la syntaxe bizarre, ce qui c’est passé c’est que j’ai écrit du code et des boucles, qui utilise donc des accolades, qui elles sont prises en tant que raccourci typographique spip... L’idéal serait qu’un admin puisse corriger mon message , mais je sais que c’est lourd et qu’ils ont déjà beaucoup de choses à gérer...

      En résumé j’ai écrit certaines choses qui ne s’affichent pas comme elles devraient être.

    • le code php de bon-de-commande.php serait plus à mettre dans spip.php que dans le html. As tu essayé cette piste ?

      Je viens d’essayer : toujours le même message d’erreur que ci-dessus sur la boucle bouteilles_validees.

      Je me demande si la contrib expliquant comment utiliser des variables php dans des boucles que tu as utilisée est compatible avec spip 1.9
      De quelle contrib s’agit-il ? Je n’ai pas su la retrouver sur spip-contrib.

      En ce qui concerne le code de ton précédent message, si ça donne un éclairage sur <!-- #ENV{mes_ids,' '})$}> --> dont je ne comprend pas comment ça marche j’aimerais bien le lire ;-) Pour qu’il ne soit pas bouffé par Spip il suffit de le mettre dans les balises <code>...</code>

      Et merci pour tes réponses

      Françoise

    • Pour la contrib pour utiliser les variables dans du php, je ne l’ai pas retrouvée non plus...

      Sinon pour cette fameuse variable qui pose pbm, je vais essayer de reformuler, parce que c’est vrai que moi meme jai eu du mal au début :

      Le but en fait c’est de faire faire comprendre à spip une boucle du genre
      BOUCLE_(ARTICLES){id_article == ^(12|25|45|3)$}
      donc moi je me suis bon, ya qu’à faire en sorte de créer une variable mes_ids contenant
      12|25|45|3 et ensuite de faire :
      BOUCLE_(ARTICLES){id_article == ^(#ENV{mes_id})$}

      Le pbm c’est que cette solution ne fonctionnait pas, donc en cherchant d’autres solutions, j’ai trouvé que ca marchait si je faisait en sorte que la variable mes id ne contienne plus : 12|25|45|3 mais directement ^12|25|45|3$...

      C’est ce que fait mon traitement php...

      Sinon, là en relisant un ptit peu des trucs sur spip.net, je me suis souvenu des balises #EVAL et #SET et #GET...
      Donc ce qu’il faudrait essayer, c’est mettre le php dans le squelette html ,et essayer dutiliser les eval set et get ) bon escient...

      En relisant ce que j’ai fait, je ne me souviens plus pourquoi javais fait par des expresions régulières càd :

      BOUCLE_(ARTICLES){id_article == ^(12|25|45|3)$}

      plutot que de faire :

      BOUCLE_(ARTICLES){id_article IN 12,25,45,3}

      qui me parait plus logique ...

      Je suis désolé de ne pouvoir revenir dessus ce sjours ci parce que je suis overbooké par rapport à mon boulot... Peut etre en fin de semaine prochaine je pourrais revenir dessus...
      Merci de tous les tests que tu as déjà réalisés. Ca permet def aire avancer le schmilblick ^^

    • J’espère que tu es sur la bonne voie ;-)

      Mais je crois que j’ai trouvé un moyen plus simple de contourner le pb :

      -  Récupérer dans la boucle « articles » de la première étape de la commande les variables nécessaires à la construction des formulaires « ajouter au devis (ou au panier) » c’est à dire le prix et le nom du produit.

      Ça, ça ne pose aucun problème à Spip contrairement à l’exécution du PHP dans la boucle ;-)
      -  Traiter la suite en PHP pur, donc éliminer toute boucle pour l’affichage des commandes cumulées (d’autant qu’à la réflexion ça n’est pas trop utile une boucle Spip à cette étape, vu qu’il n’y a pas d’intérêt de mettre en cache le résultat d’une session).

      Je n’ai pas encore eu l’occasion de finaliser le script mais AMHA ça devrait rouler sans pb., même si c’est frustrant de ne pas réussir à comprendre où se cache l’os dans le potage de la
      1.9 (j’ai l’intuition que c’est une question de syntaxe des regexp...)

      Cordialement

      Françoise

    • Apparemment tu es proche de la solution ! Je te remercie de tous tes efforts, qui serviront à tous. Encore dernièrement qqu’un demandait sur la liste une façon de proposer un devis par spip. Grâce à ton apport, tu améliores cette contrib et je t’en remercie.

      La prochaine étape serait d’en faire un plugin, mais on verra ça en temps utile.

      Si tu arrives à faire fonctionner comme tu le souhaite, n’hésite pas à faire un autre article sur spip contrib pour exposer ta façon de faire. N’hésite pas à mettre tes fichiers aussi pour que j’y jettes un oeil.

      Peut etre que ça donnera envie à qqu’un d’autre d’en faire un plugin.

    • Bonjour,
      merci beaucoup pour cette contrib qui remplit un gros besoin.... Mais j’en ai bien sur besoin en 192, et je serais très content d’aider à faire un plugin (ou tout simplement un « modèle ») avec.

      Je trouve ca dans la doc de spip

      Avec SPIP 1.9, les balises sont admises dans les arguments de IN, et notamment la balise ENV, à laquelle sont appliqués les filtres d’analyse pour assurer que la requête SQL sera bien écrite. De manière dérogatoire, SPIP testera si l’argument de ENV désigne un tableau (venant par exemple de saisies de formulaire dont l’attribut name se termine par []). Si c’est le cas, et si les filtres d’analyse ont été désactivés en suffixant cette balise par une double étoile, alors chaque élément du tableau sera considéré comme argument de IN, SPIP appliquant les filtres de sécurité sur chacun d’eux.

      et je trouve ca dans le code de spip (criteres.php)

      // Si on a une liste de valeurs dans #ENV{x}, utiliser la double etoile
      // pour faire par exemple {id_article IN #ENV**{liste_articles}}
      // http://doc.spip.org/@critere_IN_dist

      es-ce que ca ne voudrait pas dire que l’on ne pourrait pas
      -  supprimer le $str = implode(’|’, $array_articles) ;
      et faire $_GET[’mes_ids’]=array_keys($_SESSION[’bon-de-commande’]) ;

      -  et transformer

                <BOUCLE_bouteilles_validees(ARTICLES){id_article == #ENV{mes_ids}}>

      en

                <BOUCLE_bouteilles_validees(ARTICLES){id_article IN #ENV**{mes_ids}}>

      je serais très heureux d’essayer en repartant des fichiers de Françoise.... car j’ai besoin de ce type de contrib sans trop tarder.
      Merci et en espérant servir à quelque chose

      Michel

    Répondre à ce message

  • 1

    Un autre site où cette contrib a été mise en place :

    http://www.marche-francais.de/

    • Moi cette contrib me plais bien !!

      Mais j’ai des soucis de mise en oeuvre :

      Warning : session_start() [function.session-start] : open(/mnt/105/sdc/0/a/laurent.rieffel/sessions/sess_1db2719923002892120f0d1ab6f230c0, O_RDWR) failed : No such file or directory (2) in /mnt/105/sdc/0/a/laurent.rieffel/bon-de-commande.php on line 3

      Warning : session_start() [function.session-start] : Cannot send session cookie - headers already sent by (output started at /mnt/105/sdc/0/a/laurent.rieffel/bon-de-commande.php:3) in /mnt/105/sdc/0/a/laurent.rieffel/bon-de-commande.php on line 3

      Warning : session_start() [function.session-start] : Cannot send session cache limiter - headers already sent (output started at /mnt/105/sdc/0/a/laurent.rieffel/bon-de-commande.php:3) in /mnt/105/sdc/0/a/laurent.rieffel/bon-de-commande.php on line 3

    Répondre à ce message

  • Pour pouvoir tester cette contrib, je vous conseille de créer une rubrique bidon, dans laquelle vous mettez 1 ou 2 articles,ces articles ayant un prix dans leurs CHAPO (uniquement un nombre, un entier ou un nombre à virgule, les nombres à virgules s’écrivant 12.3 et non 12,3, càd le séparateur est le point et non la virgule !)

    Ceci fait dans le squelette vin-alsace-blanc, remplacer id_rubrique= 19 par id_rubrique= id_de_votre_rubrique_bidon, id_de_votre_rubrique_bidon étant l’identifiant de la rubrique que vous avez créé pour tester.

    Après avoir fait tourner un peu cette contrib, il apparait qu’elle aurait besoin d’un petit serrage de vis niveau PHP sur deux petites choses dans bon de commande.php, toute aide serait la bienvenue :

    -  Eviter les alerte « Notice » pour les variables
    -  Mettre en place une condition supplémentaire qui éviterait que array_keys et le implode plus loin foire quan le tableau est vide. Cette condition serait par exemple un
    if (count($_SESSION['bon-de-commande']) > 0)
    qui vérifie donc si le tableau est vide ou pas, ensachant que les traitements faisant intervenir array_keys ne doivent être fait que si le tableau a au moins un élément...

    Qq’un a eu un souci avec les variables de session mais je ne sais pas si ça venait du code...

    Répondre à ce message

  • Bonjour SOON7,
    moi aussi je suis tres interessee par votre contrib.mais je bloque ...
    pourriez vous detailler un peu plus votre demarche ?

    Merci d’ avance

    Répondre à ce message

Ajouter un commentaire

Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparaît.

Merci d’avance pour les personnes qui vous aideront !

Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.

Qui êtes-vous ?
[Se connecter]

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom