SPIP-Contrib

SPIP-Contrib

عربي | Deutsch | English | Español | français | italiano | Nederlands

290 Plugins, 198 contribs sur SPIP-Zone, 90 visiteurs en ce moment

Accueil > Outils pour plugins > jQuery UI > Réaliser un champ de formulaire avec autocomplétion avec jQuery (...)

Réaliser un champ de formulaire avec autocomplétion avec jQuery UI

27 février 2013 – par erational – 11 commentaires

19 votes

Ceci est une « contribution pédagogique », qui montre par l’exemple comment développer une nouvelle fonctionnalité pour SPIP.

Cet article est un tutoriel pour montrer la simplicité d’intégration de jQuery UI dans SPIP 3.

Dans un premier temps, nous allons intégrer tout le code « à la main » pour analyser le mode de fonctionnement. En fin d’article on proposera la même solution via le plugin Sélecteur générique qui propose la même solution d’une façon standard et générique.

Sur le même sujet, consulter l’article qui explique la façon d’intégrer jQuery UI dans vos plugins

Objectif

Le but est de réaliser un champs de formulaire avec auto-complétion.

Il existe plusieurs solutions compatible avec jQuery comme AutoComplete, typeahead.js. Nous allons retenir celle fournie par Jquery UI qui a l’avantage d’être intégrée nativement dans SPIP 3.

En savoir plus : Page de documentation du widget jQuery UI Autocomplete

Étape 1 : Charger jQuery UI Autocomplete

Comme beaucoup de plugins javascript, il convient de charger les feuilles de style et les scripts. En SPIP 3, jQuery UI est fourni sous forme d’un plugin du noyau nommé plugins-dist/jquery_ui

Éditer dans votre page squelette en ajoutant les lignes suivantes

  1. <head>
  2. ...
  3. <script type="text/javascript" src="#CHEMIN{prive/javascript/ui/jquery-ui.js}"></script>
  4. <script type="text/javascript" src="#CHEMIN{prive/javascript/ui/jquery.ui.autocomplete.js}"></script>
  5. <link rel="stylesheet" href="[(#CHEMIN{css/jquery-ui.css})]" type="text/css" media="all" />
  6. ...
  7. </head>

Télécharger

Inutile d’ajouter jQuery qui sera chargé automatiquement via la balise #INSERT_HEAD

Étape 2 : Préparer les données

Le plugin est chargé. Il faut maintenant alimenter l’auto-complétion par une liste de mots qui sera appelée lorsque l’utilisateur tapera un mot

Cette page lorsqu’on lui soumet la requête « pie » devra retourner tous les mots contenant ces lettres comme pierrot, homo sapiens, pie noire ....

Nous allons, par exemple, lister tous les mots-clés du site en créant une page autocomplete.html

  1. [(#REM) noisette ajax pour fournir une liste de mots
  2.        l'autocompletion jQuery UI autocomplete
  3.      
  4.       parametre
  5.       - term :    lettre cherchee
  6.  
  7. ]#HTTP_HEADER{Content-Type: text/plain; charset=#CHARSET}
  8. [<BOUCLE_mots(MOTS){titre LIKE %#ENV{term}%}{par titre}{","}{0,10}>{"id":#ID_MOT,"label":[(#TITRE|json_encode)],"value":[(#TITRE|json_encode)]}</BOUCLE_mots>]

Télécharger

Explications

  • La balise #HTTP_HEADER permet de forcer le Mime-type et d’empêcher l’affichage des boutons
  • La boucle MOTS effectue une recherche avec le critère LIKE qui permet d’avoir un joker
  • La syntaxe est en format JSON, ce qui implique de séparer les résultats par des virgules {","} et d’encoder les balises SPIP avec le filtre json_encode

Selon vos besoins, il faudra personnaliser cette page qui alimente la liste de mots.

Étape 3 : Appeler l’auto-complétion sur votre champs de formulaire

Il faut maintenant appeler le plugin sur un objet de la page, par exemple, le formulaire de recherche et son champs principal qui possède l’id recherche

L’appel se fait en javascript, par exemple en ajoutant dans votre head, le code suivant :

  1. <head>
  2. ...
  3. <script type="text/javascript">
  4. $(function() {
  5.    $( "#recherche").autocomplete({
  6.          source: "spip.php?page=autocomplete",
  7.          minLength: 2,
  8.    });
  9. });
  10. </script>
  11. ...
  12. </head>

Télécharger

Explications
On appelle la page listant les mots avec le paramètre minLength qui permet de déclencher les appels uniquement à partir de la 3e lettre tapée (pour éviter d’épuiser inutilement le serveur).

Voilà l’autocomplétion est en place !


Alternative : Réaliser la même chose avec le plugin sélecteur générique

La plugin Sélecteur générique propose de faire le travail à votre place. Pour pouvoir l’utiliser dans la partie publique, installer au préalable le plugin Sélecteur publique (à télécharger sur cet article)

Ensuite l’autocomplétion est extrêmement simplement à mettre en place

Sur votre champ input, ajouter l’attribut data-selecteur

Créer une page dans votre répertoire squelettes/selecteurs/patate.html

  1. #HTTP_HEADER{Content-Type: text/plain; charset=#CHARSET}
  2. [(#REM)
  3.  
  4.   noisette ajax pour fournir une liste de mots
  5.   l'autocompletion jQuery UI autocomplete   via le plugin selecteur generique
  6.  
  7.   parametre:
  8.   - q       : recherche  
  9.  
  10. ][<BOUCLE_mots(MOTS){titre LIKE %#ENV{q}%}{par titre}{","}{0,10}>{"id":#ID_MOT,"label":[(#TITRE|json_encode)],"value":[(#TITRE|json_encode)]}</BOUCLE_mots>]

Télécharger

Pour en savoir plus sur le commit d’intro du sélecteur générique et aussi Sélecteur générique

Dernière modification de cette page le 2 avril 2013

Retour en haut de la page

Vos commentaires

  • Le 29 janvier 2017 à 02:41, par dinobib En réponse à : Réaliser un champ de formulaire avec autocomplétion avec jQuery UI

    Merci pour cette contrib.
    Je souhaite pour ma part que l’autocomplétion propose les titres des articles, des rubriques ou les lieux des évènements de l’agenda.

    Pour ce faire, j’ai donc modifier l’autocomplete de cette manière en plaçant les séparateurs « , » virgule dans les parties conditionnelles des boucles.

    1. ]#HTTP_HEADER{Content-Type: text/plain; charset=#CHARSET}
    2. [<BOUCLE_artr(ARTICLES){titre LIKE %#ENV{term}%}{par titre}{","}{0,10}>{"id":#ID_ARTICLE,"label":[(#TITRE|textebrut|json_encode)],"value":[(#TITRE|textebrut|json_encode)]}</BOUCLE_artr>,</B_artr><B_rubr><BOUCLE_rubr(RUBRIQUES){titre LIKE %#ENV{term}%}{par titre}{0,10}{","}>{"id":#ID_RUBRIQUE,"label":[(#TITRE|textebrut|json_encode)],"value":[(#TITRE|textebrut|json_encode)]}</BOUCLE_rubr>,</B_rubr><B_lieuxr><BOUCLE_lieuxr(EVENEMENTS){lieu LIKE %#ENV{term}%}{fusion lieu}{","}>{"id":#ID_EVENEMENT,"label":[(#LIEU|textebrut|json_encode)],"value":[(#LIEU|textebrut|json_encode)]}</BOUCLE_lieuxr>

    Télécharger

    Mais cela ne fonctionne pas et je comprends que ce qu’il me faudrait c’est que cela soit conditionné par le fait qu’il il y ai eu un résultat pour la boucle précédente. Il faudrait donc une sorte de condition ’si précédé de’ pour ajouter alors seulement la virgule.

    Une idée pour gérer ça correctement ? Ça me parait simple mais je cherche sans trouver.

    • Le 31 janvier 2017 à 17:31, par dinobib En réponse à : Réaliser un champ de formulaire avec autocomplétion avec jQuery UI

      J’ai pu trouver une solution grâce à l’aide du forum.
      Pour ceux à qui cela pourrait être utile voici donc ma version du fichier autocomplete.html qui propose pour l’autocomplétion les titres d’articles, de rubriques et lieux d’événements.

      1. #HTTP_HEADER{Content-Type: text/plain; charset=#CHARSET}
      2. #SET{collect,#ARRAY}
      3. <BOUCLE_collect_ag(EVENEMENTS){fusion lieu}>
      4. #SET{collect,#GET{collect}|push{#ARRAY{id,#ID_EVENEMENT,titre,#LIEU|textebrut|json_encode}}}
      5. </BOUCLE_collect_ag>
      6. <BOUCLE_collect_rub(RUBRIQUES){fusion titre}>
      7. #SET{collect,#GET{collect}|push{#ARRAY{id,#ID_RUBRIQUE,titre,#TITRE|textebrut|json_encode}}}
      8. </BOUCLE_collect_rub>
      9. <BOUCLE_collect_art(ARTICLES){fusion titre}>
      10. #SET{collect,#GET{collect}|push{#ARRAY{id,#ID_ARTICLE,titre,#TITRE|textebrut|json_encode}}}
      11. </BOUCLE_collect_art>
      12. [<BOUCLE_res_collect(DATA){source tableau, #GET{collect}}{titre LIKE %#ENV{term}%}{par titre}{0,10}{","}>{"id":#VALEUR{id},"label":#VALEUR{titre},"value":#VALEUR{titre}}</BOUCLE_res_collect>]
      13. #FILTRE{trim}

      Télécharger

      Voir http://forum.spip.net/fr_266383.html#forum266420

    • Le 31 janvier 2017 à 18:02, par dinobib En réponse à : Réaliser un champ de formulaire avec autocomplétion avec jQuery UI

      Et même une version amélioré qui permet de prendre en compte les lettres accentués.
      Le filtre textebrut suffit, le json encode n’est pas nécessaire tant que tout est en utf8 mais il faut veiller à bien renvoyer les valeurs entre guillemets.

      1. #HTTP_HEADER{Content-Type: text/plain; charset=#CHARSET}
      2. #SET{collect,#ARRAY}
      3. <BOUCLE_collect_ag(EVENEMENTS){fusion lieu}>
      4. #SET{collect,#GET{collect}|push{#ARRAY{id,#ID_EVENEMENT,titre,#LIEU|textebrut}}}
      5. </BOUCLE_collect_ag>
      6. <BOUCLE_collect_rub(RUBRIQUES){fusion titre}>
      7. #SET{collect,#GET{collect}|push{#ARRAY{id,#ID_RUBRIQUE,titre,#TITRE|textebrut}}}
      8. </BOUCLE_collect_rub>
      9. <BOUCLE_collect_art(ARTICLES){fusion titre}>
      10. #SET{collect,#GET{collect}|push{#ARRAY{id,#ID_ARTICLE,titre,#TITRE|textebrut}}}
      11. </BOUCLE_collect_art>
      12. [<BOUCLE_res_collect(DATA){source tableau, #GET{collect}}{titre LIKE %#ENV{term}%}{par titre}{0,10}{","}>{"id":#VALEUR{id},"label":"#VALEUR{titre}","value":"#VALEUR{titre}"}</BOUCLE_res_collect>]
      13. #FILTRE{trim}

      Télécharger

    Répondre à ce message

  • Le 1er juin 2015 à 14:33, par ttseo En réponse à : Réaliser un champ de formulaire avec autocomplétion avec jQuery UI

    Bonjour
    Mon autocompletion est sensible à la casse. Effectivement en sql le critère LIKE rend la requête sur le champ titre par exemple sensible à la casse
    en sql, on peut contourner en faisant UPPER(titre) like UPPER(term)
    Mais comment faire de même avec les boucles spip ?

    Répondre à ce message

  • Le 6 juin 2014 à 11:31, par tcharlss En réponse à : Réaliser un champ de formulaire avec autocomplétion avec jQuery UI

    Un article super pratique qui m’a bien dépanné, merci.
    J’ai quand même des remarques sur 2 points :

    1) Dans le script activant l’autocomplétion, il vaut mieux utiliser la balise #URL_PAGE{autocomplete}.
    J’ai d’abord utilisé l’url spip.php?page=autocomplete comme indiqué dans l’exemple, mais ça ne marchait pas : il manquait le « ../ » au début. Ca dépend peut-être des cas de figure, en tout cas avec la balise #URL_PAGE on est sûr d’avoir la bonne adresse.

    2) Pour charger les scripts jquery ui, il y a la pipeline jqueryui_plugins qui permet d’éviter de charger les scripts en doublons.
    Dans mes_options.php :

    1. $GLOBALS['spip_pipeline']['jqueryui_plugins'] .= "|jqueryui_autocomplete";
    2. function jqueryui_autocomplete($scripts){
    3.         $scripts[] = 'jquery.ui.autocomplete';
    4.         return $scripts;
    5. }

    Télécharger

    • Le 5 février 2015 à 11:51, par Raphaël En réponse à : Réaliser un champ de formulaire avec autocomplétion avec jQuery UI

      Bonjour,

      Je remercie Tchariss pour sa remarque - merci également et bien sûr à erational - car l’ajout de la pipeline dans mes_options.php est effectivement la meilleure solution.

      En effet, l’ajout des bibliothèques / scripts directement dans le head ne suffisait pas : le sélecteur - et donc la position du menu des propositions - n’étant pas récupérée.

    Répondre à ce message

  • Le 23 avril 2014 à 19:35, par Billou En réponse à : Réaliser un champ de formulaire avec autocomplétion avec jQuery UI

    Ah finalement j’ai un léger soucis, je me retrouve avec des devant les : qui sont dans les titres des mots-clés listés par l’autocomplete…

    Une idée là-dessus ?

    • Le 23 avril 2014 à 22:25, par Billou En réponse à : Réaliser un champ de formulaire avec autocomplétion avec jQuery UI

      J’ai trouvé comment résoudre le soucis :

      Dans autocomplete.html, avant d’encodre en json, j’applique un filtre textebrut :

      [(#REM) noisette ajax pour fournir une liste de mots
            l'autocompletion jQuery UI autocomplete

           parametre
           - term :    lettre cherchee

      ]#HTTP_HEADER{Content-Type: text/plain; charset=#CHARSET}
      [<BOUCLE_mots(MOTS){titre LIKE %#ENV{term}%}{par titre}{","}{0,10}>{"id":#ID_MOT,"label":[(#TITRE|textebrut|json_encode)],"value":[(#TITRE|textebrut|json_encode)]}</BOUCLE_mots>]
    • Le 2 février 2015 à 11:13, par Fredéric En réponse à : Réaliser un champ de formulaire avec autocomplétion avec jQuery UI

      J’ai aussi eu recours à cette syntaxe car l’encodage des apostrophes n’était pas correct, j’obtenais aujourd&#8217;hui au lieu du texte aujourd'hui.

      Est-ce normal, ou y’a-t-il un paramètre à préciser ?

    Répondre à ce message

  • Le 16 septembre 2014 à 14:55, par En réponse à : Réaliser un champ de formulaire avec autocomplétion avec jQuery UI

    Est-ce que cela est fonctionnel en Spip 2.1 ?

    Répondre à ce message

  • Le 23 avril 2014 à 18:41, par Billou En réponse à : Réaliser un champ de formulaire avec autocomplétion avec jQuery UI

    Très bon merci ! J’utilisais le même mais avec une solution de base avec la doc JQuery, mais toute la liste des mots-clés s’affichait dans le code source des pages… Grâce à cette méthode, plus de soucis de ce genre.

    Répondre à ce message

Répondre à cet article

Qui êtes-vous ?

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 Les choses à faire avant de poser une question (Prolégomènes aux rapports de bugs. )
Ajouter un document

Retour en haut de la page

Ça discute par ici

  • Jeux pour SPIP 3

    27 juillet 2012 – 53 commentaires

    Un portage pour SPIP 3 du plugin Jeux a été fait. Explications et nouveautés. Cet article concerne une mise à jour du plugin Jeux dont la description complète est disponible ici : Des jeux dans vos articles !. Le code du plugin Jeux est un code (...)

  • Plugin Vidéo(s)

    23 novembre 2010 – 704 commentaires

    Interface de gestion et modèle d’insertion des vidéos : Dailymotion Vimeo Youtube Modèle de la balise HTML5 video avec alternative flash html5media : Lecture HTML5/Flash pour tout navigateur des fichiers MP4/H264/Ogg/WebM/Mkv Support mobile, iPad, (...)

  • Vidéo Accessible

    6 avril 2011 – 168 commentaires

    Un plugin pour faciliter la diffusion de vidéos accessibles. Accessibilité des vidéos Accessibilité de la vidéo Afin d’être pleinement accessible, une vidéo (composée d’images et de sons) doit répondre à plusieurs critères. Le critère de base est (...)

  • Groupes de mots clés arborescents

    26 juillet 2012 – 37 commentaires

    Ce plugin permet de gérer une arborescence de groupes de mots clés. Les sous groupes de mots héritent des propriétés du groupe racine (sur quoi peut on le lier ? peut il y avoir un ou plusieurs mots). Les formulaires de liens qui permettent de lier (...)

  • Mailshot

    16 janvier 2013 – 336 commentaires

    Ce plugin prend en charge l’envoi en nombre d’info-lettres par email. Mailshot permet l’envoi en nombre d’emails au moyen d’un SMTP (ou d’un service externe) dédié à cet effet. Il permet de limiter la cadence d’envoi. Enfin, ce plugin implémente la (...)