<?xml 
version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="https://www.spip.net/spip.php?page=backend.xslt" ?>
<rss version="2.0" 
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:atom="http://www.w3.org/2005/Atom"
>

<channel xml:lang="fr">
	<title>SPIP</title>
	<link>https://www.spip.net/</link>
	<description>Syst&#232;me de Publication pour Internet</description>
	<language>fr</language>
	<generator>SPIP - www.spip.net</generator>
	<atom:link href="https://www.spip.net/spip.php?id_auteur=3062&amp;page=backend" rel="self" type="application/rss+xml" />

	<image>
		<title>SPIP</title>
		<url>https://www.spip.net/local/cache-vignettes/L144xH107/siteon0-0ecda.png?1615902774</url>
		<link>https://www.spip.net/</link>
		<height>107</height>
		<width>144</width>
	</image>



<item xml:lang="fr">
		<title>SPIP 3.0</title>
		<link>https://www.spip.net/fr_article5427.html</link>
		<guid isPermaLink="true">https://www.spip.net/fr_article5427.html</guid>
		<dc:date>2012-05-19T11:00:00Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>cerdic, tetue</dc:creator>


		<dc:subject>SPIP 3.0</dc:subject>
		<dc:subject>#PRODUIRE</dc:subject>

		<description>
&lt;p&gt;SPIP 3 : une version marqu&#233;e par la r&#233;&#233;criture compl&#232;te de l'espace priv&#233; en squelettes, une forte modularisation et une boucle DATA r&#233;volutionnaire. Cette version a &#233;t&#233; publi&#233;e en mai 2012 et son support prend fin le 30 juin 2019. &lt;br class='autobr' /&gt; SPIP 2.0 avait apport&#233; les fonctionnalit&#233;s permettant de l'utiliser comme un &#171; framework &#187; pour le d&#233;veloppement d'applications Web, au-del&#224; de sa vocation initiale de simple outil de publication. &lt;br class='autobr' /&gt;
SPIP 3 pousse la logique du &#171; framework &#187; jusqu'&#224; se (&#8230;)&lt;/p&gt;


-
&lt;a href="https://www.spip.net/fr_rubrique785.html" rel="directory"&gt;Anciennes versions&lt;/a&gt;

/ 
&lt;a href="https://www.spip.net/@spip30" rel="tag"&gt;SPIP 3.0&lt;/a&gt;, 
&lt;a href="https://www.spip.net/@produire" rel="tag"&gt;#PRODUIRE&lt;/a&gt;

		</description>


 <content:encoded>&lt;img src='https://www.spip.net/local/cache-vignettes/L150xH95/arton5427-730aa.jpg?1594851818' class='spip_logo spip_logo_right' width='150' height='95' alt=&#034;&#034; /&gt;
		&lt;div class='rss_chapo'&gt;&lt;p&gt;&lt;strong&gt;SPIP 3&lt;/strong&gt; : une version marqu&#233;e par la r&#233;&#233;criture compl&#232;te de l'espace priv&#233; en squelettes, une forte modularisation et une boucle DATA r&#233;volutionnaire. Cette version a &#233;t&#233; publi&#233;e en mai 2012 et son support prend fin le 30 juin 2019.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;!--sommaire--&gt;&lt;div class=&#034;well nav-sommaire nav-sommaire-11&#034; id=&#034;nav69f2858127bdb9.57733317&#034;&gt;
&lt;h2&gt;Sommaire&lt;/h2&gt;&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;a id=&#034;s-Un-nouvel-espace-prive-2&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Un-nouvel-espace-prive-2&#034; class=&#034;spip_ancre&#034;&gt;Un nouvel espace priv&#233;&lt;span class=&#034;spip_note_ref&#034;&gt; [2]&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Modularisation-en-plugins&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Modularisation-en-plugins&#034; class=&#034;spip_ancre&#034;&gt;Modularisation en plugins&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Nouveaux-squelettes-par-defaut&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Nouveaux-squelettes-par-defaut&#034; class=&#034;spip_ancre&#034;&gt;Nouveaux squelettes par d&#233;faut&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-De-nouvelles-fonctionnalites&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#De-nouvelles-fonctionnalites&#034; class=&#034;spip_ancre&#034;&gt;De nouvelles fonctionnalit&#233;s&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Raccourcis&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Raccourcis&#034; class=&#034;spip_ancre&#034;&gt;Raccourcis&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Boucles&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Boucles&#034; class=&#034;spip_ancre&#034;&gt;Boucles&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Criteres&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Criteres&#034; class=&#034;spip_ancre&#034;&gt;Crit&#232;res&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Balises&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Balises&#034; class=&#034;spip_ancre&#034;&gt;Balises&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Filtres&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Filtres&#034; class=&#034;spip_ancre&#034;&gt;Filtres&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-JavaScript&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#JavaScript&#034; class=&#034;spip_ancre&#034;&gt;JavaScript&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-API&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#API&#034; class=&#034;spip_ancre&#034;&gt;API&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;!--/sommaire--&gt;&lt;p&gt;&lt;a href='https://www.spip.net/fr_article3784.html' class=&#034;spip_in&#034; hreflang=&#034;fr&#034;&gt;SPIP 2.0&lt;/a&gt; avait apport&#233; les fonctionnalit&#233;s permettant de l'utiliser comme un &#171; framework &#187; pour le d&#233;veloppement d'applications Web, au-del&#224; de sa vocation initiale de simple outil de publication.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SPIP 3&lt;/strong&gt; pousse la logique du &#171; framework &#187; jusqu'&#224; se l'appliquer &#224; lui-m&#234;me : l'ensemble de l'espace priv&#233; de SPIP a &#233;t&#233; recod&#233; en squelettes, sur la base des outils et fonctions propos&#233;s par le langage de squelettes de SPIP.&lt;/p&gt;
&lt;p&gt;Cette remise &#224; plat de l'espace priv&#233; a &#233;t&#233; l'occasion de repenser le fonctionnement des objets &#233;ditoriaux et de normaliser leur usage pour le rendre le plus g&#233;n&#233;rique possible : la plupart des particularit&#233;s historiques de chaque objet (et les exceptions de traitement associ&#233;es dans le code de SPIP) ont &#233;t&#233; gomm&#233;es pour &#234;tre ramen&#233;es &#224; une simple d&#233;claration.&lt;/p&gt;
&lt;p&gt;La cr&#233;ation de nouveaux objets &#233;ditoriaux et la personnalisation des objets existants deviennent ainsi beaucoup plus faciles et plus rapides.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SPIP 3&lt;/strong&gt; ach&#232;ve &#233;galement la d&#233;coupe du logiciel en plugins comme SPIP 2 l'avait amorc&#233; : l'ensemble des fonctionnalit&#233;s propos&#233;es par SPIP 2 repose dor&#233;navant sur un noyau &lt;strong&gt;SPIP 3&lt;/strong&gt; accompagn&#233; de 23 plugins.&lt;/p&gt;
&lt;p&gt;La d&#233;coupe compl&#232;te du noyau a permis de compl&#233;ter ses API et points d'entr&#233;e pour les d&#233;veloppeurs de plugins.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SPIP 3&lt;/strong&gt; se nourrit fortement des d&#233;veloppements de la communaut&#233; SPIP-Zone, et marque une forte inversion : ce n'est plus le noyau qui tire les d&#233;veloppements des plugins, mais les d&#233;veloppements de plugins qui nourrissent l'avanc&#233;e de SPIP par leurs exp&#233;rimentations&lt;span class=&#034;spip_note_ref&#034;&gt; [&lt;a href=&#034;#nb1&#034; class=&#034;spip_note&#034; rel=&#034;appendix&#034; title=&#034;Outre le Porte-plume d&#233;j&#224; int&#233;gr&#233; dans SPIP 2 et qui initiait ce mouvement, (&#8230;)&#034; id=&#034;nh1&#034;&gt;1&lt;/a&gt;]&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;Parmi de nombreuses autres nouveaut&#233;s fonctionnelles, &lt;strong&gt;SPIP 3&lt;/strong&gt; introduit une nouvelle &lt;a href='https://www.spip.net/fr_article5444.html' class=&#034;spip_in&#034; hreflang=&#034;fr&#034;&gt;boucle DATA&lt;/a&gt; qui permet enfin de boucler sur tout type de donn&#233;es et plus seulement sur les tables SQL. Il devient ainsi possible de parcourir soit une &#233;num&#233;ration, soit un &lt;a href='https://www.spip.net/fr_article5443.html' class=&#034;spip_in&#034; hreflang=&#034;fr&#034;&gt;fichier CSV, XML, YAML&lt;/a&gt;... Plus fort encore, la boucle DATA permet directement de boucler sur une URL : il devient possible de parcourir directement une feuille de calcul Google Spreadsheet, un &lt;a href=&#034;http://www.spip-contrib.net/Plugin-iCalendar&#034; class=&#034;spip_out&#034; hreflang=&#034;fr&#034; rel=&#034;external&#034;&gt;calendrier en ligne&lt;/a&gt;, une liste de &lt;a href=&#034;http://zzz.rezo.net/Exemples-de-boucles-YQL.html&#034; class=&#034;spip_out&#034; hreflang=&#034;fr&#034; rel=&#034;external&#034;&gt;vid&#233;os sur Youtube&lt;/a&gt;, des &lt;a href=&#034;http://zzz.rezo.net/Exemples-de-boucles-YQL.html&#034; class=&#034;spip_out&#034; hreflang=&#034;fr&#034; rel=&#034;external&#034;&gt;photos sur Flickr&lt;/a&gt;&#8230; le Web devient votre base de donn&#233;es !&lt;/p&gt;
&lt;p&gt;&lt;a id=&#034;prerequis&#034;&gt;&lt;/a&gt;&lt;br class='autobr' /&gt;
&lt;strong&gt;Pr&#233;requis&lt;/strong&gt; :&lt;br class='autobr' /&gt;
&lt;strong&gt;&lt;span style=&#034;color:#00CAD8&#034;&gt;SPIP 3.0&lt;/span&gt;&lt;/strong&gt; requiert d&#233;sormais au minimum une version 5.1.0 de PHP pour pouvoir fonctionner correctement.&lt;br class='manualbr' /&gt;&lt;strong&gt;Attention :&lt;/strong&gt; SPIP 3.0 n'est pas compatible avec PHP 7.&lt;/p&gt;
&lt;p&gt;&lt;a id=&#034;espaceprive&#034;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;section class=&#034;sommaire-section sommaire-section_niveau1 sommaire-section_h2&#034; aria-labelledby=&#034;Un-nouvel-espace-prive-2&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Un-nouvel-espace-prive-2'&gt;Un nouvel espace priv&#233;&lt;span class=&#034;spip_note_ref&#034;&gt; [&lt;a href=&#034;#nb2&#034; class=&#034;spip_note&#034; rel=&#034;appendix&#034; title=&#034;Ce chantier avait &#233;t&#233; amorc&#233; depuis quelque temps sur la Zone, et celles et (&#8230;)&#034; id=&#034;nh2&#034;&gt;2&lt;/a&gt;]&lt;/span&gt;&lt;a class='sommaire-back sommaire-back-11' href='#s-Un-nouvel-espace-prive-2' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Visuellement, l'espace priv&#233; demeure dans la continuit&#233; des versions pr&#233;c&#233;dentes, compl&#233;t&#233; de nouvelles ic&#244;nes, avec :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; pour les ic&#244;nes principales de navigation, un &lt;a href=&#034;http://sevcommunication.com/De-nouvelles-icones-pour-SPIP-3&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;jeu sp&#233;cifique r&#233;alis&#233; pour SPIP par S&#233;bastien Desbeno&#238;t&lt;/a&gt;,&lt;/li&gt;&lt;li&gt; pour le reste de la page, l'adoption d'un jeu d&#233;riv&#233; de FatCow.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;La refonte de l'interface est essentiellement technique, m&#234;me si elle a &#233;galement permis de r&#233;soudre un certain nombre de d&#233;fauts ergonomiques historiques.&lt;/p&gt;
&lt;p&gt;La navigation principale est repens&#233;e et r&#233;organis&#233;e. Le menu d&#233;roulant, d&#233;sormais enti&#232;rement navigable au clavier, int&#232;gre aussi des temporisations pour faciliter son utilisation &#224; la souris et &#234;tre plus robuste aux mouvements mal contr&#244;l&#233;s.&lt;/p&gt;
&lt;p&gt;L'ensemble de l'espace priv&#233; est donc r&#233;&#233;crit sous forme de squelettes rang&#233;s dans le r&#233;pertoire &lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;prive/squelettes&lt;/code&gt;&lt;/strong&gt; organis&#233;s par sous-dossiers correspondants &#224; un d&#233;coupage de la page en blocs. Ce d&#233;coupage est utilis&#233; notamment pour le rafra&#238;chissement des morceaux de page en Ajax, &#233;vitant le rechargement complet des pages et fluidifiant les interactions&lt;span class=&#034;spip_note_ref&#034;&gt; [&lt;a href=&#034;#nb3&#034; class=&#034;spip_note&#034; rel=&#034;appendix&#034; title=&#034;Par exemple, le passage en &#233;dition sur un article devient instantan&#233; gr&#226;ce (&#8230;)&#034; id=&#034;nh3&#034;&gt;3&lt;/a&gt;]&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;De nombreux points d'entr&#233;e (utilis&#233;s en premier lieu par les plugins du noyau) sont disponibles sous forme de pipeline pour permettre aux plugins d'&#233;tendre les fonctionnalit&#233;s de l'espace priv&#233;.&lt;/p&gt;
&lt;p&gt;Les pages de l'espace priv&#233; sont r&#233;organis&#233;es et renomm&#233;es. En particulier toutes les pages d'objets &#233;ditoriaux utilisent un nommage coh&#233;rent fond&#233; sur le nom de l'objet.&lt;/p&gt;
&lt;p&gt;La r&#233;&#233;criture a &#233;galement permis de remettre &#224; niveau la structure compl&#232;te du HTML et son accessibilit&#233;. Un r&#233;f&#233;rentiel a &#233;t&#233; mis en place pour que les d&#233;veloppeurs de plugins puissent r&#233;utiliser les m&#234;mes structures, et que les ajouts d'interface restent homog&#232;nes avec le noyau.&lt;/p&gt;
&lt;p&gt;Toutes les listes d'objet sont des squelettes qu'il devient facile de personnaliser. Elles b&#233;n&#233;ficient toutes du tri par colonne et de pagination ajax.&lt;/p&gt;
&lt;p&gt;Un syst&#232;me d'&#233;chafaudage des pages d'objet permet de construire automatiquement une interface minimale pour les nouveaux objets d&#233;clar&#233;s par les plugins. Chaque &#233;l&#233;ment de cette interface par d&#233;faut peut ensuite &#234;tre personnalis&#233; en fonction des particularit&#233;s de chaque objet :&lt;span class=&#034;spip_note_ref&#034;&gt; [&lt;a href=&#034;#nb4&#034; class=&#034;spip_note&#034; rel=&#034;appendix&#034; id=&#034;nh4&#034;&gt;4&lt;/a&gt;]&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;Tous les formulaires interactifs sont &#233;crits sous forme de formulaires CVT, ce qui permet d'assurer des interactions de qualit&#233; avec gestion syst&#233;matique des messages d'erreur, v&#233;rification de saisie, ajax robuste &#224; volont&#233;, saisie multipage si n&#233;cessaire&#8230; Ils sont ainsi tous facilement extensibles par les plugins.&lt;/p&gt;
&lt;p&gt;Autre nouveaut&#233;, en mode &#233;dition, SPIP 3 prend en compte le retour &#224; la ligne simple (il n'est d&#233;sormais plus n&#233;cessaire d'utiliser &#171; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;_ &lt;/code&gt; &#187;).&lt;/p&gt;
&lt;p&gt;Enfin, l'espace priv&#233; int&#232;gre un m&#233;canisme technique de th&#232;mes qui permet de personnaliser les feuilles de style ou tout ou partie des ic&#244;nes. Ce m&#233;canisme pourra &#234;tre utilis&#233; par un plugin proposant des variantes activables par chaque utilisateur en fonction de ses pr&#233;f&#233;rences.&lt;/p&gt;
&lt;p&gt;&lt;a id=&#034;plugin&#034;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau1 sommaire-section_h2&#034; aria-labelledby=&#034;Modularisation-en-plugins&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Modularisation-en-plugins'&gt;Modularisation en plugins&lt;a class='sommaire-back sommaire-back-11' href='#s-Modularisation-en-plugins' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;SPIP 3&lt;/strong&gt; ach&#232;ve donc la d&#233;coupe du logiciel en plugins. Son noyau conserve la gestion des articles, rubriques et auteurs ; le langage de squelettes et l'ossature de l'espace priv&#233;. Toutes les autres fonctionnalit&#233;s sont externalis&#233;es dans des plugins, automatiquement install&#233;s dans la distribution par d&#233;faut de &lt;strong&gt;SPIP 3&lt;/strong&gt;. Ces plugins fournis par d&#233;faut sont d&#233;sormais plac&#233;s dans un dossier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;plugins-dist/&lt;/code&gt;&lt;span class=&#034;spip_note_ref&#034;&gt; [&lt;a href=&#034;#nb5&#034; class=&#034;spip_note&#034; rel=&#034;appendix&#034; title=&#034;en SPIP 2.1 ils &#233;taient plac&#233;s dans le dossier d&#233;sormais inutile.&#034; id=&#034;nh5&#034;&gt;5&lt;/a&gt;]&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Cette d&#233;coupe du noyau a permis de compl&#233;ter un certain nombre d'API implicites, maintenant &#224; disposition des d&#233;veloppeurs de plugins qui peuvent ainsi ajouter des fonctionnalit&#233;s sans limite, en prenant mod&#232;le sur les plugins natifs de SPIP.&lt;/p&gt;
&lt;p&gt;Dans le domaine des plugins, &lt;strong&gt;SPIP 3&lt;/strong&gt; am&#232;ne &#233;galement une refonte importante du formalisme de d&#233;claration XML. Outre une lisibilit&#233; am&#233;lior&#233;e, cette &#233;volution int&#232;gre la question des traductions de plugins, ainsi que les outils d'alimentation automatique d'un annuaire des plugins de SPIP et un outil de chargement.&lt;/p&gt;
&lt;p&gt;Par ailleurs, les plugins peuvent b&#233;n&#233;ficier des fonctions de mise &#224; jour de base de donn&#233;es du core (avec reprise sur timeout) par simple d&#233;claration de la proc&#233;dure.&lt;/p&gt;
&lt;p&gt;Les plugins distribu&#233;s par d&#233;faut avec SPIP sont :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;strong&gt;Br&#232;ves&lt;/strong&gt; s'occupe de l'objet &#233;ditorial Br&#232;ves.&lt;/li&gt;&lt;li&gt; &lt;strong&gt;Compagnon&lt;/strong&gt; propose l'affichage de textes p&#233;dagogiques d'information et d'accompagnement lors des premiers acc&#232;s &#224; l'espace priv&#233;.&lt;/li&gt;&lt;li&gt; &lt;strong&gt;Compresseur&lt;/strong&gt; d&#233;j&#224; pr&#233;sent dans SPIP 2.1, prend en charge l'optimisation des performances du site en compressant et concat&#233;nant les feuilles de style CSS et les fichiers JavaScript embarqu&#233;s dans la page. &lt;br class='autobr' /&gt;
Cette version du plugin am&#233;liore des feuilles par m&#233;dia. Utilisation de @media pour concat&#233;ner tous les m&#233;dias en un seul fichier sans en modifier l'ordre de chargement. Gestion des urls absolues sans protocole pour que les feuilles de style compress&#233;es fonctionnent sur http et https.&lt;/li&gt;&lt;li&gt; &lt;strong&gt;Dump&lt;/strong&gt; assure la gestion des sauvegardes et restaurations. La fonctionnalit&#233; a &#233;t&#233; compl&#232;tement r&#233;-&#233;crite pour assurer une sauvegarde compl&#232;te et fiable. Le format de sauvegarde est maintenant SQLite et toutes les tables sont syst&#233;matiquement conserv&#233;es. Votre h&#233;bergement doit donc disposer de SQLite. Si ce n'est pas le cas, r&#233;alisez vos sauvegardes via phpmyadmin ou toute autre interface de gestion de la base de donn&#233;es fournie par votre h&#233;bergeur.&lt;/li&gt;&lt;li&gt; &lt;strong&gt;Forum&lt;/strong&gt; g&#232;re l'objet &#233;ditorial &lt;i&gt;forum&lt;/i&gt;, tant pour le site public que pour les interactions &#233;ditoriales dans l'espace priv&#233;. Outre une interface de mod&#233;ration repens&#233;e, les forums sont maintenant utilisables sur tous les objets &#233;ditoriaux de SPIP (natifs ou ajout&#233;s par des plugins).&lt;/li&gt;&lt;li&gt; &lt;strong&gt;Images&lt;/strong&gt;, d&#233;j&#224; dans SPIP 2.1, prend en charge tous les filtres d'images et de couleurs dans les squelettes.&lt;/li&gt;&lt;li&gt; &lt;strong&gt;jQuery UI&lt;/strong&gt; impl&#233;mente dans SPIP la librairie compl&#233;mentaire. jQuery UI facilite la cr&#233;ation de composants graphiques dynamiques : onglets, drag &amp; drop, barres de progression, widgets, effets&#8230;&lt;span class=&#034;spip_note_ref&#034;&gt; [&lt;a href=&#034;#nb6&#034; class=&#034;spip_note&#034; rel=&#034;appendix&#034; title=&#034;Voir le pipeline associ&#233; sur programmer.spip.org&#034; id=&#034;nh6&#034;&gt;6&lt;/a&gt;]&lt;/span&gt;&lt;/li&gt;&lt;li&gt; &lt;strong&gt;Mediabox&lt;/strong&gt; int&#232;gre dans SPIP par d&#233;faut une bo&#238;te &lt;i&gt;pop-in&lt;/i&gt; pour visualiser les m&#233;dias ou proposer des interactions&lt;span class=&#034;spip_note_ref&#034;&gt; [&lt;a href=&#034;#nb7&#034; class=&#034;spip_note&#034; rel=&#034;appendix&#034; title=&#034;C'est une alternative aux plugin Thickbox, LightBox... qui repose sur la (&#8230;)&#034; id=&#034;nh7&#034;&gt;7&lt;/a&gt;]&lt;/span&gt;.&lt;/li&gt;&lt;li&gt; &lt;strong&gt;Medias&lt;span class=&#034;spip_note_ref&#034;&gt; [&lt;a href=&#034;#nb8&#034; class=&#034;spip_note&#034; rel=&#034;appendix&#034; title=&#034;Connu pour SPIP 2 sous le nom &#034;M&#233;diath&#232;que&#034;&#034; id=&#034;nh8&#034;&gt;8&lt;/a&gt;]&lt;/span&gt;&lt;/strong&gt; prend en charge la gestion des documents et images. Il propose une refonte de l'interface et rend les documents utilisables sur n'importe quel objet &#233;ditorial.&lt;/li&gt;&lt;li&gt; &lt;strong&gt;Mots&lt;/strong&gt; apporte la gestion des mots-cl&#233;s et groupes de mots. Les mots-cl&#233;s sont maintenant utilisables sur tous les objets &#233;ditoriaux.&lt;/li&gt;&lt;li&gt; &lt;strong&gt;Organiseur&lt;/strong&gt; assure les fonctions de messagerie et calendrier interne de l'espace priv&#233;. L'interface est compl&#232;tement refondue. La messagerie interne b&#233;n&#233;ficie de notification par email, et le calendrier repose sur la librairie FullCalendar qui permet une navigation fluide.&lt;/li&gt;&lt;li&gt; &lt;strong&gt;P&#233;titions&lt;/strong&gt; g&#232;re les p&#233;titions sur les articles et propose une interface de mod&#233;ration repens&#233;e.&lt;/li&gt;&lt;li&gt; &lt;strong&gt;Porte plume&lt;/strong&gt;, d&#233;j&#224; dans SPIP 2.1, assure l'aide &#224; la saisie.&lt;/li&gt;&lt;li&gt; &lt;strong&gt;R&#233;visions&lt;/strong&gt; assure le versionage utilisable sur tous les objets &#233;ditoriaux de SPIP. L'interface de gestion des r&#233;visions est modernis&#233;e.&lt;/li&gt;&lt;li&gt; &lt;strong&gt;SafeHTML&lt;/strong&gt;, d&#233;j&#224; dans SPIP 2.1, prend en charge la s&#233;curisation des contenus externes potentiellement dangereux.&lt;/li&gt;&lt;li&gt; &lt;strong&gt;Sites&lt;/strong&gt; assure le fonctionnement de l'objet &#233;ditorial &#171; Site syndiqu&#233; &#187; ainsi que des articles syndiqu&#233;s. Une interface de mod&#233;ration des articles syndiqu&#233;s est propos&#233;e.&lt;/li&gt;&lt;li&gt; &lt;strong&gt;Squelettes par rubriques&lt;/strong&gt; assure le fonctionnement des squelettes suffix&#233;s (article-2.html pour les articles de la rubrique 2 et de ses sous-rubriques).&lt;/li&gt;&lt;li&gt; &lt;strong&gt;Statistiques&lt;/strong&gt; assure le calcul des statistiques du site et des articles, et propose un affichage compl&#232;tement refondu.&lt;/li&gt;&lt;li&gt; &lt;strong&gt;Support vieux navigateur&lt;/strong&gt;, d&#233;j&#224; dans SPIP 2.1, propose des fonctions JavaScript activables pour permettre aux vieilles versions de navigateurs d'afficher correctement votre site.&lt;/li&gt;&lt;li&gt; &lt;strong&gt;Svp&lt;/strong&gt; permet la gestion compl&#232;te des plugins : installation, activation, mise &#224; jour, recherche&#8230;&lt;/li&gt;&lt;li&gt; &lt;strong&gt;Textwheel&lt;/strong&gt; est un moteur typographique qui supporte int&#233;gralement les raccourcis de SPIP, d&#233;crits d&#233;sormais dans un fichier de r&#232;gles au format YAML. Ce moteur permet une nette acc&#233;l&#233;ration du traitement des raccourcis (jusqu'&#224; 2 fois plus rapide sur certains contenus), et facilite l'&#233;volution et la personnalisation des raccourcis.&lt;/li&gt;&lt;li&gt; &lt;strong&gt;Urls &#201;tendues&lt;/strong&gt; supporte les URLs propres ou arborescentes, et propose une interface de configuration ainsi qu'une interface de gestion avanc&#233;e optionnelle pour g&#233;rer finement les URLs de chaque page.&lt;/li&gt;&lt;li&gt; &lt;strong&gt;Vert&#232;bres&lt;/strong&gt;, d&#233;j&#224; dans SPIP 2.1, permet au webmestre d'afficher le contenu d'une table SQL de SPIP au moyen d'un squelette g&#233;n&#233;r&#233; automatiquement d'apr&#232;s la structure SQL de la table. Cet affichage se fait maintenant dans l'espace priv&#233;.&lt;/li&gt;&lt;/ul&gt;&lt;/section&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau1 sommaire-section_h2&#034; aria-labelledby=&#034;Nouveaux-squelettes-par-defaut&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Nouveaux-squelettes-par-defaut'&gt;Nouveaux squelettes par d&#233;faut&lt;a class='sommaire-back sommaire-back-11' href='#s-Nouveaux-squelettes-par-defaut' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Les squelettes par d&#233;faut ont &#233;t&#233; r&#233;vis&#233;s, avec un nouvel habillage graphique, pour marquer le coup. Ils adoptent une nouvelle &lt;a href=&#034;http://romy.tetue.net/826&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;structure HTML de base&lt;/a&gt; qui anticipe le HTML5, &#171; responsive &#187; par d&#233;faut, et embarquent des &lt;a href=&#034;http://romy.tetue.net/837&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;s&#233;lecteurs conditionnels&lt;/a&gt; pour plus de souplesse CSS.&lt;/p&gt;
&lt;p&gt;Par la r&#233;partition en plusieurs feuilles de styles utilisables ind&#233;pendamment, &#224; la carte (selon la &lt;a href=&#034;http://romy.tetue.net/817&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;m&#233;thode Daisy&lt;/a&gt;, voir &lt;a href=&#034;http://spip-blog.net/703&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Un, deux, trois&#8230; feuilles CSS !&lt;/a&gt;), ils constituent d&#233;sormais un cadre d'int&#233;gration modulaire. Ils posent notamment une base typographique compl&#232;te et harmonieuse, imm&#233;diatement utilisable pour d&#233;marrer un site. L'historique &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;spip_style.css&lt;/code&gt; dispara&#238;t au profit de &lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;spip.css&lt;/code&gt;&lt;/strong&gt;, feuille indispensable, &#224; utiliser en compl&#233;ment de vos styles habituels.&lt;/p&gt;
&lt;p&gt;&lt;a id=&#034;fonctionnalites&#034;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau1 sommaire-section_h2&#034; aria-labelledby=&#034;De-nouvelles-fonctionnalites&#034;&gt;&lt;h2 class=&#034;h2&#034; id='De-nouvelles-fonctionnalites'&gt;De nouvelles fonctionnalit&#233;s&lt;a class='sommaire-back sommaire-back-11' href='#s-De-nouvelles-fonctionnalites' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Le support de SQLite a &#233;t&#233; nettement am&#233;lior&#233;, et c'est le format de base de donn&#233;es propos&#233; par d&#233;faut lors d'une nouvelle installation (quand il est support&#233; par le serveur), compte tenu de sa simplicit&#233; de mise en &#339;uvre&lt;span class=&#034;spip_note_ref&#034;&gt; [&lt;a href=&#034;#nb9&#034; class=&#034;spip_note&#034; rel=&#034;appendix&#034; title=&#034;en revanche le support de PostGreSQL doit &#234;tre consid&#233;r&#233; comme exp&#233;rimental (&#8230;)&#034; id=&#034;nh9&#034;&gt;9&lt;/a&gt;]&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;La gestion des objets &#233;ditoriaux est g&#233;n&#233;ralis&#233;e. Par suite, les auteurs, documents, mots-cl&#233;s, forums, r&#233;visions et logos sont utilisables sur n'importe quel objet (tous ceux de SPIP mais aussi tout objet &#233;ditorial ajout&#233; par un plugin avec la nouvelle API de d&#233;claration). &lt;br class='autobr' /&gt;
La gestion du statut, de la date de publication, de la langue et de la traduction est &#233;galement g&#233;n&#233;ralis&#233;e et utilisable sur tout objet par simple d&#233;claration.&lt;br class='autobr' /&gt;
Lorsque le signalement de l'&#233;dition concourante est activ&#233;, tout objet &#233;dit&#233; est d&#233;sormais pris en compte dans le signalement.&lt;/p&gt;
&lt;p&gt;L'identit&#233; du site est compl&#233;t&#233;e d'un slogan du site, entre titre et descriptif long, utilisable avec la balise &lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#SLOGAN_SITE_SPIP&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;L'&#233;cran de s&#233;curit&#233; est int&#233;gr&#233; en standard.&lt;/p&gt;
&lt;p&gt;Les logs (fichiers de trace) b&#233;n&#233;ficient d'une gestion par niveau d'importance. Par d&#233;faut, les logs sont beaucoup moins verbeux en production et ne signalent que les anomalies ou informations importantes. &lt;a href='https://www.spip.net/fr_article5543.html' class=&#034;spip_in&#034;&gt;Le niveau de log peut &#234;tre ajust&#233;&lt;/a&gt; pour le debug ou le d&#233;veloppement, permettant ainsi d'avoir toutes les informations n&#233;cessaires.&lt;/p&gt;
&lt;p&gt;Le cron p&#233;riodique qui reposait sur des fichiers a &#233;t&#233; supprim&#233; au profit d'une file de t&#226;ches en attente (qui g&#232;re aussi les t&#226;ches p&#233;riodiques). Cette file de t&#226;ches permet de programmer des actions asynchrones&lt;span class=&#034;spip_note_ref&#034;&gt; [&lt;a href=&#034;#nb10&#034; class=&#034;spip_note&#034; rel=&#034;appendix&#034; title=&#034;Par exemple, pour l'envoi d'un mail &#034;d&#232;s que possible&#034; qui permet de rendre (&#8230;)&#034; id=&#034;nh10&#034;&gt;10&lt;/a&gt;]&lt;/span&gt; et propose une API simple d'utilisation pour les d&#233;veloppeurs de plugin.&lt;/p&gt;
&lt;p&gt;L'ajax des squelettes (&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{ajax}&lt;/code&gt; sur les &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;INCLURE&lt;/code&gt;) b&#233;n&#233;ficie d'une prise en charge des attributs ARIA pour am&#233;liorer son accessibilit&#233;. De plus, l'historique de navigation est aussi automatiquement pris en charge gr&#226;ce &#224; l'API &#171; History &#187; de HTML5&lt;span class=&#034;spip_note_ref&#034;&gt; [&lt;a href=&#034;#nb11&#034; class=&#034;spip_note&#034; rel=&#034;appendix&#034; title=&#034;dans tous les navigateurs modernes &#224; l'exception de Internet Explorer qui ne (&#8230;)&#034; id=&#034;nh11&#034;&gt;11&lt;/a&gt;]&lt;/span&gt;. L'URL du navigateur est donc mise &#224; jour automatiquement sur les liens ajax, et permet les retours en arri&#232;re sans soucis.&lt;/p&gt;
&lt;p&gt;Les mod&#232;les utilis&#233;s dans du texte &#233;ditorial re&#231;oivent automatiquement l'environnement du squelette dans lequel est affich&#233; le texte&lt;span class=&#034;spip_note_ref&#034;&gt; [&lt;a href=&#034;#nb12&#034; class=&#034;spip_note&#034; rel=&#034;appendix&#034; title=&#034;Voir Utiliser les mod&#232;les&#034; id=&#034;nh12&#034;&gt;12&lt;/a&gt;]&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;Les formulaires des l'espace priv&#233; utilisent les possibilit&#233;s de HTML5 avec par exemple les attributs &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;required&lt;/code&gt; ou &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;placeholder&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a id=&#034;echapper&#034;&gt;&lt;/a&gt;Les squelettes peuvent maintenant &#233;chapper les caract&#232;res &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;# [ ] ( ) { } &lt; &gt;&lt;/code&gt; en utilisant une barre oblique &lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;\&lt;/code&gt;&lt;/strong&gt;. Il devient possible d'&#233;crire des conditions par exemple sur une case &#224; cocher de formulaire de mani&#232;re bien plus &#233;l&#233;gante, sans que les crochets de l'attribut &lt;i&gt;name&lt;/i&gt; n'interf&#232;rent avec les crochets de la balise englobante :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;spip&#034; class='spip_code spip_code_block language-spip' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;[(#ENV{param}|oui) &lt;label for='tendresse'&gt;Avec tendresse ?&lt;/label&gt; &lt;input type='checkbox' name='avec_quoi\[\]' id='tendresse' checked='checked' value='tendresse' /&gt; ] &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;a id=&#034;raccourcis&#034;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau1 sommaire-section_h2&#034; aria-labelledby=&#034;Raccourcis&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Raccourcis'&gt;Raccourcis&lt;a class='sommaire-back sommaire-back-11' href='#s-Raccourcis' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Un raccourci pour les abr&#233;viations a &#233;t&#233; introduit nativement : &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;[SNCF|Soci&#233;t&#233; Nationale des Chemins de fer Fran&#231;ais]&lt;/code&gt; (ou &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;[CMS|Content Management System{en}]&lt;/code&gt;) pour indiquer une langue diff&#233;rente du texte principal) g&#233;n&#232;re une balise &lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;abbr&lt;/code&gt;&lt;/strong&gt;&lt;span class=&#034;spip_note_ref&#034;&gt; [&lt;a href=&#034;#nb13&#034; class=&#034;spip_note&#034; rel=&#034;appendix&#034; title=&#034;La balise &lt;acronym&gt; n'est plus utilis&#233;e en HTML5.&#034; id=&#034;nh13&#034;&gt;13&lt;/a&gt;]&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;Les mod&#232;les de document peuvent prendre en argument la largeur ou la hauteur pour r&#233;duire leur dimension : &lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;docxx|largeur=150&gt;&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Les tableaux &#224; 2 entr&#233;es (horizontale et verticale) sont d&#233;sormais g&#233;r&#233;s correctement.&lt;/p&gt;
&lt;p&gt;Il n'est d&#233;sormais plus n&#233;cessaire d'utiliser le raccourci &#171; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;_ &lt;/code&gt; &#187; pour produire un retour ligne simple.&lt;br class='autobr' /&gt;
Pour retrouver le fonctionnement ant&#233;rieur, ce nouveau comportement est d&#233;brayable en utilisant un &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;define('_AUTOBR', '');&lt;/code&gt; dans son fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;mes_options.php&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a id=&#034;boucles&#034;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau1 sommaire-section_h2&#034; aria-labelledby=&#034;Boucles&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Boucles'&gt;Boucles&lt;a class='sommaire-back sommaire-back-11' href='#s-Boucles' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Le syst&#232;me de boucles de SPIP a &#233;t&#233; g&#233;n&#233;ralis&#233; pour s'appliquer non plus directement sur une table SQL mais sur un it&#233;rateur. Un it&#233;rateur SQL assure le fonctionnement historique des boucles sur les tables SQL, mais il devient possible de boucler sur toute donn&#233;e it&#233;rable : &lt;a href='https://www.spip.net/fr_article5444.html' class=&#034;spip_in&#034; hreflang=&#034;fr&#034;&gt;Les it&#233;rateurs de SPIP - la boucle (DATA)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Premier exemple de nouvelle application : la boucle &lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;DATA&lt;/code&gt;&lt;/strong&gt; &#233;tend le fonctionnement des boucles &#224; toute information structur&#233;e sous forme de tableau. Il devient possible de boucler sur un fichier CSV, sur une url distante qui renvoie une information en JSON... :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;a href='https://www.spip.net/fr_article5443.html' class=&#034;spip_in&#034; hreflang=&#034;fr&#034;&gt;Exemples de `BOUCLE(DATA)`&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;http://zzz.rezo.net/La-boucle-iCalendar.html&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;http://zzz.rezo.net/La-boucle-iCalendar.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;http://zzz.rezo.net/Exemples-de-boucles-YQL.html&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;http://zzz.rezo.net/Exemples-de-boucles-YQL.html&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Pour assurer la migration facile des squelettes qui utilisaient des boucles &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;POUR&lt;/code&gt; et &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;CONDITION&lt;/code&gt;, celles-ci sont &#233;galement support&#233;es comme cas particuliers de la boucle &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;DATA&lt;/code&gt;, dans la m&#234;me syntaxe que celle qui existait.&lt;/p&gt;
&lt;p&gt;&lt;a id=&#034;criteres&#034;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau1 sommaire-section_h2&#034; aria-labelledby=&#034;Criteres&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Criteres'&gt;Crit&#232;res&lt;a class='sommaire-back sommaire-back-11' href='#s-Criteres' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{si ...}&lt;/code&gt;&lt;/strong&gt; : permet de conditionner l'ex&#233;cution d'une boucle &#224; la condition exprim&#233;e dans le crit&#232;re, qui ne d&#233;pend pas des donn&#233;es en base mais du contexte du squelette.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{tri ...}&lt;/code&gt;&lt;/strong&gt; : associ&#233; &#224; la balise &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#TRI&lt;/code&gt; &lt;a href='https://www.spip.net/fr_article5429.html' class=&#034;spip_in&#034; hreflang=&#034;fr&#034;&gt;pour des tris faciles&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{feuille}&lt;/code&gt;&lt;/strong&gt; : permet de s&#233;lectionner les rubriques sans enfants (celles tout en bas de la hi&#233;rarchie).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{noeud}&lt;/code&gt;&lt;/strong&gt; : permet de s&#233;lectionner les rubriques qui ont des enfants.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{!racine}&lt;/code&gt;&lt;/strong&gt; : exclut les rubriques de la racine.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{profondeur=3}&lt;/code&gt;&lt;/strong&gt; : permet de s&#233;lectionner les rubriques du 3e niveau (les rubriques secteurs sont le niveau 0, puis les rubriques du dessous le niveau 1 etc.).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{id_parent}&lt;/code&gt;&lt;/strong&gt; voit son comportement modifi&#233; en l'absence de boucle &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;RUBRIQUES&lt;/code&gt; englobante : auparavant, &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;id_parent&lt;/code&gt; prenait le &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;id_rubrique&lt;/code&gt; de contexte (&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#ENV{id_rubrique}&lt;/code&gt;), d&#233;sormais &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{id_parent}&lt;/code&gt; prend le &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;id_parent&lt;/code&gt; de contexte (&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#ENV{id_parent}&lt;/code&gt;). En cons&#233;quent, on peut d&#233;sormais &#233;crire &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{id_parent}&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Pour migrer un boucle utilisant &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{id_parent}&lt;/code&gt; on peut :
&lt;br /&gt;- passer un contexte &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;id_parent&lt;/code&gt;.
&lt;br /&gt;- utiliser &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{id_parent ?}{id_rubrique ?}&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a id=&#034;balise&#034;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau1 sommaire-section_h2&#034; aria-labelledby=&#034;Balises&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Balises'&gt;Balises&lt;a class='sommaire-back sommaire-back-11' href='#s-Balises' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Les mod&#232;les peuvent avoir un cache s'ils contiennent une balise &lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#CACHE&lt;/code&gt;&lt;/strong&gt; (mais par d&#233;faut ils n'en ont pas, comme auparavant).&lt;/p&gt;
&lt;p&gt;Dans l'espace priv&#233;, les squelettes n'ont pas de cache non plus, sauf si une balise &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#CACHE&lt;/code&gt; est pr&#233;sente.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#LOGO_DOCUMENT&lt;/code&gt;&lt;/strong&gt; peut prendre en argument le mode d'affichage du logo :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;i&gt;auto&lt;/i&gt; (par d&#233;faut, et c'est le fonctionnement historique) affiche automatiquement la vignette du document si existante, sinon un aper&#231;u ; et sinon l'ic&#244;ne correspondant au type de document.&lt;/li&gt;&lt;li&gt; &lt;i&gt;icone&lt;/i&gt; indique que c'est l'ic&#244;ne correspondant au type du fichier qui doit &#234;tre affich&#233;e&lt;/li&gt;&lt;li&gt; &lt;i&gt;apercu&lt;/i&gt; affiche un aper&#231;u de l'image exclusivement, m&#234;me si une vignette existe.&lt;/li&gt;&lt;li&gt; &lt;i&gt;vignette&lt;/i&gt; affiche la vignette du document si elle existe, ou sinon rien.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;La balise &lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#SPIP_CRON&lt;/code&gt;&lt;/strong&gt; dispara&#238;t et n'a plus d'effet dans les squelettes o&#249; elle serait encore utilis&#233;e.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#BOUTON_ACTION{libell&#233;, url, classe, confirm, title, callback}&lt;/code&gt;&lt;/strong&gt; g&#233;n&#232;re un mini formulaire HTML avec un seul bouton qui affiche &#171; &lt;i&gt;libell&#233;&lt;/i&gt; &#187; et d&#233;clenche au clic un POST vers &#171; &lt;i&gt;url&lt;/i&gt; &#187;. Cette balise est &#224; utiliser de pr&#233;f&#233;rence &#224; un lien quand la page &#171; &lt;i&gt;url&lt;/i&gt; &#187; modifie la base de donn&#233;es. Si la &#171; &lt;i&gt;classe&lt;/i&gt; &#187; contient la valeur &#171; &lt;i&gt;ajax&lt;/i&gt; &#187; le bouton d&#233;clenchera un rechargement du bloc ajax qui l'inclue. &#171; &lt;i&gt;confirm&lt;/i&gt; &#187; permet d'indiquer un message pour faire confirmer l'action par l'utilisateur, &#171; &lt;i&gt;title&lt;/i&gt; &#187; le contenu de l'attribut homonyme sur le bouton, et &#171; &lt;i&gt;callback&lt;/i&gt; &#187; une fonction javascript &#224; appeler lors du clic sur le bouton.&lt;/p&gt;
&lt;p&gt;&lt;a id=&#034;info_xxx&#034;&gt;&lt;/a&gt;&lt;br class='autobr' /&gt;
&lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#INFO_XXX{article, 13}&lt;/code&gt;&lt;/strong&gt; : permet de retrouver le &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#XXX&lt;/code&gt; sans faire une boucle &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;ARTICLES&lt;/code&gt; sur l'article &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;13&lt;/code&gt; (utilisable pour toute boucle et tout champ de la boucle : &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#INFO_TITRE{article,13}&lt;/code&gt;, &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#INFO_NOM{auteur,2}&lt;/code&gt;...)&lt;/p&gt;
&lt;p&gt;&lt;a id=&#034;CONFIG&#034;&gt;&lt;/a&gt;&lt;br class='autobr' /&gt;
&lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#CONFIG{nom}&lt;/code&gt;&lt;/strong&gt; permet d'afficher la valeur de la meta de configuration &lt;i&gt;nom&lt;/i&gt;.&lt;br class='autobr' /&gt;
Si la meta est un tableau, il est possible d'acc&#233;der directement &#224; des sous valeurs avec la syntaxe &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#CONFIG{nom/sousvaleur}&lt;/code&gt; qui renverra la &lt;i&gt;sousvaleur&lt;/i&gt; de la meta &lt;i&gt;nom&lt;/i&gt;.&lt;br class='autobr' /&gt;
Pour acc&#233;der &#224; la meta d'une table sp&#233;cifique &#224; un plugin, il faut utiliser la syntaxe &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#CONFIG{/metamonplugin/nom}&lt;/code&gt; : en commen&#231;ant par un &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/&lt;/code&gt;, on indique que l'on veut la meta nom de la table spip_metamonplugin au lieu de la table spip_meta de SPIP.&lt;br class='autobr' /&gt;
Dans tous les cas, il est possible d'indiquer en second argument la valeur par d&#233;faut qui doit &#234;tre utilis&#233;e si la meta n'existe pas encore : &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#CONFIG{nom,valeurpardefaut}&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&#192; l'instar de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#CONFIG{nom/sousvaleur}&lt;/code&gt; les balises &lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#ENV&lt;/code&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#GET&lt;/code&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#SESSION&lt;/code&gt;&lt;/strong&gt; permettent d'utiliser des barres obliques pour obtenir des sous valeurs de tableau tel que :&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#ENV{nom/sousvaleur}&lt;/code&gt;, &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#GET{tableau/cle/souscle}&lt;/code&gt;, &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#SESSION{prefs/couleur}&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#PUBLIE&lt;/code&gt;&lt;/strong&gt; : pour tester l'&#233;tat (publi&#233; ou non) d'un objet. S'utilise dans une boucle, porte implicitement sur l'objet en cours ou avec des arguments explicites : &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;[(#PUBLIE{article, 3}|oui) ... ]&lt;/code&gt;, sur tout autre objet.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#CLE&lt;/code&gt;&lt;/strong&gt; et &lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#VALEUR&lt;/code&gt;&lt;/strong&gt; sont les deux balises qui permettent d'afficher la cl&#233; et la valeur dans une boucle &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;DATA&lt;/code&gt;&lt;br class='autobr' /&gt;
&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#VALEUR{x}&lt;/code&gt; permet d'afficher la sous valeur de x si &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#VALEUR&lt;/code&gt; est un tableau (&#233;quivalent &#224; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;[(#VALEUR|table_valeur{x})]&lt;/code&gt;). On peut encha&#238;ner plusieurs sous index &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#VALEUR{x/y/z}&lt;/code&gt; pour afficher une valeur dans un sous-niveau du tableau.&lt;/p&gt;
&lt;p&gt;&lt;a id=&#034;PRODUIRE&#034;&gt;&lt;/a&gt;&lt;br class='autobr' /&gt;
&lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#PRODUIRE&lt;/code&gt;&lt;/strong&gt; : renvoie le nom d'un fichier statique produit &#224; partir d'un squelette. Utile pour une feuille de style calcul&#233;e ou un fichier javascript calcul&#233;. La syntaxe est la m&#234;me que pour la balise &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#INCLURE&lt;/code&gt; : &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#PRODUIRE{fond=mafeuille.css,couleur=ffffff}&lt;/code&gt; pour utiliser le squelette &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;mafeuille.css.html&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;a id=&#034;LISTE&#034;&gt;&lt;/a&gt;&lt;br class='autobr' /&gt;
&lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#LISTE{a,b,c}&lt;/code&gt;&lt;/strong&gt; renvoie simplement un tableau contenant les valeurs a,b et c. C'est une &#233;criture simplifi&#233;e de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#ARRAY{0,a,1,b,2,c}&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#TOTAL_UNIQUE&lt;/code&gt;&lt;/strong&gt; renvoie le nombre d'&#233;l&#233;ments affich&#233;s par l'interm&#233;diaire du filtre &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;|unique&lt;/code&gt;. Si on utilise &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;|unique{nom}&lt;/code&gt;, il faut faire r&#233;f&#233;rence au m&#234;me nom dans la balise : &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#TOTAL_UNIQUE{nom}&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;Dans l'espace priv&#233; :&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#AIDER{surtitre}&lt;/code&gt;&lt;/strong&gt; permet d'afficher un lien vers la section &lt;i&gt;surtitre&lt;/i&gt; de l'aide de SPIP.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#BOITE_OUVRIR&lt;/code&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#BOITE_PIED&lt;/code&gt;&lt;/strong&gt; et &lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#BOITE_FERMER&lt;/code&gt;&lt;/strong&gt; permettent d'utiliser les boites styl&#233;es de l'espace priv&#233; :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#BOITE_OUVRIR{titre,classe}&lt;/code&gt; ouvre une bo&#238;te. le &lt;i&gt;titre&lt;/i&gt; peut &#234;tre omis. Les classes styl&#233;es dans l'espace priv&#233; sont : simple, info, note, raccourcis et important ;&lt;/li&gt;&lt;li&gt; le HTML qui suit est inclus dans la bo&#238;te ;&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#BOITE_PIED&lt;/code&gt; permet de passer au pied de la bo&#238;te quand un pied est n&#233;cessaire.&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#BOITE_FERMER&lt;/code&gt; ferme la bo&#238;te.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Pour de nombreux exemples, voir la page de l'espace priv&#233; &lt;i&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;ecrire/?exec=charte_boites&lt;/code&gt;&lt;/i&gt; propos&#233;e par le plugin &lt;a href=&#034;http://plugins.spip.net/dev&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;http://plugins.spip.net/dev&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#FORMULAIRE_RECHERCHE_ECRIRE&lt;/code&gt;&lt;/strong&gt; affiche le formulaire de recherche de l'espace priv&#233;. On peut lui indiquer en premier argument l'url vers laquelle il doit pointer, et une classe en second argument. En pr&#233;sence de javascript le formulaire se comporte comme un lien vers url avec le param&#232;tre recherche fourni par la saisie. Si on indique la classe ajax en second argument, le formulaire provoque le rechargement du bloc ajax incluant, comme un lien ajax donc : &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#FORMULAIRE_RECHERCHE_ECRIRE{#SELF, ajax}&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#CHEMIN_IMAGE{article-24.png}&lt;/code&gt;&lt;/strong&gt; renvoie le chemin vers l'ic&#244;ne article-24.png du th&#232;me de l'espace priv&#233; en cours d'utilisation par l'auteur connect&#233;.&lt;/p&gt;
&lt;p&gt;&lt;a id=&#034;filtres&#034;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau1 sommaire-section_h2&#034; aria-labelledby=&#034;Filtres&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Filtres'&gt;Filtres&lt;a class='sommaire-back sommaire-back-11' href='#s-Filtres' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;|lien_ou_expose&lt;/code&gt;&lt;/strong&gt; permet de construire simplement un menu de plusieurs liens en exposant celui qui est s&#233;lectionn&#233; par un &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;strong&gt;&lt;/code&gt; et en gardant un lien &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;a&gt;&lt;/code&gt; sinon. Exemple : &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;[(#URL_PAGE{mapage}|lien_ou_expose{libelle, #ENV{page}|=={mapage}, classe, title, rel})]&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;|singulier_ou_pluriel&lt;/code&gt;&lt;/strong&gt; affiche une cha&#238;ne ou une autre en fonction du nombre sur lequel il est appliqu&#233; : &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;[(#TOTAL_BOUCLE|singulier_ou_pluriel{1_article,nb_articles})]&lt;/code&gt;. &lt;i&gt;1_article&lt;/i&gt; et &lt;i&gt;nb_articles&lt;/i&gt; sont des cha&#238;nes de langue qui re&#231;oivent le nombre en argument &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;@nb@&lt;/code&gt;. Si le nombre est z&#233;ro, le filtre n'affiche rien.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;|balise_img&lt;/code&gt;&lt;/strong&gt; permet de construire rapidement une balise HTML &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;img&gt;&lt;/code&gt; &#224; partir d'un nom de fichier en renseignant syst&#233;matiquement le width et le height pour acc&#233;l&#233;rer le rendu de la page : &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;[(#CHEMIN{monimage.png}|balise_img{alt,class})]&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;|affdate_debut_fin&lt;/code&gt;&lt;/strong&gt; affiche sous forme sympathique un intervalle de temps entre une date de d&#233;but et une date de fin, en prenant en compte le fait que la date de d&#233;but et la date de fin sont ou non le m&#234;me jour, le m&#234;me mois, la m&#234;me ann&#233;e, et en prenant en compte l'affichage de l'heure ou non (second argument, &lt;i&gt;oui&lt;/i&gt; ou &lt;i&gt;non&lt;/i&gt;). Exemple :&lt;br class='autobr' /&gt;
&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;[(#DATE_DEBUT|affdate_debut_fin{#DATE_FIN,horaire})]&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;|timestamp&lt;/code&gt;&lt;/strong&gt; ajoute au nom d'un fichier un horodatage sous la forme ?1234567890 o&#249; le nombre repr&#233;sente la date du fichier compt&#233; en secondes depuis le 1er janvier 1970. Ce filtre est utile pour r&#233;f&#233;rencer par exemple des feuilles de styles en s'assurant que le navigateur les rechargera quand leur url change :&lt;br class='autobr' /&gt;
&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;[&lt;link rel=&#034;stylesheet&#034; href=&#034;(#CHEMIN{css/perso.css}|timestamp)&#034; type=&#034;text/css&#034; /&gt;]&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;|objet_icone&lt;/code&gt;&lt;/strong&gt; renvoie l'ic&#244;ne standard d'un objet de SPIP. Par d&#233;faut, la taille 24px est renvoy&#233;e sauf si la taille 16 ou 32 est demand&#233;e en argument : &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;[(#OBJET|objet_icone{16})]&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;|objet_info&lt;/code&gt;&lt;/strong&gt; renvoie une propri&#233;t&#233; d'un objet de SPIP telle que d&#233;clar&#233;e (ou automatiquement renseign&#233;e par SPIP) via l'API &lt;i&gt;declarer_tables_objets_sql&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;|objet_afficher_nb&lt;/code&gt;&lt;/strong&gt; affiche le nombre d'objets en prenant en compte le nombre auquel le filtre s'applique et les cha&#238;nes de langue d&#233;clar&#233;es pour l'objet : &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;[(#TOTAL_BOUCLE|objet_afficher_nb{auteur})]&lt;/code&gt; affichera par exemple &lt;i&gt;1 auteur&lt;/i&gt; ou &lt;i&gt;23 auteurs&lt;/i&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;|wrap&lt;/code&gt;&lt;/strong&gt; encadre un texte d'une balise html : &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;[(#TITRE|wrap{&lt;h3&gt;})]&lt;/code&gt; produit le m&#234;me r&#233;sultat que &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;[&lt;h3&gt;(#TITRE)&lt;/h3&gt;]&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;|generer_info_entite&lt;/code&gt;&lt;/strong&gt; affiche le champ d'un objet SPIP : &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;[(#ID_ARTICLE|generer_info_entite{article,titre})]&lt;/code&gt; renvoie le titre mis en forme de l'article &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#ID_ARTICLE&lt;/code&gt;. C'est &#233;quivalent ici &#224; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;[(#INFO_TITRE{article,#ID_ARTICLE})]&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;i&gt;Dans l'espace priv&#233; :&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;|icone_horizontale&lt;/code&gt;&lt;/strong&gt; affiche une ic&#244;ne de l'espace priv&#233; au format horizontal. La syntaxe est : &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;[(#URL|icone_horizontale{libelle,icone,fonction})]&lt;/code&gt;. &lt;i&gt;icone&lt;/i&gt; peut &#234;tre d&#233;sign&#233; en abr&#233;g&#233; (&lt;i&gt;article&lt;/i&gt;) et sera alors au format 24px ou explicitement (&lt;i&gt;article-24.png&lt;/i&gt;). Le 3&#232;me argument &lt;i&gt;fonction&lt;/i&gt; pr&#233;cise une famille d'action associ&#233;e &#224; l'ic&#244;ne et peut &#234;tre au choix &lt;i&gt;add&lt;/i&gt;, &lt;i&gt;del&lt;/i&gt;, &lt;i&gt;edit&lt;/i&gt;, &lt;i&gt;new&lt;/i&gt;, ou omis. Exemple &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;[(#URL_ECRIRE{auteur_edit,new=oui}|icone_horizontale{&lt;:icone_creer_nouvel_auteur:&gt;,auteur,new})]&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;|icone_verticale&lt;/code&gt;&lt;/strong&gt; affiche une ic&#244;ne de l'espace priv&#233; au format vertical. La syntaxe est la m&#234;me que pour &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;|icone_horizontale&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;|bouton_action_horizontal&lt;/code&gt;&lt;/strong&gt; utilise la m&#234;me syntaxe que &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;|icone_horizontale&lt;/code&gt; et affichera un r&#233;sultat visuellement semblable. Cependant le markup HTML sera du m&#234;me type que celui de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#BOUTON_ACTION&lt;/code&gt; pour d&#233;clencher un POST vers l'url et est donc utile quand l'url modifie la base de donn&#233;es.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;|sinon_interdire_acces&lt;/code&gt;&lt;/strong&gt; plac&#233; &#224; n'importe quel endroit de la page permet de bloquer l'acc&#232;s &#224; celle-ci quand l'expression &#224; laquelle il s'applique est fausse. Dans ce cas une page d'erreur est affich&#233;e, sauf si une url de redirection est fournie en argument (on peut aussi alors fournir un status http de redirection en second argument). On l'utilise g&#233;n&#233;ralement sur une v&#233;rification d'autorisation &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;[(#AUTORISER{modifier,article,#ID_ARTICLE}|sinon_interdire_acces)]&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;a id=&#034;javascript&#034;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau1 sommaire-section_h2&#034; aria-labelledby=&#034;JavaScript&#034;&gt;&lt;h2 class=&#034;h2&#034; id='JavaScript'&gt;JavaScript&lt;a class='sommaire-back sommaire-back-11' href='#s-JavaScript' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;SPIP 3&lt;/strong&gt; utilise la version 1.7.2 de jQuery et int&#232;gre d&#233;sormais jQuery UI en version 1.8.20. Il devient possible d'utiliser une version diff&#233;rente de jQuery dans le site public en surchargeant simplement &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;javascript/jquery.js&lt;/code&gt; dans le dossier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;squelettes/&lt;/code&gt; sans risquer de casser l'espace priv&#233;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Liens ajax :&lt;/strong&gt;&lt;br class='autobr' /&gt;
Les liens &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;.ajax&lt;/code&gt; ne cassent plus l'historique de navigation sur les navigateurs qui supportent &lt;a href=&#034;http://www.whatwg.org/specs/web-apps/current-work/multipage/history.html&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;l'API HTML5 History&lt;/a&gt; (Firefox, Safari, Chrome &#224; la date de cet article). C'est-&#224;-dire que lorsqu'on clique sur un lien ajax de SPIP qui recharge une partie de la page, l'URL est mise &#224; jour dans le navigateur et le visiteur peut cliquer sur &lt;i&gt;Pr&#233;c&#233;dent&lt;/i&gt; pour revenir en arri&#232;re.&lt;/p&gt;
&lt;p&gt;Classes sp&#233;ciales sur les liens ajax :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;.nohistory&lt;/code&gt; indique que le lien n'affecte pas l'historique de navigation lorsqu'il est cliqu&#233; ;&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;.preload&lt;/code&gt; indique &#224; SPIP que le contenu du lien ajax doit &#234;tre pr&#233;charg&#233; au moment o&#249; la page est charg&#233;e. Ainsi le clic sur le lien produira une mise &#224; jour imm&#233;diate ;&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;.nocache&lt;/code&gt; indique &#224; SPIP que le contenu du lien ajax ne doit pas &#234;tre mis en cache. Ainsi plusieurs clics sur le m&#234;me lien provoqueront autant de chargements depuis le serveur (par d&#233;faut, seul le premier chargement &#224; lieu pour une url donn&#233;e et le contenu est ensuite m&#233;moris&#233; par le navigateur).&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Rechargement t&#233;l&#233;command&#233; de blocs ajax :&lt;/strong&gt;&lt;br class='autobr' /&gt;
Les liens &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;.ajax&lt;/code&gt; permettent par d&#233;faut le rechargement du bloc ajax qui les contient, mais il est parfois n&#233;cessaire de provoquer le rechargement d'un autre bloc ajax de la page.&lt;/p&gt;
&lt;p&gt;Pour cela, il devient possible de nommer les blocs ajax au moment de leur inclusion :&lt;br class='autobr' /&gt;
&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;INCLURE{fond=...,ajax=nomdubloc} /&gt;&lt;/code&gt;. Le bloc ajax ainsi nomm&#233; peut ensuite &#234;tre recharg&#233; via l'appel de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;ajaxReload('nomdubloc');&lt;/code&gt;. Il est possible de passer en second argument une liste d'options contenant :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; callback : fonction callback qui doit &#234;tre appel&#233;e apr&#232;s le chargement ajax du bloc&lt;/li&gt;&lt;li&gt; args : liste d'argument qui seront pass&#233;s &#224; l'url lors du chargement du bloc (permet de modifier le &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#ENV&lt;/code&gt; du bloc mis &#224; jour) ;&lt;/li&gt;&lt;li&gt; history : indique si le rechargement affecte ou non l'historique de navigation (faux par d&#233;faut).&lt;br class='autobr' /&gt;
Exemple :
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;javascript&#034; class='spip_code spip_code_block language-javascript' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;ajaxReload('nomdubloc', { callback:function(){alert('fini');}, args:{id_article:3}, history:false }); &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;ajaxReload&lt;/code&gt; peut &#234;tre utilis&#233; &#233;galement sur un s&#233;lecteur jQuery auquel cas il provoquera le rechargement du plus petit bloc ajax qui contient l'&#233;l&#233;ment cibl&#233;. Il ne prend alors qu'un argument possible (le tableau d'options) : &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$('#contenu').ajaxReload({args:{id_article:3}})&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Animations javascript :&lt;/strong&gt;&lt;br class='autobr' /&gt;
Lors des interactions d&#233;clench&#233;es par l'utilisateur, il est possible de d&#233;clencher plusieurs animations type qui s'appliquent toutes sur un s&#233;lecteur &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;jQuery&lt;/code&gt; :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;jQuery('#monid').animateLoading()&lt;/code&gt; d&#233;clenche l'animation de chargement sur &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#monid&lt;/code&gt; (automatiquement d&#233;clench&#233;e lors des rechargements ajax)&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;jQuery('#monid').endLoading()&lt;/code&gt; arr&#234;te l'animation de chargement sur &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#monid&lt;/code&gt; (automatiquement d&#233;clench&#233;e lors des rechargements ajax)&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;jQuery('#monid').animateAppend()&lt;/code&gt; anime le bloc &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#monid&lt;/code&gt; pour montrer qu'il vient d'&#234;tre ajout&#233; par l'interaction&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;jQuery('#monid').animateRemove()&lt;/code&gt; anime le bloc &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#monid&lt;/code&gt; pour montrer qu'il est supprim&#233; par l'interaction&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Fonctions utilitaires :&lt;/strong&gt;&lt;br class='autobr' /&gt;
&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;parametre_url()&lt;/code&gt; s'utilise comme sa version PHP de parametre_url pour ajouter, supprimer, r&#233;cup&#233;rer des arguments d'une URL :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;parametre_url(url,arg,value)&lt;/code&gt; ajoute &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;arg=value&lt;/code&gt; &#224; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;url&lt;/code&gt; et retourne l'url modifi&#233;e ;&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;parametre_url(url,arg,'')&lt;/code&gt; supprime la valeur de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;arg&lt;/code&gt; dans &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;url&lt;/code&gt; et retourne l'url modifi&#233;e ;&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;parametre_url(url,arg)&lt;/code&gt; retourne la valeur de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;arg&lt;/code&gt; dans &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;url&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$('a').followLink()&lt;/code&gt; suit le lien en simulant un clic dessus (prend en compte le fait que le lien est ou non un lien ajax).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Popin dans l'espace priv&#233; :&lt;/strong&gt;&lt;br class='autobr' /&gt;
Un lien vers une page de l'espace priv&#233; avec une classe &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;.popin&lt;/code&gt; provoque l'ouverture d'une popin qui contient le coeur de la page point&#233;e (bloc &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;contenu/&lt;/code&gt;). Le lien conserve sa capacit&#233; &#224; &#234;tre ouvert dans un autre onglet via clic droit et la page compl&#232;te est affich&#233;e dans ce cas.&lt;/p&gt;
&lt;p&gt;&lt;a id=&#034;api&#034;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau1 sommaire-section_h2&#034; aria-labelledby=&#034;API&#034;&gt;&lt;h2 class=&#034;h2&#034; id='API'&gt;API&lt;a class='sommaire-back sommaire-back-11' href='#s-API' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;SPIP 3&lt;/strong&gt; introduit plusieurs &lt;strong&gt;API g&#233;n&#233;riques&lt;/strong&gt; dans la gestion des objets &#233;ditoriaux :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; une gestion g&#233;n&#233;rique des tables de liens d'un objet avec n'importe quel autre objet : c'est &lt;a href='https://www.spip.net/fr_article5477.html' class=&#034;spip_in&#034; hreflang=&#034;fr&#034;&gt;l'API &lt;strong&gt;editer_liens&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt; La cr&#233;ation de nouveaux objets &#233;ditoriaux est simplifi&#233;e par &lt;a href='https://www.spip.net/fr_article5525.html' class=&#034;spip_in&#034; hreflang=&#034;fr&#034;&gt;une API d&#233;clarative&lt;/a&gt;&lt;/li&gt;&lt;li&gt; une gestion g&#233;n&#233;rique des fonctions d'insertion, modification ou publication des objets &#233;ditoriaux : &lt;a href='https://www.spip.net/fr_article5526.html' class=&#034;spip_in&#034; hreflang=&#034;fr&#034;&gt;l'API &lt;strong&gt;editer_objet&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;objet_test_si_publie($objet, $id_objet)&lt;/code&gt;&lt;/strong&gt; permet de tester facilement si un objet est publi&#233; ou non en fonction de son statut tel que d&#233;clar&#233; (et en fonction d'une &#233;ventuelle post-publication)&lt;/li&gt;&lt;li&gt; &lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;generer_url_ecrire_objet($objet,$id_objet,$args, $ancre)&lt;/code&gt;&lt;/strong&gt; renvoie l'url vers la page de l'objet dans l'espace priv&#233;. &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$args&lt;/code&gt; et &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$ancre&lt;/code&gt; sont optionnels.&lt;/li&gt;&lt;li&gt; le pipeline &lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;optimiser_base_disparus&lt;/code&gt;&lt;/strong&gt; est appel&#233; lors du nettoyage en base des objets &#224; la poubelles et des liens morts qui en r&#233;sultent&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;SPIP 3&lt;/strong&gt; dispose &#233;galement d'une &lt;a href='https://www.spip.net/fr_article5527.html' class=&#034;spip_in&#034; hreflang=&#034;fr&#034;&gt;&lt;strong&gt;gestion de file de t&#226;ches&lt;/strong&gt;&lt;/a&gt; qui permet de programmer l'ex&#233;cution future ou simplement asynchone (ASAP mais sans faire attendre l'utilisateur) de fonctions.&lt;/p&gt;
&lt;p&gt;La mise en place de configuration des plugins est simplifi&#233;e par la prise en charge automatis&#233;e des formulaires &lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#FORMULAIRE_CONFIGURER_XXX&lt;/code&gt;&lt;/strong&gt; et par l'utilisation des fonctions &lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;lire_config&lt;/code&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;ecrire_config&lt;/code&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;effacer_config&lt;/code&gt;&lt;/strong&gt; (voir &lt;a href='https://www.spip.net/fr_article5414.html' class=&#034;spip_in&#034; hreflang=&#034;fr&#034;&gt;Configurer une fonctionnalit&#233; de votre site, ou un plugin&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Les &lt;a href='https://www.spip.net/fr_article3800.html' class=&#034;spip_in&#034; hreflang=&#034;fr&#034;&gt;formulaires CVT&lt;/a&gt; permettent facilement de faire &lt;a href='https://www.spip.net/fr_article5386.html' class=&#034;spip_in&#034; hreflang=&#034;fr&#034;&gt;des formulaires en plusieurs pages&lt;/a&gt;, et supportent &#233;galement &lt;a href='https://www.spip.net/fr_article5428.html' class=&#034;spip_in&#034; hreflang=&#034;fr&#034;&gt;la sauvegarde automatique de la saisie&lt;/a&gt; par simple d&#233;claration.&lt;br class='autobr' /&gt;
Un pipeline &lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;formulaire_fond&lt;/code&gt;&lt;/strong&gt; permet de personnaliser le fond des formulaires (pour modifier le HTML du formulaire)&lt;span class=&#034;spip_note_ref&#034;&gt; [&lt;a href=&#034;#nb14&#034; class=&#034;spip_note&#034; rel=&#034;appendix&#034; id=&#034;nh14&#034;&gt;14&lt;/a&gt;]&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dans l'API SQL :&lt;/strong&gt;&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; la fonction &lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;sql_skip&lt;/code&gt;&lt;/strong&gt; est ajout&#233;e et permet de sauter un certain nombre de r&#233;sultats.&lt;/li&gt;&lt;li&gt; Les valeurs &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;null&lt;/code&gt; dans sql_updateq et sql_insertq sont traduites en &lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;NULL&lt;/code&gt;&lt;/strong&gt; SQL et ne sont plus assimil&#233;es &#224; une cha&#238;ne vide.&lt;/li&gt;&lt;li&gt; les fonctions &lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;sql_demarrer_transaction&lt;/code&gt;&lt;/strong&gt; et &lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;sql_terminer_transaction&lt;/code&gt;&lt;/strong&gt; permettent respectivement comme leur nom le sugg&#232;re de d&#233;marrer ou de cl&#244;turer une transaction SQL&lt;span class=&#034;spip_note_ref&#034;&gt; [&lt;a href=&#034;#nb15&#034; class=&#034;spip_note&#034; rel=&#034;appendix&#034; title=&#034;Est ajout&#233; de mani&#232;re exp&#233;rimentale &#233;galement pr&#233;sent plut&#244;t pour (&#8230;)&#034; id=&#034;nh15&#034;&gt;15&lt;/a&gt;]&lt;/span&gt;.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Introduction d'un point d'entr&#233;e bac-&#224;-sable, (&lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;public/sandbox.php&lt;/code&gt;&lt;/strong&gt;) pour la compilation des squelettes, permet &#224; un plugin de g&#233;rer la compilation des squelettes dans un ensemble de filtres et fonctions en liste blanche ou liste noire, et d'interdire le PHP dans les squelettes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sp&#233;cialisation des crit&#232;res&lt;/strong&gt; :&lt;br class='autobr' /&gt;
Il est possible de pr&#233;fixer par le nom du serveur et/ou le nom de la table le nom de la fonction crit&#232;re. La recherche se fait dans l'ordre :&lt;/p&gt;
&lt;ol class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;critere_serveur_TABLE_moncritere_dist&lt;/code&gt;,&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;critere_serveur_TABLE_moncritere&lt;/code&gt;,&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;critere_serveur_moncritere_dist&lt;/code&gt;,&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;critere_serveur_moncritere&lt;/code&gt;,&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;critere_TABLE_moncritere_dist&lt;/code&gt;,&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;critere_TABLE_moncritere&lt;/code&gt;,&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;critere_moncritere_dist&lt;/code&gt;,&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;critere_moncritere&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;Dans le fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;options.php&lt;/code&gt; d'un plugin ou dans le fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;mes_options.php&lt;/code&gt;, &lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$GLOBALS['marqueur_skel'] .= &#034;:prefixe&#034;&lt;/code&gt;&lt;/strong&gt; permet de diff&#233;rencier le cache des squelettes compil&#233;s comme &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$GLOBALS['marqueur'] .= &#034;:prefixe&#034;&lt;/code&gt; permettait d&#233;j&#224; de diff&#233;rencier le cache des squelettes.&lt;/p&gt;&lt;/section&gt;&lt;/div&gt;
		&lt;hr /&gt;
		&lt;div class='rss_notes'&gt;&lt;div id=&#034;nb1&#034;&gt;
&lt;p&gt;&lt;span class=&#034;spip_note_ref&#034;&gt;[&lt;a href=&#034;#nh1&#034; class=&#034;spip_note&#034; title=&#034;Notes 1&#034; rev=&#034;appendix&#034;&gt;1&lt;/a&gt;] &lt;/span&gt;Outre le Porte-plume d&#233;j&#224; int&#233;gr&#233; dans SPIP 2 et qui initiait ce mouvement, on peut citer notamment les plugins Afficher_objets, Base CSS, Navigation du priv&#233;, CVT multi-&#233;tapes, Forum, Job-queue, Mediabox, M&#233;diath&#232;que, TextWheel, URLs &#233;ditables, Comments, qui ont, pour certains, inspir&#233; fortement le d&#233;veloppement de SPIP lui-m&#234;me ; pour d'autres &#233;t&#233; int&#233;gr&#233;s, avec quelquefois certaines &#233;volutions.&lt;/p&gt;
&lt;/div&gt;&lt;div id=&#034;nb2&#034;&gt;
&lt;p&gt;&lt;span class=&#034;spip_note_ref&#034;&gt;[&lt;a href=&#034;#nh2&#034; class=&#034;spip_note&#034; title=&#034;Notes 2&#034; rev=&#034;appendix&#034;&gt;2&lt;/a&gt;] &lt;/span&gt;Ce chantier avait &#233;t&#233; amorc&#233; depuis quelque temps sur la Zone, et celles et ceux qui d'entre vous utilisaient d&#233;j&#224; le plugin &lt;i&gt;Navigation du priv&#233;&lt;/i&gt; ou la &lt;i&gt;m&#233;diath&#232;que&lt;/i&gt; retrouveront vite leurs marques.&lt;/p&gt;
&lt;/div&gt;&lt;div id=&#034;nb3&#034;&gt;
&lt;p&gt;&lt;span class=&#034;spip_note_ref&#034;&gt;[&lt;a href=&#034;#nh3&#034; class=&#034;spip_note&#034; title=&#034;Notes 3&#034; rev=&#034;appendix&#034;&gt;3&lt;/a&gt;] &lt;/span&gt;Par exemple, le passage en &#233;dition sur un article devient instantan&#233; gr&#226;ce au pr&#233;-chargement Ajax.&lt;/p&gt;
&lt;/div&gt;&lt;div id=&#034;nb4&#034;&gt;
&lt;p&gt;&lt;span class=&#034;spip_note_ref&#034;&gt;[&lt;a href=&#034;#nh4&#034; class=&#034;spip_note&#034; title=&#034;Notes 4&#034; rev=&#034;appendix&#034;&gt;4&lt;/a&gt;] &lt;/span&gt;&lt;a href=&#034;http://core.spip.org/projects/spip/repository/revisions/17650&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;http://core.spip.org/projects/spip/repository/revisions/17650&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div id=&#034;nb5&#034;&gt;
&lt;p&gt;&lt;span class=&#034;spip_note_ref&#034;&gt;[&lt;a href=&#034;#nh5&#034; class=&#034;spip_note&#034; title=&#034;Notes 5&#034; rev=&#034;appendix&#034;&gt;5&lt;/a&gt;] &lt;/span&gt;en SPIP 2.1 ils &#233;taient plac&#233;s dans le dossier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;extensions/&lt;/code&gt; d&#233;sormais inutile.&lt;/p&gt;
&lt;/div&gt;&lt;div id=&#034;nb6&#034;&gt;
&lt;p&gt;&lt;span class=&#034;spip_note_ref&#034;&gt;[&lt;a href=&#034;#nh6&#034; class=&#034;spip_note&#034; title=&#034;Notes 6&#034; rev=&#034;appendix&#034;&gt;6&lt;/a&gt;] &lt;/span&gt;Voir le pipeline associ&#233; sur &lt;a href=&#034;http://programmer3.spip.net/jqueryui_plugins&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;programmer.spip.org&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div id=&#034;nb7&#034;&gt;
&lt;p&gt;&lt;span class=&#034;spip_note_ref&#034;&gt;[&lt;a href=&#034;#nh7&#034; class=&#034;spip_note&#034; title=&#034;Notes 7&#034; rev=&#034;appendix&#034;&gt;7&lt;/a&gt;] &lt;/span&gt;C'est une alternative aux plugin Thickbox, LightBox... qui repose sur la librairie Colorbox&lt;/p&gt;
&lt;/div&gt;&lt;div id=&#034;nb8&#034;&gt;
&lt;p&gt;&lt;span class=&#034;spip_note_ref&#034;&gt;[&lt;a href=&#034;#nh8&#034; class=&#034;spip_note&#034; title=&#034;Notes 8&#034; rev=&#034;appendix&#034;&gt;8&lt;/a&gt;] &lt;/span&gt;Connu pour SPIP 2 sous le nom &#034;M&#233;diath&#232;que&#034;&lt;/p&gt;
&lt;/div&gt;&lt;div id=&#034;nb9&#034;&gt;
&lt;p&gt;&lt;span class=&#034;spip_note_ref&#034;&gt;[&lt;a href=&#034;#nh9&#034; class=&#034;spip_note&#034; title=&#034;Notes 9&#034; rev=&#034;appendix&#034;&gt;9&lt;/a&gt;] &lt;/span&gt;en revanche le support de PostGreSQL doit &#234;tre consid&#233;r&#233; comme exp&#233;rimental et incomplet pour un usage en production&lt;/p&gt;
&lt;/div&gt;&lt;div id=&#034;nb10&#034;&gt;
&lt;p&gt;&lt;span class=&#034;spip_note_ref&#034;&gt;[&lt;a href=&#034;#nh10&#034; class=&#034;spip_note&#034; title=&#034;Notes 10&#034; rev=&#034;appendix&#034;&gt;10&lt;/a&gt;] &lt;/span&gt;Par exemple, pour l'envoi d'un mail &#034;d&#232;s que possible&#034; qui permet de rendre la main &#224; l'utilisateur imm&#233;diatement sans devoir attendre que le mail soit effectivement envoy&#233;&lt;/p&gt;
&lt;/div&gt;&lt;div id=&#034;nb11&#034;&gt;
&lt;p&gt;&lt;span class=&#034;spip_note_ref&#034;&gt;[&lt;a href=&#034;#nh11&#034; class=&#034;spip_note&#034; title=&#034;Notes 11&#034; rev=&#034;appendix&#034;&gt;11&lt;/a&gt;] &lt;/span&gt;dans tous les navigateurs modernes &#224; l'exception de Internet Explorer qui ne la supporte pas encore&lt;/p&gt;
&lt;/div&gt;&lt;div id=&#034;nb12&#034;&gt;
&lt;p&gt;&lt;span class=&#034;spip_note_ref&#034;&gt;[&lt;a href=&#034;#nh12&#034; class=&#034;spip_note&#034; title=&#034;Notes 12&#034; rev=&#034;appendix&#034;&gt;12&lt;/a&gt;] &lt;/span&gt;Voir &lt;a href='https://www.spip.net/fr_article3454.html' class=&#034;spip_in&#034; hreflang=&#034;fr&#034;&gt;Utiliser les mod&#232;les&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div id=&#034;nb13&#034;&gt;
&lt;p&gt;&lt;span class=&#034;spip_note_ref&#034;&gt;[&lt;a href=&#034;#nh13&#034; class=&#034;spip_note&#034; title=&#034;Notes 13&#034; rev=&#034;appendix&#034;&gt;13&lt;/a&gt;] &lt;/span&gt;La balise &lt;acronym&gt; n'est plus utilis&#233;e en HTML5.&lt;/p&gt;
&lt;/div&gt;&lt;div id=&#034;nb14&#034;&gt;
&lt;p&gt;&lt;span class=&#034;spip_note_ref&#034;&gt;[&lt;a href=&#034;#nh14&#034; class=&#034;spip_note&#034; title=&#034;Notes 14&#034; rev=&#034;appendix&#034;&gt;14&lt;/a&gt;] &lt;/span&gt;&lt;a href=&#034;http://core.spip.org/projects/spip/repository/revisions/18754&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;http://core.spip.org/projects/spip/repository/revisions/18754&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div id=&#034;nb15&#034;&gt;
&lt;p&gt;&lt;span class=&#034;spip_note_ref&#034;&gt;[&lt;a href=&#034;#nh15&#034; class=&#034;spip_note&#034; title=&#034;Notes 15&#034; rev=&#034;appendix&#034;&gt;15&lt;/a&gt;] &lt;/span&gt;Est ajout&#233; de mani&#232;re exp&#233;rimentale &#233;galement &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;sql_preferer_transaction&lt;/code&gt; pr&#233;sent plut&#244;t pour contourner un probl&#232;me de lenteur sur des insertions multiples avec SQLite, qui sont ex&#233;cut&#233;es plus rapidement en mode transactionnel. Cette fonction renvoie &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;true&lt;/code&gt; uniquement en SQLite&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>API de gestion de la file des travaux [ redirection ]</title>
		<link>https://www.spip.net/fr_article5527.html</link>
		<guid isPermaLink="true">https://www.spip.net/fr_article5527.html</guid>
		<dc:date>2012-05-19T09:50:41Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>cerdic</dc:creator>


		<dc:subject>SPIP 3.0</dc:subject>
		<dc:subject>Archive</dc:subject>

		<description>
&lt;p&gt;SPIP int&#232;gre nativement une interface de programmation (ou API) de gestion de file de travaux (&#171; job queue &#187;). Elle permet de programmer des t&#226;ches &#224; ex&#233;cuter dans le futur, ou simplement le plus t&#244;t possible mais sans faire attendre l'utilisateur. &lt;br class='autobr' /&gt; Les travaux programm&#233;s sont &#224; tout moment visualisables dans l'espace d'administration via le menu Maintenance &gt; Liste des travaux. La page de suivi permet de forcer l'ex&#233;cution imm&#233;diate d'une t&#226;che, ou de supprimer certaines t&#226;ches. (&#8230;)&lt;/p&gt;


-
&lt;a href="https://www.spip.net/fr_rubrique257.html" rel="directory"&gt;Guide des fonctions avanc&#233;es&lt;/a&gt;

/ 
&lt;a href="https://www.spip.net/@spip30" rel="tag"&gt;SPIP 3.0&lt;/a&gt;, 
&lt;a href="https://www.spip.net/@archive" rel="tag"&gt;Archive&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;SPIP int&#232;gre nativement une &lt;a href=&#034;http://fr.wikipedia.org/wiki/Interface_de_programmation&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;interface de programmation&lt;/a&gt; (ou API) de gestion de file de travaux (&#171; job queue &#187;). Elle permet de programmer des t&#226;ches &#224; ex&#233;cuter dans le futur, ou simplement le plus t&#244;t possible mais sans faire attendre l'utilisateur.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;!--sommaire--&gt;&lt;div class=&#034;well nav-sommaire nav-sommaire-3&#034; id=&#034;nav69f285812db8e1.16822937&#034;&gt;
&lt;h2&gt;Sommaire&lt;/h2&gt;&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;a id=&#034;s-Ajouter-un-travail-dans-la-file&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Ajouter-un-travail-dans-la-file&#034; class=&#034;spip_ancre&#034;&gt;Ajouter un travail dans la file&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Supprimer-un-travail-de-la-file&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Supprimer-un-travail-de-la-file&#034; class=&#034;spip_ancre&#034;&gt;Supprimer un travail de la file&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Associer-un-travail-a-un-objet-editorial&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Associer-un-travail-a-un-objet-editorial&#034; class=&#034;spip_ancre&#034;&gt;Associer un travail &#224; un objet &#233;ditorial&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;!--/sommaire--&gt;&lt;p&gt;Les travaux programm&#233;s sont &#224; tout moment visualisables dans l'espace d'administration via le menu &lt;i&gt;Maintenance&lt;/i&gt; &gt; &lt;i&gt;Liste des travaux&lt;/i&gt;. La page de suivi permet de forcer l'ex&#233;cution imm&#233;diate d'une t&#226;che, ou de supprimer certaines t&#226;ches.&lt;/p&gt;
&lt;section class=&#034;sommaire-section sommaire-section_niveau1 sommaire-section_h2&#034; aria-labelledby=&#034;Ajouter-un-travail-dans-la-file&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Ajouter-un-travail-dans-la-file'&gt;Ajouter un travail dans la file&lt;a class='sommaire-back sommaire-back-3' href='#s-Ajouter-un-travail-dans-la-file' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;php&#034; class='spip_code spip_code_block language-php' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;$id_job = job_queue_add($function, $description, $arguments = array(), $file = '', $no_duplicate = FALSE, $time=0, $priority=0) &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Avec les arguments :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$function&lt;/code&gt; : le nom de la fonction PHP qui doit &#234;tre appel&#233;e&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$description&lt;/code&gt; : une description humainement compr&#233;hensible de ce que fait la t&#226;che (essentiellement pour l'affichage dans la page de suivi de l'espace priv&#233;)&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$arguments&lt;/code&gt; (facultatif, vide par d&#233;faut) : les arguments qui seront pass&#233;s &#224; la fonction, sous forme de tableau PHP&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$file&lt;/code&gt; (facultatif, vide par d&#233;faut) : nom du fichier &#224; inclure, via &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;include_spip($file)&lt;/code&gt; (exemple : &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;'inc/mail'&lt;/code&gt; : il ne faut pas indiquer &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;.php&lt;/code&gt;). Si le nom finit par un &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/&lt;/code&gt; alors on consid&#232;re que c'est un r&#233;pertoire et SPIP fera un &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;charger_fonction($function,$file)&lt;/code&gt;&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$no_duplicate&lt;/code&gt; (facultatif, &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;false&lt;/code&gt; par d&#233;faut)
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; si vaut &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;true&lt;/code&gt; la t&#226;che ne sera pas ajout&#233;e si elle existe d&#233;j&#224; en file d'attente avec la m&#234;me fonction et les m&#234;mes arguments.&lt;/li&gt;&lt;li&gt; si vaut &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;'function_only'&lt;/code&gt; la t&#226;che ne sera pas ajout&#233;e si elle existe d&#233;j&#224; en file d'attente avec la m&#234;me fonction ind&#233;pendamment de ses arguments&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$time&lt;/code&gt; (facultatif, &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;0&lt;/code&gt; par d&#233;faut) indique la date sous forme de timestamp &#224; laquelle la t&#226;che doit &#234;tre programm&#233;e. Si 0 ou une date pass&#233;e, la t&#226;che sera ex&#233;cut&#233;e aussit&#244;t que possible (en g&#233;n&#233;ral en fin hit, en asynchrone).&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$priority&lt;/code&gt; (facultatif, &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;0&lt;/code&gt; par d&#233;faut) indique un niveau de priorit&#233; entre -10 et +10. Les t&#226;ches sont ex&#233;cut&#233;es par ordre de priorit&#233; d&#233;croissante, une fois leur date d'ex&#233;cution pass&#233;e. La priorit&#233; est surtout utilis&#233;e quand une t&#226;che cron indique qu'elle n'a pas fini et doit &#234;tre relanc&#233;e : dans ce cas SPIP r&#233;duit sa priorit&#233; pour &#234;tre s&#251;r que celle t&#226;che ne monopolise pas la file d'attente.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;La fonction renvoie le num&#233;ro de travail ajout&#233; ou 0 si aucun travail n'a &#233;t&#233; ajout&#233;.&lt;/p&gt;
&lt;/section&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau1 sommaire-section_h2&#034; aria-labelledby=&#034;Supprimer-un-travail-de-la-file&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Supprimer-un-travail-de-la-file'&gt;Supprimer un travail de la file&lt;a class='sommaire-back sommaire-back-3' href='#s-Supprimer-un-travail-de-la-file' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;php&#034; class='spip_code spip_code_block language-php' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;job_queue_remove($id_job) &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$id_job&lt;/code&gt; est le num&#233;ro du travail en attente, tel que retourn&#233; par la fonction &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;job_queue_add&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;La fonction retourne &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;true&lt;/code&gt; si le travail a bien &#233;t&#233; trouv&#233; et supprim&#233;, &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;false&lt;/code&gt; sinon.&lt;/p&gt;
&lt;/section&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau1 sommaire-section_h2&#034; aria-labelledby=&#034;Associer-un-travail-a-un-objet-editorial&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Associer-un-travail-a-un-objet-editorial'&gt;Associer un travail &#224; un objet &#233;ditorial&lt;a class='sommaire-back sommaire-back-3' href='#s-Associer-un-travail-a-un-objet-editorial' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;php&#034; class='spip_code spip_code_block language-php' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;job_queue_link($id_job,$objets) &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Avec les arguments :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$id_job&lt;/code&gt; : le num&#233;ro de travail en attente, tel que retourn&#233; par la fonction &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;job_queue_add&lt;/code&gt;&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$objets&lt;/code&gt; une liste d'objets sous la forme d'un tableau d'objets &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;array(array('objet'=&gt;'article','id_objet'=&gt;23),...)&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Lorsque des travaux sont associ&#233;s &#224; un objet, ils apparaissent sur la page de l'espace priv&#233; de cet objet, et les auteurs qui ont le droit de modifier l'objet peuvent aussi supprimer le travail avant son ex&#233;cution.&lt;/p&gt;&lt;/section&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>API &#171; editer_objet &#187; [ redirection ]</title>
		<link>https://www.spip.net/fr_article5526.html</link>
		<guid isPermaLink="true">https://www.spip.net/fr_article5526.html</guid>
		<dc:date>2012-05-19T09:49:54Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>cerdic</dc:creator>


		<dc:subject>SPIP 3.0</dc:subject>
		<dc:subject>Archive</dc:subject>

		<description>
&lt;p&gt;L'ajout, la modification et la publication des instances d'objets &#233;ditoriaux sont simplifi&#233;s par une interface de programmation (ou API) constitu&#233;e de 3 fonctions g&#233;n&#233;riques qui peuvent servir pour manipuler tous les objets de SPIP.&lt;/p&gt;


-
&lt;a href="https://www.spip.net/fr_rubrique257.html" rel="directory"&gt;Guide des fonctions avanc&#233;es&lt;/a&gt;

/ 
&lt;a href="https://www.spip.net/@spip30" rel="tag"&gt;SPIP 3.0&lt;/a&gt;, 
&lt;a href="https://www.spip.net/@archive" rel="tag"&gt;Archive&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;L'ajout, la modification et la publication des instances d'objets &#233;ditoriaux sont simplifi&#233;s par une &lt;a href=&#034;http://fr.wikipedia.org/wiki/Interface_de_programmation&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;interface de programmation&lt;/a&gt; (ou API) constitu&#233;e de 3 fonctions g&#233;n&#233;riques qui peuvent servir pour manipuler tous les objets de SPIP.&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>API &#171; autoriser &#187; [ redirection ]</title>
		<link>https://www.spip.net/fr_article5528.html</link>
		<guid isPermaLink="true">https://www.spip.net/fr_article5528.html</guid>
		<dc:date>2012-05-19T09:49:00Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>cerdic</dc:creator>


		<dc:subject>SPIP 2.0</dc:subject>
		<dc:subject>_DEBUG_AUTORISER</dc:subject>
		<dc:subject>Archive</dc:subject>

		<description>
&lt;p&gt;L'interface de programmation (API) &#171; autoriser &#187; introduite dans SPIP permet de g&#233;rer finement les autorisations donn&#233;es &#224; un auteur d'effectuer une action sur un objet. &lt;br class='autobr' /&gt; V&#233;rifier une autorisation &lt;br class='autobr' /&gt;
La v&#233;rification d'une autorisation se fait par un appel de la forme : php include_spip('inc/autoriser') ; if (autoriser('modifier', 'article', $id_article)) ...
&lt;br class='autobr' /&gt; La fonction autoriser($faire, $type, $id, $qui, $opt) accepte 5 arguments dont seul le premier est obligatoire : $faire est une (&#8230;)&lt;/p&gt;


-
&lt;a href="https://www.spip.net/fr_rubrique257.html" rel="directory"&gt;Guide des fonctions avanc&#233;es&lt;/a&gt;

/ 
&lt;a href="https://www.spip.net/@spip20" rel="tag"&gt;SPIP 2.0&lt;/a&gt;, 
&lt;a href="https://www.spip.net/@_debug_autoriser" rel="tag"&gt;_DEBUG_AUTORISER&lt;/a&gt;, 
&lt;a href="https://www.spip.net/@archive" rel="tag"&gt;Archive&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;L'&lt;a href=&#034;http://fr.wikipedia.org/wiki/Interface_de_programmation&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;interface de programmation&lt;/a&gt; (API) &#171; autoriser &#187; introduite dans &lt;a href='https://www.spip.net/fr_article3784.html' class=&#034;spip_in&#034;&gt;SPIP 2.0&lt;/a&gt; permet de g&#233;rer finement les autorisations donn&#233;es &#224; un auteur d'effectuer une action sur un objet.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;!--sommaire--&gt;&lt;div class=&#034;well nav-sommaire nav-sommaire-4&#034; id=&#034;nav69f285813209e4.38027204&#034;&gt;
&lt;h2&gt;Sommaire&lt;/h2&gt;&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;a id=&#034;s-Verifier-une-autorisation&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Verifier-une-autorisation&#034; class=&#034;spip_ancre&#034;&gt;V&#233;rifier une autorisation&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Donner-une-autorisation-exceptionnelle&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Donner-une-autorisation-exceptionnelle&#034; class=&#034;spip_ancre&#034;&gt;Donner une autorisation exceptionnelle&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Declarer-une-nouvelle-autorisation&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Declarer-une-nouvelle-autorisation&#034; class=&#034;spip_ancre&#034;&gt;D&#233;clarer une nouvelle autorisation&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Aide-au-developpement&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Aide-au-developpement&#034; class=&#034;spip_ancre&#034;&gt;Aide au d&#233;veloppement&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;!--/sommaire--&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau1 sommaire-section_h2&#034; aria-labelledby=&#034;Verifier-une-autorisation&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Verifier-une-autorisation'&gt;V&#233;rifier une autorisation&lt;a class='sommaire-back sommaire-back-4' href='#s-Verifier-une-autorisation' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;La v&#233;rification d'une autorisation se fait par un appel de la forme :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;php&#034; class='spip_code spip_code_block language-php' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;include_spip('inc/autoriser'); if (autoriser('modifier', 'article', $id_article)) { ... } &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;La fonction &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;autoriser($faire, $type, $id, $qui, $opt)&lt;/code&gt; accepte 5 arguments dont seul le premier est obligatoire :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$faire&lt;/code&gt;&lt;/strong&gt; est une cha&#238;ne qui d&#233;signe l'action soumise &#224; autorisation. C'est en r&#232;gle g&#233;n&#233;rale un verbe simple (&lt;i&gt;modifier&lt;/i&gt;, &lt;i&gt;creer&lt;/i&gt;, &lt;i&gt;supprimer&lt;/i&gt;, &lt;i&gt;voir&lt;/i&gt;, &lt;i&gt;configurer&lt;/i&gt;...), parfois associ&#233; &#224; un contexte (les mots sont alors coll&#233;s : &lt;i&gt;changerlangue&lt;/i&gt;, &lt;i&gt;publierdans&lt;/i&gt;...). &lt;br class='manualbr' /&gt;Il y a quelques exceptions o&#249; le &lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$faire&lt;/code&gt;&lt;/strong&gt; n'est pas un verbe et s'utilise sans aucun autre argument (&lt;i&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;autoriser('webmestre')&lt;/code&gt;&lt;/i&gt; par exemple, ou &lt;i&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;autoriser('ecrire')&lt;/code&gt;&lt;/i&gt; &#8212;qui d&#233;signe ici l'espace d'administration et non l'action&#8212;).&lt;/li&gt;&lt;li&gt; &lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$type&lt;/code&gt;&lt;/strong&gt; est une cha&#238;ne qui d&#233;signe sur quoi porte l'action. C'est en g&#233;n&#233;ral le type d'un objet &#233;ditorial (article, rubrique, mot, groupe-mots, ...).&lt;/li&gt;&lt;li&gt; &lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$id&lt;/code&gt;&lt;/strong&gt; d&#233;signe l'id (la cl&#233; primaire) de l'objet sur lequel porte l'action. &lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$id&lt;/code&gt;&lt;/strong&gt; est en g&#233;n&#233;ral un nombre entier, mais peut &#234;tre une cha&#238;ne si cela correspond &#224; la cl&#233; primaire de la table SQL concern&#233;e.&lt;/li&gt;&lt;li&gt; &lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$qui&lt;/code&gt;&lt;/strong&gt; d&#233;signe l'auteur (au sens SPIP) qui va faire l'action. Si il n'est pas fourni (ou &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;null&lt;/code&gt; dans l'appel de la fonction autoriser, c'est implicitement l'auteur connect&#233; qui est pris en compte. Sinon &lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$qui&lt;/code&gt;&lt;/strong&gt; peut &#234;tre l'id_auteur d'un auteur dont on veut v&#233;rifier les droits, ou un tableau associatif qui d&#233;crit l'auteur (tableau qui contient alors les champs de la table spip_auteurs pour l'auteur concern&#233;)&lt;/li&gt;&lt;li&gt; &lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$opt&lt;/code&gt;&lt;/strong&gt; est un tableau associatif de donn&#233;es suppl&#233;mentaires contextuelles concernant l'action qui sont parfois utilis&#233;es par l'autorisation. Par exemple lorsqu'on veut modifier/publier un article, on appellera &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;autoriser('instituer', 'article', $id_article, null, array('statut' =&gt; 'publie'))&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;La fonction &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;autoriser&lt;/code&gt; retourne &#171; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;true&lt;/code&gt; &#187; ou &#171; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;false&lt;/code&gt; &#187; en fonction des droits de l'auteur &#224; faire l'action demand&#233;e.&lt;/p&gt;
&lt;p&gt;Dans un squelette, la v&#233;rification d'une autorisation se fait par &lt;a href='https://www.spip.net/fr_article3896.html' class=&#034;spip_in&#034;&gt;la balise &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#AUTORISER&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau1 sommaire-section_h2&#034; aria-labelledby=&#034;Donner-une-autorisation-exceptionnelle&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Donner-une-autorisation-exceptionnelle'&gt;Donner une autorisation exceptionnelle&lt;a class='sommaire-back sommaire-back-4' href='#s-Donner-une-autorisation-exceptionnelle' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Il arrive qu'on ait besoin de faire une action qui sera soumise &#224; autorisation pour un auteur qui normalement n'en a pas le droit. Cela peut se produire, par exemple, dans le cas d'une &lt;a href='https://www.spip.net/fr_article5527.html' class=&#034;spip_in&#034;&gt;action programm&#233;e&lt;/a&gt; qui sera alors ex&#233;cut&#233;e anonymement.&lt;/p&gt;
&lt;p&gt;Dans ce cas, il existe un m&#233;canisme via la fonction &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;autoriser_exception&lt;/code&gt; qui donne une autorisation exceptionnelle, le temps de r&#233;aliser l'action concern&#233;e.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;php&#034; class='spip_code spip_code_block language-php' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;include_spip('inc/autoriser'); // donner une autorisation exceptionnelle temporaire autoriser_exception('modifier', 'article', $id_article); // r&#233;aliser l'action d&#233;sir&#233;e include_spip('action/editer_objet'); objet_modifier('article', $id_article, array('titre' =&gt; 'Nouveau titre')); // retirer l'autorisation exceptionnelle autoriser_exception('modifier', 'article', $id_article, false); &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;La fonction &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;autoriser_exception($faire, $type, $id, $autoriser)&lt;/code&gt; prend 4 arguments :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$faire&lt;/code&gt;&lt;/strong&gt; avec la m&#234;me signification que pour &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;autoriser()&lt;/code&gt;&lt;/li&gt;&lt;li&gt; &lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$type&lt;/code&gt;&lt;/strong&gt; avec la m&#234;me signification que pour &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;autoriser()&lt;/code&gt;&lt;/li&gt;&lt;li&gt; &lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$id&lt;/code&gt;&lt;/strong&gt; avec la m&#234;me signification que pour &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;autoriser()&lt;/code&gt;&lt;/li&gt;&lt;li&gt; &lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$autoriser&lt;/code&gt;&lt;/strong&gt; qui est un &lt;i&gt;bool&#233;en&lt;/i&gt; et indique si l'autorisation exceptionnelle est accord&#233;e ou non :
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Lorsque &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$autoriser&lt;/code&gt; vaut &#171; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;true&lt;/code&gt; &#187; ou n'est pas fourni, on accorde une autorisation exceptionnelle : tous les appels suivant &#224; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;autoriser()&lt;/code&gt; avec les m&#234;mes arguments &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$faire, $type&lt;/code&gt; et &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$id&lt;/code&gt; renverront &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;true&lt;/code&gt;&lt;/li&gt;&lt;li&gt; Lorsque &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$autoriser&lt;/code&gt; vaut &#171; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;false&lt;/code&gt; &#187; cela signifie que l'autorisation revient sous le r&#233;gime normal et sera v&#233;rifi&#233;e selon la r&#232;gle en vigueur (elle peut donc &#234;tre encore autoris&#233;e ou effectivement interdite). Le &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;false&lt;/code&gt; n'indique donc pas ici qu'on interdit l'action, mais simplement qu'il n'y a plus d'exception.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Depuis SPIP 4.0 autoriser_exception accepte un argument * en guise d'id :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; quand on autorise une exception avec *, cela l'autorise pour tout id&lt;/li&gt;&lt;li&gt; quand on annule une exception avec *, cela annule toutes les exceptions pour cet objet, m&#234;me celles qui auraient &#233;t&#233; pos&#233;es individuellement avec des ids&lt;/li&gt;&lt;/ul&gt;&lt;/section&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau1 sommaire-section_h2&#034; aria-labelledby=&#034;Declarer-une-nouvelle-autorisation&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Declarer-une-nouvelle-autorisation'&gt;D&#233;clarer une nouvelle autorisation&lt;a class='sommaire-back sommaire-back-4' href='#s-Declarer-une-nouvelle-autorisation' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Lorsque la fonction g&#233;n&#233;rique &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;autoriser()&lt;/code&gt; est appel&#233;e, elle cherche une fonction nomm&#233;e &#224; laquelle d&#233;l&#233;guer la v&#233;rification.&lt;/p&gt;
&lt;p&gt;Si aucun &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$type&lt;/code&gt; n'est fourni dans l'appel &#224; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;autoriser()&lt;/code&gt;, la recherche de la fonction se fait dans l'ordre suivant :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; autoriser_&lt;i&gt;$faire&lt;/i&gt;&lt;/li&gt;&lt;li&gt; autoriser_&lt;i&gt;$faire&lt;/i&gt;_dist&lt;/li&gt;&lt;li&gt; autoriser_defaut&lt;/li&gt;&lt;li&gt; autoriser_defaut_dist&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Si un &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$type&lt;/code&gt; est fourni dans l'appel &#224; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;autoriser()&lt;/code&gt;, la recherche se fait dans l'ordre suivant :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; autoriser_&lt;i&gt;$type&lt;/i&gt;_&lt;i&gt;$faire&lt;/i&gt;&lt;/li&gt;&lt;li&gt; autoriser_&lt;i&gt;$type&lt;/i&gt;_&lt;i&gt;$faire&lt;/i&gt;_dist&lt;/li&gt;&lt;li&gt; autoriser_&lt;i&gt;$type&lt;/i&gt;&lt;/li&gt;&lt;li&gt; autoriser_&lt;i&gt;$type&lt;/i&gt;_dist&lt;/li&gt;&lt;li&gt; autoriser_&lt;i&gt;$faire&lt;/i&gt;&lt;/li&gt;&lt;li&gt; autoriser_&lt;i&gt;$faire&lt;/i&gt;_dist&lt;/li&gt;&lt;li&gt; autoriser_defaut&lt;/li&gt;&lt;li&gt; autoriser_defaut_dist&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Dans les deux cas, la recherche va du plus pr&#233;cis vers le plus g&#233;n&#233;ral. Cela permet de d&#233;finir des familles d'autorisation avec une r&#232;gle g&#233;n&#233;rale (pour une action par exemple), que l'on pr&#233;cise ensuite pour certains objets qui suivent une r&#232;gle diff&#233;rente.&lt;/p&gt;
&lt;p&gt;Pour d&#233;finir une autorisation, il suffit donc de cr&#233;er une fonction avec l'un des noms de la liste ci-dessus. La fonction recevra en arguments ceux envoy&#233;s &#224; la fonction &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;autoriser()&lt;/code&gt; et doit renvoyer &#171; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;true&lt;/code&gt; &#187; ou &#171; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;false&lt;/code&gt; &#187;.&lt;/p&gt;
&lt;p&gt;On peut d&#233;finir une autorisation g&#233;n&#233;rique. Lorsque c'est une autorisation qui n'est pas encore d&#233;finie, on la suffixe en g&#233;n&#233;ral par un &lt;i&gt;_dist&lt;/i&gt; qui permet toujours &#224; un webmestre de la surcharger dans son fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;mes_options.php&lt;/code&gt; (en d&#233;clarant la fonction de m&#234;me nom, mais sans son suffixe &lt;i&gt;_dist&lt;/i&gt;).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Attention :&lt;/strong&gt; on voit que dans le nom de la fonction, l'ordre de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$faire&lt;/code&gt; et &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$type&lt;/code&gt; est invers&#233; par rapport &#224; celui de l'appel &#224; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;autoriser()&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&#192; noter &#233;galement qu'&#224; partir de &lt;a href='https://www.spip.net/fr_article5427.html' class=&#034;spip_in&#034;&gt;SPIP 3.0&lt;/a&gt; le &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$type&lt;/code&gt; est pr&#233;sum&#233; correspondre &#224; un objet, et est normalis&#233; lors de l'appel : v&#233;rification qu'il correspond bien &#224; un type d'objet et sinon suppression du &#171; s &#187; final. Cela permet d'assurer qu'on appellera bien la bonne fonction d'autorisation m&#234;me si on utilise un synonyme du &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$type&lt;/code&gt; (syndic au lieu de site par exemple, ou &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;groupes_mot&lt;/code&gt; au lieu de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;groupe_mots&lt;/code&gt; qui est une exception de nommage).&lt;br class='manualbr' /&gt;Il est cependant possible d'&#233;chapper &#224; cette normalisation en pr&#233;fixant le &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$type&lt;/code&gt; par un '_' (underscore) dans l'appel &#224; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;autoriser()&lt;/code&gt;, lorsque cet argument est le nom d'une page de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;ecrire&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Dans tous les cas, tous les autres caract&#232;res '_' sont retir&#233;s du &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$type&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Ainsi un appel &#224; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;autoriser('modifier', 'groupes_mots', $id_groupe)&lt;/code&gt; d&#233;l&#232;guera &#224; la fonction &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;autoriser_groupemots_modifier()&lt;/code&gt; (ou l'une des variantes selon la r&#232;gle ci-dessus si cette fonction pr&#233;cise n'existe pas).&lt;br class='autobr' /&gt;
Dans les versions ant&#233;rieures &#224; &lt;a href='https://www.spip.net/fr_article5427.html' class=&#034;spip_in&#034;&gt;SPIP 3.0&lt;/a&gt; il convient de toujours faire tr&#232;s attention &#224; bien utiliser le nom de l'objet sans erreur, car sinon l'autorisation par d&#233;faut sera appel&#233;e ce qui peut conduire &#224; une erreur d'autorisation plus ou moins grave selon le cas.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Exemple de fonction d'autorisation :&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;php&#034; class='spip_code spip_code_block language-php' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;/** * Autoriser a creer un article : * Il faut qu'une rubrique existe et qu'on ait le statut necessaire pour creer * * @return bool */ function autoriser_article_creer_dist($faire, $type, $id, $qui, $opt) { return (sql_countsel('spip_rubriques')&gt;0 AND in_array($qui['statut'], array('0minirezo', '1comite'))); } &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;a id=&#034;_DEBUG_AUTORISER&#034;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau1 sommaire-section_h2&#034; aria-labelledby=&#034;Aide-au-developpement&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Aide-au-developpement'&gt;Aide au d&#233;veloppement&lt;a class='sommaire-back sommaire-back-4' href='#s-Aide-au-developpement' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Lors du d&#233;veloppement d'un plugin, il peut &#234;tre utile de comprendre comment sont appel&#233;es les autorisations et dans quel ordre d'encha&#238;nement.&lt;/p&gt;
&lt;p&gt;Pour cela il suffit d'ajouter la ligne suivante dans le fichier &lt;a href='https://www.spip.net/fr_article4654.html' class=&#034;spip_in&#034;&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;mes_options.php&lt;/code&gt;&lt;/a&gt; :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;php&#034; class='spip_code spip_code_block language-php' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;define('_DEBUG_AUTORISER', true); &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Chaque appel &#224; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;autoriser()&lt;/code&gt; sera alors trac&#233; dans le fichier &lt;i&gt;spip.log&lt;/i&gt; avec le nom de la fonction appel&#233;e et le r&#233;sultat qu'elle a retourn&#233;.&lt;/p&gt;&lt;/section&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Formulaire CVT avec sauvegarde automatique</title>
		<link>https://www.spip.net/fr_article5428.html</link>
		<guid isPermaLink="true">https://www.spip.net/fr_article5428.html</guid>
		<dc:date>2012-05-19T09:31:05Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>cerdic</dc:creator>


		<dc:subject>Formulaires CVT</dc:subject>
		<dc:subject>SPIP 3.0</dc:subject>

		<description>&lt;p&gt;SPIP 3.0 introduit la prise en charge de la sauvegarde automatique de la saisie de l'utilisateur.&lt;/p&gt;

-
&lt;a href="https://www.spip.net/fr_rubrique522.html" rel="directory"&gt;Interactivit&#233;&lt;/a&gt;

/ 
&lt;a href="https://www.spip.net/@multifrformulairescvtencvtformsesformularioscvtcaformulariscvtmulti" rel="tag"&gt;Formulaires CVT&lt;/a&gt;, 
&lt;a href="https://www.spip.net/@spip30" rel="tag"&gt;SPIP 3.0&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;!--sommaire--&gt;&lt;div class=&#034;well nav-sommaire nav-sommaire-3&#034; id=&#034;nav69f2858133e960.56662869&#034;&gt;
&lt;h2&gt;Sommaire&lt;/h2&gt;&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;a id=&#034;s-Activer-la-fonction&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Activer-la-fonction&#034; class=&#034;spip_ancre&#034;&gt;Activer la fonction&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Ou-sont-sauvegardees-les-donnees&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Ou-sont-sauvegardees-les-donnees&#034; class=&#034;spip_ancre&#034;&gt;Ou sont sauvegard&#233;es les donn&#233;es ?&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-De-la-vie-privee&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#De-la-vie-privee&#034; class=&#034;spip_ancre&#034;&gt;De la vie priv&#233;e ...&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;!--/sommaire--&gt;&lt;p&gt;Pour &#233;viter que les utilisateurs ne perdent le b&#233;n&#233;fice de leur saisie en cas de perte de connexion ou de fausse manipulation, il est possible d'activer une fonction de sauvegarde automatis&#233;e dans les formulaires CVT.&lt;/p&gt;
&lt;section class=&#034;sommaire-section sommaire-section_niveau1 sommaire-section_h2&#034; aria-labelledby=&#034;Activer-la-fonction&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Activer-la-fonction'&gt;Activer la fonction&lt;a class='sommaire-back sommaire-back-3' href='#s-Activer-la-fonction' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Pour activer la prise en charge, il suffit que la fonction charger() du formulaire renvoie un identifiant unique qui d&#233;signe le formulaire.&lt;/p&gt;
&lt;p&gt;Il y aura une sauvegarde diff&#233;rente par identifiant unique (et par formulaire), celui-ci doit donc d&#233;pendre du contexte de la saisie. Par exemple sur un formulaire de forum en r&#233;ponse &#224; un article on choisira de passer comme identifiant l'id_article de l'article auquel on r&#233;pond.&lt;/p&gt;
&lt;p&gt;Cet identifiant peut &#234;tre un entier, une chaine ou un tableau, et doit &#234;tre envoy&#233; dans le champ '_autosave_id' :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;php&#034; class='spip_code spip_code_block language-php' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;function formulaires_repondre_article_charger_dist($id_article){ ... return array( ..., '_autosave_id' =&gt; $id_article ); } &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/section&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau1 sommaire-section_h2&#034; aria-labelledby=&#034;Ou-sont-sauvegardees-les-donnees&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Ou-sont-sauvegardees-les-donnees'&gt;Ou sont sauvegard&#233;es les donn&#233;es ?&lt;a class='sommaire-back sommaire-back-3' href='#s-Ou-sont-sauvegardees-les-donnees' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Lorsqu'on active cette fonction, le formulaire va envoyer &#224; chaque modification de saisie une requ&#234;te &#224; SPIP avec la liste de tous les champs saisis. SPIP va alors stocker cette information dans la session de l'utilisateur, sur le serveur.&lt;/p&gt;
&lt;p&gt;Lorsque la saisie est compl&#232;te et que l'utilisateur valide le formulaire, SPIP va alors vider cette sauvegarde (lors du traitement du formulaire).&lt;/p&gt;
&lt;p&gt;Mais si l'utilisateur rencontre une erreur ou un probl&#232;me et oublie de valider le formulaire, la sauvegarde est conserv&#233;e 72H. Si l'utilisateur revient sur le m&#234;me formulaire, il va retrouver le formulaire pr&#233;-rempli avec toutes les informations qu'il avait saisi auparavant.&lt;/p&gt;
&lt;/section&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau1 sommaire-section_h2&#034; aria-labelledby=&#034;De-la-vie-privee&#034;&gt;&lt;h2 class=&#034;h2&#034; id='De-la-vie-privee'&gt;De la vie priv&#233;e ...&lt;a class='sommaire-back sommaire-back-3' href='#s-De-la-vie-privee' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Attention cependant &#224; ne pas utiliser cette sauvegarde automatique dans un formulaire qui collecte des donn&#233;es personnelles dans une session anonyme.&lt;/p&gt;
&lt;p&gt;Si l'utilisateur est sur un poste de consultation public et ne valide pas, ses donn&#233;es seront alors disponibles pour quiconque revient sur la m&#234;me page avec son poste de consultation.&lt;/p&gt;
&lt;p&gt;Par ailleurs, il est possible de personnaliser la dur&#233;e de 72H de conservation des donn&#233;es saisies en pr&#233;cisant dans le fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;mes_options.php&lt;/code&gt; par exemple (pour une dur&#233;e de 24h) :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;php&#034; class='spip_code spip_code_block language-php' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;define('_AUTOSAVE_GB_DELAY',24*3600) &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/section&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>{tri} et #TRI dans les boucles</title>
		<link>https://www.spip.net/fr_article5429.html</link>
		<guid isPermaLink="true">https://www.spip.net/fr_article5429.html</guid>
		<dc:date>2012-05-19T09:31:01Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>cerdic</dc:creator>


		<dc:subject>SPIP 3.0</dc:subject>
		<dc:subject>#TRI</dc:subject>
		<dc:subject>tri</dc:subject>

		<description>
&lt;p&gt;SPIP dispose d'un crit&#232;re et d'une balise qui permettent de faire facilement des listes triables. &lt;br class='autobr' /&gt; Le crit&#232;re tri simplifie la r&#233;alisation de listes triables de la m&#234;me fa&#231;on que le crit&#232;re pagination simplifie la r&#233;alisation de listes pagin&#233;es. &lt;br class='autobr' /&gt;
Dans une boucle simple, il permet de d&#233;finir le crit&#232;re de tri en lui indiquant en argument le champ &#224; utiliser par d&#233;faut : spip &lt;br class='autobr' /&gt;
Jusque l&#224; rien de nouveau par rapport au crit&#232;re par. Mais tri peut &#234;tre associ&#233; &#224; la balise #TRI qui permet de (&#8230;)&lt;/p&gt;


-
&lt;a href="https://www.spip.net/fr_rubrique522.html" rel="directory"&gt;Interactivit&#233;&lt;/a&gt;

/ 
&lt;a href="https://www.spip.net/@spip30" rel="tag"&gt;SPIP 3.0&lt;/a&gt;, 
&lt;a href="https://www.spip.net/@tri" rel="tag"&gt;#TRI&lt;/a&gt;, 
&lt;a href="https://www.spip.net/@tri" rel="tag"&gt;tri&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;SPIP dispose d'un crit&#232;re et d'une balise qui permettent de faire facilement des listes triables.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;p&gt;Le crit&#232;re &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{tri}&lt;/code&gt; simplifie la r&#233;alisation de listes triables de la m&#234;me fa&#231;on que le crit&#232;re &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{pagination}&lt;/code&gt; simplifie la r&#233;alisation de listes pagin&#233;es.&lt;/p&gt;
&lt;p&gt;Dans une boucle simple, il permet de d&#233;finir le crit&#232;re de tri en lui indiquant en argument le champ &#224; utiliser par d&#233;faut :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;spip&#034; class='spip_code spip_code_block language-spip' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;&lt;BOUCLE_art(ARTICLES){tri titre}&gt; &lt;/BOUCLE_art&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Jusque l&#224; rien de nouveau par rapport au crit&#232;re &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{par}&lt;/code&gt;. Mais &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{tri}&lt;/code&gt; peut &#234;tre associ&#233; &#224; la balise &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#TRI&lt;/code&gt; qui permet de g&#233;n&#233;rer un lien pour changer le crit&#232;re de tri. La balise &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#TRI&lt;/code&gt; prend en premier argument le champ de tri, et en second argument le libell&#233; du lien cliquable pour utiliser ce champ pour le tri :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;spip&#034; class='spip_code spip_code_block language-spip' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;&lt;B_art&gt; &lt;p&gt;#TRI{titre,'Trier par titre'} | #TRI{date,'Trier par date'} | #TRI{date_redac,'Trier par date de r&#233;daction'}&lt;/p&gt; &lt;BOUCLE_art(ARTICLES){tri titre}&gt; &lt;/BOUCLE_art&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ce faisant l'internaute se voit proposer un menu pour modifier le tri de la boucle. Le tri actuellement utilis&#233; est expos&#233; en gras. Un clic active les tris non utilis&#233;s. Depuis SPIP 4.2, un clic inverse un tri actif.&lt;/p&gt;
&lt;p&gt;Si la boucle est dans une inclusion ajax, il suffit de renseigner la classe ajax en troisi&#232;me argument de la balise &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#TRI&lt;/code&gt; pour que les liens se comportent avec un rechargement partiel de la page :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;spip&#034; class='spip_code spip_code_block language-spip' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;&lt;B_art&gt; &lt;p&gt;#TRI{titre,'Trier par titre',ajax} | #TRI{date,'Trier par date',ajax} | #TRI{date_redac,'Trier par date de r&#233;daction',ajax}&lt;/p&gt; &lt;BOUCLE_art(ARTICLES){tri titre}&gt; &lt;/BOUCLE_art&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Le crit&#232;re &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{tri}&lt;/code&gt; permet &#233;galement d'indiquer le sens du tri par d&#233;faut en second argument. Il faut indiquer la valeur &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;direct&lt;/code&gt; ou &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;1&lt;/code&gt; pour indiquer un tri croissant par d&#233;faut, et &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;inverse&lt;/code&gt; ou &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;-1&lt;/code&gt; pour un tri d&#233;croissant par d&#233;faut :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;spip&#034; class='spip_code spip_code_block language-spip' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;&lt;B_art&gt; &lt;p&gt;#TRI{titre,'Trier par titre'} | #TRI{date,'Trier par date'} | #TRI{date_redac,'Trier par date de r&#233;daction'}&lt;/p&gt; &lt;BOUCLE_art(ARTICLES){tri date,-1}&gt; &lt;/BOUCLE_art&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Par ailleurs il est aussi possible de proposer le choix du sens de tri. Cela se fait en passant &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&gt;&lt;/code&gt; pour un tri croissant et &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;&lt;/code&gt; pour un tri d&#233;croissant en premier argument de la balise &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#TRI&lt;/code&gt; :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;spip&#034; class='spip_code spip_code_block language-spip' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;&lt;B_art&gt; &lt;p&gt;#TRI{&gt;,'Tri croissant',ajax} | #TRI{&lt;,'Tri d&#233;croissant',ajax} | #TRI{titre,'Trier par titre',ajax} | #TRI{date,'Trier par date',ajax} | #TRI{date_redac,'Trier par date de r&#233;daction',ajax}&lt;/p&gt; &lt;BOUCLE_art(ARTICLES){tri titre}&gt; &lt;/BOUCLE_art&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Cela dit, plut&#244;t que de proposer des boutons de tri syst&#233;matique, une alternative est possible : adapter automatiquement le sens du tri &#224; la colonne utilis&#233;e pour le tri. Cela se fait en passant en second argument de la balise tri un tableau avec le sens par d&#233;faut pour chaque colonne :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;spip&#034; class='spip_code spip_code_block language-spip' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;#SET{defaut_tri,#ARRAY{ titre,1, date,-1, date_redac,-1 }} &lt;B_art&gt; &lt;p&gt;#TRI{titre,'Trier par titre',ajax} | #TRI{date,'Trier par date',ajax} | #TRI{date_redac,'Trier par date de r&#233;daction',ajax}&lt;/p&gt; &lt;BOUCLE_art(ARTICLES){tri titre,#GET{defaut_tri}}&gt; &lt;/BOUCLE_art&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ainsi quand l'internaute choisira le tri par titre, celui-ci sera dans un ordre croissant. Mais quand il choisira la date ou la date de r&#233;daction, le tri se fera dans un ordre d&#233;croissant.&lt;/p&gt;
&lt;p&gt;Un troisi&#232;me argument commen&#231;ant par &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;session&lt;/code&gt; permet d'indiquer de stocker l'ordre de tri dans la session de l'internaute. Celle-ci ou celui-ci pourra d&#232;s lors retrouver son tri favori lors de son retour sur la page.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;spip&#034; class='spip_code spip_code_block language-spip' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;#SET{defaut_tri,#ARRAY{ titre,1, date,-1, date_redac,-1 }} &lt;B_art&gt; &lt;p&gt;#TRI{titre,'Trier par titre',ajax} | #TRI{date,'Trier par date',ajax} | #TRI{date_redac,'Trier par date de r&#233;daction',ajax}&lt;/p&gt; &lt;BOUCLE_art(ARTICLES){tri titre,#GET{defaut_tri}, session_art}&gt; &lt;/BOUCLE_art&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Multilinguisme&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;La balise tri peut trier selon un champ m&#234;me lorsque celui ci contient des &lt;a href='https://www.spip.net/fr_article2124.html' class=&#034;spip_in&#034;&gt;cha&#238;nes multilingues&lt;/a&gt; (exemple : &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;multi&gt;[fr]Irak [en]Iraq&lt;/multi&gt;&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Il suffit pour cela de pr&#233;fixer le nom du champ par 'multi' dans l'appel de la balise #TRI.&lt;/p&gt;
&lt;p&gt;Exemple : &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#TRI{multi titre,'Titre', ajax}&lt;/code&gt;&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>API de gestion des liaisons [ redirection ]</title>
		<link>https://www.spip.net/fr_article5477.html</link>
		<guid isPermaLink="true">https://www.spip.net/fr_article5477.html</guid>
		<dc:date>2012-05-19T09:30:48Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>cerdic</dc:creator>


		<dc:subject>SPIP 3.0</dc:subject>
		<dc:subject>Archive</dc:subject>

		<description>
&lt;p&gt;SPIP 3 introduit une gestion g&#233;n&#233;rique des tables de liens d'un objet avec n'importe quel autre objet. &lt;br class='autobr' /&gt; Table de lien Les liens sont structurellement non sym&#233;triques : il partent d'un objet source pour aller vers n'importe quel objet destination. &lt;br class='autobr' /&gt;
Pour &#234;tre associable en tant que source, un objet bidibule stock&#233; dans une table spip_bidibules doit poss&#233;der une table spip_bidibules_liens qui poss&#232;dera un champ id_bidibule (m&#234;me nom que la cl&#233; primaire de spip_bidibules) et deux champs (&#8230;)&lt;/p&gt;


-
&lt;a href="https://www.spip.net/fr_rubrique257.html" rel="directory"&gt;Guide des fonctions avanc&#233;es&lt;/a&gt;

/ 
&lt;a href="https://www.spip.net/@spip30" rel="tag"&gt;SPIP 3.0&lt;/a&gt;, 
&lt;a href="https://www.spip.net/@archive" rel="tag"&gt;Archive&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;SPIP 3 introduit une gestion g&#233;n&#233;rique des tables de liens d'un objet avec n'importe quel autre objet.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;!--sommaire--&gt;&lt;div class=&#034;well nav-sommaire nav-sommaire-10&#034; id=&#034;nav69f28581381ee2.21361428&#034;&gt;
&lt;h2&gt;Sommaire&lt;/h2&gt;&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;a id=&#034;s-Table-de-lien&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Table-de-lien&#034; class=&#034;spip_ancre&#034;&gt;Table de lien&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-API&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#API&#034; class=&#034;spip_ancre&#034;&gt;API&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-objet_associable&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#objet_associable&#034; class=&#034;spip_ancre&#034;&gt;objet_associable&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-objet_associer&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#objet_associer&#034; class=&#034;spip_ancre&#034;&gt;objet_associer&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-objet_dissocier&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#objet_dissocier&#034; class=&#034;spip_ancre&#034;&gt;objet_dissocier&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-objet_qualifier_liens&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#objet_qualifier_liens&#034; class=&#034;spip_ancre&#034;&gt;objet_qualifier_liens&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-objet_trouver_liens&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#objet_trouver_liens&#034; class=&#034;spip_ancre&#034;&gt;objet_trouver_liens&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-objet_optimiser_liens&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#objet_optimiser_liens&#034; class=&#034;spip_ancre&#034;&gt;objet_optimiser_liens&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-objet_dupliquer_liens&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#objet_dupliquer_liens&#034; class=&#034;spip_ancre&#034;&gt;objet_dupliquer_liens&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Interface-d-edition&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Interface-d-edition&#034; class=&#034;spip_ancre&#034;&gt;Interface d'&#233;dition&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;!--/sommaire--&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau1 sommaire-section_h2&#034; aria-labelledby=&#034;Table-de-lien&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Table-de-lien'&gt;Table de lien&lt;a class='sommaire-back sommaire-back-10' href='#s-Table-de-lien' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Les liens sont structurellement non sym&#233;triques : il partent d'un objet source pour aller vers n'importe quel objet destination.&lt;/p&gt;
&lt;p&gt;Pour &#234;tre associable en tant que source, un objet &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;bidibule&lt;/code&gt; stock&#233; dans une table &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;spip_bidibules&lt;/code&gt; doit poss&#233;der une table &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;spip_bidibules_liens&lt;/code&gt; qui poss&#232;dera un champ &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;id_bidibule&lt;/code&gt; (m&#234;me nom que la cl&#233; primaire de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;spip_bidibules&lt;/code&gt;) et deux champs &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;id_objet&lt;/code&gt; et &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;objet&lt;/code&gt;.&lt;br class='manualbr' /&gt;La table peut aussi comporter d'autres champs pour qualifier les liens.&lt;/p&gt;
&lt;/section&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau1 sommaire-section_h2&#034; aria-labelledby=&#034;API&#034;&gt;&lt;h2 class=&#034;h2&#034; id='API'&gt;API&lt;a class='sommaire-back sommaire-back-10' href='#s-API' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;L'API permet de g&#233;rer simplement les liens sans manipuler directement des requ&#234;tes SQL, et en offrant syst&#233;matiquement des points d'entr&#233;e aux plugins qui peuvent ainsi savoir quand un lien est ajout&#233;, supprim&#233;, ou modifi&#233; et agir en cons&#233;quence.&lt;/p&gt;
&lt;p&gt;Pour utiliser l'API il faut inclure &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;action/editer_liens.php&lt;/code&gt; :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;php&#034; class='spip_code spip_code_block language-php' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;include_spip('action/editer_liens'); &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/section&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau1 sommaire-section_h2&#034; aria-labelledby=&#034;objet_associable&#034;&gt;&lt;h2 class=&#034;h2&#034; id='objet_associable'&gt;objet_associable&lt;a class='sommaire-back sommaire-back-10' href='#s-objet_associable' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;objet_associable($objet)&lt;/code&gt; teste si un objet peut &#234;tre associ&#233; &#224; d'autres via sa table de liens.&lt;/p&gt;
&lt;p&gt;Si l'objet n'est pas associable (il n'a pas de table de liens d&#233;di&#233;e), la fonction renvoie &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;false&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Si l'objet est associable, la fonction renvoie un tableau compos&#233; du nom de la cl&#233; primaire (commune &#224; la table de liens et &#224; la table de l'objet), et le nom de la table de liens.&lt;/p&gt;
&lt;p&gt;Par exemple (et par d&#233;faut dans SPIP) les auteurs, les documents, les mots sont des objets associables car ils disposent tous d'une table spip_xxx_liens.&lt;/p&gt;
&lt;p&gt;Par contre, les articles ne sont pas associables car ils ne disposent pas de table spip_articles_liens. Cela signifie qu'on ne peut pas cr&#233;er de liens partant des articles vers un autre objet quelconque. En revanche on peut cr&#233;er un lien depuis un mot, un auteur ou un document vers un article.&lt;/p&gt;
&lt;/section&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau1 sommaire-section_h2&#034; aria-labelledby=&#034;objet_associer&#034;&gt;&lt;h2 class=&#034;h2&#034; id='objet_associer'&gt;objet_associer&lt;a class='sommaire-back sommaire-back-10' href='#s-objet_associer' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;objet_associer($objets_source, $objets_lies[,$qualif])&lt;/code&gt; permet d'associer les &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$objets_lies&lt;/code&gt; aux &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$objets_source&lt;/code&gt; via leurs table de lien propres.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$objets_source&lt;/code&gt;&lt;/strong&gt;&lt;br class='manualbr' /&gt;Les &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$objets_source&lt;/code&gt; doivent &#234;tre tous associables au sens de la fonction &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;objet_associable()&lt;/code&gt;. Les objets sources sont donc les pivots sur lesquels portent les liens.&lt;/p&gt;
&lt;p&gt;Le format de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$objets_source&lt;/code&gt; est commun a toutes les fonctions de manipulation de liens. &lt;br class='manualbr' /&gt;C'est un tableau dont&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; chaque cl&#233; correspond au nom de l'objet &#224; associer&lt;/li&gt;&lt;li&gt; chaque valeur d&#233;crit le ou les id pour chaque objet. Les valeurs peuvent &#234;tre :
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; le joker &#034;*&#034; qui d&#233;signe &#034;tous les id d&#233;ja dans la table de lien&#034; (il a donc peu d'int&#233;r&#234;t dans le cas de l'ajout de liens comme ici)&lt;/li&gt;&lt;li&gt; une valeur scalaire autre d&#233;signe un id pr&#233;cis&lt;/li&gt;&lt;li&gt; un tableau d&#233;signe une liste d'id (un tableau ne peut pas contenir le joker &#034;*&#034;)&lt;/li&gt;&lt;li&gt; un tableau de deux &#233;l&#233;ments commen&#231;ant par la valeur 'NOT' d&#233;signe une condition exclusive : tous les id d&#233;j&#224; dans la table de lien sauf ceux d&#233;crits dans la seconde valeur (qui peut &#234;tre &#224; son tour un scalaire ou un tableau)&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$objets_lies&lt;/code&gt;&lt;/strong&gt;&lt;br class='manualbr' /&gt;Le format de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$objets_lies&lt;/code&gt; est commun a toutes les fonctions de manipulation de liens. &lt;br class='manualbr' /&gt;C'est un tableau dont&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; chaque cl&#233; correspond au nom de l'objet &#224; associer. La valeur joker &#034;*&#034; d&#233;signe &#034;tous les objets pr&#233;sents dans la table de lien&#034; (peu d'int&#233;r&#234;t dans le cas d'ajout de lien donc)&lt;/li&gt;&lt;li&gt; chaque valeur d&#233;crit le ou les id pour chaque objet. Les valeurs peuvent &#234;tre :
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; le joker &#034;*&#034; qui d&#233;signe &#034;tous les id d&#233;ja dans la table de lien&#034; (il a donc peu d'int&#233;r&#234;t dans le cas de l'ajout de liens comme ici)&lt;/li&gt;&lt;li&gt; une valeur scalaire autre d&#233;signe un id pr&#233;cis&lt;/li&gt;&lt;li&gt; un tableau d&#233;signe une liste d'id (un tableau ne peut pas contenir le joker &#034;*&#034;)&lt;/li&gt;&lt;li&gt; un tableau de deux &#233;l&#233;ments commen&#231;ant par la valeur 'NOT' d&#233;signe une condition exclusive : tous les id d&#233;j&#224; dans la table de lien sauf ceux d&#233;crits dans la seconde valeur (qui peut &#234;tre &#224; son tour un scalaire ou un tableau)&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$qualif&lt;/code&gt;&lt;/strong&gt;&lt;br class='manualbr' /&gt;La fonction &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;objet_associer&lt;/code&gt; peut prendre un troisi&#232;me argument facultatif &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$qualif&lt;/code&gt; qui est un tableau associatif &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;champ=&gt;valeur&lt;/code&gt; avec lequel seront modifi&#233;s les liens ajout&#233;s. Cela peut &#234;tre utile si la table de lien dispose de champs suppl&#233;mentaires qui d&#233;crivent les liens.&lt;/p&gt;
&lt;p&gt;Si plusieurs liens sont cr&#233;&#233;s en m&#234;me temps, ils se voient appliquer tous les m&#234;mes valeurs d&#233;crites dans &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$qualif&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;exemples&lt;/strong&gt;&lt;br class='manualbr' /&gt;Les exemples ci-dessous sont valides :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;php&#034; class='spip_code spip_code_block language-php' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;objet_associer(array(&#034;auteur&#034;=&gt;3), array(&#034;article&#034;=&gt;5)); objet_associer(array(&#034;auteur&#034;=&gt;3), array(&#034;article&#034;=&gt;array(5,6))); objet_associer(array(&#034;auteur&#034;=&gt;array(3,4)), array(&#034;article&#034;=&gt;5)); objet_associer(array(&#034;auteur&#034;=&gt;array(3,4)), array(&#034;article&#034;=&gt;array(5,6))); objet_associer(array(&#034;document&#034;=&gt;3), array(&#034;article&#034;=&gt;5), array('vu'=&gt;'oui')); &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;La fonction renvoie le nombre de liens effectivement cr&#233;&#233;s (certains liens pouvant d&#233;j&#224; exister au moment de la tentative d'ajout, qui ne sont alors pas compt&#233;s).&lt;/p&gt;
&lt;/section&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau1 sommaire-section_h2&#034; aria-labelledby=&#034;objet_dissocier&#034;&gt;&lt;h2 class=&#034;h2&#034; id='objet_dissocier'&gt;objet_dissocier&lt;a class='sommaire-back sommaire-back-10' href='#s-objet_dissocier' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;objet_dissocier($objets_source,$objets_lies)&lt;/code&gt; permet de supprimer les liens entre les &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$objets_source&lt;/code&gt; et &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$objets_lies&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$objets_source&lt;/code&gt;&lt;/strong&gt;&lt;br class='manualbr' /&gt;voir le format identique &#224; celui d&#233;crit dans &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;objet_associer&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$objets_lies&lt;/code&gt;&lt;/strong&gt;&lt;br class='manualbr' /&gt;voir le format identique &#224; celui d&#233;crit dans &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;objet_associer&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;exemples&lt;/strong&gt;&lt;br class='manualbr' /&gt;Les exemples ci-dessous sont valides :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;php&#034; class='spip_code spip_code_block language-php' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;objet_dissocier(array(&#034;auteur&#034;=&gt;3), array(&#034;article&#034;=&gt;5)); /* Exemple pour associer un auteur &#224; une liste d'article et uniquement &#224; ceux l&#224; */ objet_associer(array(&#034;auteur&#034;=&gt;3), array(&#034;article&#034;=&gt;array(5,6))); objet_dissocier(array(&#034;auteur&#034;=&gt;3), array(&#034;article&#034;=&gt;array('NOT', array(5,6)))); &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;La fonction renvoie le nombre de liens effectivement supprim&#233;s.&lt;/p&gt;
&lt;/section&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau1 sommaire-section_h2&#034; aria-labelledby=&#034;objet_qualifier_liens&#034;&gt;&lt;h2 class=&#034;h2&#034; id='objet_qualifier_liens'&gt;objet_qualifier_liens&lt;a class='sommaire-back sommaire-back-10' href='#s-objet_qualifier_liens' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;objet_qualifier_liens($objets_source,$objets_lies,$qualif)&lt;/code&gt; permet de modifier les valeurs des champs d&#233;crits dans &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$qualif&lt;/code&gt; sur les liens entre &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$objets_source&lt;/code&gt; et &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$objets_lies&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$objets_source&lt;/code&gt;&lt;/strong&gt;&lt;br class='manualbr' /&gt;voir le format identique &#224; celui d&#233;crit dans &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;objet_associer&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$objets_lies&lt;/code&gt;&lt;/strong&gt;&lt;br class='manualbr' /&gt;voir le format identique &#224; celui d&#233;crit dans &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;objet_associer&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$qualif&lt;/code&gt;&lt;/strong&gt;&lt;br class='manualbr' /&gt;voir le format identique &#224; celui d&#233;crit dans &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;objet_associer&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;exemples&lt;/strong&gt;&lt;br class='manualbr' /&gt;Les exemples ci-dessous sont valides :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;php&#034; class='spip_code spip_code_block language-php' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;objet_qualifier(array(&#034;document&#034;=&gt;3), array(&#034;article&#034;=&gt;5), array('vu'=&gt;'oui')); &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;La fonction renvoie le nombre de mise &#224; jour en base ou false en cas d'&#233;chec.&lt;/p&gt;
&lt;/section&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau1 sommaire-section_h2&#034; aria-labelledby=&#034;objet_trouver_liens&#034;&gt;&lt;h2 class=&#034;h2&#034; id='objet_trouver_liens'&gt;objet_trouver_liens&lt;a class='sommaire-back sommaire-back-10' href='#s-objet_trouver_liens' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;objet_trouver_liens($objets_source,$objets_lies)&lt;/code&gt; permet de retrouver tous les liens de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$objets_source&lt;/code&gt; vers &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$objets_lies&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$objets_source&lt;/code&gt;&lt;/strong&gt;&lt;br class='manualbr' /&gt;voir le format identique &#224; celui d&#233;crit dans &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;objet_associer&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$objets_lies&lt;/code&gt;&lt;/strong&gt;&lt;br class='manualbr' /&gt;voir le format identique &#224; celui d&#233;crit dans &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;objet_associer&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;La fonction renvoie un tableau constitu&#233; d'un tableau associatif pour chaque lien trouv&#233;. Ce dernier contient l'ensemble des champs du lien, auquel sont ajout&#233;s une entr&#233;e &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;objet=&gt;id&lt;/code&gt; pour la source et la destination du lien, pour simplifier le traitement au retour (&#233;vite d'avoir &#224; connaitre les cl&#233;s primaires par exemple).&lt;/p&gt;
&lt;/section&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau1 sommaire-section_h2&#034; aria-labelledby=&#034;objet_optimiser_liens&#034;&gt;&lt;h2 class=&#034;h2&#034; id='objet_optimiser_liens'&gt;objet_optimiser_liens&lt;a class='sommaire-back sommaire-back-10' href='#s-objet_optimiser_liens' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;objet_optimiser_liens($objets_source,$objets_lies)&lt;/code&gt; nettoie les liens restant entre &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$objets_source&lt;/code&gt; et &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$objets_lies&lt;/code&gt; lorsque l'un des deux n'existe plus (suppression en base de donn&#233;es).&lt;/p&gt;
&lt;p&gt;Cette fonction est classiquement utilis&#233;e dans des fonctions crons de nettoyage de la base de donn&#233;es.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$objets_source&lt;/code&gt;&lt;/strong&gt;&lt;br class='manualbr' /&gt;voir le format identique &#224; celui d&#233;crit dans &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;objet_associer&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$objets_lies&lt;/code&gt;&lt;/strong&gt;&lt;br class='manualbr' /&gt;voir le format identique &#224; celui d&#233;crit dans &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;objet_associer&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;La fonction renvoie le nombre de liens obsol&#232;tes nettoy&#233;s&lt;/p&gt;
&lt;/section&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau1 sommaire-section_h2&#034; aria-labelledby=&#034;objet_dupliquer_liens&#034;&gt;&lt;h2 class=&#034;h2&#034; id='objet_dupliquer_liens'&gt;objet_dupliquer_liens&lt;a class='sommaire-back sommaire-back-10' href='#s-objet_dupliquer_liens' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;objet_dupliquer_liens($objet,$id_source,$id_cible)&lt;/code&gt; va dupliquer tous les liens de l'&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$objet $id_source&lt;/code&gt; sur l'&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$objet $id_cible&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Pour cela, toutes les tables de liens de tous les objets connus seront parcourues pour trouver les liens depuis et vers l'&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$objet $id_source&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Chaque lien trouv&#233; sera dupliqu&#233; en substituant &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$id_cible&lt;/code&gt; &#224; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$id_source&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;La fonction retourne le nombre de liens dupliqu&#233;s.&lt;/p&gt;
&lt;/section&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau1 sommaire-section_h2&#034; aria-labelledby=&#034;Interface-d-edition&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Interface-d-edition'&gt;Interface d'&#233;dition&lt;a class='sommaire-back sommaire-back-10' href='#s-Interface-d-edition' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Une interface g&#233;n&#233;rique &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#FORMULAIRE_EDITER_LIENS&lt;/code&gt; utilisable dans les squelettes permet l'&#233;dition des liens.
&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#FORMULAIRE_EDITER_LIENS{auteurs,article,23}&lt;/code&gt; installera le formulaire pour associer/dissocier des auteurs de l'article N&#176;23.&lt;/p&gt;
&lt;p&gt;Les liens sont port&#233;s par la table lien du premier objet pass&#233; en argument du formulaire (auteurs dans l'exemple ci-dessus).&lt;/p&gt;
&lt;p&gt;On peut utiliser ce formulaire de plusieurs fa&#231;ons :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#FORMULAIRE_EDITER_LIENS{auteurs,article,23}&lt;/code&gt; pour associer des auteurs &#224; l'article N&#176;23, sur la table pivot spip_auteurs_liens&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#FORMULAIRE_EDITER_LIENS{auteur,12,articles}&lt;/code&gt; pour associer des articles &#224; l'auteur N&#176;12, sur la table pivot spip_auteurs_liens&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#FORMULAIRE_EDITER_LIENS{mot,15,auteurs}&lt;/code&gt; pour associer des auteurs au mot N&#176;15, sur la table pivot spip_mots_liens&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#FORMULAIRE_EDITER_LIENS{auteurs,mot,15}&lt;/code&gt; pour associer des auteurs au mot N&#176;15, sur la table pivot spip_auteurs_liens&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;On peut donc, par la syntaxe d'appel, d&#233;finir quels objets sont associ&#233; entre eux, ainsi que la table qui supporte les liens.&lt;/p&gt;
&lt;p&gt;Remarque : il est possible de filtrer la liste des objets pr&#233;sent&#233;s selon la valeur de certains de leurs champs en passant celles-ci en 4&#232;me argument dans un tableau associatif champ=&gt;valeur :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;spip&#034; class='spip_code spip_code_block language-spip' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;#FORMULAIRE_EDITER_LIENS{auteurs,article,23,#ARRAY{statut,6forum}} &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ne proposera que les auteurs dont le statut est &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;6forum&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Pour fonctionner, ce formulaire n&#233;cessite 2 squelettes correspondant au type d'objet associ&#233;. Par exemple pour pouvoir associer ou dissocier des auteurs de n'importe quel autre objet, les squelettes &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;prive/objets/liste/auteurs_lies.html&lt;/code&gt; et &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;prive/objets/liste/auteurs_associer.html&lt;/code&gt; sont n&#233;cessaires au fonctionnement du formulaire. Ils pr&#233;sentent la liste des objets d&#233;j&#224; associ&#233;s ainsi que la s&#233;lection des objets &#224; associer.
SPIP inclue nativement les vues n&#233;cessaires pour les auteurs, les rubriques, ainsi que les mots via le plugin mots.
Des plugins peuvent rendre cette interface disponible pour de nouveaux objets &#233;ditoriaux par la d&#233;finition de ces deux squelettes.&lt;/p&gt;&lt;/section&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>API de d&#233;claration d'objets &#233;ditoriaux [ redirection ]</title>
		<link>https://www.spip.net/fr_article5525.html</link>
		<guid isPermaLink="true">https://www.spip.net/fr_article5525.html</guid>
		<dc:date>2012-05-19T09:30:18Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>cerdic, _Eric_</dc:creator>


		<dc:subject>SPIP 3.0</dc:subject>
		<dc:subject>Archive</dc:subject>

		<description>
&lt;p&gt;La cr&#233;ation de nouveaux objets &#233;ditoriaux est simplifi&#233;e par une interface de programmation (ou API) d&#233;clarative [1] qui permet &#224; SPIP de construire de fa&#231;on automatis&#233;e une grande partie de l'interface d'&#233;dition de ces objets. &lt;br class='autobr' /&gt; Article d&#233;plac&#233; : Voir https://programmer.spip.net/1018&lt;/p&gt;


-
&lt;a href="https://www.spip.net/fr_rubrique257.html" rel="directory"&gt;Guide des fonctions avanc&#233;es&lt;/a&gt;

/ 
&lt;a href="https://www.spip.net/@spip30" rel="tag"&gt;SPIP 3.0&lt;/a&gt;, 
&lt;a href="https://www.spip.net/@archive" rel="tag"&gt;Archive&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;La cr&#233;ation de nouveaux objets &#233;ditoriaux est simplifi&#233;e par une &lt;a href=&#034;http://fr.wikipedia.org/wiki/Interface_de_programmation&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;interface de programmation&lt;/a&gt; (ou API) d&#233;clarative&lt;span class=&#034;spip_note_ref&#034;&gt; [&lt;a href=&#034;#nb3-1&#034; class=&#034;spip_note&#034; rel=&#034;appendix&#034; title=&#034;qui regroupe notamment en une seule, plusieurs d&#233;clarations existantes (&#8230;)&#034; id=&#034;nh3-1&#034;&gt;1&lt;/a&gt;]&lt;/span&gt; qui permet &#224; SPIP de construire de fa&#231;on automatis&#233;e une grande partie de l'interface d'&#233;dition de ces objets.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;p&gt;&lt;strong&gt;Article d&#233;plac&#233; : Voir &lt;a href=&#034;https://programmer.spip.net/1018&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://programmer.spip.net/1018&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/div&gt;
		&lt;hr /&gt;
		&lt;div class='rss_notes'&gt;&lt;div id=&#034;nb3-1&#034;&gt;
&lt;p&gt;&lt;span class=&#034;spip_note_ref&#034;&gt;[&lt;a href=&#034;#nh3-1&#034; class=&#034;spip_note&#034; title=&#034;Notes 3-1&#034; rev=&#034;appendix&#034;&gt;1&lt;/a&gt;] &lt;/span&gt;qui regroupe notamment en une seule, plusieurs d&#233;clarations existantes auparavant&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>La fonction verifier() des formulaires CVT</title>
		<link>https://www.spip.net/fr_article4152.html</link>
		<guid isPermaLink="true">https://www.spip.net/fr_article4152.html</guid>
		<dc:date>2010-04-06T09:34:27Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>cerdic, xdjuj</dc:creator>


		<dc:subject>Formulaires CVT</dc:subject>

		<description>
&lt;p&gt;Comment d&#233;finir la fonction &lt;br class='autobr' /&gt;
La fonction verifier() d'un formulaire XXX (qui sera affich&#233; dans les squelettes par #FORMULAIRE_XXX) est d&#233;finie dans le fichier formulaires/xxx.php ou dans le fichier formulaires/xxx/verifier.php. Le dossier formulaires/ pouvant &#234;tre rang&#233; dans le dossier d'un plugin, ou dans le dossier squelettes. &lt;br class='autobr' /&gt;
Cette fonction devra &#234;tre nomm&#233;e &lt;br class='autobr' /&gt;
function formulaires_xxx_verifier_dist(). Le suffixe _dist permettant lors du d&#233;veloppement de surcharger la fonction pour (&#8230;)&lt;/p&gt;


-
&lt;a href="https://www.spip.net/fr_rubrique522.html" rel="directory"&gt;Interactivit&#233;&lt;/a&gt;

/ 
&lt;a href="https://www.spip.net/@multifrformulairescvtencvtformsesformularioscvtcaformulariscvtmulti" rel="tag"&gt;Formulaires CVT&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;!--sommaire--&gt;&lt;div class=&#034;well nav-sommaire nav-sommaire-5&#034; id=&#034;nav69f285813d69c8.99475884&#034;&gt;
&lt;h2&gt;Sommaire&lt;/h2&gt;&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;a id=&#034;s-Comment-definir-la-fonction&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Comment-definir-la-fonction&#034; class=&#034;spip_ancre&#034;&gt;Comment d&#233;finir la fonction&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Les-arguments-de-la-fonction&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Les-arguments-de-la-fonction&#034; class=&#034;spip_ancre&#034;&gt;Les arguments de la fonction&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Que-doit-faire-la-fonction&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Que-doit-faire-la-fonction&#034; class=&#034;spip_ancre&#034;&gt;Que doit faire la fonction&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Champs-particuliers&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Champs-particuliers&#034; class=&#034;spip_ancre&#034;&gt;Champs particuliers&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Personnalisation&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Personnalisation&#034; class=&#034;spip_ancre&#034;&gt;Personnalisation&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;!--/sommaire--&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau1 sommaire-section_h2&#034; aria-labelledby=&#034;Comment-definir-la-fonction&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Comment-definir-la-fonction'&gt;Comment d&#233;finir la fonction&lt;a class='sommaire-back sommaire-back-5' href='#s-Comment-definir-la-fonction' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;La fonction &lt;i&gt;verifier()&lt;/i&gt; d'un formulaire XXX (qui sera affich&#233; dans les squelettes par &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#FORMULAIRE_XXX&lt;/code&gt;) est d&#233;finie dans le fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;formulaires/xxx.php&lt;/code&gt; ou dans le fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;formulaires/xxx/verifier.php&lt;/code&gt;. Le dossier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;formulaires/&lt;/code&gt; pouvant &#234;tre rang&#233; dans le dossier d'un plugin, ou dans le dossier squelettes.&lt;/p&gt;
&lt;p&gt;Cette fonction devra &#234;tre nomm&#233;e &lt;br class='autobr' /&gt;
&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;function formulaires_xxx_verifier_dist()&lt;/code&gt;. Le suffixe &lt;i&gt;_dist&lt;/i&gt; permettant lors du d&#233;veloppement de surcharger la fonction pour changer son comportement, en cr&#233;ant une fonction &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;function formulaires_xxx_verifier()&lt;/code&gt;&lt;/p&gt;
&lt;/section&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau1 sommaire-section_h2&#034; aria-labelledby=&#034;Les-arguments-de-la-fonction&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Les-arguments-de-la-fonction'&gt;Les arguments de la fonction&lt;a class='sommaire-back sommaire-back-5' href='#s-Les-arguments-de-la-fonction' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;La fonction &lt;i&gt;verifier()&lt;/i&gt; re&#231;oit automatiquement la valeur de chaque argument qui sont pass&#233;s &#224; la balise #FORMULAIRE_XX, dans le m&#234;me ordre.&lt;br class='autobr' /&gt;
Par exemple en &#233;crivant&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;spip&#034; class='spip_code spip_code_block language-spip' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;#FORMULAIRE_XX{#ID_ARTICLE,#ID_RUBRIQUE} &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;et la fonction&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;php&#034; class='spip_code spip_code_block language-php' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;formulaires_xxx_verifier_dist($arg1,$arg2){ ... } &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$arg1&lt;/code&gt; vaudra &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#ID_ARTICLE&lt;/code&gt;, et &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$arg2&lt;/code&gt; vaudra &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#ID_RUBRIQUE&lt;/code&gt;.&lt;/p&gt;
&lt;/section&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau1 sommaire-section_h2&#034; aria-labelledby=&#034;Que-doit-faire-la-fonction&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Que-doit-faire-la-fonction'&gt;Que doit faire la fonction&lt;a class='sommaire-back sommaire-back-5' href='#s-Que-doit-faire-la-fonction' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;La fonction &lt;i&gt;verifier()&lt;/i&gt; doit renvoyer un tableau d'erreurs de saisies r&#233;sultant de la v&#233;rification des donn&#233;es saisies.&lt;/p&gt;
&lt;p&gt;Si toute la saisie est correcte, le tableau sera vide, et SPIP appellera alors la fonction &lt;i&gt;traiter()&lt;/i&gt; du formulaire, charg&#233;e de finir le travail.&lt;/p&gt;
&lt;p&gt;Si le tableau renvoy&#233; par la fonction &lt;i&gt;verifier()&lt;/i&gt; n'est pas vide, alors la fonction &lt;i&gt;traiter()&lt;/i&gt; ne sera pas appel&#233;e, le formulaire sera de nouveau affich&#233; avec les messages d'erreur &#233;ventuels pour correction par l'utilisateur.&lt;/p&gt;
&lt;p&gt;Il convient donc de faire toutes les v&#233;rifications n&#233;cessaires au traitement dans la fonction &lt;i&gt;verifier()&lt;/i&gt; pour assurer la meilleure interactivit&#233; possible.&lt;/p&gt;
&lt;p&gt;Chaque erreur est renvoy&#233;e sous forme d'une association &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;cle=&gt;valeur&lt;/code&gt;, et il est d'usage d'utiliser comme cl&#233; le nom de la variable saisie dans le formulaire.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Exemple de fonction verifier()&lt;/strong&gt;&lt;br class='autobr' /&gt;
Voyons un exemple&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;php&#034; class='spip_code spip_code_block language-php' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;function formulaires_xxx_verifier_dist() { $erreurs = array(); if (!_request('nom')) { $erreurs['nom'] = _T('info_obligatoire'); } include_spip('inc/filtres'); if ($email = _request('email') AND !email_valide($email)) { $erreurs['email'] = _T('form_email_non_valide'); } return $erreurs; } &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ici, la fonction&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; v&#233;rifie que le nom a bien &#233;t&#233; renseign&#233;, et produit un message d'erreur dans le cas contraire ;&lt;/li&gt;&lt;li&gt; regarde si une adresse mail a &#233;t&#233; saisie, et dans ce cas v&#233;rifie sa validit&#233;, avec un message d'erreur si l'adresse mail est incorrecte.&lt;/li&gt;&lt;/ul&gt;&lt;/section&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau1 sommaire-section_h2&#034; aria-labelledby=&#034;Champs-particuliers&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Champs-particuliers'&gt;Champs particuliers&lt;a class='sommaire-back sommaire-back-5' href='#s-Champs-particuliers' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;La fonction &lt;i&gt;verifier()&lt;/i&gt; peut renvoyer certaines valeurs particuli&#232;res dans le tableau :&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;message_erreur&lt;/strong&gt;&lt;br class='manualbr' /&gt;Cette valeur est utilis&#233;e dans le squelette du formulaire pour afficher un message d'erreur g&#233;n&#233;ral, qui concerne tout le formulaire. Il peut &#234;tre judicieux de renseigner ce message d&#232;s qu'une erreur sur un champ a &#233;t&#233; identifi&#233;e&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;message_ok&lt;/strong&gt;&lt;br class='autobr' /&gt;
Cette valeur permet de renvoyer un message de succ&#232;s. Ce message peut-&#234;tre utile quand par exemple l'internaute a entr&#233; une premi&#232;re valeur qui permet de v&#233;rifier certaines informations, sans que la saisie du formulaire ne soit finie pour autant.&lt;br class='autobr' /&gt;
La pr&#233;sence de ce message emp&#234;che l'appel &#224; la fonction &lt;i&gt;traiter()&lt;/i&gt; du formulaire, qui n'est appel&#233;e que si, et seulement si, le tableau retourn&#233; par &lt;i&gt;verifier()&lt;/i&gt; est vide.&lt;/p&gt;
&lt;/section&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau1 sommaire-section_h2&#034; aria-labelledby=&#034;Personnalisation&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Personnalisation'&gt;Personnalisation&lt;a class='sommaire-back sommaire-back-5' href='#s-Personnalisation' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Comme la fonction &lt;i&gt;charger()&lt;/i&gt;, la fonction &lt;i&gt;verifier()&lt;/i&gt; d'un formulaire existant peut &#234;tre personnalis&#233;e par deux m&#233;canismes&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Surcharge&lt;/strong&gt;&lt;br class='autobr' /&gt;
Comme indiqu&#233; ci-dessus, il est possible de red&#233;finir la fonction &lt;i&gt;verifier()&lt;/i&gt; par d&#233;faut en d&#233;finissant sa propre fonction&lt;br class='autobr' /&gt;
&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;function formulaires_xxx_verifier()&lt;/code&gt;&lt;br class='autobr' /&gt;
qui sera appel&#233;e &#224; la place de la fonction par d&#233;faut qui comporte le suffixe _dist.&lt;br class='autobr' /&gt;
Cette fonction surcharg&#233;e pourra &#234;tre d&#233;finie dans le fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;formulaires/xxx/verifier.php&lt;/code&gt;, ou dans un fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;options.php&lt;/code&gt; appel&#233; &#224; chaque hit de fa&#231;on &#224; ce que la fonction soit d&#233;finie au moment o&#249; SPIP va la chercher.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pipeline&lt;/strong&gt;&lt;br class='manualbr' /&gt;Le pipeline &lt;i&gt;formulaire_verifier&lt;/i&gt; permet de modifier le r&#233;sultat de la fonction &lt;i&gt;verifier()&lt;/i&gt; par d&#233;faut de n'importe quel formulaire CVT.&lt;/p&gt;
&lt;p&gt;C'est la m&#233;thode qu'il faut privil&#233;gier dans un plugin.&lt;/p&gt;
&lt;p&gt;Le pipeline re&#231;oit en argument un tableau de cette forme :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;php&#034; class='spip_code spip_code_block language-php' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;array( 'args'=&gt;array('form'=&gt;$form,'args'=&gt;$args), 'data'=&gt;$erreurs ) &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En &#233;crivant la fonction pipeline sous cette forme&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;php&#034; class='spip_code spip_code_block language-php' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;function monplugin_formulaire_verifier($flux) { ... } &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Alors vous trouverez dans $flux les &#233;l&#233;ments suivants :&lt;/p&gt;
&lt;table class=&#034;table spip&#034;&gt;
&lt;tbody&gt;
&lt;tr class='row_odd odd'&gt;
&lt;td&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$flux['args']['form']&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;nom du formulaire (xxx dans notre exemple)&lt;/td&gt;&lt;/tr&gt;
&lt;tr class='row_even even'&gt;
&lt;td&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$flux['args']['args']&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;arguments de la fonction &lt;i&gt;charger()&lt;/i&gt; dans l'ordre o&#249; ils ont &#233;t&#233; pass&#233;s &#224; la balise #FORMULAIRE_XXX&lt;/td&gt;&lt;/tr&gt;
&lt;tr class='row_odd odd'&gt;
&lt;td&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$flux['data']&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;tableau &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$erreurs&lt;/code&gt; renvoy&#233; par la fonction &lt;i&gt;verifier()&lt;/i&gt; par d&#233;faut&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Tous les formulaires passent par le m&#234;me pipeline. Il faut donc tester la valeur de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$flux['args']['form']&lt;/code&gt; pour ne modifier que le comportement du formulaire xxx.&lt;/p&gt;
&lt;p&gt;voir aussi les fonctions &lt;a href='https://www.spip.net/fr_article4151.html' class=&#034;spip_in&#034;&gt;charger()&lt;/a&gt; et &lt;a href='https://www.spip.net/fr_article4153.html' class=&#034;spip_in&#034;&gt;traiter()&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>La fonction traiter() des formulaires CVT</title>
		<link>https://www.spip.net/fr_article4153.html</link>
		<guid isPermaLink="true">https://www.spip.net/fr_article4153.html</guid>
		<dc:date>2010-04-06T09:34:14Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>cerdic</dc:creator>


		<dc:subject>Formulaires CVT</dc:subject>

		<description>
&lt;p&gt;Comment d&#233;finir la fonction &lt;br class='autobr' /&gt;
La fonction traiter() d'un formulaire XXX (qui sera affich&#233; dans les squelettes par #FORMULAIRE_XXX) est d&#233;finie dans le fichier formulaires/xxx.php ou dans le fichier formulaires/xxx/traiter.php. Le dossier formulaires/ pouvant &#234;tre plac&#233; dans le dossier d'un plugin, ou dans le dossier squelettes. &lt;br class='autobr' /&gt;
La fonction devra &#234;tre nomm&#233;e &lt;br class='autobr' /&gt;
function formulaires_xxx_traiter_dist(). Le suffixe _dist permettant lors du d&#233;veloppement de red&#233;finir la fonction pour changer (&#8230;)&lt;/p&gt;


-
&lt;a href="https://www.spip.net/fr_rubrique522.html" rel="directory"&gt;Interactivit&#233;&lt;/a&gt;

/ 
&lt;a href="https://www.spip.net/@multifrformulairescvtencvtformsesformularioscvtcaformulariscvtmulti" rel="tag"&gt;Formulaires CVT&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;!--sommaire--&gt;&lt;div class=&#034;well nav-sommaire nav-sommaire-7&#034; id=&#034;nav69f2858140f724.51522719&#034;&gt;
&lt;h2&gt;Sommaire&lt;/h2&gt;&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;a id=&#034;s-Comment-definir-la-fonction&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Comment-definir-la-fonction&#034; class=&#034;spip_ancre&#034;&gt;Comment d&#233;finir la fonction&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Les-arguments-de-la-fonction&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Les-arguments-de-la-fonction&#034; class=&#034;spip_ancre&#034;&gt;Les arguments de la fonction&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Que-doit-faire-la-fonction&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Que-doit-faire-la-fonction&#034; class=&#034;spip_ancre&#034;&gt;Que doit faire la fonction&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Exemple-de-fonction-traiter&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Exemple-de-fonction-traiter&#034; class=&#034;spip_ancre&#034;&gt;Exemple de fonction traiter()&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Cas-particuliers&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Cas-particuliers&#034; class=&#034;spip_ancre&#034;&gt;Cas particuliers&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Personnalisation&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Personnalisation&#034; class=&#034;spip_ancre&#034;&gt;Personnalisation&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Voir-aussi&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Voir-aussi&#034; class=&#034;spip_ancre&#034;&gt;Voir aussi&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;!--/sommaire--&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau1 sommaire-section_h2&#034; aria-labelledby=&#034;Comment-definir-la-fonction&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Comment-definir-la-fonction'&gt;Comment d&#233;finir la fonction&lt;a class='sommaire-back sommaire-back-7' href='#s-Comment-definir-la-fonction' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;La fonction &lt;i&gt;traiter()&lt;/i&gt; d'un formulaire XXX (qui sera affich&#233; dans les squelettes par &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#FORMULAIRE_XXX&lt;/code&gt;) est d&#233;finie dans le fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;formulaires/xxx.php&lt;/code&gt; ou dans le fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;formulaires/xxx/traiter.php&lt;/code&gt;. Le dossier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;formulaires/&lt;/code&gt; pouvant &#234;tre plac&#233; dans le dossier d'un plugin, ou dans le dossier squelettes.&lt;/p&gt;
&lt;p&gt;La fonction devra &#234;tre nomm&#233;e &lt;br class='autobr' /&gt;
&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;function formulaires_xxx_traiter_dist()&lt;/code&gt;. Le suffixe &lt;i&gt;_dist&lt;/i&gt; permettant lors du d&#233;veloppement de red&#233;finir la fonction pour changer son comportement, en cr&#233;ant une fonction &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;function formulaires_xxx_traiter()&lt;/code&gt;&lt;/p&gt;
&lt;/section&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau1 sommaire-section_h2&#034; aria-labelledby=&#034;Les-arguments-de-la-fonction&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Les-arguments-de-la-fonction'&gt;Les arguments de la fonction&lt;a class='sommaire-back sommaire-back-7' href='#s-Les-arguments-de-la-fonction' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Comme les fonctions &lt;i&gt;charger()&lt;/i&gt; et &lt;i&gt;verifier()&lt;/i&gt;, la fonction &lt;i&gt;traiter()&lt;/i&gt; re&#231;oit automatiquement, dans le m&#234;me ordre, la valeur de chacun des arguments pass&#233;s &#224; la balise #FORMULAIRE_XX.&lt;br class='autobr' /&gt;
Par exemple en &#233;crivant&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;spip&#034; class='spip_code spip_code_block language-spip' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;#FORMULAIRE_XX{#ID_ARTICLE,#ID_RUBRIQUE} &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;et la fonction&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;php&#034; class='spip_code spip_code_block language-php' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;formulaires_xxx_traiter_dist($arg1,$arg2) { ... } &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$arg1&lt;/code&gt; vaudra &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#ID_ARTICLE&lt;/code&gt;, et &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$arg2&lt;/code&gt; vaudra &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#ID_RUBRIQUE&lt;/code&gt;.&lt;/p&gt;
&lt;/section&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau1 sommaire-section_h2&#034; aria-labelledby=&#034;Que-doit-faire-la-fonction&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Que-doit-faire-la-fonction'&gt;Que doit faire la fonction&lt;a class='sommaire-back sommaire-back-7' href='#s-Que-doit-faire-la-fonction' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;La fonction &lt;i&gt;traiter()&lt;/i&gt; fait tous les traitements n&#233;cessaires suite &#224; la saisie de l'internaute, et apr&#232;s les v&#233;rifications faites par la fonction &lt;i&gt;verifier()&lt;/i&gt;.&lt;/p&gt;
&lt;p&gt;Le point important ici est que la fonction &lt;i&gt;traiter()&lt;/i&gt; sera toujours appel&#233;e juste apr&#232;s la fonction &lt;i&gt;verifier()&lt;/i&gt; et uniquement si celle-ci a bien renvoy&#233; un tableau vide signifiant l'absence d'erreurs.&lt;/p&gt;
&lt;p&gt;Une fois les actions r&#233;alis&#233;es (par exemple : enregistrement des donn&#233;es, &#233;criture dans un fichier, envoi de mail ...), la fonction &lt;i&gt;traiter()&lt;/i&gt; doit renvoyer un tableau de valeurs d&#233;crivant le r&#233;sultat de l'action.&lt;/p&gt;
&lt;p&gt;Ce tableau renvoy&#233; par &lt;i&gt;traiter()&lt;/i&gt; doit renseigner au moins une des deux valeurs &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;message_ok&lt;/code&gt; ou &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;message_erreur&lt;/code&gt; pour indiquer le succ&#232;s ou l'&#233;chec &#233;ventuel du traitement.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;message_ok&lt;/strong&gt;&lt;br class='manualbr' /&gt;Si tout c'est bien d&#233;roul&#233;, l'indiquer dans un message permet &#224; l'utilisateur d'&#234;tre rassur&#233; sur l'action r&#233;alis&#233;e. C'est une bonne pratique de toujours renvoyer un message, m&#234;me si tout se passe bien !&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;message_erreur&lt;/strong&gt;&lt;br class='manualbr' /&gt;Malgr&#233; les v&#233;rifications r&#233;alis&#233;es par la fonction &lt;i&gt;verifier()&lt;/i&gt;, le traitement peut &#233;chouer pour d'autres raisons non d&#233;tectables &#224; l'avance. Dans ce cas la fonction &lt;i&gt;traiter()&lt;/i&gt; indique la cause de l'erreur dans message_erreur, et l'utilisateur sera inform&#233; du probl&#232;me.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;editable&lt;/strong&gt;&lt;br class='manualbr' /&gt;Par d&#233;faut, apr&#232;s la saisie du formulaire et son traitement avec succ&#232;s, la saisie du formulaire ne sera pas re-propos&#233;e, seul le message de succ&#232;s ou d'erreur &#233;tant affich&#233;.&lt;/p&gt;
&lt;p&gt;En renvoyant une valeur &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;true&lt;/code&gt; pour ce champ, cela permet de demander &#224; l'utilisateur de remplir &#224; nouveau le formulaire.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;id_xx&lt;/strong&gt;&lt;br class='manualbr' /&gt;Si le traitement a ins&#233;r&#233; ou modifi&#233; une (ou plusieurs) donn&#233;e en base, il est judicieux de renvoyer les cl&#233; primaires, g&#233;n&#233;ralement commen&#231;ant par &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;id_&lt;/code&gt;, des enregistrements concern&#233;s.&lt;/p&gt;
&lt;p&gt;Ainsi, un plugin qui veut intervenir &#224; la suite du traitement par d&#233;faut sait sur quel objet a port&#233; l'op&#233;ration, et peut agir en compl&#233;ment.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;redirect&lt;/strong&gt;&lt;br class='manualbr' /&gt;Il suffit d'indiquer une url dans ce champ pour rediriger l'internaute sur une autre page apr&#232;s la saisie.&lt;/p&gt;
&lt;p&gt;Attention, il est important que la fonction &lt;i&gt;traiter()&lt;/i&gt; ne fasse pas elle-m&#234;me la redirection, car cela emp&#234;cherait tout intervention d'un plugin &#224; la suite de la fonction &lt;i&gt;traiter()&lt;/i&gt;.&lt;/p&gt;
&lt;/section&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau1 sommaire-section_h2&#034; aria-labelledby=&#034;Exemple-de-fonction-traiter&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Exemple-de-fonction-traiter'&gt;Exemple de fonction traiter()&lt;a class='sommaire-back sommaire-back-7' href='#s-Exemple-de-fonction-traiter' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Voyons un exemple&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;php&#034; class='spip_code spip_code_block language-php' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;function formulaires_xxx_traiter_dist() { $res = array(); $nom = _request('nom'); $prenom = _request('prenom'); $email = _request('email'); include_spip('action/editer_auteur'); if ($id_auteur = insert_auteur()) { auteurs_set($id_auteur,array('nom'=&gt;&#034;$nom $prenom&#034;,'email'=&gt;$email)); $res['message_ok'] = &#034;Enregistrement r&#233;ussi !&#034;; $res['id_auteur'] = $id_auteur; } else { $res['message_erreur'] = &#034;Un probleme a &#233;t&#233; rencontr&#233;, impossible d'enregistrer votre saisie&#034;; } return $res; } &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ici, la fonction&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; r&#233;cup&#232;re les informations saisies ;&lt;/li&gt;&lt;li&gt; ajoute un auteur dans la table des auteurs de SPIP ;&lt;/li&gt;&lt;li&gt; enregistre les nom, pr&#233;nom et email saisis pour cet auteur ;&lt;/li&gt;&lt;li&gt; indique dans le r&#233;sultat l'id_auteur ajout&#233;, ainsi que le message de succ&#232;s.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Si l'auteur ne peut &#234;tre ajout&#233;, un message d'erreur est renvoy&#233;.&lt;/p&gt;
&lt;/section&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau1 sommaire-section_h2&#034; aria-labelledby=&#034;Cas-particuliers&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Cas-particuliers'&gt;Cas particuliers&lt;a class='sommaire-back sommaire-back-7' href='#s-Cas-particuliers' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Les formulaires peuvent &#234;tre facilement ajax&#233;s en les incluant dans une classe ajax. Les fonctions &lt;i&gt;charger()&lt;/i&gt;, &lt;i&gt;verifier()&lt;/i&gt; et &lt;i&gt;traiter()&lt;/i&gt; n'en savent rien, et ne voient pas de diff&#233;rence.&lt;/p&gt;
&lt;p&gt;Cependant, il est parfois n&#233;cessaire que la fonction &lt;i&gt;traiter()&lt;/i&gt; ne soit pas appel&#233;e en ajax. Par exemple parcequ'elle va modifier fortement la base de donn&#233;es et qu'il est pr&#233;f&#233;rable que toute la page soit r&#233;-affich&#233;e apr&#232;s la saisie, pas seulement le formulaire.&lt;/p&gt;
&lt;p&gt;Dans ce cas, il faut commencer la fonction &lt;i&gt;traiter()&lt;/i&gt; par un appel &#224; la fonction &lt;br class='autobr' /&gt;
&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;refuser_traiter_formulaire_ajax()&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Si le formulaire n'a pas &#233;t&#233; soumis en ajax, cette fonction ne fera rien, et la suite de la fonction &lt;i&gt;traiter()&lt;/i&gt; sera ex&#233;cut&#233;e normalement.&lt;/p&gt;
&lt;p&gt;Si le formulaire a &#233;t&#233; soumis en ajax, alors cette fonction va tout arr&#234;ter en renvoyant un code sp&#233;cifique au javascript de la page. Lorsque le javascript re&#231;oit ce code, il provoque &#224; nouveau un envoi des donn&#233;es du formulaire, mais sans ajax cette fois-ci. SPIP va alors de nouveau appeler la fonction &lt;i&gt;verifier()&lt;/i&gt;, puis la fonction &lt;i&gt;traiter()&lt;/i&gt;, qui cette fois s'ex&#233;cutera compl&#232;tement et pourra r&#233;aliser ses op&#233;rations.&lt;/p&gt;
&lt;p&gt;Il est donc primordial que la fonction &lt;i&gt;traiter()&lt;/i&gt; commence par cet appel &#224; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;refuser_traiter_formulaire_ajax()&lt;/code&gt;, et ne fasse aucune manipulation avant d'appeler cette fonction, car sinon ces &#233;ventuelles op&#233;rations seraient ex&#233;cut&#233;es deux fois.&lt;/p&gt;
&lt;/section&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau1 sommaire-section_h2&#034; aria-labelledby=&#034;Personnalisation&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Personnalisation'&gt;Personnalisation&lt;a class='sommaire-back sommaire-back-7' href='#s-Personnalisation' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Comme les fonctions &lt;i&gt;charger()&lt;/i&gt; et &lt;i&gt;verifier()&lt;/i&gt;, la fonction &lt;i&gt;traiter()&lt;/i&gt; d'un formulaire existant peut &#234;tre personnalis&#233;e par deux m&#233;canismes&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Surcharge&lt;/strong&gt;&lt;br class='autobr' /&gt;
Comme indiqu&#233; ci-dessus, il est possible de red&#233;finir la fonction &lt;i&gt;traiter()&lt;/i&gt; par d&#233;faut en d&#233;finissant sa propre fonction&lt;br class='autobr' /&gt;
&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;function formulaires_xxx_traiter()&lt;/code&gt;&lt;br class='autobr' /&gt;
qui sera appel&#233;e &#224; la place de la fonction par d&#233;faut qui comporte le suffixe _dist.&lt;br class='autobr' /&gt;
Cette fonction surcharg&#233;e pourra &#234;tre d&#233;finie dans le fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;formulaires/xxx/traiter.php&lt;/code&gt;, ou dans un fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;options.php&lt;/code&gt; appel&#233; &#224; chaque hit de fa&#231;on &#224; ce que la fonction soit d&#233;finie au moment o&#249; SPIP va la chercher.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pipeline&lt;/strong&gt;&lt;br class='autobr' /&gt;
Le pipeline &lt;i&gt;formulaire_traiter&lt;/i&gt; permet de modifier le r&#233;sultat de la fonction &lt;i&gt;traiter()&lt;/i&gt; par d&#233;faut de n'importe quel formulaire CVT.&lt;/p&gt;
&lt;p&gt;C'est la m&#233;thode qu'il faut privil&#233;gier dans un plugin.&lt;/p&gt;
&lt;p&gt;Le pipeline re&#231;oit en argument un tableau de cette forme :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;php&#034; class='spip_code spip_code_block language-php' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;array( 'args'=&gt;array('form'=&gt;$form,'args'=&gt;$args), 'data'=&gt;$res) ) &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En &#233;crivant la fonction pipeline sous cette forme&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;php&#034; class='spip_code spip_code_block language-php' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;function monplugin_formulaire_traiter($flux) { ... } &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Alors vous trouverez dans $flux les &#233;l&#233;ments suivants :&lt;/p&gt;
&lt;table class=&#034;table spip&#034;&gt;
&lt;tbody&gt;
&lt;tr class='row_odd odd'&gt;
&lt;td&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$flux['args']['form']&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;nom du formulaire (xxx dans notre exemple)&lt;/td&gt;&lt;/tr&gt;
&lt;tr class='row_even even'&gt;
&lt;td&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$flux['args']['args']&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;arguments de la fonction &lt;i&gt;charger()&lt;/i&gt; dans l'ordre o&#249; ils ont &#233;t&#233; pass&#233;s &#224; la balise #FORMULAIRE_XXX&lt;/td&gt;&lt;/tr&gt;
&lt;tr class='row_odd odd'&gt;
&lt;td&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$flux['args']['data']&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;tableau &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$res&lt;/code&gt; renvoy&#233; par la fonction &lt;i&gt;traiter()&lt;/i&gt; par d&#233;faut&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Tous les formulaires passent par le m&#234;me pipeline. Il faut donc tester la valeur de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$flux['args']['form']&lt;/code&gt; pour ne modifier que le comportement du formulaire xxx.&lt;/p&gt;
&lt;/section&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau1 sommaire-section_h2&#034; aria-labelledby=&#034;Voir-aussi&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Voir-aussi'&gt;Voir aussi&lt;a class='sommaire-back sommaire-back-7' href='#s-Voir-aussi' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Les fonctions&lt;/strong&gt;&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;a href='https://www.spip.net/fr_article4151.html' class=&#034;spip_in&#034;&gt;charger()&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href='https://www.spip.net/fr_article4152.html' class=&#034;spip_in&#034;&gt;verifier()&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Sur programmer.spip.net&lt;/strong&gt;&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; le pipeline &lt;a href=&#034;https://programmer.spip.net/formulaire_traiter&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;formulaire_traiter&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;https://programmer.spip.net/-Formulaires-35-&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;les formulaires CVT&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;https://programmer.spip.net/-Exemples,92-&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;d'autres exemples&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/section&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>



</channel>

</rss>
