Aide à la construction de pages publiques de type « tunnels »
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Charles Razack de6d3cc7ab Menu : balise strong uniquement pour l'entrée en cours 4 days ago
dev Garder sous la main des docs de dev 2 weeks ago
images Dépôt initial 2 weeks ago
inc Renommage du menu + ajustements divers 2 weeks ago
inclure Menu : balise strong uniquement pour l'entrée en cours 4 days ago
lang Dépôt initial 2 weeks ago
prive/squelettes/contenu Dépôt initial 2 weeks ago
CREDITS.md Dépôt initial 2 weeks ago
README.md Renommage du menu + ajustements divers 2 weeks ago
paquet.xml Afficher le titre de l'étape à part 1 week ago

README.md

Plugin Tunnels

Un plugin pour implémenter facilement des tunnels

Principe

Un tunnel est une série d’étapes à faire dans un ordre précis. C’est en quelque sorte l’équivalent d’un formulaire multi-étapes, mais découpé en plusieurs formulaires indépendants sur plusieurs pages. Il peut s’agir de tunnels pour passer une commande, pour s’abonner, etc.

Ce plugin fournit un mécansime pour décrire les tunnels et leurs étapes, ainsi qu'un squelette pour l'affichage avec tous les automatismes nécessaires (menu de navigation, gestion des autorisations, redirections éventuelles, etc).

Les règles :

  • Les étapes se font dans un ordre précis
  • On peut revenir en arrière à tout moment
  • Pour accéder à une étape, il faut avoir le droit d'accéder à toutes les étapes antérieures.
  • Lorsqu'on essaie d'accéder à une étape interdite, on est redirigé vers la dernière étape autorisée

Mise en oeuvre

1) Créer les squelettes de chaque étape

Placer les squelettes dans le dossier inclure/tunnels/

inclure
  |- tunnels
     |- truc.html
     |- muche.html

Dans ces squelettes, vous avez à disposition ces variables d'environnement :

  • tunnel : identifiant du tunnel
  • etape : identifiant de l'étape
  • etapes : tableau de toutes les étapes avec leurs titres et leurs URLs
  • etape_precedente : identifiant de l'étape précédente
  • etape_suivante : identifiant de l'étape suivante
  • url_etape_suivante : URL de l'étape suivante
  • url_etape_precedente : URL de l'étape précédente

La plus importante étant url_etape_suivante qu’il faut passer en paramètre aux différents formulaire, pour la redirection.

2) Déclarer les tunnels et leurs étapes

Les tunnels se déclarent au moyen du pipeline lister_tunnels. Celui-ci doit renvoyer un tableau avec l'identifiant du tunnel, son titre et la liste de ses étapes, sous la forme nom du squelette => titre.

array(
	'tunnelA' => array(
		'titre' => 'Titre du tunnel',
		'etapes' => array(
			'truc' => 'Titre de l’étape Truc',
			'muche' => 'Titre de l’étape Muche',
		),
	),
	'tunnelB' => array(...),
);

3) Définir les autorisations

Enfin, il reste à définir les autorisations pour chaque étape.

Celles-ci se cumulent : c’est à dire qu’à l'étape n°3 par exemple, on teste les autorisations des étapes n°1 et n°2. Il est donc inutile de refaire les tests des étapes précédentes dans les autorisations.

Les autorisations doivent être nommées de la sorte : autoriser_tunnel{identifiant du tunnel}{identifiant de l’étape}_voir.

Par exemple pour l'étape panier du tunnel commande : autoriser_tunnelcommandepanier_voir

Si le squelette d'une étape comporte les caractères _ ou -, il faut les retirer. Par exemple l’autorisation pour un squelette truc_muche serait autoriser_tunnelcommandetrucmuche_voir.

4) Intégrer le tunnel

Enfin, vous pouvez intégrer le tunnel sur n'importe quelle page. Il suffit d'inclure un squelette en précisant l'identifiant du tunnel souhaité :

<INCLURE{fond=inclure/tunnel, tunnel=commande, env}>

Exemple

Un exemple pour un tunnel de commande se reposant sur les plugins Commandes, Paniers, Bank, et Profils pour les informations utilisateur.

Il y aurait 3 étapes :

  1. Validation du panier
  2. Inscription ou mise à jour des informations utilisateur
  3. Paiement

1) Squelettes

inclure/tunnel/panier.html

#FORMULAIRE_PANIER{#ENV{url_etape_suivante}}

inclure/tunnel/profil.html

[(#REM) Pour les connecté⋅e⋅s : mise à jour du profil ]
[(#SESSION{id_auteur}|oui)
	#FORMULAIRE_PROFIL{#SESSION{id_auteur,'',#ENV{url_etape_suivante}}
]

[(#REM) Pour les anonymes : connexion ou inscription ]
	#FORMULAIRE_INSCRIPTION{6forum, 0, #ENV{url_etape_suivante}}
	#FORMULAIRE_LOGIN{#SELF}
]

inclure/tunnel/paiement.html

<BOUCLE_commande(COMMANDES)
	{id_auteur=#SESSION{id_auteur}}
	{statut=encours}
	{0,1}
	{!par date}
	{tout}
>
[(#FORMULAIRE_PAYER_ACTE{#PRIX*, #ARRAY{
	montant_ht,  #PRIX_HT*,
	id_auteur,   #ID_AUTEUR,
	id_commande, #ID_COMMANDE,
}})]
</BOUCLE_commande>

2) pipeline

function monplugin_lister_tunnels($tunnels) {

	$tunnels['commande'] = array(
		'titre' => _T('monplugin:titre_commander'),
		'etapes' => array(
			'panier'   => _T('monplugin:titre_etape_panier'),
			'profil'   => _T('monplugin:titre_etape_profil'),
			'paiement' => _T('monplugin:titre_etape_paiement'),
		),
	);

	return $tunnels;
}

3) Autorisations

// Etape panier : ok tout le temps
function autoriser_tunnelcommandepanier_voir($faire, $quoi, $id, $qui, $options) {
	$autoriser = true;
	return $autoriser;
}

// Profil : avoir une commande en cours
function autoriser_tunnelabonnementabonnementprofil_voir($faire, $quoi, $id, $qui, $options) {
	include_spip('inc/session');
    $has_commande = sql_countsel(
    	'spip_commandes',
    	array(
    		'statut=' . sql_quote('encours'),
    		'id_auteur=' . intval($qui['id_auteur']),
    	)
    );
	$autoriser = $has_commande;
	return $autoriser;
}

// Paiement : avoir mis à jour son profil
// TODO