Tutoriel d'intégration de formulaires avec l'API sur son site Kiubi
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
docs
theme/fr
AUTHORS
LICENSE.md
README.md

README.md

Créer un formulaire de demande de devis avec l'API de son site Kiubi

Introduction

Ce dépôt est un tutoriel qui explique comment utiliser l'API de son site Kiubi pour créer un formulaire de demande de devis.

L'objectif étant d'intégrer de façon automatique le contenu du panier de l'internaute dans une réponse à un formulaire dismoi?. Ce formulaire pourra ainsi être utilisé comme un formulaire de demande de devis.

image

Prérequis

Ce tutoriel suppose que vous avez un site Kiubi et qu'il est bien configuré :

  • l'API est activée
  • le catalogue est activé
  • le site est en thème personnalisé, basé sur Shiroi

Il est préférable d'être à l'aise avec la manipulation des thèmes personnalisés. En cas de besoin, le guide du designer est là.

Ce tutoriel est applicable à tout thème graphique mais les exemples de codes donnés sont optimisés pour un rendu basé sur le thème Shiroi.

Ajout d'un formulaire dismoi? dans la page de détail panier.

L'objectif est d'intégrer à la page de détail panier un formulaire dismoi?. Ce formulaire intégrera, dans un champ prévu à cet effet, un descriptif textuel du panier de l'utilisateur.

Pour y arriver, on utilise ici plusieurs composants :

  • le framework jQuery pour les manipulations javascript de base
  • le client Javascript API Front-office de Kiubi (qui est un plugin jQuery) pour récupérer les produits

Nous allons créer un fragment de template spécifique pour faciliter sa mise en place.

Mise en place

Créer un formulaire dismoi?. Ajouter un champ texte multi-lignes. Dans le champ Aide à la saisie, renseigner la valeur %cart%. Cette valeur permettra de retrouver le champ associé au contenu du panier et de pré-remplir sa valeur.

image

Ajouter d'autres champs si souhaité (civilité, coordonnées, message libre, ...) puis enregistrer le formulaire.

Dans l'onglet "Paramètres", repérer l'identifiant API du formulaire.

image

Copier les fichiers theme/fr/templates/devis.css et theme/fr/templates/forms.js de ce dépôt dans le dossier fr/templates/ du thème personnalisé. Copier le fichier theme/fr/includes/devis.html de ce dépôt dans le dossier fr/includes/ du thème personnalisé. Ouvrir ce même fichier et renseigner la variable form_id avec l'identifiant API du formulaire.

<script type="text/javascript">
	var form_id = 'X-XXXXXXXXXXXXXXX'; // identifiant API

Dans le Back-office du site, éditer une mise en page de type "détail panier".

Placer le widget "Fragment de template" dans la page. Editer la configuration du widget et choisir le template "devis".

La page de détail d'un produit affiche désormais un bouton "demande de devis". Un clic sur ce bouton, affiche un formulaire de demande de devis. A la soumission du formulaire, un réponse au formulaire dismoi sera créé et apparaitra dans le Back-office du site. Elle contiendra le contenu du panier de l'internaute. Un confirmation par e-mail sera également envoyée à l'internaute et au propriétaire du site.

Explications

Examinons en détail le code HTML du fragment de template devis.html :

<link rel="stylesheet" href="{racine}/{theme}/{lg}/templates/devis.css" />

<input id="show_modal" type="submit" value="Demande de devis" />

<div id="overlay" style="display:none">
  <div class="modal">
	<h1>Demande de devis</h1>
	<form method="post" onsubmit="return false;">
		<div class="fields"><center>Chargement du formulaire...</center></div>
		<input type="submit" value="Demande de devis" />
		<input type="reset" value="Annuler" class="submit reset close">
		<footer>Le contenu de votre panier sera joint à votre demande</footer>
	</form>
  </div>
</div>

Cette première portion de code met en place le bouton "demande de devis". Ainsi que le bloc (masqué par défaut) permettant d'accueillir le formulaire dismoi?.

On inclut ensuite le client Javascript API Front-office de Kiubi ainsi que le fichier forms.js :

<script type="text/javascript" src="{cdn}/js/kiubi.api.pfo.jquery-1.0.min.js"></script>
<script type="text/javascript" src="{racine}/{theme}/{lg}/templates/forms.min.js"></script>
<script type="text/javascript">
	
	var form_id = 'X-XXXXXXXXXXXXXXX'; // identifiant API
	var $form = $('.modal form');
	var $container = $('.fields', $form);
	

On initialise les variables form_id, $form et $container correspondant respectivement à l'identifiant unique du formulaire, l'objet jquery du formulaire HTML et enfin le conteneur destiné à accueillir les champs dudit formulaire.

Ouverture de la modal-box
	/**
	 * Ouverture de la modal
	 */
	$("#show_modal").click(function(){
	
		$('#overlay').show();
		$('#overlay .modal').addClass('scrolldown');

Au clic sur le bouton "Demande de devis", on affiche le fond et on ajoute la classe scrolldown à la modal-box. On récupère ensuite la configuration du formulaire dismoi? à l'aide du client Javascript API Front-office de Kiubi :

		kiubi.forms.get(form_id).done(function(meta, APIForm){

On vide puis remplit le conteneur à l'aide de la méthode createForm() définit dans le fichier forms.js précédemment inclus. Cette méthode accepte en premier argument une liste de champ issue d'une requête API et, en second argument, le noeud DOM dans lequel les champs seront ajoutés en HTML.

			$container.empty();

			// on remplit le formulaire avec tous les champs 
			createForm(APIForm.fields, $container);

On recherche ensuite le champ associé au panier :

			var cart_field = $('[placeholder=\\%cart\\%]', $container);
			if(cart_field.length)
			{
				// on masque ce champ spécial, ainsi que son label
				cart_field.hide();
				$('label[for=' + cart_field.attr('id') +']').hide();

Si le champ a été trouvé, on récupère le contenu du panier de l'internaute à l'aide du client Javascript API Front-office de Kiubi :

				// on récupère le contenu du panier
				kiubi.cart.get().done(function(meta, data){

On remplit enfin ce champ avec une version textuelle du contenu du panier :

					var text = data.items_count + " produit(s) \n\n";
					data.items && $.each(data.items, function(num, item){
						text += "- " + item.product_name + " (" + item.name + ")\n";
						text += "\t quantité : " + item.quantity + "\n";
						text += "\t référence : " + item.sku + "\n";
						text += "\t URL : " + location.protocol + '//' + location.host + item.product_url + "\n";
						text += "\n";
					});
					// on ajoute un descriptif textuel du panier au champ
					cart_field.val(text);
				});
			}
		});
	});
Soumission du formulaire

A la soumission du formulaire HTML, on utilise à nouveau l'API afin de stocker la demande de l'internaute.

	/**
	 * Soumission du formulaire
	 */
	$form.submit(function(){
		var submit = kiubi.forms.submit(form_id, $form);

En cas de succès, on remplace les champs du formulaire par le message de remerciement, on masque les erreurs éventuellement survenues lors d'une soumission antérieure, puis on renomme le bouton Annuler en Fermer :

		// Réussite
		submit.done(function(meta, data){
			$container.empty();
			$container.append(data.message);
			
			$('footer, input[type=submit]', $form).hide();
			$('div.erreurs', $form).remove();
			$('input.close', $form).val('Fermer');
		});

image

Gestion des erreurs

En cas d'échec (champ obligatoire non renseigné, valeur d'un champ incorrecte, …), on affiche un div qui contiendra l'erreur ayant occasionnée cet échec :

		// Echec
		submit.fail(function(meta, error, data){
			$('div.erreurs', $form).remove();
			var info_box = $('<div>', {'class':'erreurs'});
			info_box.insertBefore($container);
			info_box.append(error.message);

On ajoute une classe erreur aux champs ayant éventuellement occasionnés cette erreur :

	
			$('input, textarea, select', $form).removeClass('erreur');
			$.each(error.fields, function(){
				$('[name="'+this.field+'"]', $form).addClass('erreur');
				info_box.append("<br>" + this.message);
			});

Si un nouveau captcha est à renseigner, on met à jour la question de ce dernier, puis on vide la réponse précédente :

			if(data && data.new_captcha) {
				// un nouveau captcha à été généré pour ce formulaire
				$('[name=captcha]', $form).val("");
				$('label[for=captcha]', $form).html(data.new_captcha+' *');
			}
		});

		return false; // empêche la soumission "normale" du formulaire.
	});

image

Fermeture de la modal-box

Pour finir, le code ci-dessous permet de fermer la modal-box au clic du bouton "Annuler/Fermer" :

	/**
	 * Fermeture de la modal
	 */
	$('input.close', $form).click(function(){
		$('#overlay').hide();
		$('div.erreurs', $form).remove();
		$('#overlay .modal form *').show();
		$container.empty();
		$(this).val('Annuler'); // rétabli le nom du bouton
	});
</script>

La page affiche désormais un formulaire de demande de devis. Dans le back-office, les réponses à ce formulaire intègrent le contenu du panier :

image