Nota SPIP-Contrib : une contribution qui affiche clairement sa nature de témoignage de mise en oeuvre pouvant être améliorée de Forms & Tables, mais justement intéressante pour cela
Un annuaire en trois pages
L’annuaire est composé de trois pages
- La première est la liste des catégories (métier, ou autre), la page entreprise.html
- La seconde liste les fiches qui appartiennent à la catégorie choisie, la page fichecat.html
- La dernière est la fiche détaillée du sujet, la page ficheent.html
Utilisation de Forms & Tables
Tout d’abord, il vous faut créer deux tables, dans la partie privée. Appelons-les « Entreprises » et « Catégorie » :
- « Entreprise » correspond à votre table principale. Elle contient des champs comme « Nom », « Adresse », « Téléphone », etc.
- « Catégorie » n’a qu’un seul champ, le champ « NomCat »
L’idée est d’utiliser le champ de table liée pour simuler une contrainte hiérarchique et générer ainsi un arbre hiérarchique. En réalité, tout est factice, mais le résultat correspond à ce que l’on cherche.
La page entreprise.html
J’ai choisi d’afficher les catégories par 2, mais vous pouvez simplifier le code en supprimant tout ce qui est html+la boucle _suite.
Cette page est simple, on liste toutes les catégories de notre table « catégorie » et on y colle un lien qui prend en paramètre le nom de la catégorie. (Et non l’id). Petit point interessant, pour trier les données, on utilise "tri_donnee NomChampSpecifiant". Ainsi il faut que le champ soit déclaré "spécifiant" et que l’on releve son nom de champ spécifiant en regardant dans la base de donnée, ou dans les URL servant à trier les données depuis la page d’administration. Ils sont de la forme "ligne_X"
Son code de squelette est le suivant
<div>
<BOUCLE_champs(FORMS_CHAMPS){titre=NomCat}{tri_donnee ligne_1}>
<table width="100%" border="0">
<B_reponses>
<tr>
<BOUCLE_reponses(FORMS_DONNEES){id_form=1}{doublons}{0,2}>
<td width="50%">
<a href="spip.php?page=fichecat&nom_cat=#VALEUR"><b>#VALEUR</b></a>
</td>
</BOUCLE_reponses>
</tr>
<BOUCLE_reponses_suite (BOUCLE_reponses)></BOUCLE_reponses_suite>
</B_reponses>
</table>
</BOUCLE_champs>
</div>
La page fichecat.html
Cette page n’est absolument pas optimisée, mais elle est tout de même la page qui posait problème à beaucoup de personnes. La liaison de table étant factice, comment réalisé les boucles ? Je ne sais pas comment Cédric fait, mais voici ma façon de faire.
D’abord, je vais chercher dans la table « FORMS_DONNES_CHAMPS » l’id qui correspond au nom de ma catégorie.
Ensuite je crée un tableau ’tab’ et j’y imbrique trois boucles (voir le code plus bas) :
- la première sélectionne l’id_form de votre table « Entreprise »
- la seconde sélectionne uniquement les id_donnee qui ont une correspondance à votre id de catégorie dans la table « FORMS_DONNEES_DONNEES. »
- enfin la dernière choisit de n’afficher que le nom de l’entreprise et la range dans le tableau.
Si j’ai utilisé un tableau c’est parce que cet enchainement de boucles a un soucis que je n’ai su résoudre, des doublons. Alors grâce au tableau
je passe une petite fonction array_unique pour les balayer.
Enfin, je mets en lien ma ficheent.html avec en paramètre mon id_donnee (et accessoirement le nom de la catégorie si je veux l’afficher dans la fiche de mon entreprise)
<table width="100%">
<BOUCLE_cat(FORMS_DONNEES_CHAMPS){valeur=#ENV{nom_cat}}>
#SET{id_cat,#ID_DONNEE}
</BOUCLE_cat>
#SET{tab,#ARRAY{0,0}}
<BOUCLE_reponses(FORMS_DONNEES){id_form=2}>
<BOUCLE_lie(SPIP_FORMS_DONNEES_DONNEES){id_donnee_liee=#GET{id_cat}}>
<BOUCLE_champs(FORMS_CHAMPS){titre=Nom}{tri_donnee ligne_1}>
[<tr><td><div class="bordureCat2"><a href="spip.php?page=ficheent&nom_cat=#ENV{nom_cat}&id_donnee=#ID_DONNEE"><img src="images/puceCat.gif" border="0" /> <b>(#VALEUR|in_array{[(#GET**{tab})]}|?{'',#VALEUR})]
[(#GET{tab}|array_push{#VALEUR}|?{''})</b></a></div></td></tr>]
</BOUCLE_champs>
</BOUCLE_lie>
</BOUCLE_reponses>
</table>
La page ficheent.html
J’ai laissé exprès la mise en page pour montrer l’utilisation des différents type de champs, notamment les images.
Mon astuce pour afficher une image est d’utiliser un champ ligne de texte, d’utiliser l’uploader de SPIP (pour cela pensez a cocher « permettre l’ajout de fichiers » a la création de la table), puis en glisser/deposer, l’URL de mon image se retrouve dans ma ligne de texte.
Je traite a la suite mon champ dans une balise par un #SET puis un #GET qui prend en sus un filtre de création de vignette. (L’encapsulation de f&t doit pouvoir être utilisée mais je ne sais pas comment)
Bon sinon cette page est aussi simple que la première, on affiche nos différents champs (soit avec #LESVALEURS
si on ne désire pas de mise en page, soit un par un grâce au critère {titre}
)
<BOUCLE_reponses(FORMS_DONNEES){id_form=2}{id_donnee}>
<div class="bordureAnnuaire">
<table border="0" width="100%">
<tr>
<BOUCLE_nom(FORMS_CHAMPS){titre=Nom}>
<td width="30%"><b>Nom : </b></td><td width="60%">#VALEUR</td>
</BOUCLE_nom>
</tr>
<tr>
<BOUCLE_adresse(FORMS_CHAMPS){titre=Adresse}>
<td><b>Adresse : </b></td><td>#VALEUR</td>
</BOUCLE_adresse>
</tr>
<tr>
<BOUCLE_cp(FORMS_CHAMPS){champ=ligne_5}>
<td><b>Code Postal : </b></td><td>#VALEUR</td>
</BOUCLE_cp>
</tr>
<tr>
<BOUCLE_ville(FORMS_CHAMPS){titre=Ville}>
<td><b>Ville : </b></td><td>#VALEUR</td>
</BOUCLE_ville>
</tr>
</table>
</div>
<br />
<div class="bordureAnnuaire">
<table border="0" width="100%">
<tr>
<BOUCLE_courriel(FORMS_CHAMPS){titre=Courriel}>
<td width="30%"><b>Courriel :</b></td><td width="60%"><a href="mailto:#VALEUR">#VALEUR</a></td>
</BOUCLE_courriel>
</tr>
<tr>
<BOUCLE_telfixe(FORMS_CHAMPS){titre=Telephone fixe}>
<td><b>Tel fixe :</b></td><td>#VALEUR</td>
</BOUCLE_telfixe>
</tr>
<tr>
<BOUCLE_telport(FORMS_CHAMPS){titre=telephone portable}>
<td><b>Tel portable :</b></td><td>#VALEUR</td>
</BOUCLE_telport>
</tr>
<tr>
<BOUCLE_fax(FORMS_CHAMPS){titre=Fax}>
<td><b>Fax :</b></td><td>#VALEUR</td>
</BOUCLE_fax>
</tr>
</table>
</div>
<br />
<div class="bordureAnnuaire">
<table border="0" width="100%">
<tr>
<td width="30%"><b>Catégorie :</b></td><td width="60%">#ENV{nom_cat}</td>
</tr>
<tr>
<BOUCLE_web(FORMS_CHAMPS){titre=SiteWeb}>
<td><b>Site internet :</b></td><td><a href="#VALEUR" target="_blank">#VALEUR</a></td>
</BOUCLE_web>
</tr>
<tr>
<BOUCLE_pres(FORMS_CHAMPS){titre=Présentation}>
<td><b>Présentation :</b></td><td>#VALEUR</td>
</BOUCLE_pres>
</tr>
</table>
</div>
<br />
<div class="bordureAnnuaire">
<table border="0" width="100%">
<tr>
<BOUCLE_imgint(FORMS_CHAMPS){titre=Photo Interieur}>
#SET{imgint,<td><center><a href="#VALEUR"><img src="#VALEUR" border="0" /></a></center></td>}
[(#GET{imgint}|image_reduire{200})]
</BOUCLE_imgint>
<BOUCLE_imgext(FORMS_CHAMPS){titre=Photo Exterieur}>
#SET{imgext,<td><center><a href="#VALEUR"><img src="#VALEUR" border="0" /></a></center></td>}
[(#GET{imgext}|image_reduire{200})]
</BOUCLE_imgext>
</tr>
</table>
</div>
</BOUCLE_reponses>
Conclusion
Si vous voulez voir le résultat final :
http://www.coutras-calic.fr/spip.php?page=entreprise. ou regardez le document joint.
Merci à tout les gens qui m’ont aidé sur la liste spip-zone, sur SPIP-Contrib et surtout le canal irc #spip@freenodes !
Si vous avez des questions ou des réponses aux choses que je n’ai su faire proprement n’hésitez pas ...
Autres exemples d’annuaire avec Forms & Tables
Ajout SPIP-Contrib
Voir cet intéressant article sur Spip Ô Toulouse : Premières solutions pour l’annuaire de personnes avec un exemple très parlant et qui décrit l’importation de données via le le plugin « import csv ».
Discussions par date d’activité
35 discussions
Bonjour et merci pour votre contribution,
J’aurais une question : comment avez-vous trouvé que la boucle FORMS_DONNEES avait comme balise #VALEUR ?
En effet, lorsque l’on étudie la structure des tables SQL générées par le plugin, on constate que la table SPIP_FORMS_DONNEES n’a pas de champ VALEUR. Par contre, VALEUR est un champ de la table SPIP_FORMS_DONNEES_CHAMPS ...
Merci
le « plus simple »(!) pour entrer dans les subtilités des balises de F&T consiste à jeter un œil au code des fichiers modèles fournis dans le répertoire /plugins/forms_et_tables_1_9_1/modeles
Un coup d’oeil à la page suivante apportera des éléments de réponse à ta question
Carnet de notes
Répondre à ce message
Bonjour,
merci pour ce plugin. Je galère néanmoins encore pas mal et n’arrive pas à faire ce que je voudrais, à savoir monter un annuaire comme celui ci :
http://afup.org/pages/annuaire/
Quelqu’un aurait-il une idée sur la façon de procéder pour arriver à une résultat similaire ?
Je pense que ça n’est pas trop compliqué, je pensais créer une seule table avec les champs nom, prénom, tel etc...
mais je n’arrive pas à trouver comment la faire afficher dans la partie publique dans un article ou un squelette...
Quelqu’un peut m’aider ?
Merci par avance
Répondre à ce message
Visiblement l’utilisation de ces feuilles de squelette fonctionnent mal avec spip 1.9.3.
J’ai utilisé « Forms & Tables » pour la version 1.9.3, cependant j’ai cette erreur :
Fatal error : Only variables can be passed by reference in /var/www/ecrire/public/composer.php(65) : eval()’d code on line 62
Visiblement SPIP n’aime pas qu’on envoie certains paramètres en url ... où je me trompe ?
Exemple :
http://192.168.0.5/spip.php?page=fichecat&nom_cat=Cat1
Avez vous des idées sur la résolution de ce problème ?
Quelqu’un à déjà eu un tel problème avec spip 1.9.3 ? C’est « que » moi ? :)
Comme indiqué explicitement dans la doc de ce plugin (http://www.spip-contrib.net/plugin-...), il n’est pas compatible avec toute version postérieure à la 1.9.2...
Répondre à ce message
Bonjour,
je suis novice en la matière.
Je « gère » le site internet de mon club de badminton.
Nous avons généré un formulaire d’inscription au club.
Est ce qu’il est possible de récupérer des informations des réponses envoyées pour renseigner une table qui permettra d’élaborer l’annuaire ?
Je n’ai pas tout compris à ce tuto. Est ce que je dois créer ces 3 pages ?
Si oui, dans quelle arborescence ?
merci d’avance
Emmanuelle
Répondre à ce message
Merci pour cette contrib !
Je souhaite afficher les données récoltées dans ma table et pouvoir trier selon les champs spécifiants déclarés (avec des petites flèches pour choisir le sens du tri).
Savez-vous comment je dois faire ? J’ai cherché mais ne trouve rien.
Merci
Répondre à ce message
Bonjour ,
merci pour cette doc,
je me pose une question,
si l’on voulais sur le meme principe des 3 pages permettre sur la premiere page de faire un choix sur plusieurs criteres : catégorie et ville par exemple.
Serait il possible d’utiliser la meme technique ?
Hmm oui, il faudrait alors faire une seconde boucle, sur une table « ville », et envoyer les deux variables. Ca complique la chose, mais tu peux.
En fait j’imaginais de remplacer la page « entreprise.html » par une page « rechercheentreprise.html »
et dans cette page je glisse un formulaire de recherche multicritère...
qui me permet de rechercher l’entreprise pas uniquement en fonction de la catégorie,
mais en fonction de la ville également par exemple.
ensuite j’utiliserais tes deux autres pages pour l’affichage des résultats.
je suis en train de regarder ca,
merci pour ta réponse
Hmm je suppose que c’est possible, mais de fait alors tu n’a plus besoin de table lié je pense. Il te suffierai d’afficher la liste des entreprises ayant pour champ tes deux criteres. La liaison sert principalement à la gestion automatisée des pages « entreprise » et « catent ». Si elles sont issues d’une recherche, alors elles perdent leur utilité.
Par contre, bon sa savoir, il existe une façon de demander au moteur de recherche de spip de rechercher dans tes tables. Je te donne le code :
A mettre donc dans ton squelette de recherche.
Peux tu me donner davantage de précisions sur le fonctionnement de ce bout de script. Il permet de rechercher sur n’importe quelle table que l’on a créé puisqu’il ne fait pas référence à un formulaire en particulier.
Et il permet de rediriger les résultats vers la page entreprise c’est bien cela ?
Où cela s’ajoute t’il exactement ?
n’importe où dans recherche.html ?
merci
Pietrus
Il cherche dans une seule table (ici id_form=2).
En effet cela ce place « ou tu veux » dans le squelette recherche. Si tu veux une xemple, va voir sur le site que je donne en exemple à la fin de la doc, en haut à droite, tu as un petit formulaire de recherche. Tape par exemple « axa » et regarde le résultat.
J’ai testé c’est génial sur ton site
à propos du moteur de recherche.
Ca fonctionne très bien , la table est indexée. pas de probleme
par contre je rencontre un probleme avec le formulaire forms_recherche
Lorsque je laisse activée cette ligne, et que je valide le formulaire de recherche (dans le cadre d’une utilisation du modele fourni table_recherche) je suis renvoyé sur une page fantaisiste et ca ne fonctionne pas.
Utilises tu ces modeles et formulaires ?
Hmm là je ne saurais t’aider, désolé. Jamais utilisé. Essaye de poser la question dans le carnet de note F&T, peut etre que l’auteur pourra te répondre.
ce code fonctionne très bien mais par exemple il ne cherche pas sur tous les champs de la table indiquée par le critère form.
en effet les champs select par exemple ne sont pas pris en compte.
savez vous comment modifier ce code pour que les résultats soient affichés y compris si la réponse est dans un champ de type select.
exemple pour une entreprise , la catégorie peut être dans un champ select.
et à ce moment le moteur de recherche n’affiche pas les données qui correspondent à une recherche basée sur la valeur du champ select.
merci
J’utilise le code ci-dessus pour effectuer une recherche dans une table. Ça fonctionne... mais avec un petit problème : si le mot recherché se trouve dans plusieurs champs de la donnée, cette donnée sort plusieurs fois. Ex : la donnée A contient le mot toto dans les champs Nom et Biographie, alors la recherche donnera 2 fois la donnée A. J’ai essayé avec doublons, ce n’est pas mieux... Une idée ?
Bon ben j’ai trouve tout seul une solution :
Répondre à ce message
bonjour,
pour ma part j’ai utilisé une variant de ce code,
j’ai :
une seule table avec un champ select (la catégorie de l’entreprise)
- page A : affiche la liste des entreprises par catégorie
- page B : affiche l’entreprise
je fais afficher la liste des entreprises par catégorie, et par ordre alphabétique.
un double classement d’abord par catégorie , puis par ordre alphabétique à l’intérieur de chaque catégorie.
cependant je n’arrive pas à ne faire apparaitre qu’une seule fois le nom de la catégorie suivi de toutes les entreprises concernées,
j’ai à chaque fois categorie + nom
je souhaiterais : categorie : nomA, nomB, nomC ...
si quelqu’un peut m’aider, voici mes boucles :
tri_donnee select_1 = le champ categorie
ligne_1 = nom de l’entreprise
Page A :
personne n’aurait une idée afin d’afficher les résultats de la table de cette manière ? la table possede deux champ : un champ ligne de texte et un champ select. Il s’agit de présenter les résulat en fonction de la boucle select mais en affichant qu’une fois ce champ select pour toutes les données qui le possede.
exemple :
Répondre à ce message
Afin que mon visiteur remplisse un formulaire sans se lasser et afin de pouvoir savoir précisement ou il décroche éventuellement dans mes stats, je voudrais savoir s’il est possible de découper un formulaire en plusieurs pages avec par exemple un bouton suivant (au lieu du valider)
Cela serait très pratique si c’etait possible avec ce plugins.
Si vous avez des pistes merci.
Répondre à ce message
lorsque j’utilise le modele table_recherche
je peux faire afficher les résultats par ordre alphabétique en modifiant la boucle dans le modele et en choisissant par ligne1 par exemple pour afficher les réponse en fonction de ce champ.
par contre si il s’agit d’un select, par select 1 ne fonctionne pas.
avez vous une idée de comment contourner ce probleme ?
merci
Répondre à ce message
Bonjour,
Bravo pour cette magnifique réalisation !
... Dommage que je n’y comprenne rien... j’ai suivi à la lettre pourtant la démonstration : Ma « page=entreprise » reste désespérément vide.
SVP, qu’est-ce que déclarer un champ spécifiant ?
Est-ce cocher « Ce champ qualifie la donnée (tri, filtre, description) »
SVP, où (Plus précisément) trouve-ton « son nom de champ » « ligne_X » : J’ai cherché dans la base de données et dans l’espace privé/Edition/Table/Champ (Administration ?), form=1 form=2, etc ... oui, il y a des url avec ça ;-) mais aucun « ligne_1 », « ligne_2 » ...
J’ai essayé la valeur de « form » pour « ligne », c’est pas la solution :-(
J’ai la version du 24 janvier de Forms et Tables et suis sous Spip 1.9.2c
Merci de bien vouloir éclairer un nul
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 :
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.
Suivre les commentaires : |