<?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=1524&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>La boucle DATA</title>
		<link>https://www.spip.net/fr_article6434.html</link>
		<guid isPermaLink="true">https://www.spip.net/fr_article6434.html</guid>
		<dc:date>2018-03-06T21:51:46Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>BoOz</dc:creator>


		<dc:subject>SPIP 3.0</dc:subject>
		<dc:subject>BOUCLE(DATA)</dc:subject>

		<description>
&lt;p&gt;La boucle DATA est capable d'it&#233;rer sur un jeu de donn&#233;es d'un certain format. &lt;br class='autobr' /&gt;
Sa syntaxe est la suivante : spip [(#CLE)] - [(#VALEUR|print)] &lt;br class='autobr' /&gt;
Le crit&#232;re source format, donn&#233;es d&#233;finit les donn&#233;es sur lesquelles la boucle va it&#233;rer. Le format peut &#234;tre de ce type : Tableau PHP : table|tableau Collections de fichiers locaux : ls|preg_files Contenu de fichiers (locaux ou distants) : file|csv|json|xml|rss|yaml|... Commandes : sql|yql|ics|liste|enum|plugins|... Les donn&#233;es peuvent &#234;tre (&#8230;)&lt;/p&gt;


-
&lt;a href="https://www.spip.net/fr_rubrique143.html" rel="directory"&gt;Manuel de r&#233;f&#233;rence des boucles et balises&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/@boucledata" rel="tag"&gt;BOUCLE(DATA)&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;p&gt;La boucle DATA est capable d'it&#233;rer sur un jeu de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;donn&#233;es&lt;/code&gt; d'un certain &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;format&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Sa syntaxe est la suivante :&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_afficher(DATA){source format,donn&#233;es}&gt; [(#CLE)] - [(#VALEUR|print)] &lt;/BOUCLE_afficher&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;{source format, donn&#233;es}&lt;/code&gt; d&#233;finit les donn&#233;es sur lesquelles la boucle va it&#233;rer.&lt;/p&gt;
&lt;p&gt;&#8212; &lt;strong&gt;Le &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;format&lt;/code&gt;&lt;/strong&gt; peut &#234;tre de ce type :
&lt;br /&gt;- Tableau PHP : &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;table|tableau&lt;/code&gt;
&lt;br /&gt;- Collections de fichiers locaux : &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;ls|preg_files&lt;/code&gt;
&lt;br /&gt;- Contenu de fichiers (locaux ou distants) : &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;file|csv|json|xml|rss|yaml|...&lt;/code&gt;
&lt;br /&gt;- Commandes : &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;sql|yql|ics|liste|enum|plugins|...&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&#8212; &lt;strong&gt;Les &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;donn&#233;es&lt;/code&gt;&lt;/strong&gt; peuvent &#234;tre de plusieurs natures, en fonction du format :
&lt;br /&gt;- un tableau PHP
&lt;br /&gt;- le chemin d'un fichier ou d'un dossier sur le disque dur
&lt;br /&gt;- l'URL d'un fichier ou d'un webservice (API)
&lt;br /&gt;- ou encore, une cha&#238;ne quelconque que le format saura transformer en tableau de donn&#233;es, ex : &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&#034;select * from flickr.photos.search where text='spip'&#034;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Les crit&#232;res suivants permettent de filtrer les tableaux affich&#233;s par les boucles DATA.
&lt;br /&gt;- &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{valeur=x}&lt;/code&gt; ; les op&#233;rateurs disponibles sont &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;=, &gt;, &lt;, &gt;=, &lt;=, ==&lt;/code&gt;(expression rationnelle) et &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;LIKE&lt;/code&gt;.
&lt;br /&gt;- &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{cle=x}&lt;/code&gt; : idem, pour tester la cl&#233;
&lt;br /&gt;- &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{par xx}&lt;/code&gt; et &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{!par xx}&lt;/code&gt;
&lt;br /&gt;- &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{a,b}&lt;/code&gt; et &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{pagination ...}&lt;/code&gt;
&lt;br /&gt;- &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{fusion /x/y}&lt;/code&gt;
&lt;br /&gt;- &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{datapath chemin/vers/ma/donnee}&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Un chapitre complet d&#233;taille l'usage des boucles DATA, propose des exemples d'usage et pr&#233;sente la mani&#232;re de d&#233;clarer de nouvelles boucles DATA.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lire la suite&lt;/strong&gt; : &lt;a href='https://www.spip.net/fr_article5444.html' class=&#034;spip_in&#034;&gt;Les it&#233;rateurs de SPIP - la boucle (DATA)&lt;/a&gt;.&lt;br class='autobr' /&gt;
&lt;strong&gt;Voir&lt;/strong&gt; &lt;a href='https://www.spip.net/fr_article5443.html' class=&#034;spip_in&#034;&gt;Exemples de `BOUCLE(DATA)`&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>{crit&#232;re IN valeur1, valeur2[, valeur3,..., valeurN]}</title>
		<link>https://www.spip.net/fr_article4010.html</link>
		<guid isPermaLink="true">https://www.spip.net/fr_article4010.html</guid>
		<dc:date>2009-08-24T15:02:10Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>BoOz</dc:creator>


		<dc:subject>{xxxx IN a,b,c,d,....}</dc:subject>
		<dc:subject>SPIP 1.8</dc:subject>

		<description>
&lt;p&gt;... IN ... limite l'affichage aux r&#233;sultats ayant un crit&#232;re appartenant &#224; un ensemble fini. &lt;br class='autobr' /&gt; xxxx IN a,b,c,d limite l'affichage aux r&#233;sultats ayant le crit&#232;re xxxx &#233;gal &#224; a, b, c ou d. &lt;br class='autobr' /&gt;
Les r&#233;sultats sont tri&#233;s dans l'ordre indiqu&#233; (sauf demande explicite d'un autre crit&#232;re de tri). Il est aussi possible de s&#233;lectionner des cha&#238;nes de caract&#232;res, par exemple avec titre IN 'Chine', 'Japon' &lt;br class='autobr' /&gt;
Passer en argument un tableau C'est possible et c'est aussi le seul moyen de passer (&#8230;)&lt;/p&gt;


-
&lt;a href="https://www.spip.net/fr_rubrique544.html" rel="directory"&gt;Crit&#232;res&lt;/a&gt;

/ 
&lt;a href="https://www.spip.net/@xxxxina,b,c,d," rel="tag"&gt;{xxxx IN a,b,c,d,....}&lt;/a&gt;, 
&lt;a href="https://www.spip.net/@spip18" rel="tag"&gt;SPIP 1.8&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{... IN ...}&lt;/code&gt; limite l'affichage aux r&#233;sultats ayant un crit&#232;re appartenant &#224; un ensemble fini.&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;nav6a10dbd2c2a881.41186112&#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-Passer-en-argument-un-tableau&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Passer-en-argument-un-tableau&#034; class=&#034;spip_ancre&#034;&gt;Passer en argument un tableau&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Negation-de-l-operateur-IN-en-critere-de-boucle&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Negation-de-l-operateur-IN-en-critere-de-boucle&#034; class=&#034;spip_ancre&#034;&gt;N&#233;gation de l'op&#233;rateur IN en crit&#232;re de boucle&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Utilisation-conditionnelle-de-l-operateur-IN-dans-un-critere-de-boucle&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Utilisation-conditionnelle-de-l-operateur-IN-dans-un-critere-de-boucle&#034; class=&#034;spip_ancre&#034;&gt;Utilisation conditionnelle de l'op&#233;rateur IN dans un crit&#232;re de boucle&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;p&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{xxxx IN a,b,c,d}&lt;/code&gt; limite l'affichage aux r&#233;sultats ayant le crit&#232;re xxxx &#233;gal &#224; a, b, c ou d.&lt;/p&gt;
&lt;p&gt;Les r&#233;sultats sont tri&#233;s dans l'ordre indiqu&#233; (sauf demande explicite d'un autre crit&#232;re de tri). Il est aussi possible de s&#233;lectionner des cha&#238;nes de caract&#232;res, par exemple avec &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{titre IN 'Chine', 'Japon'}&lt;/code&gt;&lt;/p&gt;
&lt;section class=&#034;sommaire-section sommaire-section_niveau1 sommaire-section_h2&#034; aria-labelledby=&#034;Passer-en-argument-un-tableau&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Passer-en-argument-un-tableau'&gt;Passer en argument un tableau&lt;a class='sommaire-back sommaire-back-4' href='#s-Passer-en-argument-un-tableau' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;C'est possible et c'est aussi le seul moyen de passer dynamiquement une liste de valeur avec le crit&#232;re IN.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Exemple&lt;/strong&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;#SET{mes_rubriques, #LISTE{1,2,3}} &lt;BOUCLE_a(ARTICLES){id_rubrique IN #GET{mes_rubriques}}&gt; &lt;h3&gt;#TITRE&lt;/h3&gt; &lt;/BOUCLE_a&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Il peut s'agir d'un tableau d&#233;fini par les balises&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_article4009.html' class=&#034;spip_in&#034;&gt;#ARRAY&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href='https://www.spip.net/fr_article5547.html' class=&#034;spip_in&#034;&gt;#LISTE&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;ou bien d'un tableau provenant d'une balise &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#GET&lt;/code&gt; ou &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#ENV**{mon_post}&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Si &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#ENV{mon_post}&lt;/code&gt; est un tableau (venant par exemple de saisies de formulaire dont l'attribut name se termine par &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;[]&lt;/code&gt;), et si les filtres d'analyse ont &#233;t&#233; d&#233;sactiv&#233;s en suffixant cette balise par une double &#233;toile, alors chaque &#233;l&#233;ment du tableau sera consid&#233;r&#233; comme argument de IN, SPIP appliquant les filtres de s&#233;curit&#233; sur chacun d'eux&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;voir aussi la page de la balise # ENV&#034; id=&#034;nh1&#034;&gt;1&lt;/a&gt;]&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;Le squelette standard fourni dans &lt;i&gt;plugins-dist/forum/formulaires/inc-forum_previsu.html&lt;/i&gt; fournit un exemple d'utilisation avec une boucle MOTS ayant le crit&#232;re &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{id_mot IN #ENV**{ajouter_mot}}&lt;/code&gt; :&lt;br class='autobr' /&gt;
cette boucle s&#233;lectionne seulement les mots-cl&#233;s appartenant &#224; un ensemble indiqu&#233; dynamiquement. Ici, cet ensemble aura &#233;t&#233; construit par le formulaire du squelette standard &#171; choix_mots &#187;, qui utilise l'attribut &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;name=ajouter_mot[]&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;Negation-de-l-operateur-IN-en-critere-de-boucle&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Negation-de-l-operateur-IN-en-critere-de-boucle'&gt;N&#233;gation de l'op&#233;rateur IN en crit&#232;re de boucle&lt;a class='sommaire-back sommaire-back-4' href='#s-Negation-de-l-operateur-IN-en-critere-de-boucle' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&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_a(ARTICLES) {id_article !IN 11,12,13}&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&#8230; n'affichera que les articles dont l'id &lt;strong&gt;n'est pas dans&lt;/strong&gt; la liste IN (voir &lt;a href='https://www.spip.net/fr_article4008.html' class=&#034;spip_in&#034;&gt;&lt;i&gt;crit&#232;re !op&#233;rateur valeur&lt;/i&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;Utilisation-conditionnelle-de-l-operateur-IN-dans-un-critere-de-boucle&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Utilisation-conditionnelle-de-l-operateur-IN-dans-un-critere-de-boucle'&gt;Utilisation conditionnelle de l'op&#233;rateur IN dans un crit&#232;re de boucle&lt;a class='sommaire-back sommaire-back-4' href='#s-Utilisation-conditionnelle-de-l-operateur-IN-dans-un-critere-de-boucle' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Exemple&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Si #ID_ARTICLE est pr&#233;sent dans l'environnement :&lt;/p&gt;
&lt;p&gt;- &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;BOUCLE_a(ARTICLES) {id_article ?IN 11,12,13}&gt;...&lt;/code&gt; n'affichera que les articles dont l'id &lt;strong&gt;est dans&lt;/strong&gt; la liste IN.&lt;/p&gt;
&lt;p&gt;- &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;BOUCLE_a(ARTICLES) {id_article ?!IN 11,12,13}&gt;...&lt;/code&gt; n'affichera que les articles dont l'id &lt;strong&gt;n'est pas dans&lt;/strong&gt; la liste IN.&lt;/p&gt;
&lt;p&gt;Si par contre, #ID_ARTICLE n'est pas pr&#233;sent dans l'environnement, ces crit&#232;res conditionnels ne s'appliquent pas, et donc ces 2 boucles afficheront &lt;strong&gt;tous&lt;/strong&gt; les articles, quelques soient leur id.&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-4' href='#s-Voir-aussi' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Crit&#232;res conditionnels&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_article3996.html' class=&#034;spip_in&#034;&gt;&lt;i&gt;crit&#232;re ?&lt;/i&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href='https://www.spip.net/fr_article4013.html' class=&#034;spip_in&#034;&gt;&lt;i&gt;crit&#232;re ?op&#233;rateur valeur&lt;/i&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Op&#233;rateurs logiques&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_article4008.html' class=&#034;spip_in&#034;&gt;&lt;i&gt;crit&#232;re !op&#233;rateur valeur&lt;/i&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href='https://www.spip.net/fr_article3997.html' class=&#034;spip_in&#034;&gt;&lt;i&gt; !crit&#232;re op&#233;rateur valeur&lt;/i&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Op&#233;rateurs&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_article3981.html' class=&#034;spip_in&#034;&gt;&lt;i&gt;crit&#232;re LIKE valeur&lt;/i&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&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;&lt;i&gt;&lt;a href='https://www.spip.net/fr_article4014.html' class=&#034;spip_in&#034;&gt;voir aussi la page de la balise # ENV&lt;/a&gt;&lt;/i&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>#ARRAY</title>
		<link>https://www.spip.net/fr_article4009.html</link>
		<guid isPermaLink="true">https://www.spip.net/fr_article4009.html</guid>
		<dc:date>2009-06-16T06:52:27Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Aur&#233;lie, BoOz, denisb</dc:creator>


		<dc:subject>#ARRAY</dc:subject>
		<dc:subject>table_valeur</dc:subject>
		<dc:subject>push</dc:subject>
		<dc:subject>find</dc:subject>
		<dc:subject>foreach</dc:subject>

		<description>
&lt;p&gt;La balise #ARRAY peut contenir un tableau PHP, c'est-&#224;-dire un ensemble de paires cl&#233;/valeur, que l'on veut stocker pour les r&#233;utiliser dans la suite du squelette. &lt;br class='autobr' /&gt;
Le tableau doit &#234;tre d&#233;clar&#233; par la balise #SET et peut ensuite &#234;tre r&#233;cup&#233;r&#233; par la balise #GET [1]. &lt;br class='autobr' /&gt;
Il peut &#234;tre utilis&#233; ensuite, entre autres, associ&#233; au crit&#232;re IN d'une boucle. D&#233;clarer un tableau et r&#233;cup&#233;rer des valeurs &lt;br class='autobr' /&gt;
- #SETmon_tableau, #ARRAYcle1,valeur1,cle2,valeur2 cr&#233;e la variable mon_tableau et lui affecte un (&#8230;)&lt;/p&gt;


-
&lt;a href="https://www.spip.net/fr_rubrique543.html" rel="directory"&gt;Balises&lt;/a&gt;

/ 
&lt;a href="https://www.spip.net/@array" rel="tag"&gt;#ARRAY&lt;/a&gt;, 
&lt;a href="https://www.spip.net/@table_valeur" rel="tag"&gt;table_valeur&lt;/a&gt;, 
&lt;a href="https://www.spip.net/@push" rel="tag"&gt;push&lt;/a&gt;, 
&lt;a href="https://www.spip.net/@find" rel="tag"&gt;find&lt;/a&gt;, 
&lt;a href="https://www.spip.net/@foreach" rel="tag"&gt;foreach&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;La balise &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#ARRAY&lt;/code&gt; peut contenir un &lt;i&gt;tableau PHP&lt;/i&gt;, c'est-&#224;-dire un ensemble de paires cl&#233;/valeur, que l'on veut stocker pour les r&#233;utiliser dans la suite du squelette.&lt;/p&gt;
&lt;p&gt;Le tableau doit &#234;tre d&#233;clar&#233; par la balise &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#SET&lt;/code&gt; et peut ensuite &#234;tre r&#233;cup&#233;r&#233; par la balise &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#GET&lt;/code&gt;&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;Voir #SET et #GET pour plus de d&#233;tails.&#034; id=&#034;nh3-1&#034;&gt;1&lt;/a&gt;]&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;Il peut &#234;tre utilis&#233; ensuite, entre autres, associ&#233; au crit&#232;re &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;IN&lt;/code&gt; d'une boucle.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;!--sommaire--&gt;&lt;div class=&#034;well nav-sommaire nav-sommaire-7&#034; id=&#034;nav6a10dbd2c7bbf3.53869903&#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-Declarer-un-tableau-et-recuperer-des-valeurs&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Declarer-un-tableau-et-recuperer-des-valeurs&#034; class=&#034;spip_ancre&#034;&gt;D&#233;clarer un tableau et r&#233;cup&#233;rer des valeurs&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Remplir-un-tableau-dynamiquement&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Remplir-un-tableau-dynamiquement&#034; class=&#034;spip_ancre&#034;&gt;Remplir un tableau dynamiquement&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Utiliser-le-tableau-dans-une-boucle-avec-l-operateur-IN&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Utiliser-le-tableau-dans-une-boucle-avec-l-operateur-IN&#034; class=&#034;spip_ancre&#034;&gt;Utiliser le tableau dans une boucle avec l'op&#233;rateur &lt;i&gt;IN&lt;/i&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Exemples-d-utilisation-des-tableaux&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Exemples-d-utilisation-des-tableaux&#034; class=&#034;spip_ancre&#034;&gt;Exemples d'utilisation des tableaux&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Boucler-sur-n-importe-quel-tableau&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Boucler-sur-n-importe-quel-tableau&#034; class=&#034;spip_ancre&#034;&gt;Boucler sur n'importe quel tableau&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Tester-si-un-tableau-est-vide&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Tester-si-un-tableau-est-vide&#034; class=&#034;spip_ancre&#034;&gt;Tester si un tableau est vide&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;Declarer-un-tableau-et-recuperer-des-valeurs&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Declarer-un-tableau-et-recuperer-des-valeurs'&gt;D&#233;clarer un tableau et r&#233;cup&#233;rer des valeurs&lt;a class='sommaire-back sommaire-back-7' href='#s-Declarer-un-tableau-et-recuperer-des-valeurs' 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;#SET{mon_tableau, #ARRAY{cle1,valeur1,cle2,valeur2}}&lt;/code&gt;&lt;/strong&gt;&lt;br class='manualbr' /&gt;cr&#233;e la variable &lt;i&gt;mon_tableau&lt;/i&gt; et lui affecte un &lt;a href=&#034;http://fr.php.net/manual/fr/language.types.array.php&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;tableau PHP&lt;/a&gt; comme valeur, qui pourrait &#234;tre repr&#233;sent&#233; comme suit :&lt;/p&gt;
&lt;table class=&#034;table spip&#034;&gt;
&lt;thead&gt;&lt;tr class='row_first'&gt;&lt;th id='id4614_c0'&gt;Cl&#233;s&lt;/th&gt;&lt;th id='id4614_c1'&gt;Valeurs&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr class='row_odd odd'&gt;
&lt;td headers='id4614_c0'&gt;cle1&lt;/td&gt;
&lt;td headers='id4614_c1'&gt;valeur1&lt;/td&gt;&lt;/tr&gt;
&lt;tr class='row_even even'&gt;
&lt;td headers='id4614_c0'&gt;cle2&lt;/td&gt;
&lt;td headers='id4614_c1'&gt;valeur2&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Il n'est pas n&#233;cessaire d'entourer les chaines de caract&#232;res avec des guillemets simple ou double, sauf pour sp&#233;cifier une chaine vide qui s'&#233;crira ''&lt;/p&gt;
&lt;p&gt;- &#192; des fins de test, on peut afficher le tableau gr&#226;ce au &lt;strong&gt;&lt;a href='https://www.spip.net/fr_article4248.html' class=&#034;spip_in&#034;&gt;filtre &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;|foreach&lt;/code&gt;&lt;/a&gt;&lt;/strong&gt; (&lt;a href='https://www.spip.net/fr_article6428.html#Depreciations' class=&#034;spip_in&#034;&gt;d&#233;pr&#233;ci&#233; depuis SPIP 4&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;- La valeur associ&#233;e &#224; une cl&#233; donn&#233;e peut &#234;tre r&#233;cup&#233;r&#233;e en utilisant le &lt;strong&gt;filtre &lt;a href='https://www.spip.net/fr_article4572.html' class=&#034;spip_in&#034;&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;|table_valeur&lt;/code&gt;&lt;/a&gt;&lt;/strong&gt; :&lt;/p&gt;
&lt;p&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;[(#GET{mon_tableau}|table_valeur{cle1})]&lt;/code&gt; retourne &lt;i&gt;valeur1&lt;/i&gt;.&lt;/p&gt;
&lt;p&gt;Depuis SPIP 3.0, on peut simplifier sous la forme suivante &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;[(#GET{mon_tableau/cle1})]&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;- V&#233;rifier la pr&#233;sence d'une valeur dans le tableau avec le &lt;strong&gt;&lt;a href='https://www.spip.net/fr_article4575.html' class=&#034;spip_in&#034;&gt;filtre &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;|find&lt;/code&gt;&lt;/a&gt;&lt;/strong&gt;&lt;span class=&#034;spip_note_ref&#034;&gt; [&lt;a href=&#034;#nb3-2&#034; class=&#034;spip_note&#034; rel=&#034;appendix&#034; title=&#034;correspond &#224; la fonction PHP , &#224; la diff&#233;rence que ce filtre ne produit pas (&#8230;)&#034; id=&#034;nh3-2&#034;&gt;2&lt;/a&gt;]&lt;/span&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;[(#GET{mon_tableau}|find{valeur2}|oui) Ceci s'affiche si la valeur est dans le tableau. ] &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;Remplir-un-tableau-dynamiquement&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Remplir-un-tableau-dynamiquement'&gt;Remplir un tableau dynamiquement&lt;a class='sommaire-back sommaire-back-7' href='#s-Remplir-un-tableau-dynamiquement' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Un int&#233;r&#234;t des tableaux est de les remplir dynamiquement, par les r&#233;sultats d'une ou plusieurs boucle(s).&lt;/p&gt;
&lt;p&gt;Le tableau doit alors &#234;tre d&#233;clar&#233; par un &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#SET&lt;/code&gt; &lt;strong&gt;avant la boucle&lt;/strong&gt; : &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#SET{mon_tableau,#ARRAY}&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dans la boucle&lt;/strong&gt;, un nouveau &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#SET&lt;/code&gt; red&#233;finit &lt;i&gt;mon_tableau&lt;/i&gt; &#224; chaque it&#233;ration : on le r&#233;cup&#232;re par &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#GET&lt;/code&gt; et on y ajoute une nouvelle valeur gr&#226;ce aux filtres &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;|push&lt;/code&gt; ou &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;|array_merge&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;#SET{mon_tableau,#ARRAY} &lt;BOUCLE(...)&gt; #SET{mon_tableau, #GET{mon_tableau}|push{#COMPTEUR_BOUCLE}} &lt;/BOUCLE&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;L'ordre des valeurs du tableau d&#233;pend des crit&#232;res de tri de la boucle.&lt;/p&gt;
&lt;p&gt;- &lt;a href='https://www.spip.net/fr_article4571.html' class=&#034;spip_in&#034;&gt;&lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;|push&lt;/code&gt;&lt;/strong&gt;&lt;/a&gt; ajoute simplement une valeur &#224; la fin du tableau. La cl&#233; est index&#233;e automatiquement : elle est incr&#233;ment&#233;e de 1 &#224; chaque it&#233;ration de la boucle et ce, &#224; partir de 0 (la premi&#232;re cl&#233; est 0, puis 1, 2, 3,...).&lt;/p&gt;
&lt;p&gt;Exemple : cr&#233;er un tableau &lt;i&gt;mots_choisis&lt;/i&gt; contenant les &lt;i&gt;#ID_MOT&lt;/i&gt; de tous les mots-cl&#233;s li&#233;s &#224; un article.&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{mots_choisis, #ARRAY} &lt;BOUCLE_themes(MOTS){id_article}&gt; #SET{mots_choisis, #GET{mots_choisis}|push{#ID_MOT}} &lt;/BOUCLE_themes&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Si les mots li&#233;s &#224; cet article portent les num&#233;ros 4, 9 et 18, &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;[(#GET{mots_choisis}|foreach)]&lt;/code&gt; retourne :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; 0=&gt;4&lt;/li&gt;&lt;li&gt; 1=&gt;9&lt;/li&gt;&lt;li&gt; 2=&gt;18&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Notez bien que &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;[(#GET{mots_choisis}|table_valeur{2})]&lt;/code&gt; retourne &lt;i&gt;18&lt;/i&gt;, la valeur associ&#233;e &#224; la cl&#233; &lt;i&gt;2&lt;/i&gt;, donc la &lt;i&gt;troisi&#232;me&lt;/i&gt; valeur du tableau.&lt;/p&gt;
&lt;p&gt;- &lt;strong&gt;&lt;a href=&#034;http://fr.php.net/manual/fr/function.array-merge.php&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;|array_merge&lt;/code&gt;&lt;/a&gt;&lt;/strong&gt; ajoute une paire cl&#233;/valeur &#224; la fin du tableau. Cela permet donc de forcer le &#034;nom&#034; des cl&#233;s.&lt;/p&gt;
&lt;p&gt;Attention (1) : si une cl&#233; appara&#238;t plusieurs fois, seule la derni&#232;re valeur pour cette cl&#233; sera retenue.&lt;/p&gt;
&lt;p&gt;Attention (2) : la cl&#233; que l'on veut forcer ne peut pas &#234;tre de type num&#233;rique. En effet, la &lt;a href=&#034;http://fr.php.net/manual/fr/function.array-merge.php&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;documentation de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;array_merge&lt;/code&gt;&lt;/a&gt; pr&#233;cise :&lt;/p&gt;
&lt;blockquote class=&#034;spip&#034;&gt;
&lt;p&gt;Si vous passez un seul tableau &#224; cette fonction et qu'il a des index num&#233;riques, les cl&#233;s seront r&#233;index&#233;es normalement.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Il existe deux solutions &#224; cette limitation :&lt;/p&gt;
&lt;p&gt;- &lt;strong&gt;pr&#233;fixer&lt;/strong&gt; cette cl&#233; avec une valeur alphab&#233;tique :&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{mots_choisis, #ARRAY} &lt;BOUCLE_themes(MOTS) {id_article}&gt; [(#SET{mots_choisis,#GET{mots_choisis}|array_merge{#ARRAY{mot#ID_MOT,#TITRE}}})] &lt;/BOUCLE_themes&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;[(#GET{mots_choisis}|foreach)]&lt;/code&gt; retourne :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; mot4=&gt;Pomme&lt;/li&gt;&lt;li&gt; mot9=&gt;Banane&lt;/li&gt;&lt;li&gt; mot18=&gt;Carotte&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;- &lt;strong&gt;inverser&lt;/strong&gt; cl&#233; et valeur, &#224; condition que &lt;i&gt;valeur&lt;/i&gt; ne soit pas elle aussi num&#233;rique :&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{mots_choisis, #ARRAY} &lt;BOUCLE_themes(MOTS) {id_article}&gt; [(#SET{mots_choisis,#GET{mots_choisis}|array_merge{#ARRAY{#TITRE,#ID_MOT}}})] &lt;/BOUCLE_themes&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;[(#GET{mots_choisis}|foreach)]&lt;/code&gt; retourne :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Pomme=&gt;4&lt;/li&gt;&lt;li&gt; Banane=&gt;9&lt;/li&gt;&lt;li&gt; Carotte=&gt;18&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Dans ce cas, on pourra appliquer la &lt;a href=&#034;http://fr.php.net/manual/fr/function.array-flip.php&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;fonction PHP &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;|array_flip&lt;/code&gt;&lt;/a&gt; comme filtre sur le tableau final (apr&#232;s la boucle) :&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{mots_choisis, #GET{mots_choisis}|array_flip})] &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;[(#GET{mots_choisis}|foreach)]&lt;/code&gt; retourne alors :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; 4=&gt;Pomme&lt;/li&gt;&lt;li&gt; 9=&gt;Banane&lt;/li&gt;&lt;li&gt; 18=&gt;Carotte&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Dans certains cas, on pourra utiliser la balise &lt;a href='https://www.spip.net/fr_article5547.html' class=&#034;spip_in&#034;&gt;#LISTE&lt;/a&gt; qui permet de saisir des tableaux sous forme simplifi&#233;e&lt;/p&gt;
&lt;/section&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau1 sommaire-section_h2&#034; aria-labelledby=&#034;Utiliser-le-tableau-dans-une-boucle-avec-l-operateur-IN&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Utiliser-le-tableau-dans-une-boucle-avec-l-operateur-IN'&gt;Utiliser le tableau dans une boucle avec l'op&#233;rateur &lt;i&gt;IN&lt;/i&gt; &lt;a class='sommaire-back sommaire-back-7' href='#s-Utiliser-le-tableau-dans-une-boucle-avec-l-operateur-IN' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Reprenons le tableau &lt;i&gt;mots_choisis&lt;/i&gt; contenant des #ID_MOT, on peut s&#233;lectionner ensuite les articles li&#233;s aux m&#234;mes mots-cl&#233;s que notre article initial gr&#226;ce au &lt;strong&gt;&lt;a href='https://www.spip.net/fr_article4010.html' class=&#034;spip_in&#034;&gt;crit&#232;re &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;IN&lt;/code&gt;&lt;/a&gt;&lt;/strong&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;#SET{mots_choisis, #ARRAY} &lt;BOUCLE_themes(MOTS){id_article}&gt; #SET{mots_choisis, #GET{mots_choisis}|push{#ID_MOT}} &lt;/BOUCLE_themes&gt; &lt;BOUCLE_memes_themes(ARTICLES) {id_mot IN #GET{mots_choisis}}&gt; #TITRE &lt;br&gt; &lt;/BOUCLE_memes_themes&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Cette utilisation conna&#238;t de multiples usages, notamment lorsque l'on veut s&#233;lectionner des objets &#224; l'aide de plusieurs crit&#232;res qui ne peuvent faire partie de la m&#234;me boucle, puis les m&#233;langer entre eux avec un crit&#232;re de tri unique.&lt;/p&gt;
&lt;/section&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau1 sommaire-section_h2&#034; aria-labelledby=&#034;Exemples-d-utilisation-des-tableaux&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Exemples-d-utilisation-des-tableaux'&gt;Exemples d'utilisation des tableaux&lt;a class='sommaire-back sommaire-back-7' href='#s-Exemples-d-utilisation-des-tableaux' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;- Affichage conditionnel en fonction de la page (valeur de &lt;a href='https://www.spip.net/fr_article4014.html' class=&#034;spip_in&#034;&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#ENV{page}&lt;/code&gt;&lt;/a&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;[(#ENV{page}|in_array{#ARRAY{0,article,1,rubrique,2,site}}|oui) Affichage conditionnel: la page est celle d'un article, d'une rubrique ou d'un site. ] &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;- Affichage conditionnel en fonction d'une variable pass&#233;e dans l'URL&lt;span class=&#034;spip_note_ref&#034;&gt; [&lt;a href=&#034;#nb3-3&#034; class=&#034;spip_note&#034; rel=&#034;appendix&#034; title=&#034;Voir et |parametre_url.&#034; id=&#034;nh3-3&#034;&gt;3&lt;/a&gt;]&lt;/span&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;BOUCLE_tous_les_mots(MOTS){par titre}{&#034;, &#034;}&gt; &lt;a href=&#034;[(#SELF|parametre_url{lolo,#ID_MOT})]&#034;&gt;#TITRE&lt;/a&gt; &lt;/BOUCLE_tous_les_mots&gt; #SET{les_mots, #ARRAY} &lt;BOUCLE_certains_mots(MOTS){id_article}&gt; #SET{les_mots, #GET{les_mots}|push{#ID_MOT}} &lt;/BOUCLE_certains_mots&gt; [&lt;br&gt;Ceci s'affichera si la valeur de la variable 'lolo' pass&#233;e dans l'url est pr&#233;sente dans un tableau 'les_mots' d&#233;clar&#233; et rempli pr&#233;c&#233;demment. (#ENV{lolo}|in_any{#GET{les_mots}}|oui)] &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;- S&#233;lectionner les articles d'une rubrique et ceux associ&#233;s par ailleurs &#224; un mot-cl&#233; puis lister tous ces articles par date.&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{les_articles,#ARRAY} &lt;BOUCLE_articles_rubrique(ARTICLES){id_rubrique}&gt; #SET{les_articles,#GET{les_articles}|push{#ID_ARTICLE}} &lt;/BOUCLE_articles_rubrique&gt; &lt;BOUCLE_articles_mot(ARTICLES){id_mot}&gt; #SET{les_articles,#GET{les_articles}|push{#ID_ARTICLE}} &lt;/BOUCLE_articles_mot&gt; &lt;BOUCLE_affiche(ARTICLES){id_article IN #GET{les_articles}}{par date}&gt; &lt;br&gt;#TITRE &lt;/BOUCLE_affiche&gt; &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;Boucler-sur-n-importe-quel-tableau&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Boucler-sur-n-importe-quel-tableau'&gt;Boucler sur n'importe quel tableau&lt;a class='sommaire-back sommaire-back-7' href='#s-Boucler-sur-n-importe-quel-tableau' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;On pourra utiliser la boucle DATA pour &lt;a href='https://www.spip.net/fr_article5443.html#tableau' class=&#034;spip_in&#034;&gt;boucler arbitrairement sur un tableau&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;Tester-si-un-tableau-est-vide&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Tester-si-un-tableau-est-vide'&gt;Tester si un tableau est vide&lt;a class='sommaire-back sommaire-back-7' href='#s-Tester-si-un-tableau-est-vide' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;1er cas&lt;/strong&gt;&lt;br class='manualbr' /&gt;Si &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#GET{mon_tableau}&lt;/code&gt; est un tableau vide&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;/* je d&#233;clare un tableau vide */ [(#SET{mon_tableau, #ARRAY})] /* alors le test suivant est suffisant : */ [(#GET{mon_tableau}|non) &#8230; ] &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;2e cas&lt;/strong&gt;&lt;br class='manualbr' /&gt;Dans le cas d'entr&#233;es vides dans le tableau tel que :&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{mon_tableau, #ARRAY{0,'',1,0}})] &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&#8230;on pourra utiliser la fonction PHP &lt;a href=&#034;http://php.net/manual/fr/function.array-filter.php&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;array_filter()&lt;/a&gt; qui enl&#232;vera du tableau toute valeur &#233;quivalente &#224; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;false&lt;/code&gt; du tableau.&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;[(#GET{mon_tableau}|array_filter|non) ... ] &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;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;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;a href='https://www.spip.net/fr_article5547.html' class=&#034;spip_in&#034;&gt;#LISTE&lt;/a&gt; : balise pratique pour d&#233;clarer de simples tableaux index&#233;s&lt;/li&gt;&lt;li&gt; &lt;a href='https://www.spip.net/fr_article6434.html' class=&#034;spip_in&#034;&gt;La boucle DATA&lt;/a&gt; : pour utiliser des tableaux complexes&lt;/li&gt;&lt;/ul&gt;&lt;/section&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;Voir &lt;a href='https://www.spip.net/fr_article3990.html' class=&#034;spip_in&#034;&gt;#SET et #GET&lt;/a&gt; pour plus de d&#233;tails.&lt;/p&gt;
&lt;/div&gt;&lt;div id=&#034;nb3-2&#034;&gt;
&lt;p&gt;&lt;span class=&#034;spip_note_ref&#034;&gt;[&lt;a href=&#034;#nh3-2&#034; class=&#034;spip_note&#034; title=&#034;Notes 3-2&#034; rev=&#034;appendix&#034;&gt;2&lt;/a&gt;] &lt;/span&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;|find&lt;/code&gt; correspond &#224; la &lt;a href=&#034;http://fr.php.net/manual/fr/function.in-array.php&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;fonction PHP &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;in_array&lt;/code&gt;&lt;/a&gt;, &#224; la diff&#233;rence que ce filtre ne produit pas le message d'erreur &#034;&lt;i&gt;Warning : in_array() [function.in-array] : Wrong datatype for second argument.&lt;/i&gt;&#034; si la variable n'est finalement pas un tableau. En effet, lorsqu'une variable est g&#233;n&#233;r&#233;e dynamiquement, on ne sait pas toujours si elle existera et s'il s'agira bien d'un tableau.&lt;/p&gt;
&lt;/div&gt;&lt;div id=&#034;nb3-3&#034;&gt;
&lt;p&gt;&lt;span class=&#034;spip_note_ref&#034;&gt;[&lt;a href=&#034;#nh3-3&#034; class=&#034;spip_note&#034; title=&#034;Notes 3-3&#034; rev=&#034;appendix&#034;&gt;3&lt;/a&gt;] &lt;/span&gt;Voir &lt;a href='https://www.spip.net/fr_article1902.html' class=&#034;spip_in&#034;&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#SELF&lt;/code&gt;&lt;/a&gt; et &lt;a href='https://www.spip.net/fr_article4255.html' class=&#034;spip_in&#034;&gt;|parametre_url&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Principe g&#233;n&#233;ral</title>
		<link>https://www.spip.net/fr_article3437.html</link>
		<guid isPermaLink="true">https://www.spip.net/fr_article3437.html</guid>
		<dc:date>2007-05-20T10:22:28Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>BoOz, cent20, cerdic, dani, Ma&#239;eul, mortimer</dc:creator>



		<description>
&lt;p&gt;Tout le contenu d'un site g&#233;r&#233; sous SPIP est install&#233; dans une base de donn&#233;es MySQL. Pour pr&#233;senter ces informations aux visiteurs du site, il faut donc r&#233;aliser l'op&#233;ration qui consiste &#224; lire les informations, &#224; les organiser et &#224; les mettre en page, afin d'afficher une page HTML dans le navigateur Web. &lt;br class='autobr' /&gt;
A moins d'utiliser un gestionnaire de contenu avanc&#233; comme SPIP, cette op&#233;ration est assez fastidieuse : &lt;br class='autobr' /&gt;
- il faut conna&#238;tre la programmation PHP et MySQL, et &#233;crire des &#171; routines &#187; (&#8230;)&lt;/p&gt;


-
&lt;a href="https://www.spip.net/fr_rubrique135.html" rel="directory"&gt;Webmestres&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;nav6a10dbd2cab246.98655128&#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-Pour-chaque-type-de-page-un-squelette&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Pour-chaque-type-de-page-un-squelette&#034; class=&#034;spip_ancre&#034;&gt;Pour chaque type de page, un squelette&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Lorsque-SPIP-appelle-un-squelette-il-lui-passe-un-contexte&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Lorsque-SPIP-appelle-un-squelette-il-lui-passe-un-contexte&#034; class=&#034;spip_ancre&#034;&gt;Lorsque SPIP appelle un squelette, il lui passe un contexte&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Le-principe-de-fonctionnement-du-cache-de-maniere-simplifiee&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Le-principe-de-fonctionnement-du-cache-de-maniere-simplifiee&#034; class=&#034;spip_ancre&#034;&gt;Le principe de fonctionnement du cache, de mani&#232;re simplifi&#233;e&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Le-fichier-html&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Le-fichier-html&#034; class=&#034;spip_ancre&#034;&gt;Le fichier .html&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Que-peut-on-mettre-dans-un-fichier-html&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Que-peut-on-mettre-dans-un-fichier-html&#034; class=&#034;spip_ancre&#034;&gt;Que peut-on mettre dans un fichier .html&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;!--/sommaire--&gt;&lt;p&gt;Tout le contenu d'un site g&#233;r&#233; sous SPIP est install&#233; dans une base de donn&#233;es MySQL. Pour pr&#233;senter ces informations aux visiteurs du site, il faut donc r&#233;aliser l'op&#233;ration qui consiste &#224; lire les informations, &#224; les organiser et &#224; les mettre en page, afin d'afficher une page HTML dans le navigateur Web.&lt;/p&gt;
&lt;p&gt;A moins d'utiliser un gestionnaire de contenu avanc&#233; comme SPIP, cette op&#233;ration est assez fastidieuse : &lt;br /&gt;- il faut conna&#238;tre la programmation PHP et MySQL, et &#233;crire des &#171; routines &#187; relativement complexes ;
&lt;br /&gt;- l'int&#233;gration de telles routines dans une mise en page HTML &#233;labor&#233;e est assez p&#233;nible ;
&lt;br /&gt;- il faut d&#233;velopper toute une interface pour que les utilisateurs autoris&#233;s modifient le contenu de la base de donn&#233;es ; &lt;br /&gt;- il faut prendre en compte des probl&#232;mes de performances : le recours syst&#233;matique &#224; du code MySQL et PHP est gourmand en ressources, ralentit la visite et, dans des cas extr&#234;mes, provoque des plantages du serveur Web.&lt;/p&gt;
&lt;p&gt;SPIP propose une solution compl&#232;te pour contourner ces difficult&#233;s :
&lt;br /&gt;- la mise en page du site est effectu&#233;e au moyen de gabarits au format HTML nomm&#233;s &lt;i&gt;squelettes&lt;/i&gt;, contenant des instructions simplifi&#233;es permettant d'indiquer o&#249; et comment se placent les informations tir&#233;es de la base de donn&#233;es dans la page ;
&lt;br /&gt;- un syst&#232;me de cache permet de stocker chaque page et ainsi d'&#233;viter de provoquer des appels &#224; la base de donn&#233;es &#224; chaque visite. Non seulement la charge sur le serveur est r&#233;duite, la vitesse tr&#232;s largement acc&#233;l&#233;r&#233;e, de plus un site sous SPIP reste consultable m&#234;me lorsque la base MySQL est plant&#233;e ;
&lt;br /&gt;- un &#171; espace priv&#233; &#187; permettant aux administrateurs et aux r&#233;dacteurs de g&#233;rer l'ensemble des donn&#233;es du site.&lt;/p&gt;
&lt;section class=&#034;sommaire-section sommaire-section_niveau1 sommaire-section_h2&#034; aria-labelledby=&#034;Pour-chaque-type-de-page-un-squelette&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Pour-chaque-type-de-page-un-squelette'&gt;Pour chaque type de page, un squelette&lt;a class='sommaire-back sommaire-back-5' href='#s-Pour-chaque-type-de-page-un-squelette' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;L'int&#233;r&#234;t (et la limite) d'un syst&#232;me de publication automatis&#233;, est de d&#233;finir un gabarit pour, par exemple, tous les articles. On indique dans ce gabarit (le squelette) o&#249; viendront se placer, par exemple, le titre, le texte, les liens de navigation... de l'article, et le syst&#232;me fabriquera chaque page individuelle d'article en pla&#231;ant automatiquement ces &#233;l&#233;ments tir&#233;s de la base de donn&#233;es, dans la mise en page con&#231;ue par la/le webmestre.&lt;/p&gt;
&lt;p&gt;Ce syst&#232;me automatis&#233; permet donc une pr&#233;sentation coh&#233;rente &#224; l'int&#233;rieur d'un site... Et c'est aussi sa limite : il ne permet pas de d&#233;finir une interface diff&#233;rente pour chaque page isol&#233;e (on verra plus loin que SPIP autorise cependant une certaine souplesse).&lt;/p&gt;
&lt;p&gt;Lorsque vous installez SPIP, un jeu de squelettes est propos&#233; par d&#233;faut. Il se trouve dans le r&#233;pertoire &lt;strong&gt;squelettes-dist/&lt;/strong&gt;, &#224; la racine de votre site. D&#232;s que vous modifiez ces fichiers pour les adapter &#224; vos besoins, ou si vous voulez installer un autre jeu de squelettes, il convient de cr&#233;er un r&#233;pertoire nomm&#233; &lt;strong&gt;squelettes/&lt;/strong&gt; au m&#234;me niveau. Pour plus de d&#233;tails sur cette question, lire l'article &lt;a href='https://www.spip.net/fr_article3347.html' class=&#034;spip_in&#034;&gt;O&#249; placer ses squelettes&lt;/a&gt; .&lt;/p&gt;
&lt;p&gt;Lorsqu'un visiteur demande la page &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;http://exemple.org/spip.php?article3437&lt;/code&gt;, SPIP va chercher un squelette nomm&#233; &#171; article.html &#187;. SPIP se base donc sur l'adresse URL de la page pour d&#233;terminer le squelette &#224; utiliser :&lt;/p&gt;
&lt;table class=&#034;table spip&#034;&gt;
&lt;thead&gt;&lt;tr class='row_first'&gt;&lt;th id='id7ec2_c0'&gt; L'URL &lt;/th&gt;&lt;th id='id7ec2_c1'&gt; appellera le squelette &lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr class='row_odd odd'&gt;
&lt;td headers='id7ec2_c0'&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;spip.php?article3437&lt;/code&gt;&lt;/td&gt;
&lt;td headers='id7ec2_c1'&gt;&lt;tt&gt;article.html&lt;/tt&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class='row_even even'&gt;
&lt;td headers='id7ec2_c0'&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;spip.php?rubrique143&lt;/code&gt;&lt;/td&gt;
&lt;td headers='id7ec2_c1'&gt;&lt;tt&gt;rubrique.html&lt;/tt&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class='row_odd odd'&gt;
&lt;td headers='id7ec2_c0'&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;spip.php?mot12&lt;/code&gt;&lt;/td&gt;
&lt;td headers='id7ec2_c1'&gt;&lt;tt&gt;mot.html&lt;/tt&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class='row_even even'&gt;
&lt;td headers='id7ec2_c0'&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;spip.php?auteur5&lt;/code&gt;&lt;/td&gt;
&lt;td headers='id7ec2_c1'&gt;&lt;tt&gt;auteur.html&lt;/tt&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class='row_odd odd'&gt;
&lt;td headers='id7ec2_c0'&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;spip.php?site364&lt;/code&gt;&lt;/td&gt;
&lt;td headers='id7ec2_c1'&gt;&lt;tt&gt;site.html&lt;/tt&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Avec deux cas particuliers :&lt;/p&gt;
&lt;p&gt;- L'URL &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;spip.php&lt;/code&gt; appelle le squelette sommaire.html. Il s'agit de la page d'accueil du site.
&lt;br /&gt;- L'URL &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;spip.php?page=abcd&lt;/code&gt; appelle le squelette abcd.html. En d'autres termes, vous pouvez cr&#233;er des squelettes qui ne sont pas pr&#233;vus par le syst&#232;me et les nommer comme vous le souhaitez.&lt;/p&gt;
&lt;p&gt;Cette syntaxe sert &#233;galement pour les pages telles que le plan du site ou les r&#233;sultats de recherche par exemple : &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;spip.php?page=plan&lt;/code&gt;, &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;spip.php?page=recherche&amp;recherche=ecureuil&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;Lorsque-SPIP-appelle-un-squelette-il-lui-passe-un-contexte&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Lorsque-SPIP-appelle-un-squelette-il-lui-passe-un-contexte'&gt;Lorsque SPIP appelle un squelette, il lui passe un contexte&lt;a class='sommaire-back sommaire-back-5' href='#s-Lorsque-SPIP-appelle-un-squelette-il-lui-passe-un-contexte' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Par ailleurs, vous aurez constat&#233; que l'URL fournit d'autres &#233;l&#233;ments que le nom du squelette. Par exemple, dans &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;spip.php?article3437&lt;/code&gt;, le num&#233;ro de l'article demand&#233; (3437) ; dans &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;spip.php?page=recherche&amp;recherche=ecureuil&lt;/code&gt;, le mot recherch&#233; (ecureuil).&lt;/p&gt;
&lt;p&gt;Il s'agit d'un &#171; contexte &#187;, c'est-&#224;-dire, une ou plusieurs &#171; variables d'environnement &#187;, que SPIP va fournir au squelette pour qu'elles puissent &#234;tre utilis&#233;es dans la composition de la page. En effet, le squelette article.html a besoin de conna&#238;tre le num&#233;ro de l'article demand&#233; pour rechercher son titre, son texte,... dans la base de donn&#233;es. De m&#234;me, le squelette recherche.html doit connaitre les mots recherch&#233;s par le visiteur pour trouver les enregistrements de la base de donn&#233;es qui contiennent ces termes.&lt;/p&gt;
&lt;p&gt;Dans toute URL, les variables d'environnement apparaissent apr&#232;s le &#171; ? &#187;. Lorsqu'il y en a plusieurs, elles sont s&#233;par&#233;es par des &#171; &amp; &#187;.&lt;/p&gt;
&lt;p&gt;Dans l'URL &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;spip.php?page=recherche&amp;recherche=ecureuil&lt;/code&gt;, on a donc deux variables : page et recherche, auxquelles on attribue les valeurs respectives &#171; recherche &#187; et &#171; &#233;cureuil &#187;.&lt;/p&gt;
&lt;p&gt;Dans le cas de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;spip.php?article3437&lt;/code&gt;, SPIP a simplifi&#233; l'URL qui correspond en fait &#224; : &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;spip.php?page=article&amp;id_article=3437&lt;/code&gt; (si si, vous pouvez essayer !). On a donc ici aussi deux variables : page a la valeur &#034;article&#034; et id_article a la valeur &#034;3437&#034;. Ces variables permettent &#224; SPIP d'utiliser les donn&#233;es de l'article 3437 dans le squelette article.html.&lt;/p&gt;
&lt;/section&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau1 sommaire-section_h2&#034; aria-labelledby=&#034;Le-principe-de-fonctionnement-du-cache-de-maniere-simplifiee&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Le-principe-de-fonctionnement-du-cache-de-maniere-simplifiee'&gt;Le principe de fonctionnement du cache, de mani&#232;re simplifi&#233;e&lt;a class='sommaire-back sommaire-back-5' href='#s-Le-principe-de-fonctionnement-du-cache-de-maniere-simplifiee' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div class='spip_document_2138 spip_document spip_documents spip_document_image spip_documents_center spip_document_center spip_document_avec_legende' data-legende-len=&#034;38&#034; data-legende-lenx=&#034;x&#034;
&gt;
&lt;figure class=&#034;spip_doc_inner&#034;&gt; &lt;img src='https://www.spip.net/local/cache-vignettes/L485xH653/Image_7-ba771.png?1594835767' width='485' height='653' alt='' /&gt;
&lt;figcaption class='spip_doc_legende'&gt; &lt;div class='spip_doc_titre crayon document-titre-2138 '&gt;&lt;strong&gt;Sch&#233;ma simplifi&#233; du syst&#232;me de cache
&lt;/strong&gt;&lt;/div&gt; &lt;/figcaption&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;SPIP regarde si une page correspondante &#224; l'URL demand&#233;e se situe dans le &lt;strong&gt;CACHE&lt;/strong&gt;&lt;/p&gt;
&lt;ol class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Si la page existe, SPIP v&#233;rifie qu'elle n'est pas trop ancienne.
&lt;ol class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Si la page est trop ancienne, SPIP la recalcule &#224; partir du squelette et de la base MySQL, puis la stocke dans le &lt;strong&gt;CACHE&lt;/strong&gt;, avant de l'envoyer &#224; l'utilisateur.&lt;/li&gt;&lt;li&gt; Si la page est assez r&#233;cente, SPIP la retourne &#224; l'utilisateur.&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;li&gt; Si la page n'existe pas, SPIP la calcule &#224; partir du squelette et de la base MySQL, puis la stocke dans le &lt;strong&gt;CACHE&lt;/strong&gt;, avant de l'envoyer &#224; l'utilisateur.&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;Lors d'une visite suivante, si le d&#233;lai entre les deux visites est suffisamment court, c'est donc cette nouvelle page stock&#233;e dans &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/tmp/cache&lt;/code&gt; qui est retourn&#233;e, sans avoir &#224; faire un nouveau calcul &#224; partir de la base de donn&#233;es. En cas de plantage de la base de donn&#233;es, c'est forc&#233;ment la page en cache qui est retourn&#233;e, m&#234;me si elle est &#171; trop &#226;g&#233;e &#187;.&lt;/p&gt;
&lt;blockquote class=&#034;spip&#034;&gt;
&lt;p&gt;&lt;i&gt;Remarque.&lt;/i&gt; On voit ici que chaque page du site est mise en cache individuellement, et chaque recalcul est provoqu&#233; par les visites du site. Il n'y a pas, en particulier, un recalcul de toutes les pages du site d'un seul coup &#224; &#233;ch&#233;ance r&#233;guli&#232;re (ce genre de &#171; grosse man&#339;uvres &#187; ayant le bon go&#251;t de surcharger le serveur et de le faire parfois planter).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Par d&#233;faut, si aucune balise &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#CACHE&lt;/code&gt; n'est utilis&#233;e en d&#233;but de squelette, une page est consid&#233;r&#233;e comme trop vieille au bout de 24 heures.&lt;span class=&#034;spip_note_ref&#034;&gt; [&lt;a href=&#034;#nb5-1&#034; class=&#034;spip_note&#034; rel=&#034;appendix&#034; title=&#034;Une fois que vous aurez compris le langage SPIP, vous pourrez modifier ce (&#8230;)&#034; id=&#034;nh5-1&#034;&gt;1&lt;/a&gt;]&lt;/span&gt;&lt;/p&gt;
&lt;/section&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau1 sommaire-section_h2&#034; aria-labelledby=&#034;Le-fichier-html&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Le-fichier-html'&gt;Le fichier .html&lt;a class='sommaire-back sommaire-back-5' href='#s-Le-fichier-html' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Dans SPIP, nous appelons les fichiers &lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;.html&lt;/code&gt;&lt;/strong&gt; les &lt;strong&gt;squelettes&lt;/strong&gt;. Ce sont eux qui d&#233;crivent l'interface graphique de vos pages.&lt;/p&gt;
&lt;p&gt;Ces fichiers sont r&#233;dig&#233;s directement en HTML, auquel on ajoute des instructions permettant d'indiquer &#224; SPIP o&#249; il devra placer les &#233;l&#233;ments tir&#233;s de la base de donn&#233;es (du genre : &#171; placer le titre ici &#187;, &#171; indiquer &#224; cet endroit la liste des articles portant sur le m&#234;me th&#232;me &#187;...).&lt;/p&gt;
&lt;p&gt;Les instructions de placement des &#233;l&#233;ments sont r&#233;dig&#233;es dans un langage sp&#233;cifique, qui fait l'objet du pr&#233;sent manuel d'utilisation. Ce langage constitue par ailleurs la seule difficult&#233; de SPIP.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&#171; Encore un langage ? &#187;&lt;/strong&gt; H&#233; oui, il va vous falloir apprendre un nouveau langage. Il n'est cependant pas tr&#232;s compliqu&#233;, et il permet de cr&#233;er des interfaces complexes tr&#232;s rapidement. Par rapport au couple PHP/MySQL, vous verrez qu'il vous fait gagner un temps fou (surtout : il est beaucoup plus simple). C'est un &lt;span lang=&#034;en&#034;&gt;&lt;i&gt;markup language&lt;/i&gt;&lt;/span&gt;, c'est-&#224;-dire un langage utilisant des balises similaires &#224; celles du HTML.&lt;/p&gt;
&lt;/section&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau1 sommaire-section_h2&#034; aria-labelledby=&#034;Que-peut-on-mettre-dans-un-fichier-html&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Que-peut-on-mettre-dans-un-fichier-html'&gt;Que peut-on mettre dans un fichier .html&lt;a class='sommaire-back sommaire-back-5' href='#s-Que-peut-on-mettre-dans-un-fichier-html' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Les fichiers &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;.html&lt;/code&gt; sont essentiellement des fichiers &#171; texte &#187;, compl&#233;t&#233;s d'instructions de placement des &#233;l&#233;ments de la base de donn&#233;es.&lt;/p&gt;
&lt;p&gt;SPIP analyse uniquement les instructions de placement des &#233;l&#233;ments de la base de donn&#233;es (cod&#233;es selon le langage sp&#233;cifique de SPIP) ; il se contrefiche de ce qui est plac&#233; dans ce fichier et qui ne correspond pas &#224; ces instructions.&lt;/p&gt;
&lt;p&gt;Leur contenu essentiel est donc du HTML. Vous d&#233;terminez la mise en page, la version du HTML d&#233;sir&#233;, etc. Vous pouvez &#233;videmment y inclure des feuilles de style (CSS), mais &#233;galement du JavaScript, du Flash... en gros : tout ce qu'on place habituellement dans une page Web.&lt;/p&gt;
&lt;p&gt;Mais vous pouvez &#233;galement (tout cela n'est jamais que du texte) cr&#233;er du XML (par exemple, &#171; backend.html &#187; g&#233;n&#232;re du XML).&lt;/p&gt;
&lt;p&gt;Plus original : toutes les pages retourn&#233;es au visiteur sont tir&#233;es du &lt;strong&gt;CACHE&lt;/strong&gt; par une page &#233;crite en PHP. Vous pouvez donc inclure dans vos squelettes des instructions en PHP, elles seront ex&#233;cut&#233;es lors de la visite. Utilis&#233;e de mani&#232;re assez fine, cette possibilit&#233; apporte une grande souplesse &#224; SPIP, que vous pouvez ainsi compl&#233;ter (par exemple ajouter un compteur, etc.), ou m&#234;me faire &#233;voluer certains &#233;l&#233;ments de mise en page en fonction des informations tir&#233;es de la base de donn&#233;es.&lt;/p&gt;&lt;/section&gt;&lt;/div&gt;
		&lt;hr /&gt;
		&lt;div class='rss_notes'&gt;&lt;div id=&#034;nb5-1&#034;&gt;
&lt;p&gt;&lt;span class=&#034;spip_note_ref&#034;&gt;[&lt;a href=&#034;#nh5-1&#034; class=&#034;spip_note&#034; title=&#034;Notes 5-1&#034; rev=&#034;appendix&#034;&gt;1&lt;/a&gt;] &lt;/span&gt;Une fois que vous aurez compris le langage SPIP, vous pourrez modifier ce d&#233;lai en vous servant de la balise &lt;a href='https://www.spip.net/fr_article1902.html#cache' class=&#034;spip_in&#034;&gt;#CACHE&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>



</channel>

</rss>
