<?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=3109&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>Les outils utilis&#233;s pour le d&#233;veloppement</title>
		<link>https://www.spip.net/fr_article6924.html</link>
		<guid isPermaLink="true">https://www.spip.net/fr_article6924.html</guid>
		<dc:date>2025-01-14T06:58:03Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>bricebou, b_b, James, Ma&#239;eul, Matthieu Marcillaud, placido, tofulm</dc:creator>



		<description>
&lt;p&gt;L'&#233;quipe de maintenance utilise ces outils pour maintenir et d&#233;velopper SPIP. Cet article r&#233;sume succinctement le r&#244;le des outils et les liens de documentation. &lt;br class='autobr' /&gt; |Nom de l'outil|R&#244;le|Documentation sp&#233;cifique &#224; la communaut&#233; SPIP| D&#233;veloppement c&#244;t&#233; serveur ou back-end PHP Langage dans lequel SPIP est &#233;crit c&#244;t&#233; serveur PHPdoc Commentaire du code Composer Installer les biblioth&#232;ques de code (library) dont le projet principal a besoin Qualit&#233; de code Easy Coding Standard (&#8230;)&lt;/p&gt;


-
&lt;a href="https://www.spip.net/fr_rubrique809.html" rel="directory"&gt;Outils de d&#233;veloppement&lt;/a&gt;


		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;L'&#233;quipe de maintenance utilise ces outils pour maintenir et d&#233;velopper SPIP. Cet article r&#233;sume succinctement le r&#244;le des outils et les liens de documentation.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;table class=&#034;table spip&#034;&gt;
&lt;thead&gt;&lt;tr class='row_first'&gt;&lt;th id='id7894_c0'&gt;Nom de l'outil&lt;/th&gt;&lt;th id='id7894_c1'&gt;R&#244;le&lt;/th&gt;&lt;th id='id7894_c2'&gt;Documentation sp&#233;cifique &#224; la communaut&#233; SPIP&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;
&lt;tbody&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;table class=&#034;table spip&#034;&gt;
&lt;tbody&gt;
&lt;tr class='row_odd odd'&gt;
&lt;td colspan='3'&gt;&lt;strong&gt;D&#233;veloppement c&#244;t&#233; serveur ou &lt;i&gt;back-end&lt;/i&gt; &lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class='row_even even'&gt;
&lt;td&gt;&lt;a href=&#034;https://www.php.net/manual/fr&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;PHP&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Langage dans lequel SPIP est &#233;crit c&#244;t&#233; serveur&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class='row_odd odd'&gt;
&lt;td&gt;&lt;a href=&#034;https://docs.phpdoc.org/guide/getting-started/index.html#getting-started&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;PHPdoc&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Commentaire du code&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class='row_even even'&gt;
&lt;td&gt;&lt;a href=&#034;https://getcomposer.org/doc&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Composer&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Installer les biblioth&#232;ques de code (library) dont le projet principal a besoin&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class='row_odd odd'&gt;
&lt;td colspan='3'&gt;&lt;strong&gt;Qualit&#233; de code&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class='row_even even'&gt;
&lt;td&gt;&lt;a href=&#034;https://github.com/easy-coding-standard/easy-coding-standard&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Easy Coding Standard&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Automatiser le respect des r&#233;gles de codages&lt;/td&gt;
&lt;td&gt;&lt;a href='https://www.spip.net/fr_article7086.html' class=&#034;spip_in&#034;&gt;Utiliser ECS&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class='row_odd odd'&gt;
&lt;td&gt;&lt;a href=&#034;https://getrector.com/documentation&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Rector&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Corriger du code historique pour le rendre plus durable&lt;/td&gt;
&lt;td&gt;&lt;a href='https://www.spip.net/fr_article7090.html' class=&#034;spip_in&#034;&gt;Utiliser Rector&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class='row_even even'&gt;
&lt;td&gt;&lt;a href=&#034;https://www.php-fig.org/psr/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;PSR&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Bonne pratiques de codage&lt;/td&gt;
&lt;td&gt;&lt;a href='https://www.spip.net/fr_rubrique783.html' class=&#034;spip_in&#034;&gt;Conventions&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class='row_odd odd'&gt;
&lt;td&gt;&lt;a href=&#034;https://phpunit.de/documentation.html&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;PHPUnit&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Tester le code&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class='row_even even'&gt;
&lt;td&gt;&lt;a href=&#034;https://phpstan.org/user-guide/getting-started&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;PHPStan&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Analyser le code&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class='row_odd odd'&gt;
&lt;td&gt;&lt;a href=&#034;https://refactoring.guru/design-patterns/php&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Refactoring Guru&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Inspiration pour transformer le code proc&#233;dural historique en code POO et pour gagner en robustesse&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class='row_even even'&gt;
&lt;td&gt;&lt;a href=&#034;https://12factor.net/fr/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;The Twelve-Factor App&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Inspiration : une m&#233;thodologie pour concevoir des logiciels en tant que service&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;table class=&#034;table spip&#034;&gt;
&lt;tbody&gt;
&lt;tr class='row_odd odd'&gt;
&lt;td colspan='3'&gt;&lt;strong&gt;D&#233;veloppement c&#244;t&#233; navigateur ou &lt;i&gt;front-end&lt;/i&gt; &lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class='row_even even'&gt;
&lt;td&gt;&lt;a href=&#034;https://javascript.info/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Javascript&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Langage pour l'affichage dynamique de fragments de page (front-end)&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class='row_odd odd'&gt;
&lt;td&gt;&lt;a href=&#034;https://api.jquery.com&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;jQuery&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Biblioth&#232;que longtemps rest&#233;e comme r&#233;f&#233;rence (en voie de migration)&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class='row_even even'&gt;
&lt;td&gt;&lt;a href=&#034;https://docs.npmjs.com&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;npm&lt;/a&gt; + &lt;a href=&#034;https://bun.sh/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Bun&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Installer des modules ou biblioth&#232;ques de code (library)&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class='row_odd odd'&gt;
&lt;td colspan='3'&gt;&lt;strong&gt;Qualit&#233; de code&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class='row_even even'&gt;
&lt;td&gt;&lt;a href=&#034;https://bun.sh/docs/cli/test&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;bun:test&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Tester le code&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class='row_odd odd'&gt;
&lt;td&gt;&lt;a href=&#034;https://biomejs.dev/guides/getting-started/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;biomejs&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Normaliser le code (linter)&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;table class=&#034;table spip&#034;&gt;
&lt;thead&gt;&lt;tr class='row_first'&gt;&lt;th id='id8889_c0' colspan='3'&gt;Versionnage&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr class='row_odd odd'&gt;
&lt;td headers='id8889_c0'&gt;&lt;a href=&#034;https://git-scm.com/doc&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Git&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Suivi de version de code&lt;/td&gt;
&lt;td&gt;&lt;a href=&#034;https://git-scm.com/book/fr/v2&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Consulter un livre en fran&#231;ais&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class='row_even even'&gt;
&lt;td headers='id8889_c0'&gt;&lt;a href=&#034;https://about.gitlab.com/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Gitlab&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Plateforme de d&#233;veloppement&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class='row_odd odd'&gt;
&lt;td headers='id8889_c0'&gt;&lt;a href=&#034;https://semver.org/lang/fr/spec/v2.0.0.html&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;S&#233;mantique&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Comment fonctionnent les versions de SPIP et de ses d&#233;pendances&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class='row_even even'&gt;
&lt;td headers='id8889_c0'&gt;&lt;a href=&#034;https://www.conventionalcommits.org/fr/v1.0.0/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Conventionnel commit&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Des messages des commits signifiants, lisibles pour l'humain&lt;/td&gt;
&lt;td&gt;Voir aussi &lt;a href='https://www.spip.net/fr_article6824.html' class=&#034;spip_in&#034;&gt;&#201;crire un message de commit&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class='row_odd odd'&gt;
&lt;td headers='id8889_c0'&gt;&lt;a href=&#034;https://keepachangelog.com/fr/1.0.0/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Changelog&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Permettre de voir pr&#233;cis&#233;ment quels changements notables ont &#233;t&#233; faits entre chaque publication (release) d'un projet&lt;/td&gt;
&lt;td&gt;Voir aussi &lt;a href='https://www.spip.net/fr_article6825.html' class=&#034;spip_in&#034;&gt;Tenir un CHANGELOG&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
		&lt;div class='rss_ps'&gt;&lt;p&gt;Nous d&#233;veloppons et utilisons aussi nos propres outils :&lt;/p&gt;
&lt;p&gt;- &lt;a href=&#034;https://git.spip.net/spip-contrib-outils/spip-releases&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;spip-releases&lt;/a&gt;
&lt;br /&gt;- &lt;a href=&#034;https://git.spip.net/spip-league/easy-coding-standard&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;spip-league/ecs&lt;/a&gt;
&lt;br /&gt;- &lt;a href=&#034;https://git.spip.net/spip-league/rector&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;spip-league/rector&lt;/a&gt;
&lt;br /&gt;- &lt;a href=&#034;https://git.spip.net/spip-league/sdk&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;spip-league/sdk&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>SPIP 4.3</title>
		<link>https://www.spip.net/fr_article6871.html</link>
		<guid isPermaLink="true">https://www.spip.net/fr_article6871.html</guid>
		<dc:date>2024-07-26T10:40:37Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>b_b, jack, Ma&#239;eul, Matthieu Marcillaud</dc:creator>



		<description>
&lt;p&gt;Compatibilit&#233; PHP 7.4 &#224; 8.3 &lt;br class='autobr' /&gt;
SPIP 4.3 n&#233;cessite PHP 7.4 minimum, et fonctionne jusqu'&#224; PHP 8.3. Il n&#233;cessite les extensions PHP : sodium, Zlib, Zip et Phar. &lt;br class='autobr' /&gt;
Changements apport&#233;s par SPIP 4.3 &lt;br class='autobr' /&gt;
Les changements les plus importants concernent le bandeau de l'espace priv&#233; plus condens&#233;, le formulaire de changement de statut des objets &#233;ditoriaux revu, les filtres d'image plus rapides, une &#233;criture plus inclusive de certaines formulations, l'envoi d'une notification par mail lorsqu'une mise (&#8230;)&lt;/p&gt;


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


		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;!--sommaire--&gt;&lt;div class=&#034;well nav-sommaire nav-sommaire-14&#034; id=&#034;nav69e3a65ec1fbc8.57099012&#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-Compatibilite-PHP-7-4-a-8-3&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Compatibilite-PHP-7-4-a-8-3&#034; class=&#034;spip_ancre&#034;&gt;Compatibilit&#233; PHP 7.4 &#224; 8.3&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Changements-apportes-par-SPIP-4-3&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Changements-apportes-par-SPIP-4-3&#034; class=&#034;spip_ancre&#034;&gt;Changements apport&#233;s par SPIP 4.3&lt;/a&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;a id=&#034;s-Le-bandeau-de-l-espace-prive-prend-moins-de-place-en-hauteur&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Le-bandeau-de-l-espace-prive-prend-moins-de-place-en-hauteur&#034; class=&#034;spip_ancre&#034;&gt;Le bandeau de l'espace priv&#233; prend moins de place en hauteur&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-La-creation-rapide-des-contenus-passe-dans-un-menu-depliant&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#La-creation-rapide-des-contenus-passe-dans-un-menu-depliant&#034; class=&#034;spip_ancre&#034;&gt;La cr&#233;ation rapide des contenus passe dans un menu d&#233;pliant&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Le-formulaire-de-changement-de-statut-est-revu&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Le-formulaire-de-changement-de-statut-est-revu&#034; class=&#034;spip_ancre&#034;&gt;Le formulaire de changement de statut est revu&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Un-message-avertissant-d-une-nouvelle-version-disponible&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Un-message-avertissant-d-une-nouvelle-version-disponible&#034; class=&#034;spip_ancre&#034;&gt;Un message avertissant d'une nouvelle version disponible&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Ajouts&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Ajouts&#034; class=&#034;spip_ancre&#034;&gt;Ajouts&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Changements&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Changements&#034; class=&#034;spip_ancre&#034;&gt;Changements&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Corrections&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Corrections&#034; class=&#034;spip_ancre&#034;&gt;Corrections&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Depreciations&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Depreciations&#034; class=&#034;spip_ancre&#034;&gt;D&#233;pr&#233;ciations&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Retrait&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Retrait&#034; class=&#034;spip_ancre&#034;&gt;Retrait&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Plugins-dist&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Plugins-dist&#034; class=&#034;spip_ancre&#034;&gt;Plugins-dist&lt;/a&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;a id=&#034;s-Images&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Images&#034; class=&#034;spip_ancre&#034;&gt;Images&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Plugins-compatibles&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Plugins-compatibles&#034; class=&#034;spip_ancre&#034;&gt;Plugins compatibles&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;Compatibilite-PHP-7-4-a-8-3&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Compatibilite-PHP-7-4-a-8-3'&gt; Compatibilit&#233; PHP 7.4 &#224; 8.3 &lt;a class='sommaire-back sommaire-back-14' href='#s-Compatibilite-PHP-7-4-a-8-3' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;SPIP 4.3 n&#233;cessite PHP 7.4 minimum, et fonctionne jusqu'&#224; PHP 8.3.&lt;br class='autobr' /&gt;
Il n&#233;cessite les extensions PHP : sodium, Zlib, Zip et Phar.&lt;/p&gt;
&lt;/section&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau1 sommaire-section_h2&#034; aria-labelledby=&#034;Changements-apportes-par-SPIP-4-3&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Changements-apportes-par-SPIP-4-3'&gt;Changements apport&#233;s par SPIP 4.3&lt;a class='sommaire-back sommaire-back-14' href='#s-Changements-apportes-par-SPIP-4-3' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Les changements les plus importants concernent&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; le bandeau de l'espace priv&#233; plus condens&#233;,&lt;/li&gt;&lt;li&gt; le formulaire de changement de statut des objets &#233;ditoriaux revu,&lt;/li&gt;&lt;li&gt; les filtres d'image plus rapides,&lt;/li&gt;&lt;li&gt; une &#233;criture plus inclusive de certaines formulations,&lt;/li&gt;&lt;li&gt; l'envoi d'une notification par mail lorsqu'une mise &#224; jour de SPIP est disponible, ainsi qu'une indication visuelle plus grande dans l'espace priv&#233;,&lt;/li&gt;&lt;/ul&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau2 sommaire-section_h3&#034; aria-labelledby=&#034;Le-bandeau-de-l-espace-prive-prend-moins-de-place-en-hauteur&#034;&gt;&lt;h3 class=&#034;h3&#034; id='Le-bandeau-de-l-espace-prive-prend-moins-de-place-en-hauteur'&gt; Le bandeau de l'espace priv&#233; prend moins de place en hauteur&lt;a class='sommaire-back sommaire-back-14' href='#s-Le-bandeau-de-l-espace-prive-prend-moins-de-place-en-hauteur' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class='spip_document_4208 spip_document spip_documents spip_document_image spip_documents_center spip_document_center'&gt;
&lt;figure class=&#034;spip_doc_inner&#034;&gt; &lt;a href='https://www.spip.net/IMG/png/bandeau_espace_prive__4.3.png' class=&#034;spip_doc_lien mediabox&#034; type=&#034;image/png&#034;&gt; &lt;img src='https://www.spip.net/local/cache-vignettes/L500xH90/bandeau_espace_prive__4.3-3e058.png?1721990759' width='500' height='90' alt='' /&gt;&lt;/a&gt;
&lt;/figure&gt;
&lt;/div&gt;&lt;/section&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau2 sommaire-section_h3&#034; aria-labelledby=&#034;La-creation-rapide-des-contenus-passe-dans-un-menu-depliant&#034;&gt;&lt;h3 class=&#034;h3&#034; id='La-creation-rapide-des-contenus-passe-dans-un-menu-depliant'&gt; La cr&#233;ation rapide des contenus passe dans un menu d&#233;pliant&lt;a class='sommaire-back sommaire-back-14' href='#s-La-creation-rapide-des-contenus-passe-dans-un-menu-depliant' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;div class='spip_document_4207 spip_document spip_documents spip_document_image spip_documents_center spip_document_center'&gt;
&lt;figure class=&#034;spip_doc_inner&#034;&gt; &lt;a href='https://www.spip.net/IMG/png/bandeau_espace_prive__4.3-menu_cre_er.png' class=&#034;spip_doc_lien mediabox&#034; type=&#034;image/png&#034;&gt; &lt;img src='https://www.spip.net/local/cache-vignettes/L500xH157/bandeau_espace_prive__4.3-menu_cre_er-95aee.png?1721990759' width='500' height='157' alt='' /&gt;&lt;/a&gt;
&lt;/figure&gt;
&lt;/div&gt;&lt;/section&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau2 sommaire-section_h3&#034; aria-labelledby=&#034;Le-formulaire-de-changement-de-statut-est-revu&#034;&gt;&lt;h3 class=&#034;h3&#034; id='Le-formulaire-de-changement-de-statut-est-revu'&gt; Le formulaire de changement de statut est revu &lt;a class='sommaire-back sommaire-back-14' href='#s-Le-formulaire-de-changement-de-statut-est-revu' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;div class='spip_document_4209 spip_document spip_documents spip_document_image spip_documents_center spip_document_center spip_document_avec_legende' data-legende-len=&#034;61&#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/L500xH385/formulaire_instituer_4.3-ba621.png?1721990759' width='500' height='385' alt='' /&gt;
&lt;figcaption class='spip_doc_legende'&gt; &lt;div class='spip_doc_titre crayon document-titre-4209 '&gt;&lt;strong&gt;Pr&#233;sentation initiale du formulaire de changement de statut
&lt;/strong&gt;&lt;/div&gt; &lt;/figcaption&gt;&lt;/figure&gt;
&lt;/div&gt;&lt;div class='spip_document_4210 spip_document spip_documents spip_document_image spip_documents_center spip_document_center spip_document_avec_legende' data-legende-len=&#034;43&#034; data-legende-lenx=&#034;x&#034;
&gt;
&lt;figure class=&#034;spip_doc_inner&#034;&gt; &lt;a href='https://www.spip.net/IMG/png/formulaire_instituer_4.3-deplie.png' class=&#034;spip_doc_lien mediabox&#034; type=&#034;image/png&#034;&gt; &lt;img src='https://www.spip.net/local/cache-vignettes/L500xH747/formulaire_instituer_4.3-deplie-6d66c.png?1721990759' width='500' height='747' alt='' /&gt;&lt;/a&gt;
&lt;figcaption class='spip_doc_legende'&gt; &lt;div class='spip_doc_titre crayon document-titre-4210 '&gt;&lt;strong&gt;Formulaire de changement de statut d&#233;pli&#233;
&lt;/strong&gt;&lt;/div&gt; &lt;/figcaption&gt;&lt;/figure&gt;
&lt;/div&gt;&lt;/section&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau2 sommaire-section_h3&#034; aria-labelledby=&#034;Un-message-avertissant-d-une-nouvelle-version-disponible&#034;&gt;&lt;h3 class=&#034;h3&#034; id='Un-message-avertissant-d-une-nouvelle-version-disponible'&gt; Un message avertissant d'une nouvelle version disponible &lt;a class='sommaire-back sommaire-back-14' href='#s-Un-message-avertissant-d-une-nouvelle-version-disponible' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;div class='spip_document_4211 spip_document spip_documents spip_document_image spip_documents_center spip_document_center'&gt;
&lt;figure class=&#034;spip_doc_inner&#034;&gt; &lt;a href='https://www.spip.net/IMG/png/info_maj_nouvelle.png' class=&#034;spip_doc_lien mediabox&#034; type=&#034;image/png&#034;&gt; &lt;img src='https://www.spip.net/local/cache-vignettes/L500xH72/info_maj_nouvelle-8cd08.png?1721990759' width='500' height='72' alt='' /&gt;&lt;/a&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;Cette version apporte &#233;galement d'autres am&#233;liorations ou corrections de bugs.&lt;/p&gt;
&lt;/section&gt;&lt;/section&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau1 sommaire-section_h2&#034; aria-labelledby=&#034;Ajouts&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Ajouts'&gt; Ajouts &lt;a class='sommaire-back sommaire-back-14' href='#s-Ajouts' 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; Afficher un encart pour signaler les nouvelles versions dans toutes les pages de l'espace priv&#233; pour les webmestres, et un bouton pointant vers &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;spip_loader&lt;/code&gt;(voir &lt;a href='https://www.spip.net/fr_article5705.html' class=&#034;spip_in&#034; hreflang=&#034;fr&#034;&gt;Utiliser spip_loader&lt;/a&gt;) s'il est pr&#233;sent&lt;/li&gt;&lt;li&gt; Notifier par email les webmestres du site lorsque SPIP dispose d'une mise &#224; jour (d&#233;sactivable avec la constante &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;_MAJ_NOTIF_EMAILS&lt;/code&gt;, &lt;a href='https://www.spip.net/fr_article6872.html' class=&#034;spip_in&#034;&gt;voir la documentation&lt;/a&gt;)&lt;/li&gt;&lt;li&gt; Am&#233;liorer l'ergonomie du formulaire instituer (changement de statut d'un objet &#233;ditorial, voir plus haut)&lt;/li&gt;&lt;li&gt; Le formulaire d'identit&#233; du site permet de configurer la timezone utilis&#233;e&lt;/li&gt;&lt;li&gt; Nouveau filtre &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;|balise_img_svg&lt;/code&gt; pour ins&#233;rer une image ou un SVG inline sans savoir d'avance le format&lt;/li&gt;&lt;li&gt; Ajouter une option &#224; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;find_all_in_path()&lt;/code&gt; pour renvoyer tous les fichiers r&#233;pondant &#224; un pattern&lt;/li&gt;&lt;li&gt; Filtre &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;|propre&lt;/code&gt; qui applique &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;propre()&lt;/code&gt; &amp; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;safehtml()&lt;/code&gt; (cela permet de d&#233;s-&#233;chapper le code de confiance des mod&#232;les)&lt;/li&gt;&lt;li&gt; D&#233;bugueur : Afficher le nombre d'occurrences et temps total des inclusions de squelettes&lt;/li&gt;&lt;li&gt; La constante &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;_DEBUG_MINIPRES&lt;/code&gt; d&#233;finie &#224; true active l'affichage d'un debug visible lorsqu'une erreur de type Minipage survient&lt;/li&gt;&lt;li&gt; Pipeline &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;get_spip_doc&lt;/code&gt; pour manipuler le r&#233;sultat natif de la fonction &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;get_spip_doc()&lt;/code&gt;&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;Changements&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Changements'&gt; Changements &lt;a class='sommaire-back sommaire-back-14' href='#s-Changements' 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; Le bandeau de navigation de l'espace priv&#233; est r&#233;duit en hauteur (2 lignes au lieu de 3, voir plus haut)&lt;/li&gt;&lt;li&gt; Le menu de cr&#233;ation rapide passe en menu d&#233;roulant avec des labels explicites (voir plus haut)&lt;/li&gt;&lt;li&gt; &#201;criture plus inclusive de certaines formulations&lt;/li&gt;&lt;li&gt; Optimisation des boucles avec pagination, en for&#231;ant une clause limit automatique dessus&lt;/li&gt;&lt;li&gt; Dans un plugin, si l'attribut logo d'un &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;paquet.xml&lt;/code&gt; est absent, et qu'il existe un fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{prefixe}.svg&lt;/code&gt; dans le plugin, il est utilis&#233; comme logo&lt;/li&gt;&lt;li&gt; Les fonctions &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;extraire_balise()&lt;/code&gt; et &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;extraire_balises()&lt;/code&gt; peuvent g&#233;rer des balises imbriqu&#233;es&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;Corrections&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Corrections'&gt; Corrections &lt;a class='sommaire-back sommaire-back-14' href='#s-Corrections' 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; Am&#233;liorer la conformit&#233; HTML5&lt;/li&gt;&lt;li&gt; Ic&#244;ne T&#226;ches de fond qui n'&#233;voque pas les bases de donn&#233;es&lt;/li&gt;&lt;li&gt; Refactoring de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;ecrire_fichier()&lt;/code&gt;&lt;/li&gt;&lt;li&gt; Combinaison des crit&#232;res &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{pagination}&lt;/code&gt; et &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{limit}&lt;/code&gt;&lt;/li&gt;&lt;li&gt; Ne pas conserver un double des fichiers calcul&#233;s inchang&#233;s (&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#PRODUIRE_FOND&lt;/code&gt;)&lt;/li&gt;&lt;li&gt; Mise &#224; jour de la biblioth&#232;que &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;mediaelement&lt;/code&gt; en version 7.0.3&lt;/li&gt;&lt;li&gt; Correction de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;inserer_attribut()&lt;/code&gt; sur un cas d&#233;rogatoire : les balises&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;img&gt;&lt;/code&gt; (m&#234;me non autofermante)&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;Depreciations&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Depreciations'&gt; D&#233;pr&#233;ciations &lt;a class='sommaire-back sommaire-back-14' href='#s-Depreciations' 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; D&#233;pr&#233;cier les fonctions d&#233;su&#232;tes de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;ecrire/inc/presentation&lt;/code&gt;&lt;/li&gt;&lt;li&gt; La globale &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;auteur_session&lt;/code&gt; (d&#233;pr&#233;ci&#233;e depuis SPIP 2.0 !) sera supprim&#233;e en SPIP 5.0. Utiliser &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;visiteur_session&lt;/code&gt;.&lt;/li&gt;&lt;li&gt; D&#233;pr&#233;cier la classe &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;.label&lt;/code&gt; au profit de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;.editer-label&lt;/code&gt; dans les formulaires&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;Retrait&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Retrait'&gt; Retrait &lt;a class='sommaire-back sommaire-back-14' href='#s-Retrait' 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; Retrait des options d'affichage des ic&#244;nes dans les pr&#233;f&#233;rences&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;Plugins-dist&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Plugins-dist'&gt;Plugins-dist&lt;a class='sommaire-back sommaire-back-14' href='#s-Plugins-dist' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau2 sommaire-section_h3&#034; aria-labelledby=&#034;Images&#034;&gt;&lt;h3 class=&#034;h3&#034; id='Images'&gt; Images&lt;a class='sommaire-back sommaire-back-14' href='#s-Images' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Les performances du plugin-dist Filtres Images ont &#233;t&#233; tr&#232;s nettement optimis&#233;es, certains filtres images sont d&#233;sormais jusqu'&#224; 10 fois plus rapides gr&#226;ce &#224; l'utilisation des fonctions natives de PHP GD&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Un nouveau filtre, &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;|image_oriente_selon_exif&lt;/code&gt; pour r&#233;orienter automatiquement une image selon son exif&lt;/li&gt;&lt;li&gt; Les filtres d'images tel que &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;|image_recadre&lt;/code&gt; r&#233;orientent l'image selon l'exif d'orientation&lt;/li&gt;&lt;li&gt; Optimisation des filtres &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;|image_aplatir&lt;/code&gt;, &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;|image_renforcement&lt;/code&gt;, &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;|image_flou&lt;/code&gt;, &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;|image_sepia&lt;/code&gt;, &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;|image_flip_vertical&lt;/code&gt;, &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;|image_flip_horizontal&lt;/code&gt;, &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;|image_nb&lt;/code&gt;, &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;|image_gamma&lt;/code&gt;, &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;|image_rotation&lt;/code&gt;&lt;/li&gt;&lt;li&gt; Correction du param&#232;tre crop de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;|image_rotation&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau1 sommaire-section_h2&#034; aria-labelledby=&#034;Plugins-compatibles&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Plugins-compatibles'&gt;Plugins compatibles&lt;a class='sommaire-back sommaire-back-14' href='#s-Plugins-compatibles' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;D&#232;s sa sortie SPIP 4.3 b&#233;n&#233;ficie d'environ 700 plugins compatibles, ce qui facilitera les mises &#224; jour.&lt;br class='autobr' /&gt;
Voir : &lt;a href='https://www.spip.net/fr_article1318.html#Etape-2-Mettez-a-jour-vos-plugins' class=&#034;spip_in&#034;&gt;Effectuer une mise &#224; jour&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>SPIP 4.1</title>
		<link>https://www.spip.net/fr_article6708.html</link>
		<guid isPermaLink="true">https://www.spip.net/fr_article6708.html</guid>
		<dc:date>2022-03-25T13:39:45Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>b_b, James, JLuc, Matthieu Marcillaud</dc:creator>



		<description>&lt;p&gt;Changements apport&#233;s par SPIP 4.1&lt;/p&gt;

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


		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;SPIP 4.1 est avant tout une version qui suit les versions maintenues de PHP (7.4 &#224; 8.1) et met &#224; jour diff&#233;rentes librairies utilis&#233;es en interne. Il modifie aussi le syst&#232;me d'authentification des auteurs.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;!--sommaire--&gt;&lt;div class=&#034;well nav-sommaire nav-sommaire-25&#034; id=&#034;nav69e3a65ec54653.43237308&#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-Compatibilite-PHP&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Compatibilite-PHP&#034; class=&#034;spip_ancre&#034;&gt;Compatibilit&#233; PHP&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Compatibilite-PHP-8-1&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Compatibilite-PHP-8-1&#034; class=&#034;spip_ancre&#034;&gt;Compatibilit&#233; PHP 8.1&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Authentification-amp-Chiffrement&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Authentification-amp-Chiffrement&#034; class=&#034;spip_ancre&#034;&gt;Authentification &amp; Chiffrement&lt;/a&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;a id=&#034;s-Le-formulaire-de-login&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Le-formulaire-de-login&#034; class=&#034;spip_ancre&#034;&gt;Le formulaire de login&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Poivre-sel-hash-du-mot-de-passe&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Poivre-sel-hash-du-mot-de-passe&#034; class=&#034;spip_ancre&#034;&gt;Poivre, sel, hash du mot de passe&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Cles-de-chiffrement&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Cles-de-chiffrement&#034; class=&#034;spip_ancre&#034;&gt;Cl&#233;s de chiffrement&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Password&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Password&#034; class=&#034;spip_ancre&#034;&gt;Password&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Chiffrement&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Chiffrement&#034; class=&#034;spip_ancre&#034;&gt;Chiffrement&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Signature-des-actions&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Signature-des-actions&#034; class=&#034;spip_ancre&#034;&gt;Signature des actions&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Qualite-du-code&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Qualite-du-code&#034; class=&#034;spip_ancre&#034;&gt;Qualit&#233; du code&lt;/a&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;a id=&#034;s-Typage&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Typage&#034; class=&#034;spip_ancre&#034;&gt;Typage&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Sucre-syntaxique&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Sucre-syntaxique&#034; class=&#034;spip_ancre&#034;&gt;Sucre syntaxique&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Changements-d-API-sur-les-URLs-et-objets&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Changements-d-API-sur-les-URLs-et-objets&#034; class=&#034;spip_ancre&#034;&gt;Changements d'API sur les URLs et objets&lt;/a&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;a id=&#034;s-Encodage&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Encodage&#034; class=&#034;spip_ancre&#034;&gt;Encodage&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Decodage&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Decodage&#034; class=&#034;spip_ancre&#034;&gt;D&#233;codage&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Objet&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Objet&#034; class=&#034;spip_ancre&#034;&gt;Objet&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Reecriture-de-en-api&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Reecriture-de-en-api&#034; class=&#034;spip_ancre&#034;&gt;R&#233;&#233;criture de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;transmettre&lt;/code&gt; en .api&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Mises-a-jour-des-librairies&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Mises-a-jour-des-librairies&#034; class=&#034;spip_ancre&#034;&gt;Mises &#224; jour des librairies&lt;/a&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&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-PHP&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#PHP&#034; class=&#034;spip_ancre&#034;&gt;PHP&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Suppression-de-librairies&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Suppression-de-librairies&#034; class=&#034;spip_ancre&#034;&gt;Suppression de librairies&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Interface&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Interface&#034; class=&#034;spip_ancre&#034;&gt;Interface&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Nettoyages&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Nettoyages&#034; class=&#034;spip_ancre&#034;&gt;Nettoyages&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Quelques-adaptations&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Quelques-adaptations&#034; class=&#034;spip_ancre&#034;&gt;Quelques adaptations&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Plugins&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Plugins&#034; class=&#034;spip_ancre&#034;&gt;Plugins&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;Compatibilite-PHP&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Compatibilite-PHP'&gt; Compatibilit&#233; PHP &lt;a class='sommaire-back sommaire-back-25' href='#s-Compatibilite-PHP' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;SPIP 4.1&lt;/strong&gt; n&#233;cessite PHP 7.4 minimum, et fonctionne jusqu'&#224; PHP 8.1.&lt;br class='autobr' /&gt;
Il n&#233;cessite les extensions PHP : sodium, Zlib, Zip et Phar.&lt;/p&gt;
&lt;p&gt;Rappel : &lt;strong&gt;SPIP 4.0&lt;/strong&gt; c'est PHP 7.3 &#224; 8.0.&lt;/p&gt;
&lt;/section&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau1 sommaire-section_h2&#034; aria-labelledby=&#034;Compatibilite-PHP-8-1&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Compatibilite-PHP-8-1'&gt; Compatibilit&#233; PHP 8.1 &lt;a class='sommaire-back sommaire-back-25' href='#s-Compatibilite-PHP-8-1' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Pour la compatibilit&#233; PHP 8.1, nous avons du corriger / adapter de nombreuses fonctions.&lt;/p&gt;
&lt;p&gt;Cela concerne particuli&#232;rement des appels &#224; des fonctions de PHP traitant des cha&#238;nes de caract&#232;res, si elles re&#231;oivent &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;null&lt;/code&gt; au lieu d'une cha&#238;ne, pour &#233;viter des &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;deprecated&lt;/code&gt; : &lt;a href=&#034;https://php.watch/versions/8.1/internal-func-non-nullable-null-deprecation&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://php.watch/versions/8.1/internal-func-non-nullable-null-deprecation&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;Authentification-amp-Chiffrement&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Authentification-amp-Chiffrement'&gt; Authentification &amp; Chiffrement &lt;a class='sommaire-back sommaire-back-25' href='#s-Authentification-amp-Chiffrement' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Nous reprenons en l'adaptant le travail de g0uz sur le plugin &lt;a href=&#034;https://git.spip.net/spip-contrib-extensions/chiffrer&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Chiffrer&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;- Cela corrige certains rares cas o&#249; la librairie Javascript utilis&#233;e jusqu'&#224; pr&#233;sent &#233;chouait dans l'identification de l'internaute
&lt;br /&gt;- Cela renforce la s&#233;curit&#233; en &#233;vitant certains types d'attaques.&lt;/p&gt;
&lt;section class=&#034;sommaire-section sommaire-section_niveau2 sommaire-section_h3&#034; aria-labelledby=&#034;Le-formulaire-de-login&#034;&gt;&lt;h3 class=&#034;h3&#034; id='Le-formulaire-de-login'&gt; Le formulaire de login &lt;a class='sommaire-back sommaire-back-25' href='#s-Le-formulaire-de-login' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;HTTPS est d&#233;sormais encore plus fortement conseill&#233;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;En effet, SPIP ne cherche plus &#224; chiffrer le mot de passe des auteurs en Javascript depuis le formulaire de login, et le mot de passe arrive donc syst&#233;matiquement &#171; en clair &#187; &#224; SPIP. Il est donc fortement conseill&#233; d'avoir son site en HTTPS, car HTTPS assure alors la s&#233;curit&#233; de la transmission.&lt;/p&gt;
&lt;p&gt;En cons&#233;quence, la constante &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;_AUTORISER_AUTH_FAIBLE&lt;/code&gt;, qui permettait de forcer l'envoi du mot de passe en clair, est supprim&#233;e.&lt;/p&gt;
&lt;/section&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau2 sommaire-section_h3&#034; aria-labelledby=&#034;Poivre-sel-hash-du-mot-de-passe&#034;&gt;&lt;h3 class=&#034;h3&#034; id='Poivre-sel-hash-du-mot-de-passe'&gt; Poivre, sel, hash du mot de passe &lt;a class='sommaire-back sommaire-back-25' href='#s-Poivre-sel-hash-du-mot-de-passe' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Le mot de passe d'un auteur est maintenant hach&#233; dans SPIP en utilisant un poivre (une cl&#233; sp&#233;cifique pour le site). Par ailleurs, la fonction &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;password_hash&lt;/code&gt; de PHP s'occupe de trouver le meilleur algorithme de hachage et de cr&#233;er un sel dedans. La fonction &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;password_verify&lt;/code&gt; de PHP est utilis&#233;e pour le v&#233;rifier.&lt;/p&gt;
&lt;p&gt;Les &#034;al&#233;as&#034; rotatifs des auteurs sont toujours cr&#233;&#233;s, mais ne sont plus utilis&#233;s pour saler le mot de passe vu que PHP g&#232;re cela tr&#232;s bien. Par contre, l'application suppl&#233;mentaire d'un poivre est une nouveaut&#233;.&lt;/p&gt;
&lt;p&gt;Comme avant, &#224; chaque authentification r&#233;ussie d'un auteur, on enregistre un nouveau hash en base, en recr&#233;ant un hash avec &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;password_hash&lt;/code&gt; : cela applique un nouveau sel dessus donc, et &#233;ventuellement PHP en profite pour utiliser un algorithme de hachage plus performant si besoin.&lt;/p&gt;
&lt;/section&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau2 sommaire-section_h3&#034; aria-labelledby=&#034;Cles-de-chiffrement&#034;&gt;&lt;h3 class=&#034;h3&#034; id='Cles-de-chiffrement'&gt; Cl&#233;s de chiffrement &lt;a class='sommaire-back sommaire-back-25' href='#s-Cles-de-chiffrement' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Pour mener &#224; bien ce poivre, et d'autres actions dans SPIP, des cl&#233;s de chiffrement sont utilis&#233;es et stock&#233;es dans &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;config/cles.php&lt;/code&gt;. Il y en a 2 par d&#233;faut :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; secret_des_auth : elle sert &#224; poivrer le mot de passe des auteurs. C'est une nouvelle cl&#233; donc.&lt;/li&gt;&lt;li&gt; secret_du_site : elle sert pour moiti&#233; &#224; calculer le secret du site. L'autre moiti&#233; &#233;tant stock&#233; en base dans l'entr&#233;e &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;secret_du_site&lt;/code&gt; de la table &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;spip_meta&lt;/code&gt;. Ce secret du site (combin&#233;) permet de signer et/ou chiffrer certaines parties de SPIP (contextes ajax, actions d'auteurs).&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Lorsqu'un webmestre se connecte, les cl&#233;s sont sauvegard&#233;es dans le nouveau champ &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;backup_cles&lt;/code&gt; de la table &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;spip_auteurs&lt;/code&gt;, en le chiffrant avec le mot de passe en clair de l'auteur.&lt;/p&gt;
&lt;p&gt;Ceci permet de restaurer les cl&#233;s du site si le fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;cles.php&lt;/code&gt; a &#233;t&#233; effac&#233;, lors de l'authentification d'un webmestre.&lt;/p&gt;
&lt;p&gt;La classe &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;\Spip\Chiffrer\SpipCles&lt;/code&gt; permet de manipuler les cl&#233;s au besoin.&lt;/p&gt;
&lt;/section&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau2 sommaire-section_h3&#034; aria-labelledby=&#034;Password&#034;&gt;&lt;h3 class=&#034;h3&#034; id='Password'&gt; Password &lt;a class='sommaire-back sommaire-back-25' href='#s-Password' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;SPIP fournit deux m&#233;thodes qui sont utilis&#233;es dans &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;ecrire/auth/spip.php&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;- &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;\Spip\Chiffrer\Password::verifier($clair, $hash, $key = null): bool&lt;/code&gt; &lt;br /&gt;- &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;\Spip\Chiffrer\Password::hacher($clair, $key = null): string&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;La cl&#233; par d&#233;faut est celle de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;secret_des_auth&lt;/code&gt;, utilis&#233;e pour poivrer.&lt;/p&gt;
&lt;/section&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau2 sommaire-section_h3&#034; aria-labelledby=&#034;Chiffrement&#034;&gt;&lt;h3 class=&#034;h3&#034; id='Chiffrement'&gt; Chiffrement &lt;a class='sommaire-back sommaire-back-25' href='#s-Chiffrement' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Trois m&#233;thodes sont aussi fournies pour chiffrer et d&#233;chiffrer (chiffrage sym&#233;trique) des contenus.&lt;br class='autobr' /&gt;
Dedans nous utilisons la librairie Sodium (fournie par d&#233;faut dans PHP &gt;= 7.2).&lt;/p&gt;
&lt;p&gt;- &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;Chiffrement::chiffrer($message, $key): ?string&lt;/code&gt; &lt;br /&gt;- &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;Chiffrement::dechiffrer($encoded, $key): ?string&lt;/code&gt;
&lt;br /&gt;- &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;Chiffrement::keygen(): string&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;La m&#233;thode &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;keygen&lt;/code&gt; produit simplement une cl&#233; de chiffrement &#224; la longueur adapt&#233;e.&lt;/p&gt;
&lt;p&gt;Les m&#233;thodes &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;chiffrer()&lt;/code&gt; et &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;dechiffrer()&lt;/code&gt; seront tr&#232;s lentes si la cl&#233; transmise n'a pas la bonne longueur : on consid&#232;re alors la cl&#233; de chiffrement comme &#233;tant un mot de passe n&#233;cessitant un traitement suppl&#233;mentaire lourd (avec &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;sodium_crypto_pwhash&lt;/code&gt;).&lt;/p&gt;
&lt;/section&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau2 sommaire-section_h3&#034; aria-labelledby=&#034;Signature-des-actions&#034;&gt;&lt;h3 class=&#034;h3&#034; id='Signature-des-actions'&gt; Signature des actions &lt;a class='sommaire-back sommaire-back-25' href='#s-Signature-des-actions' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Les actions sont authentifi&#233;es maintenant en utilisant &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;hash_hmac&lt;/code&gt; et &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;hash_equals&lt;/code&gt; (et les al&#233;as d'auteurs et/ou le secret du site)&lt;/p&gt;
&lt;/section&gt;&lt;/section&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau1 sommaire-section_h2&#034; aria-labelledby=&#034;Qualite-du-code&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Qualite-du-code'&gt; Qualit&#233; du code &lt;a class='sommaire-back sommaire-back-25' href='#s-Qualite-du-code' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Il y a de quoi progresser sur la qualit&#233; du code PHP de SPIP&#8230; l'avenir ne peut &#234;tre que meilleur ;-)&lt;/p&gt;
&lt;section class=&#034;sommaire-section sommaire-section_niveau2 sommaire-section_h3&#034; aria-labelledby=&#034;Typage&#034;&gt;&lt;h3 class=&#034;h3&#034; id='Typage'&gt; Typage &lt;a class='sommaire-back sommaire-back-25' href='#s-Typage' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Ce faisant pour PHP 8.1, nous avons commenc&#233; &#224; typer certains arguments et retours de fonctions pour d&#233;tecter au plus t&#244;t certains appels incorrects.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;C'est un changement potentiellement impactant&lt;/strong&gt; : cela peut cr&#233;er des erreurs de squelettes l&#224; o&#249; l'erreur &#233;tait auparavant plus silencieuse ou tol&#233;r&#233;e. De m&#234;me cela pourrait provoquer des erreurs PHP dans des plugins ou des scripts maison sur les appels erron&#233;s &#224; ces fonctions.&lt;/p&gt;
&lt;p&gt;En assurant la compatibilit&#233; avec les nouvelles versions de PHP nous irons forc&#233;ment vers plus de typage dans le code de SPIP au fur et &#224; mesure des &#233;volutions et factorisations du code source.&lt;/p&gt;
&lt;p&gt;La cons&#233;quence sera donc que les personnes d&#233;veloppant des plugins ou des squelettes devront &#234;tre plus vigilantes sur les appels effectu&#233;s d'une part, et d'autre part que nous restreindrons certainement les nouvelles fonctions &#224; des types uniques (&#233;viter les &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;mixed&lt;/code&gt;), de m&#234;me que certaines fonctions d&#233;j&#224; existantes verront probablement certains types d'arguments mixtes r&#233;duits (&#233;viter qu'un argument puisse recevoir un peu tout comme &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;int | string | array&lt;/code&gt; par exemple), de m&#234;me pour les retours de fonctions.&lt;/p&gt;
&lt;p&gt;Au vu du code de SPIP historique ce ne sera pas si &#233;vident.&lt;/p&gt;
&lt;/section&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau2 sommaire-section_h3&#034; aria-labelledby=&#034;Sucre-syntaxique&#034;&gt;&lt;h3 class=&#034;h3&#034; id='Sucre-syntaxique'&gt; Sucre syntaxique &lt;a class='sommaire-back sommaire-back-25' href='#s-Sucre-syntaxique' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Nous avons pass&#233; l'outil &lt;a href=&#034;https://github.com/rectorphp/rector&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Rector&lt;/a&gt; sur le code de SPIP 4.1 avec la configuration PHP 7.4. L'outil permet de transformer la syntaxe du code source PHP en modifiant certains &#233;l&#233;ments qui peuvent &#234;tre simplifi&#233;s gr&#226;ce &#224; des &#233;critures plus r&#233;centes de PHP. Par exemple utiliser les op&#233;rateurs &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;??&lt;/code&gt; ou &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;??=&lt;/code&gt; lorsque c'est possible (&lt;a href=&#034;https://www.php.net/manual/fr/migration70.new-features.php#migration70.new-features.null-coalesce-op&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Voir la doc PHP&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;C'est toujours &#231;a de pris :-)&lt;/p&gt;
&lt;p&gt;&lt;a id=&#034;urls_etendues&#034;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;&lt;/section&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau1 sommaire-section_h2&#034; aria-labelledby=&#034;Changements-d-API-sur-les-URLs-et-objets&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Changements-d-API-sur-les-URLs-et-objets'&gt; Changements d'API sur les URLs et objets &lt;a class='sommaire-back sommaire-back-25' href='#s-Changements-d-API-sur-les-URLs-et-objets' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Certaines fonctions d'appels pour calculer ou d&#233;coder les URLs sont modifi&#233;es. &lt;br class='autobr' /&gt;
Les anciennes API sont d&#233;pr&#233;ci&#233;es.&lt;/p&gt;
&lt;p&gt;Il y a maintenant 2 jeux de fonctions distincts pour g&#233;n&#233;rer l'URL d'un objet et pour d&#233;coder une URL. Ce nouveau m&#233;canisme permet de d&#233;finir une fonction pour g&#233;n&#233;rer une URL propre pour les &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#URL_PAGE&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Les nouvelles fonctions sont typ&#233;es. Dans les explications suivantes, on ne pr&#233;sente que le d&#233;but des signatures des diff&#233;rentes fonctions modifi&#233;es.&lt;/p&gt;
&lt;p&gt;Voir &lt;a href=&#034;https://git.spip.net/spip/spip/-/merge_requests/5000&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;la demande d'ajout correspondante&lt;/a&gt; pour le d&#233;tail complet.&lt;/p&gt;
&lt;section class=&#034;sommaire-section sommaire-section_niveau2 sommaire-section_h3&#034; aria-labelledby=&#034;Encodage&#034;&gt;&lt;h3 class=&#034;h3&#034; id='Encodage'&gt; Encodage &lt;a class='sommaire-back sommaire-back-25' href='#s-Encodage' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;generer_objet_url&lt;/strong&gt; (anciennement &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;generer_url_entite&lt;/code&gt;)&lt;/p&gt;
&lt;p&gt;Cette fonction g&#233;n&#232;re une URL, qui peut &#234;tre soit pour l'espace public (param&#232;tre &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$public = true&lt;/code&gt;), soit pour l'espace priv&#233; (&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$public = false&lt;/code&gt;), soit par d&#233;faut (&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$public = null&lt;/code&gt;) retourner une URL pour l'espace dans lequel on se trouve actuellement &#8230;&lt;/p&gt;
&lt;p&gt;La fonction &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;generer_objet_url()&lt;/code&gt; est la fonction de haut niveau, qui va finir par appeler une fonction &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;urls_xxx_generer_url_objet()&lt;/code&gt;_dist selon le module d'URL actif.&lt;/p&gt;
&lt;p&gt;&lt;i&gt;Note :&lt;/i&gt; Pour cette fonction la signature change l&#233;g&#232;rement.&lt;/p&gt;
&lt;p&gt;Dans &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;generer_url_entite()&lt;/code&gt; maintenant d&#233;pr&#233;ci&#233; :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Le 5&lt;sup&gt;e&lt;/sup&gt; param&#232;tre &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$public&lt;/code&gt; pouvait valoir &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;true, false, null ou 'string'&lt;/code&gt;. Dans le cas d'une chaine, il correspondait &#224; un param&#232;tre &#034;connect&#034;.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Ce sont maintenant 2 param&#232;tres s&#233;par&#233;s pour &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;generer_objet_url&lt;/code&gt; :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Le 5&lt;sup&gt;e&lt;/sup&gt; est &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;?bool $public = null&lt;/code&gt; (donc &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;true, false ou null)&lt;/code&gt;,&lt;/li&gt;&lt;li&gt; le 6&lt;sup&gt;e&lt;/sup&gt; est &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;string $connect = ''&lt;/code&gt;.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Dans la majorit&#233; des cas, cela n'affectera pas les usages et renommer simplement la fonction devrait &#234;tre suffisant.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;diff&#034; class='spip_code spip_code_block language-diff' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;- generer_url_entite($id, $objet, ...) + generer_objet_url($id, string $objet, ...) &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;generer_objet_url_absolue&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;G&#233;n&#232;re l'URL absolue vers un objet&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;diff&#034; class='spip_code spip_code_block language-diff' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;- generer_url_entite_absolue($id, $entite, ...) + generer_objet_url_absolue($id = 0, string $entite = '', ...) &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/section&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau2 sommaire-section_h3&#034; aria-labelledby=&#034;Decodage&#034;&gt;&lt;h3 class=&#034;h3&#034; id='Decodage'&gt; D&#233;codage &lt;a class='sommaire-back sommaire-back-25' href='#s-Decodage' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;La fonction de d&#233;codage des URLs s'appelle maintenant &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;urls_xxxx_decoder_url_dist()&lt;/code&gt; ce qui &#233;vite toute confusion avec l'ancienne fonction &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;urls_xxxx_dist()&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;De plus, pour un module d'URLs qui voudrait &#234;tre compatible avec les anciennes versions de SPIP et cette nouvelle convention, il suffit de proposer une fonction &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;urls_xxxx_dist()&lt;/code&gt; non typ&#233;e qui fait le routage vers les 2 fonctions &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;urls_xxx_generer_url_objet_dist()&lt;/code&gt; et &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;decoder_url()&lt;/code&gt; du module.&lt;/p&gt;
&lt;/section&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau2 sommaire-section_h3&#034; aria-labelledby=&#034;Objet&#034;&gt;&lt;h3 class=&#034;h3&#034; id='Objet'&gt; Objet &lt;a class='sommaire-back sommaire-back-25' href='#s-Objet' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;generer_objet_lien&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;G&#233;n&#232;re un lien (titre cliquable vers url) vers un objet&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;diff&#034; class='spip_code spip_code_block language-diff' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;- generer_lien_entite($id_objet, $objet, ...) + generer_objet_lien(int $id_objet, string $objet, ...) &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;generer_objet_info&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Donner une information sur un objet &#233;ditorial. Utilis&#233; entre autres par &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#INFO_XX&lt;/code&gt;&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;diff&#034; class='spip_code spip_code_block language-diff' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;- generer_info_entite($id_objet, $type_objet, $info, ...) + generer_objet_info($id_objet, string $type_objet, string $info, ...) &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Les fonctions permettant de d&#233;finir des calculs sp&#233;cifiques pour l'obtention d'information sont aussi renomm&#233;es. Pour l'information calcul&#233;e 'xxx' : appel&#233; via &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;generer_objet_info(3, 'article', 'xxx')&lt;/code&gt; ou &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#INFO_XXX{article,3}&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Si ces fonctions existent, elles sont utilis&#233;es par SPIP dans ce cas :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;diff&#034; class='spip_code spip_code_block language-diff' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;// xxx sp&#233;cifiquement sur l'objet 'type' - generer_xxx_{type}($id_objet, $type_objet, ...) + generer_{type}_xxx($id_objet, string $type_objet, ...) // sinon xxx sur un objet quelconque - generer_xxx_entite($id_objet, $type_objet, $row, ...) + generer_objet_xxx($id_objet, string $type_objet, array $row, ...) &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;L'ancien nommage est d&#233;pr&#233;ci&#233;.&lt;/p&gt;
&lt;p&gt;Suivant ce principe, la fonction interne &#224; SPIP pour calculer l'introduction a &#233;t&#233; renomm&#233;e :&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;generer_objet_introduction&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;G&#233;n&#232;re l'introduction de l'objet (fonction priv&#233;e &#224; SPIP), utilis&#233; par &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#INTRODUCTION&lt;/code&gt; et &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#INFO_INTRODUCTION&lt;/code&gt;)&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;diff&#034; class='spip_code spip_code_block language-diff' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;- generer_introduction_entite($id_objet, $objet, $ligne_sql, ...) + generer_objet_introduction(int $id_objet, string $objet, array $ligne_sql, ...) &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau1 sommaire-section_h2&#034; aria-labelledby=&#034;Reecriture-de-en-api&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Reecriture-de-en-api'&gt; R&#233;&#233;criture de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;transmettre&lt;/code&gt; en .api &lt;a class='sommaire-back sommaire-back-25' href='#s-Reecriture-de-en-api' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Pour faciliter et s&#233;curiser partiellement l'envoi de donn&#233;es sp&#233;cifiques (CSV, JSON) &#224; des auteurs connus de SPIP, l'URL d'api transmettre.api a &#233;t&#233; mis en place (elle remplace un ancien m&#233;canisme &#224; l'objectif identique qui utilisait un squelette &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;transmettre.html&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;L'URL est g&#233;n&#233;r&#233;e avec la fonction &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;generer_url_api_low_sec()&lt;/code&gt; (&#171; low sec &#187; signifiant ici &#171; s&#233;curit&#233; basse &#187;). Un jeton fixe est cr&#233;&#233; pour cette action (avec ses param&#232;tres) pour l'auteur d&#233;sign&#233; et sera accept&#233;e m&#234;me si l'auteur est d&#233;connect&#233; (ce qui veut dire que quiconque poss&#232;de l'URL pourra acc&#233;der au contenu renvoy&#233;).&lt;/p&gt;
&lt;p&gt;Historiquement cela permet de g&#233;n&#233;rer des fichiers non publics (RSS des articles propos&#233;s &#224; publication, statistiques du site) qui peuvent &#234;tre exploit&#233;s par des outils tierces (agr&#233;gateur RSS par exemple).&lt;/p&gt;
&lt;p&gt;&#201;galement :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; la fonction &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;securiser_acces()&lt;/code&gt; est renommee en &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;securiser_acces_low_sec()&lt;/code&gt; et definie dans inc/acces.&lt;/li&gt;&lt;li&gt; On garde un &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;filtre_securiser_acces_dist()&lt;/code&gt; dans inc/filtres pour la compat des vieux squelettes&lt;/li&gt;&lt;li&gt; la fonction &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;param_low_sec()&lt;/code&gt; est depreciee&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;Mises-a-jour-des-librairies&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Mises-a-jour-des-librairies'&gt; Mises &#224; jour des librairies &lt;a class='sommaire-back sommaire-back-25' href='#s-Mises-a-jour-des-librairies' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Nous avons mis &#224; jour diff&#233;rentes librairies utilis&#233;es par SPIP.&lt;/p&gt;
&lt;section class=&#034;sommaire-section sommaire-section_niveau2 sommaire-section_h3&#034; aria-labelledby=&#034;Javascript&#034;&gt;&lt;h3 class=&#034;h3&#034; id='Javascript'&gt; Javascript &lt;a class='sommaire-back sommaire-back-25' href='#s-Javascript' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; spip/spip -&gt; Sortable 1.14.0&lt;/li&gt;&lt;li&gt; spip/spip -&gt; jquery Form 4.3.0&lt;/li&gt;&lt;li&gt; spip/spip -&gt; JS Cookie 3.0.1&lt;/li&gt;&lt;li&gt; spip/statistiques -&gt; d3 7.3.0&lt;/li&gt;&lt;li&gt; spip/statistiques -&gt; luxon 2.3.0&lt;/li&gt;&lt;li&gt; spip/plan -&gt; jstree 3.3.12&lt;/li&gt;&lt;/ul&gt;&lt;/section&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau2 sommaire-section_h3&#034; aria-labelledby=&#034;PHP&#034;&gt;&lt;h3 class=&#034;h3&#034; id='PHP'&gt; PHP&lt;a class='sommaire-back sommaire-back-25' href='#s-PHP' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; spip/compresseur -&gt; css-tidy 2.0.0&lt;/li&gt;&lt;li&gt; spip/medias -&gt; getid3 1.9.21&lt;/li&gt;&lt;li&gt; spip/medias -&gt; svg-sanitizer 0.14.1&lt;/li&gt;&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau1 sommaire-section_h2&#034; aria-labelledby=&#034;Suppression-de-librairies&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Suppression-de-librairies'&gt; Suppression de librairies &lt;a class='sommaire-back sommaire-back-25' href='#s-Suppression-de-librairies' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Nous avons supprim&#233; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;jQuery.cookie&lt;/code&gt; qui &#233;tait d&#233;pr&#233;ci&#233; depuis SPIP 3.2 au profit de JS Cookie.&lt;/p&gt;
&lt;p&gt;Pour rappel si vous n'aviez pas encore adapt&#233;s vos utilisations :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;js&#034; class='spip_code spip_code_block language-js' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;$.cookie(key) devient Cookies.get(key) $.cookie(key, value) devient Cookies.set(key, value) $.cookie(key, value, options) devient Cookies.set(key, value, options) &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;Interface&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Interface'&gt; Interface &lt;a class='sommaire-back sommaire-back-25' href='#s-Interface' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Les rubriques dans l'espace priv&#233; affichent maintenant aussi la liste des articles refus&#233;s.&lt;/p&gt;
&lt;/section&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau1 sommaire-section_h2&#034; aria-labelledby=&#034;Nettoyages&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Nettoyages'&gt; Nettoyages &lt;a class='sommaire-back sommaire-back-25' href='#s-Nettoyages' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Nous avons supprim&#233;&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_CONFIGURER_METAS &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;qui &#233;tait d&#233;pr&#233;ci&#233; depuis SPIP 3.0 au profit des formulaires&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_CONFIGURER_XX &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;. Voir la documentation &lt;a href='https://www.spip.net/fr_article5414.html' class=&#034;spip_in&#034;&gt;Configurer une fonctionnalit&#233; de votre site, ou un plugin&lt;/a&gt; &#224; ce sujet.&lt;/p&gt;
&lt;/section&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau1 sommaire-section_h2&#034; aria-labelledby=&#034;Quelques-adaptations&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Quelques-adaptations'&gt; Quelques adaptations &lt;a class='sommaire-back sommaire-back-25' href='#s-Quelques-adaptations' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Dans un squelette, pour avoir la liste des tables des objets &#233;ditoriaux, pr&#233;f&#233;rer &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#NULL&lt;/code&gt; (qui retourne &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;null&lt;/code&gt;) plut&#244;t que &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#REM&lt;/code&gt; (qui retourne une cha&#238;ne vide).&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;diff&#034; class='spip_code spip_code_block language-diff' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;- [(#REM|lister_tables_objets_sql)] + [(#NULL|lister_tables_objets_sql)] &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;Plugins&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Plugins'&gt; Plugins &lt;a class='sommaire-back sommaire-back-25' href='#s-Plugins' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Archiviste&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Le plugin &#034;Archiviste&#034; a &#233;t&#233; mis &#224; jour pour utiliser les extensions PHP Zip, zlib et Phar, qui sont d&#233;sormais requises. Ceci nous a permis de supprimer les (tr&#232;s) vielles librairies Pcl* que nous tra&#238;nions depuis quelques ann&#233;es.&lt;/p&gt;
&lt;p&gt;&#192; noter aussi que le plugin est accompagn&#233; de tests unitaires &#233;crits avec &lt;a href=&#034;https://docs.phpunit.de/fr/latest/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;PHPUnit&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bigup&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Le formulaire de configuration de Bigup est affich&#233; sur la page des options avanc&#233;es, avec une formulation un peu plus parlante pour le titre du formulaire d'explication.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Compresseur&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Mise &#224; jour de la librairie CSSTidy en version 2.0 et correction d'un bug dans la compression des fichiers Javascript sur certains environnements.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Forum&lt;/strong&gt;&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; correction d'un bug qui affichait le lien vers la page de contr&#244;le des forums pour les auteurs non autoris&#233;s.&lt;/li&gt;&lt;li&gt; normalisation de l'ajout d'un forum en base afin de bien faire passer les informations par les pipeline pre/post insertion&lt;/li&gt;&lt;li&gt; correction d'un bug d'affichage d'ic&#244;ne en langue RTL&lt;/li&gt;&lt;li&gt; correction d'un bug qui permettait d'acc&#233;der au forum priv&#233; des r&#233;dacteurs alors que celui-ci &#233;tait d&#233;sactiv&#233; dans la configuration&lt;/li&gt;&lt;li&gt; correction d'un bug dans la recherche de message depuis la page de contr&#244;le des forums&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Mediabox&lt;/strong&gt;&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; am&#233;lioration de l'affichage des textes longs dans la l&#233;gende des modales, avec l'attribut &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;data-box-caption-state&lt;/code&gt; valant &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;min&lt;/code&gt; ou &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;expanded&lt;/code&gt; sur les liens mediabox.&lt;/li&gt;&lt;li&gt; utilisation d'un th&#232;me sombre par d&#233;faut dans l'espace priv&#233;&lt;/li&gt;&lt;li&gt; r&#233;tablissement du support des URLs avec fragments &#224; l'aide d'un s&#233;lecteur dans l'attribut &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;data-href-popin&lt;/code&gt;&lt;/li&gt;&lt;li&gt; ajout du support des attributs &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;data-box-(max|min)-(width|height)&lt;/code&gt; et &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;data-box-(width|height)&lt;/code&gt; sur les liens mediabox et r&#233;tablissement de la compatibilit&#233; avec les anciennes classes du type &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;boxInline boxIframe boxWidth-xx boxHeight-xx&lt;/code&gt; (documentation : &lt;a href=&#034;https://contrib.spip.net/MediaBox&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://contrib.spip.net/MediaBox&lt;/a&gt;)&lt;/li&gt;&lt;li&gt; correction d'un bug avec certaines images distantes qui n'&#233;taient pas affich&#233;es par la modale (notamment des SVG), car l'image n'a pas de dimension connue&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Medias&lt;/strong&gt;&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; permettre de personnaliser le comportement en autolien des images en fonction du media, de l'extension, de la taille ou de l'id_document&lt;/li&gt;&lt;li&gt; correction d'un bug dans le mod&#232;le d'embed des fichiers CSV&lt;/li&gt;&lt;li&gt; retrait de la librairie obsol&#232;te jQuery multifile&lt;/li&gt;&lt;li&gt; mise &#224; jour des librairies SVG Sanitizer et getid3&lt;/li&gt;&lt;li&gt; retrait des pr&#233;fixes navigateurs dans les CSS du plugin&lt;/li&gt;&lt;li&gt; am&#233;lioration UX des boutons dans le bloc des documents d'un objet&lt;/li&gt;&lt;li&gt; correction d'un bug dans le code g&#233;n&#233;r&#233; pour les attributs d'une image avec l&#233;gende&lt;/li&gt;&lt;li&gt; am&#233;lioration du mod&#232;le utilis&#233; pour l'insertion des images SVG dans le texte d'un objet&lt;/li&gt;&lt;li&gt; correction d'un bug d'affichage de la m&#233;diath&#232;que quand un document comporte une tr&#232;s longue URL dans les champs titre ou credit&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Plan&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Mise &#224; jour de la librairie Jstree en version 3.3.12.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;R&#233;visions&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Correction d'un bug qui emp&#234;chait le fonctionnement du g&#233;nie d'optimisation des r&#233;visions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sites&lt;/strong&gt;&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; correction d'un bug qui affichait la date en double dans les listes d'articles syndiqu&#233;s&lt;/li&gt;&lt;li&gt; am&#233;lioration des formulaires d'&#233;dition de site en utilisant un placeholder dans les champs d'URL (au lieu de les pr&#233;-remplir avec http://)&lt;/li&gt;&lt;li&gt; correction d'un bug d'affichage de la liste des sites en colonne lat&#233;rale de l'espace priv&#233;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Statistiques&lt;/strong&gt;&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; mise &#224; jour des librairies D3.js, d3-time-format et Luxon.js&lt;/li&gt;&lt;li&gt; correction d'un bug d'affichage des noms des mois dans les statistiques en langue arabe&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;SVP&lt;/strong&gt;&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; correction d'un bug dans le d&#233;ballage des archives de plugin avec les nouvelles fonctions du plugin Archiviste&lt;/li&gt;&lt;li&gt; am&#233;lioration de pr&#233;sentation des cases &#224; cocher dans la liste des plugins&lt;/li&gt;&lt;li&gt; correction d'un bug de s&#233;lection des plugins quand la personne faisait &#034;tout cocher&#034; puis &#034;cocher les mises &#224; jour&#034;&lt;/li&gt;&lt;li&gt; correction d'un bug dans l'affichage des messages de retour du formulaire de chargement de plugin&lt;/li&gt;&lt;li&gt; toujours afficher le lien vers la documentation du plugin qu'il soit actif ou non&lt;/li&gt;&lt;li&gt; correction d'un bug qui emp&#234;chait d'activer un plugin quand les t&#233;l&#233;chargements sont interdits&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;TextWheel&lt;/strong&gt;&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; correction d'un bug qui &#233;chappait par erreur certains liens automatiques&lt;/li&gt;&lt;li&gt; correction d'un bug de direction d'affichage des puces quand la page contient des bloc de textes de directions diff&#233;rentes&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;URLs &#233;tendues&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Pour faire suite aux &lt;a href=&#034;#urls_etendues&#034; class=&#034;spip_ancre&#034;&gt;changements d'API sur les URLs et objets&lt;/a&gt;, les fonctions d'URLs ont &#233;t&#233; reprises pour une &#233;criture plus claire et mieux typ&#233;e avec 2 points d'entr&#233;e pour la partie d&#233;codage/encodage.&lt;/p&gt;
&lt;p&gt;Voir &lt;a href=&#034;https://git.spip.net/spip/urls/-/merge_requests/4811&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;la demande d'ajout correspondante&lt;/a&gt; pour le d&#233;tail complet.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Squelettes dist&lt;/strong&gt;&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; correction d'un bug qui provoquait le d&#233;bordement des paginations sur petit &#233;cran&lt;/li&gt;&lt;li&gt; application du filtre &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;|header_silencieux&lt;/code&gt; sur les pages publiques afin de respecter la valeur de la globale &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;spip_header_silencieux&lt;/code&gt;&lt;/li&gt;&lt;li&gt; retrait des classes sp&#233;cifiques &#224; Internet Explorer dans les CSS&lt;/li&gt;&lt;li&gt; correction d'un bug d'affichage des images et SVG sur petit &#233;cran&lt;/li&gt;&lt;/ul&gt;&lt;/section&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>SPIP 4.0</title>
		<link>https://www.spip.net/fr_article6428.html</link>
		<guid isPermaLink="true">https://www.spip.net/fr_article6428.html</guid>
		<dc:date>2021-07-09T05:58:08Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>erational, Matthieu Marcillaud, tcharlss</dc:creator>


		<dc:subject>#PAGINATION</dc:subject>

		<description>&lt;p&gt;Changements apport&#233;s par SPIP 4.0&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/@pagination" rel="tag"&gt;#PAGINATION&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;!--sommaire--&gt;&lt;div class=&#034;well nav-sommaire nav-sommaire-10&#034; id=&#034;nav69e3a65ecdd310.61761006&#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-Interface&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Interface&#034; class=&#034;spip_ancre&#034;&gt;Interface&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Compatibilite-PHP&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Compatibilite-PHP&#034; class=&#034;spip_ancre&#034;&gt;Compatibilit&#233; PHP&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Base-de-donnees&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Base-de-donnees&#034; class=&#034;spip_ancre&#034;&gt;Base de donn&#233;es&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Syntaxe-des-squelettes-etendue&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Syntaxe-des-squelettes-etendue&#034; class=&#034;spip_ancre&#034;&gt;Syntaxe des squelettes &#233;tendue&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Changements-et-apports-pour-les-squelettes&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Changements-et-apports-pour-les-squelettes&#034; class=&#034;spip_ancre&#034;&gt;Changements et apports pour les squelettes&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Autres-apports&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Autres-apports&#034; class=&#034;spip_ancre&#034;&gt;Autres apports&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Corrections&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Corrections&#034; class=&#034;spip_ancre&#034;&gt;Corrections&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Nettoyages&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Nettoyages&#034; class=&#034;spip_ancre&#034;&gt;Nettoyages&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Depreciations&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Depreciations&#034; class=&#034;spip_ancre&#034;&gt;D&#233;pr&#233;ciations&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Plugins&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Plugins&#034; class=&#034;spip_ancre&#034;&gt;Plugins&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;Interface&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Interface'&gt; Interface &lt;a class='sommaire-back sommaire-back-10' href='#s-Interface' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Espace priv&#233; relook&#233;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Un gros travail d'ergonomie a &#233;t&#233; initi&#233; pour rendre &#224; terme l'espace priv&#233; adaptatif sur toutes les tailles d'&#233;crans afin d'en faciliter l'usage.&lt;/p&gt;
&lt;p&gt;L'espace priv&#233; s'adapte mieux &#224; la largeur de l'&#233;cran, et commence &#224; utiliser diff&#233;rentes variables CSS pour faciliter sa maintenance.&lt;/p&gt;
&lt;div class='spip_document_3884 spip_document spip_documents spip_document_image spip_documents_center spip_document_center spip_document_avec_legende' data-legende-len=&#034;92&#034; data-legende-lenx=&#034;xx&#034;
&gt;
&lt;figure class=&#034;spip_doc_inner&#034;&gt; &lt;a href='https://www.spip.net/IMG/png/espace_prive_spip_40.png' class=&#034;spip_doc_lien mediabox&#034; type=&#034;image/png&#034;&gt; &lt;img src='https://www.spip.net/local/cache-vignettes/L500xH268/espace_prive_spip_40-279b8.png?1625835035' width='500' height='268' alt='' /&gt;&lt;/a&gt;
&lt;figcaption class='spip_doc_legende'&gt; &lt;div class='spip_doc_titre crayon document-titre-3884 '&gt;&lt;strong&gt;Aper&#231;u de l'espace priv&#233; de SPIP 4.0
&lt;/strong&gt;&lt;/div&gt; &lt;div class='spip_doc_descriptif crayon document-descriptif-3884 '&gt;L'espace priv&#233; de SPIP 4.0 dans le site SPIP Contrib.
&lt;/div&gt; &lt;/figcaption&gt;&lt;/figure&gt;
&lt;/div&gt;&lt;div class='spip_document_3888 spip_document spip_documents spip_document_image spip_documents_center spip_document_center spip_document_avec_legende' data-legende-len=&#034;42&#034; data-legende-lenx=&#034;x&#034;
&gt;
&lt;figure class=&#034;spip_doc_inner&#034;&gt; &lt;a href='https://www.spip.net/IMG/png/article_vue.png' class=&#034;spip_doc_lien mediabox&#034; type=&#034;image/png&#034;&gt; &lt;img src='https://www.spip.net/local/cache-vignettes/L500xH278/article_vue-7f8b2.png?1625837313' width='500' height='278' alt='' /&gt;&lt;/a&gt;
&lt;figcaption class='spip_doc_legende'&gt; &lt;div class='spip_doc_titre crayon document-titre-3888 '&gt;&lt;strong&gt;Vue d'un article (avec la couleur grise)
&lt;/strong&gt;&lt;/div&gt; &lt;/figcaption&gt;&lt;/figure&gt;
&lt;/div&gt;&lt;div class='spip_document_3887 spip_document spip_documents spip_document_image spip_documents_center spip_document_center spip_document_avec_legende' data-legende-len=&#034;46&#034; data-legende-lenx=&#034;x&#034;
&gt;
&lt;figure class=&#034;spip_doc_inner&#034;&gt; &lt;a href='https://www.spip.net/IMG/png/article_edit.png' class=&#034;spip_doc_lien mediabox&#034; type=&#034;image/png&#034;&gt; &lt;img src='https://www.spip.net/local/cache-vignettes/L500xH278/article_edit-31d63.png?1625837313' width='500' height='278' alt='' /&gt;&lt;/a&gt;
&lt;figcaption class='spip_doc_legende'&gt; &lt;div class='spip_doc_titre crayon document-titre-3887 '&gt;&lt;strong&gt;&#201;dition d'un article (avec la couleur grise)
&lt;/strong&gt;&lt;/div&gt; &lt;/figcaption&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Un &#233;cran de connexion (login) &#233;l&#233;gant&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;La page de connexion par d&#233;faut (login.html) est toute re-styl&#233;e, teint&#233;e du rose SPIP en fond.&lt;/p&gt;
&lt;div class='spip_document_3885 spip_document spip_documents spip_document_image spip_documents_center spip_document_center spip_document_avec_legende' data-legende-len=&#034;85&#034; data-legende-lenx=&#034;xx&#034;
&gt;
&lt;figure class=&#034;spip_doc_inner&#034;&gt; &lt;a href='https://www.spip.net/IMG/png/login_spip_40.png' class=&#034;spip_doc_lien mediabox&#034; type=&#034;image/png&#034;&gt; &lt;img src='https://www.spip.net/local/cache-vignettes/L500xH309/login_spip_40-f788e.png?1625835483' width='500' height='309' alt='' /&gt;&lt;/a&gt;
&lt;figcaption class='spip_doc_legende'&gt; &lt;div class='spip_doc_titre crayon document-titre-3885 '&gt;&lt;strong&gt;&#201;cran de connexion par d&#233;faut &#224; SPIP 4.0
&lt;/strong&gt;&lt;/div&gt; &lt;div class='spip_doc_descriptif crayon document-descriptif-3885 '&gt;L'&#233;cran de connexion sur le site SPIP.net.
&lt;/div&gt; &lt;/figcaption&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;Et si le rose vous surprend, pas de panique ! Un nouveau formulaire dans la configuration de l'identit&#233; du site existe. Il permet de choisir la couleur qu'on veut. Et mieux : il permet m&#234;me de d&#233;poser une magnifique image de fond.&lt;/p&gt;
&lt;div class='spip_document_3886 spip_document spip_documents spip_document_image spip_documents_center spip_document_center spip_document_avec_legende' data-legende-len=&#034;50&#034; data-legende-lenx=&#034;x&#034;
&gt;
&lt;figure class=&#034;spip_doc_inner&#034;&gt; &lt;a href='https://www.spip.net/IMG/png/login_spip_40_avec_image.png' class=&#034;spip_doc_lien mediabox&#034; type=&#034;image/png&#034;&gt; &lt;img src='https://www.spip.net/local/cache-vignettes/L500xH319/login_spip_40_avec_image-fb3b7.png?1625835900' width='500' height='319' alt='' /&gt;&lt;/a&gt;
&lt;figcaption class='spip_doc_legende'&gt; &lt;div class='spip_doc_titre crayon document-titre-3886 '&gt;&lt;strong&gt;&#201;cran de connexion avec une image, dans SPIP 4.0
&lt;/strong&gt;&lt;/div&gt; &lt;/figcaption&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Iconographie en SVG&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Une grande partie des icones et illustrations dans l'espace priv&#233; de SPIP et ses plugins sont pass&#233;s en SVG.&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Tickets &lt;a href=&#034;https://core.spip.net/issues/4468&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;#4468&lt;/a&gt; et &lt;a href=&#034;https://core.spip.net/issues/4562&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;#4562&lt;/a&gt; : Harmonisation dans l'espace priv&#233; du HTML &amp; CSS des boutons&lt;/li&gt;&lt;li&gt; Nouveau jeu d'ic&#244;ne bas&#233; sur le th&#232;me Numix (en SVG) pour les types de document de la m&#233;diath&#232;que&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;a id=&#034;documents&#034;&gt;&lt;/a&gt;&lt;strong&gt;Documents &amp; Logos&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Un gros travail a &#233;t&#233; fait sur les documents et logos :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Les logos des articles et autres objets &#233;ditoriaux sont stock&#233;s comme les documents (dans spip_documents en base de donn&#233;es, et dans IMG/logo/ sur le disque en conservant le nom du fichier). Une phase de migration d&#233;place les logos &#224; leur nouvel emplacement sur le disque.&lt;/li&gt;&lt;li&gt; Les logos, documents images et filtres d'images acceptent et g&#232;rent le format SVG&lt;/li&gt;&lt;li&gt; Le filtre &lt;a href='https://www.spip.net/fr_article4003.html' class=&#034;spip_in&#034;&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;balise_img&lt;/code&gt;&lt;/a&gt; permet de g&#233;rer des fichiers SVG et de d&#233;clarer leur taille&lt;/li&gt;&lt;li&gt; Le nouveau filtre &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;balise_svg&lt;/code&gt; permet d'int&#233;grer le code source d'un fichier d'image SVG dans le code html directement. Peut &#234;tre pratique par exemple pour les petites ic&#244;nes.&lt;/li&gt;&lt;li&gt; Les documents / logos peuvent &#234;tre t&#233;l&#233;vers&#233;s par drag'n'drop, quelles que soient leurs tailles (int&#233;gration du plugin BigUp en plugins-dist, am&#233;lior&#233; pour l'occasion). La taille maximum autoris&#233;e est configurable.&lt;/li&gt;&lt;li&gt; Les mod&#232;les de documents (&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;docXX&gt;, &lt;imgXX&gt;, ...&lt;/code&gt;) sont revus et simplifi&#233;s et utilisent la balise &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;figure&gt;&lt;/code&gt;. &lt;a href=&#034;https://git.spip.net/SPIP/medias/commit/fa13018a9ef63c633e78da253106867d6bac8a78&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Commit fa13018a&lt;/a&gt;. &lt;strong&gt;Attention :&lt;/strong&gt; Les mod&#232;les &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;doc.html&lt;/code&gt;, &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;img.html&lt;/code&gt; et &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;emb.html&lt;/code&gt; ne sont plus utilis&#233;s (et donc toute ancienne surcharge de ces fichiers dans des plugins ou squelettes ne sera plus utilis&#233;e). &#192; la place, on utilise les mod&#232;les &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;image.html&lt;/code&gt;, &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;audio.html&lt;/code&gt;, &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;video.html&lt;/code&gt; et &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;file.html&lt;/code&gt;, correspondant au type de document. Le mode de document n'est plus pris en compte pour le calcul du mod&#232;le. NB : afin de ne pas casser vos anciens sites, &lt;a href=&#034;https://plugins.spip.net/historique_spip32_documents.html&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;un plugin de r&#233;tro-compatibilit&#233; permet de retrouver les anciens mod&#232;les&lt;/a&gt;.&lt;/li&gt;&lt;li&gt; Possibilit&#233; de d&#233;cliner les fichiers HTML des mod&#232;les de document par type de fichier (mime type) d&#233;taill&#233; : &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;file_text_csv.html&lt;/code&gt; ou principal : &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;file_text.html&lt;/code&gt; ; ou par extension : &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;video_mp4.html&lt;/code&gt;. En cons&#233;quence vos variantes personnalis&#233;es doc_[variante].html correspondant au raccourci &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;docN|variante&gt;&lt;/code&gt; ne fonctionneront plus et sont &#224; d&#233;cliner : &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;image_[variante].html&lt;/code&gt;, &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;video_[variante].html&lt;/code&gt;, etc.&lt;/li&gt;&lt;li&gt; L'&#233;criture des raccourcis SPIP des mod&#232;les de documents &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;docXX&gt;&lt;/code&gt;, &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;imgXX&gt;&lt;/code&gt; ou &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;embXX&gt;&lt;/code&gt; devient &#233;quivalente. L'&#233;criture recommand&#233;e est &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;docXX&gt;&lt;/code&gt; (o&#249; XX est le num&#233;ro du document).&lt;/li&gt;&lt;li&gt; La notion de Portfolio et de mode document / image sur les documents dispara&#238;t. &lt;a href=&#034;https://git.spip.net/SPIP/medias/commit/9cf774b9eb06f5dd0c52deaa18c04101aa98598c&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Commit 9cf774b9&lt;/a&gt;. La constante &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;_COMPORTEMENT_HISTORIQUE_PORTFOLIO&lt;/code&gt; d&#233;clar&#233;e &#224; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;true&lt;/code&gt; permet de r&#233;tablir l'ancien fonctionnement.&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;Compatibilite-PHP&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Compatibilite-PHP'&gt; Compatibilit&#233; PHP &lt;a class='sommaire-back sommaire-back-10' href='#s-Compatibilite-PHP' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Limitation de la compatibilit&#233; de SPIP 4.0 avec PHP de 7.3 &#224; 8.0. De nombreuses notices, d&#233;pr&#233;ciations ont &#233;t&#233; aussi corrig&#233;es. &#192; noter que SPIP 3.2 sera donc la derni&#232;re version de SPIP &#224; &#234;tre compatible avec PHP 5.&lt;/p&gt;
&lt;/section&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau1 sommaire-section_h2&#034; aria-labelledby=&#034;Base-de-donnees&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Base-de-donnees'&gt;Base de donn&#233;es&lt;a class='sommaire-back sommaire-back-10' href='#s-Base-de-donnees' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;SPIP 4.0 fonctionne avec Mysql ou Sqlite. Il peut mettre &#224; jour une base issue d'un SPIP &gt;= 2.0.0.&lt;/p&gt;
&lt;p&gt;Pour une mise &#224; jour d'un SPIP ant&#233;rieur, une &#233;tape de migration en SPIP 3.2 sera n&#233;cessaire.&lt;/p&gt;
&lt;/section&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau1 sommaire-section_h2&#034; aria-labelledby=&#034;Syntaxe-des-squelettes-etendue&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Syntaxe-des-squelettes-etendue'&gt; Syntaxe des squelettes &#233;tendue &lt;a class='sommaire-back sommaire-back-10' href='#s-Syntaxe-des-squelettes-etendue' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Ajout du support des boucles anonymes : &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;BOUCLE(ARTICLES)&gt;&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Marre du fichage ? une boucle anonyme n'a pas besoin de pr&#233;ciser son nom ! &lt;br class='autobr' /&gt;
Un identifiant lui sera automatiquement attribu&#233; en interne.&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;[(#REM) Une boucle nomm&#233;e ] &lt;B_mon_nom&gt; &lt;ul&gt; &lt;BOUCLE_mon_nom(ARTICLES){id_article}{0,5}&gt; &lt;li&gt;#TITRE&lt;/li&gt; &lt;/BOUCLE_mon_nom&gt; &lt;/ul&gt; &lt;/B_mon_nom&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/div&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;[(#REM) Une boucle anonyme ] &lt;B&gt; &lt;ul&gt; &lt;BOUCLE(ARTICLES){id_article}{0,5}&gt; &lt;li&gt;#TITRE&lt;/li&gt; &lt;/BOUCLE&gt; &lt;/ul&gt; &lt;/B&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Et si vous &#234;tes ambitieux, vous pouvez en mettre autant que vous le souhaitez dans un squelette, et m&#234;me les imbriquer ! Mais bon, pensez &#224; vos successeurs pour ne pas rendre le code trop anonyme &#224; ne plus pouvoir s'y retrouver :)&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&gt; &lt;ul class=&#034;rubriques&#034;&gt; &lt;BOUCLE(RUBRIQUES){racine}{par num titre, titre}&gt; &lt;li&gt; &lt;h3&gt;#TITRE&lt;/h3&gt; &lt;B&gt; &lt;ul class=&#034;articles&#034;&gt; &lt;BOUCLE(ARTICLES){id_rubrique}{!par date}{0,5}&gt; &lt;li&gt;&lt;a href=&#034;#URL_ARTICLE&#034;&gt;#TITRE&lt;/a&gt;&lt;/li&gt; &lt;/BOUCLE&gt; &lt;/ul&gt; &lt;/B&gt; &lt;/li&gt; &lt;/BOUCLE&gt; &lt;/ul&gt; &lt;/B&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Ajout des parties non conditionnelles de boucles, avant &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;BB_boucle&gt;&lt;/code&gt; et apr&#232;s &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;/BB_boucle&gt;&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Une syntaxe pour des parties non conditionnelles aux boucles est ajout&#233;e : ce contenu sera toujours affich&#233;, qu'il y ait un r&#233;sultat ou pas, tout en permettant d'utiliser les balises propre &#224; la boucle (&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#TOTAL_BOUCLE&lt;/code&gt;, &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#TRI&lt;/code&gt;, etc).&lt;/p&gt;
&lt;p&gt;Cette syntaxe sert particuli&#232;rement pour les tableaux d'&#233;l&#233;ments avec des tris et filtrages. Si la boucle ne retourne pas d'&#233;l&#233;ments, on souhaite toujours afficher les filtres (pour les d&#233;cocher / les modifier).&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;[(#REM) Une partie non conditionnelle avant / apr&#232;s la boucle ] &lt;BB_non_conditionnel&gt; [(#REM) cette partie est affich&#233;e m&#234;me si la boucle ne retourne pas d'articles ] &lt;h3&gt;Les articles&lt;/h3&gt; Nombre : #TOTAL_BOUCLE&lt;br&gt; &lt;BOUCLE_non_conditionnel(ARTICLES){id_article?}{id_rubrique?}{!par date}{0,5}{', '}&gt; &lt;a href=&#034;#URL_ARTICLE&#034;&gt;#TITRE&lt;/a&gt; &lt;/BOUCLE_non_conditionnel&gt; [(#REM) cette partie est affich&#233;e m&#234;me si la boucle ne retourne pas d'articles ] &lt;nav class=&#034;pagination&#034; role=&#034;navigation&#034;&gt;#PAGINATION&lt;/nav&gt; &lt;/BB_non_conditionnel&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Cela compl&#232;te les parties conditionnelles des boucles avant &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;B_boucle&gt;&lt;/code&gt; et apr&#232;s &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;/B_boucle&gt;&lt;/code&gt; qui elles s'affichent uniquement si la boucle a au moins un r&#233;sultat.&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;[(#REM) Une partie conditionnelle avant / apr&#232;s la boucle ] &lt;B_conditionnel&gt; [(#REM) cette partie n'est affich&#233;e que si la boucle retourne des articles ] &lt;h3&gt;Les articles&lt;/h3&gt; Nombre : #TOTAL_BOUCLE&lt;br&gt; &lt;BOUCLE_conditionnel(ARTICLES){id_article}{id_article?}{id_rubrique?}{!par date}{0,5}{', '}&gt; &lt;a href=&#034;#URL_ARTICLE&#034;&gt;#TITRE&lt;/a&gt; &lt;/BOUCLE_conditionnel&gt; [(#REM) cette partie n'est affich&#233;e que si la boucle retourne des articles ] &lt;nav class=&#034;pagination&#034; role=&#034;navigation&#034;&gt;#PAGINATION&lt;/nav&gt; &lt;/B_conditionnel&gt; &lt;h3&gt;Aucun article&lt;/h3&gt; &lt;//B_conditionnel&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;La partie non conditionnelle des boucles peut se coupler avec la partie conditionnelle : dans se cas elle encadre la partie conditionnelle.&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;[(#REM) Mix non conditionnel / conditionnel avant / apr&#232;s ] &lt;BB_mix&gt; &lt;div class=&#034;articles&#034;&gt; &lt;h3&gt;Les articles&lt;/h3&gt; &lt;B_mix&gt; &lt;ul&gt; &lt;BOUCLE_mix(ARTICLES){id_article}{id_article}{!par date}{0,5}{', '}&gt; &lt;li&gt;#TITRE&lt;/li&gt; &lt;/BOUCLE_mix&gt; &lt;/ul&gt; &lt;nav class=&#034;pagination&#034; role=&#034;navigation&#034;&gt;#PAGINATION&lt;/nav&gt; &lt;/B_mix&gt; &lt;/div&gt; &lt;/BB_mix&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt; Ajout du support des boucles dans la partie conditionnelle des balises&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Oui ! On peut maintenant mettre des boucles dans des balises !&lt;br class='autobr' /&gt;
Si si ! Dans les parties conditionnelles des balises.&lt;/p&gt;
&lt;p&gt;Quelques exemples :&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;[(#BALISE) &lt;BOUCLE(ARTICLES) {0,1}&gt;#TITRE&lt;/BOUCLE&gt; ] [&lt;BOUCLE(ARTICLES) {0,1}&gt;#TITRE&lt;/BOUCLE&gt; (#BALISE)] [(#ENV{documents}|oui) &lt;B_docs&gt; &lt;ul&gt; &lt;BOUCLE_docs(DOCUMENTS){id_article}{par num titre, titre}{mode=document}&gt; &lt;li&gt; &lt;a href=&#034;#URL_DOCUMENT&#034;&gt; [(#TITRE|sinon{Document n&#176;#ID_DOCUMENT})] \(#EXTENSION\) &lt;/a&gt; &lt;/li&gt; &lt;/BOUCLE_docs&gt; &lt;ul&gt; &lt;/B_docs&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;Changements-et-apports-pour-les-squelettes&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Changements-et-apports-pour-les-squelettes'&gt; Changements et apports pour les squelettes &lt;a class='sommaire-back sommaire-back-10' href='#s-Changements-et-apports-pour-les-squelettes' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt; Les balises &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#PAGINATION&lt;/code&gt; n&#233;cessitent un changement de syntaxe et d'arguments. &lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Le changement porte 1) sur la balise englobante, qui doit &#234;tre &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;nav&lt;/code&gt; 2) sur les arguments.&lt;/p&gt;
&lt;p&gt;1) La balise englobante doit d&#233;sormais &#234;tre &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;nav class=&#034;pagination&#034;&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Jusqu'&#224; SPIP 3.2, on &#233;crivait par exemple :&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;p class='pagination'&gt;(#PAGINATION)&lt;/p&gt;] &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Avec SPIP 4.0, il faut maintenant utiliser :&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;nav class='pagination' role='navigation'&gt;(#PAGINATION)&lt;/nav&gt;] &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;2) Il n'existe plus qu'un seul mod&#232;le de pagination. De ce fait, les diff&#233;rences de rendu de la pagination se font en lui passant des 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;afficher_lien_precedent=oui&lt;/code&gt; pour afficher le &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;&lt;/code&gt; vers les r&#233;sultats pr&#233;c&#233;dents&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;afficher_lien_suivant=oui&lt;/code&gt; pour afficher le &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&gt;&lt;/code&gt; qui m&#232;ne aux r&#233;sultats suivants&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;afficher_lien_tous=oui&lt;/code&gt; pour afficher un lien permettant de voir tous les r&#233;sultats simultan&#233;ment. Dans ce cas, le texte du lien est &#034;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&#8734;&lt;/code&gt;&#034; par d&#233;faut, mais il est possible de sp&#233;cifier un autre label avec l'argument &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;label_tous&lt;/code&gt;. Exemple : &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;label_tous=tous&lt;/code&gt;.&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;nombre_liens_max&lt;/code&gt; permet de d&#233;finir le nombre de lien de pagination maximum affich&#233; par le mod&#232;le. On peut &#233;galement employer la constante &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;_PAGINATION_NOMBRE_LIENS_MAX&lt;/code&gt; pour l'espace public ou &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;_PAGINATION_NOMBRE_LIENS_MAX_ECRIRE&lt;/code&gt; pour l'espace priv&#233;.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Le premier argument peut indiquer quel est le type de pagination d&#233;sir&#233;. On peut &#233;galement l'indiquer avec un argument &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;type_pagination&lt;/code&gt;. &lt;br class='autobr' /&gt;
Exemple : &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#PAGINATION{naturel}&lt;/code&gt; est &#233;quivalent &#224; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#PAGINATION{type_pagination=naturel}&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;type_pagination=page&lt;/code&gt; pour afficher les n&#176; de page : 1, 2, 3, 4...&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;type_pagination=rang&lt;/code&gt; pour afficher les rangs : 0, 10, 20, 30...&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;type_pagination=naturel&lt;/code&gt; pour afficher les rangs avec 1 &#224; la place du 0 : 1, 10, 20, 30...&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;type_pagination=resultats&lt;/code&gt; pour afficher les rangs de 10 en 10 &#224; partir de 1 : 1, 11, 21, 31...&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;type_pagination=page_precedent_suivant&lt;/code&gt; est la combinaison d'une pagination de type &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;page&lt;/code&gt; avec les liens pr&#233;c&#233;dents et suivants.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;L'utilisation de la balise dans l'espace priv&#233; est d&#233;tect&#233;e automatiquement, ce qui rend inutile le passage de l'argument &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;type_pagination=prive&lt;/code&gt;. La compatibilit&#233; avec l'ancienne syntaxe &#233;tant toutefois assur&#233;e sur ce point, on pourra conserver, sur des anciens squelettes, l'argument de l'ancienne version ainsi :&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;nav class='pagination' role='navigation'&gt;(#PAGINATION{prive})&lt;/nav&gt;] &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Crit&#232;re &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{id_?}&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Le crit&#232;re &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{id_?}&lt;/code&gt; permet de faire toutes les liaisons possibles avec les variables d'environnement. Il se comporte donc comme autant de crit&#232;res &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{id_xxx ?}&lt;/code&gt; que possibles pour la boucle donn&#233;e.&lt;/p&gt;
&lt;p&gt;Voir &lt;a href='https://www.spip.net/fr_article6645.html' class=&#034;spip_in&#034;&gt;&lt;i&gt;id_ ?&lt;/i&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fonction &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;lister_champs_id_conditionnel&lt;/code&gt; et pipeline &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;exclure_id_conditionnel&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Le crit&#232;re &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{id_?}&lt;/code&gt; s'appuie directement sur la fonction &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;lister_champs_id_conditionnel($table)&lt;/code&gt; qui retourne une liste des champs de s&#233;lection conditionnelle possibles pour cette table.&lt;/p&gt;
&lt;p&gt;Le calcul est fait &#224; partir des champs commen&#231;ant par 'id_' dans la table, ainsi qu'avec un &#233;ventuel champ 'objet'. On compl&#232;te ensuite avec les cl&#233;s primaires des tables &#233;ditoriales qui peuvent &#234;tre li&#233;es facilement.&lt;/p&gt;
&lt;p&gt;Enfin, le r&#233;sultat traverse le pipeline &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;exclure_id_conditionnel&lt;/code&gt; qui permet d'exclure certains champs de la liste calcul&#233;e par la fonction &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;lister_champs_id_conditionnel&lt;/code&gt;. Voir l'exemple dans le plugin Br&#232;ves ou le plugin SVP.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Crit&#232;re &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{par_ordre_liste champ,#LISTE{...}}&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Nouveau &lt;a href='https://www.spip.net/fr_article6646.html' class=&#034;spip_in&#034;&gt;crit&#232;re par_ordre_liste&lt;/a&gt; pour ordonner une boucle selon un ordre pr&#233;cis.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Crit&#232;re &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{fusion_supprimer}&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Ce crit&#232;re entre dans le Core. Il &#233;tait jadis d&#233;fini dans le plugin SPIP-Bonux. &lt;strong&gt;Important&lt;/strong&gt; : Il faut mettre &#224; jour le plugin SPIP-Bonux, s'il est actif, en version &gt;= 3.7.1 &lt;strong&gt;avant&lt;/strong&gt; de mettre &#224; jour le site vers SPIP 4.0 pour &#233;viter un conflit.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Filtre et fonction &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;identifiant_slug&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt; &lt;a href=&#034;https://core.spip.net/issues/4628&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Ticket #4628&lt;/a&gt; : ajout de la fonction &lt;a href='https://www.spip.net/fr_article6636.html' class=&#034;spip_in&#034;&gt;identifier_slug()&lt;/a&gt;. Permet de transformer un texte clair en nom court pouvant servir d'identifiant, class, id, url&#8230; en ne conservant que des caract&#232;res alphanum&#233;riques et un separateur.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Filtres &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;label_nettoyer&lt;/code&gt; et &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;label_ponctuer&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Ces filtres sont ajout&#233;s pour g&#233;rer et utiliser un peu mieux les cha&#238;nes de langues historiques de SPIP (parfois avec des &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;:&lt;/code&gt;, parfois sans).&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;label_nettoyer&lt;/code&gt; enl&#232;ve les &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;:&lt;/code&gt; en fin de texte&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;label_ponctuer&lt;/code&gt; ajoute &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&#8239;:&lt;/code&gt; en fin de texte&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;&#201;volution des crit&#232;res &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{tri}&lt;/code&gt; et &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{par num xxx}&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Le crit&#232;re &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{tri xxx}&lt;/code&gt; accepte un &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#TRI{par num&#233;ro, num xxx}&lt;/code&gt; se comportant comme &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{par num xxx}&lt;/code&gt; (les &#233;l&#233;ments sans num&#233;ros sont class&#233;s apr&#232;s les &#233;l&#233;ments ayant un num&#233;ro)&lt;/li&gt;&lt;li&gt; Le crit&#232;re &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{par num xxx}&lt;/code&gt; int&#232;gre automatiquement le crit&#232;re &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{par sinum xxx}&lt;/code&gt; avant lui : ainsi dans &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;(ARTICLES){par num titre}&lt;/code&gt;, les articles sans num&#233;ros (ou avec le num&#233;ro 0) passent apr&#232;s les articles ayant un num&#233;ro&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Autres points sur les squelettes&lt;/strong&gt;&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Nouveaux arguments de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#FORMULAIRE_INSCRIPTION&lt;/code&gt; et &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#FORMULAIRE_LOGIN&lt;/code&gt;&lt;/li&gt;&lt;li&gt; Nouveaux filtres &lt;a href='https://www.spip.net/fr_article6623.html' class=&#034;spip_in&#034;&gt;ajouter_class&lt;/a&gt;, &lt;a href='https://www.spip.net/fr_article6624.html' class=&#034;spip_in&#034;&gt;supprimer_class&lt;/a&gt; et &lt;a href='https://www.spip.net/fr_article6625.html' class=&#034;spip_in&#034;&gt;commuter_class&lt;/a&gt;&lt;/li&gt;&lt;li&gt; Filtre &lt;a href='https://www.spip.net/fr_article4004.html' class=&#034;spip_in&#034;&gt;lien_ou_expose&lt;/a&gt; am&#233;lior&#233;&lt;/li&gt;&lt;li&gt; Le filtre &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;|singulier_ou_pluriel&lt;/code&gt; peut &#234;tre &#233;tendu pour chaque langue en cr&#233;ant son propre filtre &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;singulier_ou_pluriel_&lt;lang&gt;&lt;/code&gt;, qui sera appel&#233; si la langue correspond&lt;/li&gt;&lt;li&gt; Nouveau filtre &lt;a href=&#034;https://git.spip.net/spip/spip/commit/668d3212&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;appliquer_si_filtre&lt;/a&gt; en compl&#233;ment de &lt;a href='https://www.spip.net/fr_article5068.html' class=&#034;spip_in&#034;&gt;appliquer_filtre&lt;/a&gt; : le 1er renvoie le contenu initial si le filtre cherch&#233; n'existe pas, le 2nd ne renvoie plus rien.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Squelettes-dist (th&#232;me de l'espace public par d&#233;faut) &lt;/strong&gt;&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Le squelettes-dist par d&#233;faut utilise maintenant une syntaxe HTML5&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;Autres-apports&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Autres-apports'&gt;Autres apports&lt;a class='sommaire-back sommaire-back-10' href='#s-Autres-apports' 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; Int&#233;gration de la librairie Javascript &lt;a href=&#034;https://sortablejs.github.io/Sortable/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Sortable.js&lt;/a&gt; pour prendre en charge le glisser-d&#233;poser de fa&#231;on plus fluide, notamment pour ordonner les documents, en remplacement du module de jQuery UI.&lt;/li&gt;&lt;li&gt; Une nouvelle boite modale l&#233;g&#232;re, accessible, responsive et plus jolie bas&#233;e sur &lt;a href=&#034;https://sorgalla.com/lity/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Lity&lt;/a&gt;&lt;/li&gt;&lt;li&gt; Une feuille de style XSLT fournit des flux RSS styl&#233;s&lt;/li&gt;&lt;li&gt; Le graphique des statistiques refait &#224; neuf (il utilise d3.js)&lt;/li&gt;&lt;li&gt; Le compagnon peut &#234;tre ignor&#233; pour chaque auteur qui connait d&#233;j&#224; SPIP&lt;/li&gt;&lt;li&gt; L'option &#034;se limiter au HTML4&#034; pour l'espace public est supprim&#233;e. Les squelettes par d&#233;faut (la dist) passent en HTML 5 (&lt;a href=&#034;https://git.spip.net/spip-contrib-extensions/historique_spip32_html4&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;plugin de r&#233;tro-compatibilit&#233;&lt;/a&gt;)&lt;/li&gt;&lt;li&gt; L'attribut summary pour les tableaux est enlev&#233;&lt;/li&gt;&lt;li&gt; Intertitres de niveau h2 par d&#233;faut, et plus de niveau h3 comme c'&#233;tait le cas avant (&lt;a href=&#034;https://git.spip.net/spip-contrib-extensions/historique_spip32_h3&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;plugin de r&#233;tro-compatibilit&#233;&lt;/a&gt;)&lt;/li&gt;&lt;li&gt; La fonction &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;autoriser_exception()&lt;/code&gt; accepte un argument * en guise d'id : cela l'autorise pour tout id. 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;li&gt; Le filtre &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;heure_minutes&lt;/code&gt; accepte en argument optionnel &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;abbr&lt;/code&gt; lorsqu'on ne souhaite pas indiquer l'unit&#233; des minutes. Ainsi &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;[(#DATE|heures_minutes{abbr})]&lt;/code&gt; affichera, par exemple : &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;17h26&lt;/code&gt;&lt;/li&gt;&lt;li&gt; La constante &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;_AUTO_SELECTION_RUBRIQUE&lt;/code&gt;, qui permet d'affecter automatiquement une rubrique &#224; la cr&#233;ation d'un article si sa valeur est &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;true&lt;/code&gt; accepte maintenant en plus un entier : dans ce cas cela correspond &#224; l'identifiant de rubrique &#224; attribuer par d&#233;faut.&lt;/li&gt;&lt;li&gt; Si le 3&#232; param&#232;tre (class) de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#BOUTON_ACTION{libell&#233;, url, class ,message de confirmation}&lt;/code&gt; contient &#034;ajax&#034;, cette classe est ajout&#233;e au formulaire qui contient le bouton.&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;Corrections&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Corrections'&gt; Corrections &lt;a class='sommaire-back sommaire-back-10' href='#s-Corrections' 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; Mise &#224; jour de toutes les librairies JS utilis&#233;es&lt;/li&gt;&lt;li&gt; [login] &lt;a href=&#034;https://core.spip.net/issues/3957&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Ticket #3957&lt;/a&gt; : Ne plus afficher le cadenas sur la page login, trop ambigu avec le cadenas https du navigateur.&lt;/li&gt;&lt;li&gt; [admin] Le lien &#034;Afficher les visiteurs&#034; n'est pas pr&#233;sent&#233; s'il n'y a pas d'utilisateurs avec ce statut sur le site.&lt;/li&gt;&lt;li&gt; [svp][plugins] S'il y a une erreur XML sur un paquet.xml, elle est directement explicit&#233;e sur la page de gestion des plugins.&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;Nettoyages&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Nettoyages'&gt; Nettoyages &lt;a class='sommaire-back sommaire-back-10' href='#s-Nettoyages' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Plugins&lt;/strong&gt;&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Les fichiers &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;plugin.xml&lt;/code&gt; des plugins SPIP 2.x ne sont plus interpr&#233;t&#233;s. Seuls les &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;paquet.xml&lt;/code&gt; le sont d&#233;sormais. Un plugin qui n'aurait donc que &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;plugin.xml&lt;/code&gt; (sans &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;paquet.xml&lt;/code&gt; &#224; c&#244;t&#233;) ne fonctionnera donc plus &#224; partir de SPIP 4.0.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Divers&lt;/strong&gt;&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;a href=&#034;https://core.spip.net/issues/4060&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Ticket #4060&lt;/a&gt; : Nettoyage code &lt; PHP 5.4&lt;/li&gt;&lt;li&gt; Nettoyage code &amp; CSS &lt;= IE9&lt;/li&gt;&lt;li&gt; Nettoyage htaccess (plus de compat sur les URLs .php(3) de SPIP &lt;= 1.8&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Fichiers&lt;/strong&gt;&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Suppression de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;inc/mail&lt;/code&gt; d&#233;pr&#233;ci&#233; depuis SPIP 2. Utiliser par exemple :
&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;$envoyer_mail = charger_fonction('envoyer_mail', 'inc'); $envoyer_mail(...); &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt; Suppression de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;action/preferer.php&lt;/code&gt; inutilis&#233; depuis SPIP 3.2 (suppression de ecrire/oo/).&lt;/li&gt;&lt;li&gt; Supression de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;exec/valider_xml.php&lt;/code&gt; non fonctionnel, d&#233;plac&#233; dans le plugin &#224; corriger &lt;a href=&#034;https://zone.spip.org/trac/spip-zone/changeset/108307&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Valider XML&lt;/a&gt;&lt;/li&gt;&lt;li&gt; Suppression de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;exec/fond_monobloc.php&lt;/code&gt;. Cr&#233;er les squelettes de l'espace priv&#233; dans &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;prive/squelettes&lt;/code&gt;.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Balises / Filtres / Crit&#232;res &lt;/strong&gt;&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Suppression des balises &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#DEBUT_SURLIGNE&lt;/code&gt; et &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#FIN_SURLIGNE&lt;/code&gt; d&#233;pr&#233;ci&#233;es depuis SPIP 2. Utiliser les classes CSS &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;surlignable&lt;/code&gt; et &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;pas_surlignable&lt;/code&gt;.&lt;/li&gt;&lt;li&gt; Les filtres &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;aligner&lt;/code&gt;, &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;aligner_gauche&lt;/code&gt;, &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;aligner_droite&lt;/code&gt;, &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;centrer&lt;/code&gt;, &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;justifier&lt;/code&gt; et &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;style_align&lt;/code&gt; sont supprim&#233;s. Utiliser du code CSS pour obtenir le m&#234;me r&#233;sultat.&lt;/li&gt;&lt;li&gt; Suppression de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#LOGIN_PRIVE&lt;/code&gt;. Utiliser &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#FORMULAIRE_LOGIN&lt;/code&gt;&lt;/li&gt;&lt;li&gt; Suppression de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#LOGIN_PUBLIC&lt;/code&gt;. Utiliser &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#FORMULAIRE_LOGIN&lt;/code&gt;&lt;/li&gt;&lt;li&gt; Suppression de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#DOSSIER_SQUELETTE&lt;/code&gt;. Utiliser &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#CHEMIN&lt;/code&gt;&lt;/li&gt;&lt;li&gt; Suppression de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#NOOP&lt;/code&gt;. Utiliser &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#VAL&lt;/code&gt;&lt;/li&gt;&lt;li&gt; Suppression de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{datasource ...}&lt;/code&gt;. Utiliser directement le crit&#232;re &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{source ...}&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Fonctions PHP&lt;/strong&gt;&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Suppression de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;echo_log()&lt;/code&gt; (inutile maintenant).&lt;/li&gt;&lt;li&gt; Suppression de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;spip_fetch_array()&lt;/code&gt;. Utiliser &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;sql_fetch()&lt;/code&gt; &#224; la place.&lt;/li&gt;&lt;li&gt; Suppression de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;generer_url_retour()&lt;/code&gt;. Utiliser &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;parametre_url()&lt;/code&gt; &#224; la place, avec le param&#232;tre 'redirect'.&lt;/li&gt;&lt;li&gt; Suppression de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;charger_php_extension()&lt;/code&gt; (utiliser &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;extension_loaded()&lt;/code&gt;)&lt;/li&gt;&lt;li&gt; Suppression de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;revisions_articles()&lt;/code&gt;. Utiliser &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;article_modifier()&lt;/code&gt;&lt;/li&gt;&lt;li&gt; Suppression de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;revision_article()&lt;/code&gt;. Utiliser &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;article_modifier()&lt;/code&gt;&lt;/li&gt;&lt;li&gt; Suppression de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;articles_set()&lt;/code&gt;. Utiliser &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;article_modifier()&lt;/code&gt;&lt;/li&gt;&lt;li&gt; Suppression de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;insert_article()&lt;/code&gt;. Utiliser &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;article_inserer()&lt;/code&gt;&lt;/li&gt;&lt;li&gt; Suppression de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;instituer_article()&lt;/code&gt;. Utiliser &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;article_instituer()&lt;/code&gt;&lt;/li&gt;&lt;li&gt; Suppression de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;insert_auteur()&lt;/code&gt;. Utiliser &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;auteur_inserer()&lt;/code&gt;&lt;/li&gt;&lt;li&gt; Suppression de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;auteurs_set()&lt;/code&gt;. Utiliser &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;auteur_modifier()&lt;/code&gt;&lt;/li&gt;&lt;li&gt; Suppression de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;instituer_auteur()&lt;/code&gt;. Utiliser &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;auteur_instituer()&lt;/code&gt;&lt;/li&gt;&lt;li&gt; Suppression de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;revision_auteur()&lt;/code&gt;. Utiliser &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;auteur_modifier()&lt;/code&gt;&lt;/li&gt;&lt;li&gt; Suppression de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;insert_rubrique()&lt;/code&gt;. Utiliser &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;rubrique_inserer()&lt;/code&gt;&lt;/li&gt;&lt;li&gt; Suppression de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;revisions_rubriques()&lt;/code&gt;. Utiliser &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;rubrique_modifier()&lt;/code&gt;&lt;/li&gt;&lt;li&gt; Suppression de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;instituer_rubrique()&lt;/code&gt;. Utiliser &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;rubrique_instituer()&lt;/code&gt;&lt;/li&gt;&lt;li&gt; Suppression de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;admin_repair_plat()&lt;/code&gt;. Les fichiers .plat ne sont plus utilis&#233;s. Cette fonction n'est plus appel&#233;e depuis &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;r14292&lt;/code&gt;&lt;/li&gt;&lt;li&gt; Suppression de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;version_svn_courante()&lt;/code&gt;. Utiliser &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;version_vcs_courante()&lt;/code&gt;&lt;/li&gt;&lt;li&gt; Suppression de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;lire_meta()&lt;/code&gt;. Utiliser &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$GLOBALS['meta'][$nom]&lt;/code&gt; ou &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;lire_config('nom')&lt;/code&gt;&lt;/li&gt;&lt;li&gt; Suppression de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;auteur_referent()&lt;/code&gt;. Utiliser &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;auteur_associer()&lt;/code&gt;&lt;/li&gt;&lt;li&gt; Suppression de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;table_jointure()&lt;/code&gt;. Utiliser Utiliser l'API editer_liens ou les tables de liaisons spip_xx_liens ou spip_yy_liens, selon.&lt;/li&gt;&lt;li&gt; Suppression de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;modifier_contenu()&lt;/code&gt;. Utiliser les fonctions g&#233;n&#233;riques pour l'API de modification de contenu.&lt;/li&gt;&lt;li&gt; Suppression de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;revision_objet()&lt;/code&gt;. Utiliser &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;objet_modifier()&lt;/code&gt;.&lt;/li&gt;&lt;li&gt; Suppression de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;notifier_publication_article()&lt;/code&gt;.&lt;/li&gt;&lt;li&gt; Suppression de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;notifier_proposition_article()&lt;/code&gt;.&lt;/li&gt;&lt;li&gt; Suppression de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;calcul_branche()&lt;/code&gt;. Utiliser &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;calcul_branche_in()&lt;/code&gt;.&lt;/li&gt;&lt;li&gt; Suppression de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;ecrire_metas()&lt;/code&gt;.&lt;/li&gt;&lt;li&gt; Suppression de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;spip_query_db()&lt;/code&gt;. Utiliser &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;sql_query()&lt;/code&gt; ou autre.&lt;/li&gt;&lt;li&gt; Suppression de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;spip_get_lock()&lt;/code&gt; et &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;spip_release_lock()&lt;/code&gt; qui n'&#233;taient plus utilis&#233;es.&lt;/li&gt;&lt;li&gt; Suppression de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;recuperer_entetes()&lt;/code&gt;. Utiliser &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;recuperer_entetes_complets()&lt;/code&gt;.&lt;/li&gt;&lt;li&gt; Suppression de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;maj_version()&lt;/code&gt; et &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;upgrade_vers()&lt;/code&gt; qui ne servent plus.&lt;/li&gt;&lt;li&gt; Suppression de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;upgrade_types_documents()&lt;/code&gt;. Utiliser directement &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;creer_base_types_doc()&lt;/code&gt; du plugin Medias&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;Depreciations&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Depreciations'&gt; D&#233;pr&#233;ciations &lt;a class='sommaire-back sommaire-back-10' href='#s-Depreciations' 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; La &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;BOUCLE(POUR)&lt;/code&gt; et son crit&#232;re &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{tableau ...}&lt;/code&gt; sont d&#233;pr&#233;ci&#233;s au profit de la &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;BOUCLE(DATA)&gt;&lt;/code&gt; et son crit&#232;re &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{source table, ...}&lt;/code&gt;.&lt;/li&gt;&lt;li&gt; De m&#234;me, le fitre &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;|foreach&lt;/code&gt; est d&#233;pr&#233;ci&#233; au profit de la syntaxe &#224; base de boucle &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;(DATA)&lt;/code&gt;.&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;Plugins&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Plugins'&gt; Plugins &lt;a class='sommaire-back sommaire-back-10' href='#s-Plugins' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;- Les plugins &lt;strong&gt;breves&lt;/strong&gt;, &lt;strong&gt;jquery_ui&lt;/strong&gt;, &lt;strong&gt;organiseur&lt;/strong&gt;, &lt;strong&gt;petitions&lt;/strong&gt;, &lt;strong&gt;vertebres&lt;/strong&gt;, &lt;strong&gt;squelettes_par_rubriques&lt;/strong&gt; ne sont plus distribu&#233;s avec SPIP par d&#233;faut. Ces plugins, &lt;strong&gt;breves&lt;/strong&gt;, &lt;strong&gt;organiseur&lt;/strong&gt;, &lt;strong&gt;petitions&lt;/strong&gt; et &lt;strong&gt;squelettes_par_rubriques&lt;/strong&gt; sont toujours maintenus mais il faut les installer &#224; la main (via SVP par exemple) afin de b&#233;n&#233;ficier de leurs fonctionnalit&#233;s. Par exemple, installer le plugin &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;Squelettes par rubrique&lt;/code&gt; pour utiliser des squelettes suffix&#233;s par num&#233;ro de rubrique et/ou par code de langue : (&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;-23.html&lt;/code&gt;, &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;=23.html&lt;/code&gt;, et &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;.en.html&lt;/code&gt;). Pour installer ces plugins via SVP, il faut jouter le d&#233;p&#244;t SPiP-Zone - Core (ref &lt;a href=&#034;https://plugins.spip.net/spip.php?page=depots&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://plugins.spip.net/spip.php?page=depots&lt;/a&gt;) dans la page de gestion des d&#233;p&#244;ts de l'interface priv&#233;e.&lt;/p&gt;
&lt;p&gt;- &lt;strong&gt;jquery_ui&lt;/strong&gt; est maintenu par la communaut&#233;, mais d&#233;pr&#233;ci&#233;&lt;/p&gt;
&lt;p&gt;- &lt;strong&gt;vertebres&lt;/strong&gt; bien que fonctionnel en SPIP 4.0 est abandonn&#233; : le plugin Adminer est une alternative plus compl&#232;te.&lt;/p&gt;
&lt;p&gt;Pour faciliter la suppression de leurs tables dans la base de donn&#233;es lors de la migration 3.2 -&gt; 4.0, le plugin d&#233;di&#233; &lt;strong&gt;L&#233;on&lt;/strong&gt; est mis &#224; votre disposition : &lt;a href=&#034;https://contrib.spip.net/leon-le-nettoyeur&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://contrib.spip.net/leon-le-nettoyeur&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Breves&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;Fonctions PHP&lt;/i&gt;&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Suppression de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;insert_breve()&lt;/code&gt;. Utiliser &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;breve_inserer()&lt;/code&gt;&lt;/li&gt;&lt;li&gt; Suppression de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;revisions_breves()&lt;/code&gt;. Utiliser &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;breve_modifier()&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Grenier&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Le grenier est nettoy&#233; et ne contient plus que les fonctions enlev&#233;es de SPIP 3.2 et SPIP 4.0. &lt;br class='autobr' /&gt;
Ce qui est ant&#233;rieur &#224; SPIP 3.2 n'est plus pr&#233;sent dedans.&lt;/p&gt;
&lt;p&gt;Il re&#231;oit les diff&#233;rentes fonctions et fichiers supprim&#233;s de SPIP 4.0 qui pouvaient potentiellement &#234;tre utilis&#233;s par des squelettes ou plugins.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Medias&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;Fonctions PHP&lt;/i&gt;&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Suppression de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;document_set()&lt;/code&gt;. Utiliser &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;document_modifier()&lt;/code&gt;&lt;/li&gt;&lt;li&gt; Suppression de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;insert_document()&lt;/code&gt;. Utiliser &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;document_inserer()&lt;/code&gt;&lt;/li&gt;&lt;li&gt; Suppression de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;revision_document()&lt;/code&gt;. Utiliser &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;document_modifier()&lt;/code&gt;&lt;/li&gt;&lt;li&gt; Suppression de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;afficher_documents_colonne()&lt;/code&gt;. Utiliser l'inclusion pr&#233;vue ou une v&#233;ritable d&#233;claration d'objet &#233;ditorial (la colonne document est alors affich&#233;e automatiquement sur la page d'&#233;dition de l'objet)&lt;/li&gt;&lt;li&gt; Suppression de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;lien_objet()&lt;/code&gt;. Utiliser &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;generer_lien_entite()&lt;/code&gt;&lt;/li&gt;&lt;li&gt; Suppression de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;instituer_document()&lt;/code&gt;. Utiliser &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;document_instituer()&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Mots&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;Fonctions PHP&lt;/i&gt;&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Suppression de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;groupemots_inserer()&lt;/code&gt;. Utiliser &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;groupe_mots_inserer()&lt;/code&gt; ou &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;objet_inserer()&lt;/code&gt;&lt;/li&gt;&lt;li&gt; Suppression de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;groupemots_modifier()&lt;/code&gt;. Utiliser &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;groupe_mots_modifier()&lt;/code&gt; ou &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;objet_modifier()&lt;/code&gt;&lt;/li&gt;&lt;li&gt; Suppression de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;revision_groupe_mot()&lt;/code&gt;. Utiliser &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;groupe_mots_modifier()&lt;/code&gt;&lt;/li&gt;&lt;li&gt; Suppression de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;insert_mot()&lt;/code&gt;. Utiliser Utiliser &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;mot_inserer()&lt;/code&gt;&lt;/li&gt;&lt;li&gt; Suppression de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;mots_set()&lt;/code&gt;. Utiliser &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;mot_modifier()&lt;/code&gt;&lt;/li&gt;&lt;li&gt; Suppression de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;revision_mot()&lt;/code&gt;. Utiliser &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;mot_modifier()&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;P&#233;titions&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;L'utilisation des p&#233;titions est maintenant optionnelle : elles sont d&#233;sactiv&#233;es par d&#233;faut sur les nouvelles installations&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;Sur les installation existantes, ce n'est le cas que si elles n&#233;taient pas (&#8230;)&#034; id=&#034;nh1&#034;&gt;1&lt;/a&gt;]&lt;/span&gt;. Vous pouvez les activer dans la configuration des contenus du site.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sites&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;Fonctions PHP&lt;/i&gt;&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Suppression de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;insert_syndic()&lt;/code&gt;. Utiliser site_inserer()&lt;/li&gt;&lt;li&gt; Suppression de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;revisions_sites()&lt;/code&gt;. Utiliser site_modifier()&lt;/li&gt;&lt;li&gt; Suppression de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;syndic_set()&lt;/code&gt;. Utiliser site_modifier()&lt;/li&gt;&lt;li&gt; Suppression de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;instituer_syndic()&lt;/code&gt;. Utiliser objet_instituer()&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;Sur les installation existantes, ce n'est le cas que si elles n&#233;taient pas utilis&#233;es auparavant&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>SPIP 3.2</title>
		<link>https://www.spip.net/fr_article6399.html</link>
		<guid isPermaLink="true">https://www.spip.net/fr_article6399.html</guid>
		<dc:date>2017-10-13T12:56:56Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Matthieu Marcillaud, peetdu, tofulm</dc:creator>



		<description>
&lt;p&gt;SPIP 3.2 est une version am&#233;lior&#233;e de SPIP 3.1, qui comprend une mise &#224; jour des biblioth&#232;ques JavaScript embarqu&#233;es, une meilleure ergonomie de l'espace priv&#233; ainsi que de nombreuses am&#233;liorations. &lt;br class='autobr' /&gt; Voici le d&#233;tail des &#233;volutions &lt;br class='autobr' /&gt;
Javascript &lt;br class='autobr' /&gt;
jQuery Mise &#224; jour de jQuery en version 3.2 (dans SPIP 3.1 c'est jQuery 1.12). https://jquery.com/upgrade-guide/3.0 int&#233;gration de jQuery-migrate-3.0.1.js pour faciliter les migrations des scripts utilisant jQuery. (&#8230;)&lt;/p&gt;


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


		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;SPIP 3.2 est une version am&#233;lior&#233;e de SPIP 3.1, qui comprend une mise &#224; jour des biblioth&#232;ques JavaScript embarqu&#233;es, une meilleure ergonomie de l'espace priv&#233; ainsi que de nombreuses am&#233;liorations.&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;nav69e3a65ed3b755.02194096&#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-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-PHP&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#PHP&#034; class=&#034;spip_ancre&#034;&gt;PHP&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Core&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Core&#034; class=&#034;spip_ancre&#034;&gt;Core&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Plugins&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Plugins&#034; class=&#034;spip_ancre&#034;&gt;Plugins&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;!--/sommaire--&gt;&lt;p&gt;Voici le d&#233;tail des &#233;volutions&lt;/p&gt;
&lt;p&gt;&lt;a id=&#034;javascript&#034;&gt;&lt;/a&gt;&lt;/p&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-4' href='#s-Javascript' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;jQuery&lt;/strong&gt;&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;strong&gt;Mise &#224; jour de jQuery&lt;/strong&gt; en version 3.2 (dans SPIP 3.1 c'est jQuery 1.12). &lt;a href=&#034;https://jquery.com/upgrade-guide/3.0&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://jquery.com/upgrade-guide/3.0&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;strong&gt;int&#233;gration de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;jQuery-migrate-3.0.1.js&lt;/code&gt;&lt;/strong&gt; pour faciliter les migrations des scripts utilisant jQuery. &lt;a href=&#034;https://github.com/jquery/jquery-migrate/#README&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://github.com/jquery/jquery-migrate/#README&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;blockquote class=&#034;spip&#034;&gt;
&lt;p&gt;
&lt;strong&gt;Note importante : &lt;/strong&gt; Ces changements impliquent qu'il est fortement conseill&#233; de mettre &#224; jour les scripts utilisant jQuery. Cela concerne principalement les modifications suivantes :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; bind() =&gt; on()&lt;/li&gt;&lt;li&gt; unbind() =&gt; off()&lt;/li&gt;&lt;li&gt; load() =&gt; on('load', ...)&lt;/li&gt;&lt;li&gt; unload() =&gt; on('unload', ...)&lt;/li&gt;&lt;li&gt; jQuery.isArray() =&gt; Array.isArray()
&lt;/blockquote&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;jQuery UI&lt;/strong&gt;&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;strong&gt;Mise &#224; jour de jQuery UI&lt;/strong&gt; en version 1.12 (dans SPIP 3.0 c'est jQuery UI 1.11). &lt;a href=&#034;http://jqueryui.com/upgrade-guide/1.12/&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;http://jqueryui.com/upgrade-guide/1.12/&lt;/a&gt; . Changement d'impl&#233;mentation au passage :
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; tout jQuery UI est charg&#233; dans l'espace priv&#233; par d&#233;faut.&lt;/li&gt;&lt;li&gt; Dans l'espace public, d&#232;s lors qu'un &#233;l&#233;ment de jQuery UI est demand&#233; via le pipeline &#034;jqueryui_plugins&#034;, tout le JS / CSS de jQuery UI est &#233;galement charg&#233;.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;blockquote class=&#034;spip&#034;&gt;
&lt;p&gt;
&lt;strong&gt;Note importante : &lt;/strong&gt; Ces changements impliquent que les usages de javascript qui chargeaient des modules de jQuery UI avec &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$.getScript()&lt;/code&gt; ne fonctionneront plus. Vous pouvez soit charger globalement jQuery UI dans votre squelette, ou via le pipeline &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;jqueryui_plugins&lt;/code&gt; pour un plugin, soit utiliser &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$.getScript()&lt;/code&gt; sur le chemin du fichier &#034;jquery-ui.js&#034; directement.&lt;/p&gt;
&lt;p&gt;Ainsi :&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;$.getScript(&#034;#CHEMIN{prive/javascript/ui/core.js}&#034;, function(){ $.getScript(&#034;#CHEMIN{prive/javascript/ui/widget.js}&#034;, function(){ $.getScript(&#034;#CHEMIN{prive/javascript/ui/mouse.js}&#034;, function(){ $.getScript(&#034;#CHEMIN{prive/javascript/ui/sortable.js}&#034;, function(){ // ... })})})}); &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Pourrait devenir :&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;$.getScript(&#034;#CHEMIN{prive/javascript/ui/jquery-ui.js}&#034;, function(){ // ... }); &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;JS Cookie&lt;/strong&gt;&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; La librairie JS Cookies est int&#233;gr&#233;e en version 2.1.4. Elle remplace jQuery.cookie. &lt;a href=&#034;https://github.com/js-cookie/js-cookie&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://github.com/js-cookie/js-cookie&lt;/a&gt;&lt;/li&gt;&lt;li&gt; L'ancienne &#233;criture &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$.cookie()&lt;/code&gt; fonctionne encore dans la plupart des usages mais il est conseill&#233; de migrer :
&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;$.cookie(key)&lt;/code&gt; devient &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;Cookies.get(key)&lt;/code&gt;&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$.cookie(key, value)&lt;/code&gt; devient &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;Cookies.set(key, value)&lt;/code&gt;&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$.cookie(key, value, options)&lt;/code&gt; devient &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;Cookies.set(key, value, options)&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;&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;PHP&#034;&gt;&lt;h2 class=&#034;h2&#034; id='PHP'&gt;PHP&lt;a class='sommaire-back sommaire-back-4' href='#s-PHP' 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; Nombreuses notices PHP enlev&#233;es encore.&lt;/li&gt;&lt;li&gt; Compatibilit&#233; PHP 7.4 maximum&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;a id=&#034;core&#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;Core&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Core'&gt;Core&lt;a class='sommaire-back sommaire-back-4' href='#s-Core' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Tri des items de navigation &amp; entr&#233;es favorites&lt;/strong&gt;&lt;br class='autobr' /&gt;
Le fonctionnement du plugin &#171; &lt;a href=&#034;https://contrib.spip.net/Menu-prive-alphabetique&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Menu priv&#233; alphab&#233;tique&lt;/a&gt; &#187; est int&#233;gr&#233; :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; les sous-menus de navigation (au survol des menus &#171; &#201;dition &#187;, &#171; Publication &#187;, &#171; Activit&#233; &#187;, ...) sont maintenant tri&#233;s par ordre alphab&#233;tique&lt;span class=&#034;spip_note_ref&#034;&gt; [&lt;a href=&#034;#nb2-1&#034; class=&#034;spip_note&#034; rel=&#034;appendix&#034; title=&#034;Auparavant, l'ordre pouvait d&#233;pendre d'une position souhait&#233;e, mais aussi de (&#8230;)&#034; id=&#034;nh2-1&#034;&gt;1&lt;/a&gt;]&lt;/span&gt;.&lt;/li&gt;&lt;li&gt; dans ses pr&#233;f&#233;rences personnelles, il est maintenant possible de cocher des entr&#233;es de menus &#171; favorites &#187;, qui s'afficheront alors en t&#234;te dans les sous-menus de navigation concern&#233;s.&lt;/li&gt;&lt;li&gt; si un sous-menu contient plus de 20 entr&#233;es, il est alors affich&#233; en 2 colonnes.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Simplification du &#171; cookie de correspondance &#187;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Le bouton pour activer ce cookie dans l'espace priv&#233; n'&#233;tait pas explicite. Par ailleurs, le cookie se d&#233;sactivait &#224; terme si un auteur se connectait r&#233;guli&#232;rement sur un m&#234;me site. La solution retenue est de supprimer la notion (et le bouton) de &#171; cookie de correspondance &#187;, et de cr&#233;er le cookie (dit d'admin) syst&#233;matiquement lorsqu'un auteur se loge et a les droits d'acc&#232;s &#224; l'espace priv&#233;. Le cookie d'admin est renouvel&#233; en m&#234;me temps que le cookie de session. Et s'enl&#232;ve en se d&#233;connectant.&lt;br class='autobr' /&gt;
Tickets associ&#233;s : &lt;a href=&#034;https://core.spip.net/issues/3740&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;#1740&lt;/a&gt;, &lt;a href=&#034;https://core.spip.net/issues/3710&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;#1710&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;D&#233;pendances des plugins &#224; des extensions PHP&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Il est maintenant possible d'indiquer dans un &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;paquet.xml&lt;/code&gt; qu'un plugin a besoin d'une extension PHP pour fonctionner. &lt;a href=&#034;https://core.spip.net/issues/3819&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Ticket #3829&lt;/a&gt;. Une erreur sera affich&#233;e dans le cas contraire &#224; l'activation du plugin. Syntaxe :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;xml&#034; class='spip_code spip_code_block language-xml' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;&lt;necessite nom=&#034;php:curl&#034; /&gt; &lt;necessite nom=&#034;php:xdebug&#034; compatibilite=&#034;[2.0.0;]&#034; /&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Formulaire&lt;/strong&gt;&lt;br class='autobr' /&gt;
La balise &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#FORMULAIRE_INSCRIPTION&lt;/code&gt; s'enrichie de deux nouvelles possibilit&#233;s :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; elle accepte un 3e argument pour indiquer la page vers laquelle on redirige la personne lorsqu'elle confirme son inscription ;&lt;/li&gt;&lt;li&gt; Il est possible de forcer l'utilisation du lien de confirmation contenu dans l'email.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Les explications d&#233;taill&#233;es dans l'article &lt;a href='https://www.spip.net/fr_article4590.html#inscription_spip32' class=&#034;spip_in&#034;&gt;FORMULAIRE_INSCRIPTION&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Crit&#232;res&lt;/strong&gt;&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; le crit&#232;re &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{par champ}&lt;/code&gt; a &#233;t&#233; r&#233;&#233;crit et tol&#232;re mieux les noms de champs provenant de tables de jointures, en harmonisant avec &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{par num champ}&lt;/code&gt; et &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{par multi champ}&lt;/code&gt; le fonctionnement. Des expressions &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{par expr champ}&lt;/code&gt; peuvent maintenant &#234;tre cr&#233;&#233;es sans surcharger tout le crit&#232;re, &#224; toutes fins utiles.&lt;/li&gt;&lt;li&gt; ajout de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{par sinum champ}&lt;/code&gt; qui met en premier les &#233;l&#233;ments ayant des num&#233;ros (hors &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;0.&lt;/code&gt;). Ainsi &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{par sinum titre, num titre, titre}&lt;/code&gt; mettra les titres avec des num&#233;ros avant ceux n'en ayant pas (contrairement &#224; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{par num titre, titre}&lt;/code&gt;), puis triera par num&#233;ro. Et contrairement &#224; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{par titre, num titre}&lt;/code&gt;, le num&#233;ro 100 sera bien plac&#233; apr&#232;s le num&#233;ro 20.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Pipelines&lt;/strong&gt;&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;strong&gt;formulaire_receptionner&lt;/strong&gt; : pipeline appel&#233; au moment o&#249; un formulaire est post&#233; par un visiteur, mais avant l'analyse des donn&#233;es post&#233;es par la fonction de v&#233;rification. &lt;a href=&#034;https://core.spip.net/projects/spip/repository/revisions/23308&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://core.spip.net/projects/spip/repository/revisions/23308&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Divers tickets&lt;/strong&gt;&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Inclusions, connect &amp; pagination (Tickets &lt;a href=&#034;https://core.spip.net/issues/3823&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;#3823&lt;/a&gt; et &lt;a href=&#034;https://core.spip.net/issues/3899&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;#3899&lt;/a&gt;) : les paginations ajax prennent en compte le param&#232;tre &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;connect&lt;/code&gt; qui &#233;tait utilis&#233;. Le &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;connect&lt;/code&gt; explicit&#233; sur une inclusion est prioritaire sur celui provenant de l'URL.&lt;/li&gt;&lt;li&gt; Limiter le nombre de fichiers de session d'un auteur (Ticket &lt;a href=&#034;https://core.spip.net/issues/3807&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;#3807&lt;/a&gt;)&lt;/li&gt;&lt;li&gt; Permettre d'envoyer un nouveau mot de passe &#224; un auteur depuis l'interface priv&#233;e (Ticket &lt;a href=&#034;https://core.spip.net/issues/2250&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;#2250&lt;/a&gt;)&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Fichiers supprim&#233;s&lt;/strong&gt;&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; ecrire/inc/aider.php (d&#233;plac&#233; dans plugins-dist/aide/inc/aide.php)&lt;/li&gt;&lt;li&gt; ecrire/inc/pclzip.php (d&#233;plac&#233; dans plugins-dist/archiviste/inc/pclzip.php)&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;D&#233;placements&lt;/strong&gt;&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; les filtres de dates sont maintenant dans inc/filtres_dates.php (d&#233;plac&#233;s depuis inc/filtres.php) (&lt;a href=&#034;https://core.spip.net/issues/3583&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Ticket #3583&lt;/a&gt;).&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Suppression&lt;/strong&gt;&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; les fonctions d&#233;pr&#233;ci&#233;es &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;afficher_plus()&lt;/code&gt;, &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;debut_cadre_couleur_foncee()&lt;/code&gt;, &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;fin_cadre_couleur_foncee()&lt;/code&gt; sont pass&#233;es dans le plugin Grenier.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;a id=&#034;plugins&#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;Plugins&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Plugins'&gt;Plugins&lt;a class='sommaire-back sommaire-back-4' href='#s-Plugins' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Aide&lt;/strong&gt;&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Nouveau plugin qui int&#232;gre la gestion de l'aide en ligne (fonctions d&#233;plac&#233;es depuis le Core ou plugin SVP)&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Archiviste&lt;/strong&gt;&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Nouveau plugin qui int&#232;gre la gestion des archives zip et tar (fonctions d&#233;plac&#233;es depuis le Core)&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Filtres Images&lt;/strong&gt;&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Suppression des fonctions et fichiers d&#233;pr&#233;ci&#233;s depuis SPIP 2.1 (&lt;a href=&#034;https://core.spip.net/issues/3601&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Ticket #3601&lt;/a&gt;). Les &#233;l&#233;ments ont &#233;t&#233; d&#233;plac&#233;s dans le plugin Grenier.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Grenier&lt;/strong&gt;&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Accueil des fonctions d&#233;pr&#233;ci&#233;es du plugin Filtres images.&lt;/li&gt;&lt;li&gt; Accueil des fonctions d&#233;pr&#233;ci&#233;es du Core&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;M&#233;dias&lt;/strong&gt;&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Int&#233;gration du plugin &lt;a href=&#034;https://contrib.spip.net/4859&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Minidoc&lt;/a&gt; dans le plugin m&#233;dias. Il permet diff&#233;rents affichages des listes de documents attach&#233;s aux objets &#233;ditoriaux. &lt;a href=&#034;https://core.spip.net/issues/3888&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Ticket #3888&lt;/a&gt;&lt;/li&gt;&lt;li&gt; Modification &#233;galement de la pr&#233;sentation par d&#233;faut de ces listes documents attach&#233;s&lt;/li&gt;&lt;li&gt; Int&#233;gration du plugin &lt;a href=&#034;https://contrib.spip.net/4860&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Ordoc&lt;/a&gt; dans le plugin m&#233;dias. &lt;a href=&#034;https://core.spip.net/issues/3887&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Ticket #3887&lt;/a&gt;. Il permet d'ordonner les listes de documents joints aux objets &#233;ditoriaux&lt;span class=&#034;spip_note_ref&#034;&gt; [&lt;a href=&#034;#nb2-2&#034; class=&#034;spip_note&#034; rel=&#034;appendix&#034; title=&#034;Pour les sites qui utilisaient le plugin Mosaique pour cela, un plugin de (&#8230;)&#034; id=&#034;nh2-2&#034;&gt;2&lt;/a&gt;]&lt;/span&gt;, et ajoute un champ &#034;rang_lien&#034; dans la table spip_documents_liens. Il devient alors possible d'utiliser des boucles telle que :&lt;br class='manualbr' /&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_docs(DOCUMENTS){id_article}{par rang_lien, num titre, titre, date}&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;.&lt;/p&gt;
&lt;/li&gt;&lt;li&gt; Changement de structure du code HTML attendu en retour du pipeline &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;afficher_metas_document&lt;/code&gt;, qui par ailleurs envoie le code HTML des d&#233;tails affich&#233;s pour le document plut&#244;t que rien par d&#233;faut, ce qui permet de compl&#233;ter la balise &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;table&gt;&lt;/code&gt; utilis&#233;e.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Mots&lt;/strong&gt;&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Ajout d'une administration avanc&#233;e sur les mots pour permettre de les fusionner ou de cr&#233;er des associations/dissociations par rapport &#224; un autre mot cl&#233; &lt;a href=&#034;https://zone.spip.org/trac/spip-zone/changeset/100448/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Commit 100448&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Organiseur&lt;/strong&gt;&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Mise &#224; jour de la librairie &lt;a href=&#034;https://fullcalendar.io/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;FullCalendar&lt;/a&gt; en version 3.5.1 (auparavant en version 1.6). Pour migrer si vous utilisiez cette librairie dans l'espace public, se reporter &#224; &lt;a href=&#034;https://fullcalendar.io/wiki/Upgrading-to-v2/&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://fullcalendar.io/wiki/Upgrading-to-v2/&lt;/a&gt; ou &lt;a href=&#034;https://fullcalendar.io/docs/&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://fullcalendar.io/docs/&lt;/a&gt;&lt;/li&gt;&lt;li&gt; Int&#233;gration de la librairie &lt;a href=&#034;http://momentjs.com/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Moment.js&lt;/a&gt; (n&#233;cessaire &#224; FullCalendar)&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Sites&lt;/strong&gt;&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Permettre de rechercher dans les articles syndiqu&#233;s sur un site. &lt;a href=&#034;https://core.spip.net/issues/3859&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Ticket #3859&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;SVP - Gestion des plugin&lt;/strong&gt;&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Prise en compte de l'affichage des erreurs de d&#233;pendances sur les extensions PHP. &lt;a href=&#034;https://core.spip.net/issues/3819&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Ticket #3819&lt;/a&gt;.&lt;/li&gt;&lt;li&gt; Affichage plus compr&#233;hensible des versions sur les erreurs de d&#233;pendances.&lt;/li&gt;&lt;li&gt; On peut maintenant t&#233;l&#233;charger un plugin sans l'activer. Dans ce cas on reste sur la page de recherche de plugin. &lt;a href=&#034;https://core.spip.net/issues/3471&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Ticket #3471&lt;/a&gt;&lt;/li&gt;&lt;li&gt; Afficher une barre de progression lors d'actions multiples (&#233;vite des erreurs de redirections). &lt;a href=&#034;https://core.spip.net/issues/3473&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Ticket #3473&lt;/a&gt;&lt;/li&gt;&lt;li&gt; Correction de l'absence de confirmation des actions lorsque des actions suppl&#233;mentaires sont ajout&#233;es automatiquement par SVP (par exemple activer ou d&#233;sactiver des d&#233;pendances).&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;inc/pcltar.php&lt;/code&gt; et &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;lib/pcltar/&lt;/code&gt; d&#233;plac&#233;s dans le plugin Archiviste.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;URL &#201;tendues&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Les URLs Arborescentes (principalement) peuvent g&#233;rer du multilinguisme (champs multis sur les rubriques par exemple) et des parents multiples (polyhi&#233;rarchie).&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Tol&#233;rer plusieurs parents pour un objet. &lt;a href=&#034;https://zone.spip.org/trac/spip-zone/changeset/100814&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Commit 100814&lt;/a&gt;&lt;/li&gt;&lt;li&gt; Ajout d'un champ &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;langue&lt;/code&gt; sur la table &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;spip_urls&lt;/code&gt;. &lt;a href=&#034;https://zone.spip.org/trac/spip-zone/changeset/100835&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Commit 100835&lt;/a&gt;&lt;/li&gt;&lt;li&gt; Il est possible de d&#233;finir une URL sp&#233;cifique pour une certaine langue langue sur un objet &#233;ditorial en &#233;ditant l'URL. Pour ce faire, dans le champ de saisie, indiquer &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;[code langue]:[url propre]&lt;/code&gt; tel que &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;en:movies&lt;/code&gt; et &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;fr:videos&lt;/code&gt;. &lt;a href=&#034;https://zone.spip.org/trac/spip-zone/changeset/100835&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Commit 100835&lt;/a&gt;&lt;/li&gt;&lt;li&gt; La d&#233;claration du &#171; type &#187; pr&#233;fixant &#233;ventuellement l'URL d'un objet dans les URLs arborescentes (exemple : 'mot' dans &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;mot/titre_du_mot&lt;/code&gt;) peut recevoir une &#233;criture &#224; base de balise multi pour que le terme soit traduit en fonction de la langue &lt;a href=&#034;https://zone.spip.org/trac/spip-zone/changeset/100836&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Commit 100836&lt;/a&gt;&lt;/li&gt;&lt;li&gt; Les URLs arborescentes peuvent g&#233;rer du multilinguisme, en ajoutant le code de langue dans l'URL, activable par la constante &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;_url_arbo_multilang&lt;/code&gt;. &lt;a href=&#034;https://zone.spip.org/trac/spip-zone/changeset/100844&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Commit 100844&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;nb2-1&#034;&gt;
&lt;p&gt;&lt;span class=&#034;spip_note_ref&#034;&gt;[&lt;a href=&#034;#nh2-1&#034; class=&#034;spip_note&#034; title=&#034;Notes 2-1&#034; rev=&#034;appendix&#034;&gt;1&lt;/a&gt;] &lt;/span&gt;Auparavant, l'ordre pouvait d&#233;pendre d'une position souhait&#233;e, mais aussi de l'ordre dont s'activaient les plugins&lt;/p&gt;
&lt;/div&gt;&lt;div id=&#034;nb2-2&#034;&gt;
&lt;p&gt;&lt;span class=&#034;spip_note_ref&#034;&gt;[&lt;a href=&#034;#nh2-2&#034; class=&#034;spip_note&#034; title=&#034;Notes 2-2&#034; rev=&#034;appendix&#034;&gt;2&lt;/a&gt;] &lt;/span&gt;Pour les sites qui utilisaient le plugin &lt;a href=&#034;https://contrib.spip.net/4232&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Mosaique&lt;/a&gt; pour cela, un &lt;a href=&#034;https://contrib.spip.net/4864&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;plugin de migration&lt;/a&gt; existe&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Les it&#233;rateurs de SPIP - la boucle (DATA)</title>
		<link>https://www.spip.net/fr_article5444.html</link>
		<guid isPermaLink="true">https://www.spip.net/fr_article5444.html</guid>
		<dc:date>2012-05-19T09:30:50Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Fil, Matthieu Marcillaud</dc:creator>


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

		<description>
&lt;p&gt;SPIP 3.0 a apport&#233; une notion g&#233;n&#233;rale de boucle, bas&#233;e sur les it&#233;rateurs de PHP. &lt;br class='autobr' /&gt; Les boucles (DATA) ne portent plus exclusivement sur des requ&#234;tes SQL, mais elles peuvent tourner sur toutes sortes de listes de donn&#233;es. &lt;br class='autobr' /&gt;
Par exemple : un tableau de donn&#233;es produit par une fonction quelconque (dont les it&#233;rateurs PHP) le contenu d'un fichier local au format XML, CSV, JSON, YAML, etc. une liste de fichiers dans un r&#233;pertoire du serveur une requ&#234;te sur un webservice une requ&#234;te SQL (telle (&#8230;)&lt;/p&gt;


-
&lt;a href="https://www.spip.net/fr_rubrique702.html" rel="directory"&gt;Les it&#233;rateurs&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_chapo'&gt;&lt;p&gt;SPIP 3.0 a apport&#233; une notion g&#233;n&#233;rale de boucle, bas&#233;e sur les it&#233;rateurs de PHP.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;!--sommaire--&gt;&lt;div class=&#034;well nav-sommaire nav-sommaire-5&#034; id=&#034;nav69e3a65ed67d09.59850891&#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-Syntaxe-et-formats-de-la-boucle&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Syntaxe-et-formats-de-la-boucle&#034; class=&#034;spip_ancre&#034;&gt;Syntaxe et formats de la boucle &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;(DATA)&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Filtrage-tri-pagination-fusion&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Filtrage-tri-pagination-fusion&#034; class=&#034;spip_ancre&#034;&gt;Filtrage, tri, pagination, fusion&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Le-critere&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Le-critere&#034; class=&#034;spip_ancre&#034;&gt;Le crit&#232;re &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{liste ...}&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Le-critere-13aa&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Le-critere-13aa&#034; class=&#034;spip_ancre&#034;&gt;Le crit&#232;re &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{enum ...}&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Protection-des-donnees-manipulees-par-les-iterateurs&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Protection-des-donnees-manipulees-par-les-iterateurs&#034; class=&#034;spip_ancre&#034;&gt;Protection des donn&#233;es manipul&#233;es par les it&#233;rateurs&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;!--/sommaire--&gt;&lt;p&gt;Les boucles (DATA) ne portent plus exclusivement sur des requ&#234;tes SQL&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;Sans surprise, l'it&#233;rateur classique de SPIP s'appelle SQL : il ex&#233;cute la (&#8230;)&#034; id=&#034;nh3-1&#034;&gt;1&lt;/a&gt;]&lt;/span&gt;, mais elles peuvent tourner sur toutes sortes de listes de donn&#233;es.&lt;/p&gt;
&lt;p&gt;Par exemple :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; un tableau de donn&#233;es produit par une fonction quelconque (dont les it&#233;rateurs PHP)&lt;/li&gt;&lt;li&gt; le contenu d'un fichier local au format XML, CSV, JSON, YAML, etc.&lt;/li&gt;&lt;li&gt; une liste de fichiers dans un r&#233;pertoire du serveur&lt;/li&gt;&lt;li&gt; une requ&#234;te sur un webservice&lt;/li&gt;&lt;li&gt; une requ&#234;te SQL (telle que calcul&#233;e par SPIP, par ex.)&lt;/li&gt;&lt;li&gt; etc. (LDAP...).&lt;/li&gt;&lt;/ul&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau1 sommaire-section_h2&#034; aria-labelledby=&#034;Syntaxe-et-formats-de-la-boucle&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Syntaxe-et-formats-de-la-boucle'&gt;Syntaxe et formats de la boucle &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;(DATA)&lt;/code&gt;&lt;a class='sommaire-back sommaire-back-5' href='#s-Syntaxe-et-formats-de-la-boucle' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;C'est une boucle capable d'it&#233;rer n'importe quel tableau de donn&#233;es. Sa syntaxe de base 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_exemple(DATA){source format, donn&#233;es}&gt; #BALISES &lt;/BOUCLE_exemple&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;La d&#233;finition d'une source de donn&#233;es n&#233;cessite deux &#233;l&#233;ments :&lt;/p&gt;
&lt;p&gt;&#8212; &lt;strong&gt;La partie &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;donn&#233;es&lt;/code&gt;&lt;/strong&gt; : cet &#233;l&#233;ment peut &#234;tre de plusieurs natures :
&lt;br /&gt;- un tableau de donn&#233;es, par exemple &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#ENV*&lt;/code&gt;
&lt;br /&gt;- le chemin d'un fichier sur le disque dur, ex : &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;sources/definitions.csv&lt;/code&gt;
&lt;br /&gt;- l'URL d'un fichier ou d'un webservice, ex : &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;http://per.sonn.es/bases/phobia.fr.yaml&lt;/code&gt;
&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;&#8212; &lt;strong&gt;La partie &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;format&lt;/code&gt;&lt;/strong&gt; est &#224; prendre dans la liste ci-dessous :
&lt;br /&gt;- &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;table&lt;/code&gt; (alias &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;array&lt;/code&gt; ou &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;tableau&lt;/code&gt;), pour un tableau d&#233;j&#224; cr&#233;&#233;
&lt;br /&gt;- &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;csv&lt;/code&gt;, &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;json&lt;/code&gt;, &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;yaml&lt;/code&gt; pour un fichier compos&#233; dans l'un de ces formats
&lt;br /&gt;- &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;file&lt;/code&gt; pour boucler sur les lignes d'un fichier
&lt;br /&gt;- &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;glob&lt;/code&gt; ou &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;pregfiles&lt;/code&gt; pour boucler sur les fichiers d'un r&#233;pertoire (et plus...)
&lt;br /&gt;- &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;rss&lt;/code&gt; (alias &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;atom&lt;/code&gt;) pour lire un flux de nouvelles
&lt;br /&gt;- &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;plugins&lt;/code&gt; pour lister les plugins actifs sur le site
&lt;br /&gt;- &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;yql&lt;/code&gt; pour envoyer une requ&#234;te sur le webservice de Yahoo Query Language
&lt;br /&gt;- &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;sql&lt;/code&gt; pour envoyer une requ&#234;te brute au serveur SQL . Attention dans ce cas : 1) la cha&#238;ne sp&#233;cifiant la requ&#234;te ne doit pas contenir de fins de lignes 2) utiliser la syntaxe &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{source sql, connecteur:requete}&lt;/code&gt; pour envoyer la requ&#234;te sur une base externe &lt;br /&gt;- &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;ics&lt;/code&gt; pour boucler sur des calendriers (n&#233;cessite le plugin &lt;i&gt;icalendar&lt;/i&gt; : lire &lt;a href=&#034;http://contrib.spip.net/Plugin-iCalendar&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Plugin iCalendar&lt;/a&gt;)
&lt;br /&gt;- etc.&lt;/p&gt;
&lt;p&gt;Tous ces formats sont d&#233;j&#224; disponibles, et il est tr&#232;s ais&#233; d'en ajouter un nouveau, en cr&#233;ant une simple fonction &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;inc_FORMAT_to_array($u)&lt;/code&gt;. A titre d'exemple voici la fonction qui transforme un fichier JSON en tableau de donn&#233;es :&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 inc_json_to_array_dist($u) { if (is_array($json = json_decode($u)) OR is_object($json)) return (array) $json; } &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On peut d&#233;clarer une nouvelle boucle DATA dans un fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;inc/ma_source_to_array.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;function inc_ma_source_to_array_dist($data,$param1='',$param2='') { // $data contient le contenu du fichier (local | distant) ou bien la valeur de la variable pass&#233;e dans le crit&#232;re. // $param1, $param2... sont des param&#232;tres facultatifs ... } &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;et l'afficher ensuite :&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_exemple(DATA){source ma_source,test}&gt; #VALEUR &lt;/BOUCLE_exemple&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Cache :&lt;/strong&gt; &lt;br /&gt;- Le crit&#232;re &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{datacache 3600}&lt;/code&gt; permet de sp&#233;cifier la dur&#233;e pendant laquelle le r&#233;sultat d'une boucle DATA est enregistr&#233; en cache. On peut donc d&#233;sactiver tout cache avec le crit&#232;re &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{datacache 0}&lt;/code&gt;
&lt;br /&gt;- Voir &lt;a href=&#034;https://programmer.spip.net/1012&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;plus d'infos sur les caches des boucles DATA&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;Filtrage-tri-pagination-fusion&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Filtrage-tri-pagination-fusion'&gt; Filtrage, tri, pagination, fusion &lt;a class='sommaire-back sommaire-back-5' href='#s-Filtrage-tri-pagination-fusion' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Filtres.&lt;/strong&gt; Comme les boucles SQL, les boucles &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;(DATA)&lt;/code&gt; peuvent &#234;tre filtr&#233;es par des crit&#232;res du type &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;=&lt;/code&gt;, &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&gt;&lt;/code&gt;, &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;&lt;/code&gt;, &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&gt;=&lt;/code&gt;, &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;=&lt;/code&gt;, &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;==&lt;/code&gt; (expression rationnelle) et &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;LIKE&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Cependant ce filtrage s'effectue non pas en amont lors de la requ&#234;te, comme en SQL, mais en aval, sur le tableau de donn&#233;es initialement r&#233;cup&#233;r&#233;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tris.&lt;/strong&gt; Les tris &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{par xx}&lt;/code&gt; sont &#233;galement possibles, avec leur variante &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{!par xx}&lt;/code&gt; pour trier en ordre inverse.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pagination.&lt;/strong&gt; La pagination fonctionne normalement, ainsi que le crit&#232;re &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{offset,limite}&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fusion.&lt;/strong&gt; Le crit&#232;re &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{fusion /x/y}&lt;/code&gt; fonctionne aussi. Par exemple, pour un fichier d'adresses au format CSV, si l'email est le champ n&#176; 3, on pourra ne retenir qu'un seul enregistrement par email avec la boucle 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_csv(DATA){source csv, adresses.csv}{fusion /3}{par /0}{'&lt;br&gt;'}&gt; #VALEUR{0} : #VALEUR{3} &lt;/BOUCLE_csv&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;La fusion se fait apr&#232;s le tri, et retient le premier &#233;l&#233;ment rencontr&#233;. De cette mani&#232;re, si un tableau est trie &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{!par date}&lt;/code&gt; puis fusionn&#233; sur l'email, l'enregistrement retenu pour chaque email sera le plus r&#233;cent.&lt;/p&gt;
&lt;/section&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau1 sommaire-section_h2&#034; aria-labelledby=&#034;Le-critere&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Le-critere'&gt; Le crit&#232;re &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{liste ...}&lt;/code&gt; &lt;a class='sommaire-back sommaire-back-5' href='#s-Le-critere' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Pour simplifier l'&#233;criture de tableaux de donn&#233;es, lorsqu'il s'agit d'une simple liste d'&#233;l&#233;ments qu'on veut indiquer manuellement, la boucle &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;(DATA)&lt;/code&gt; accepte le crit&#232;re &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{liste ...}&lt;/code&gt;, qui permet de constituer un tableau de donn&#233;es en s&#233;parant celles-ci par des virgules.&lt;/p&gt;
&lt;p&gt;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;&lt;BOUCLE_i(DATA){liste 3,4,5}{&#034;&lt;br&gt;&#034;}&gt; &lt;BOUCLE_j(DATA){liste 6,7,8}{&#034; &#034;}&gt; [(#VALEUR|mult{#_i:VALEUR})] &lt;/BOUCLE_j&gt; &lt;/BOUCLE_i&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;R&#233;sultat :&lt;/p&gt;
&lt;blockquote class=&#034;spip&#034;&gt;
&lt;p&gt; 18 21 24 &lt;br&gt; 24 28 32 &lt;br&gt; 30 35 40 &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;i&gt;A noter :&lt;/i&gt; on a utilis&#233; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#_i:VALEUR&lt;/code&gt; pour r&#233;f&#233;rencer dans la boucle &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;j&lt;/code&gt; la valeur calcul&#233;e par la boucle &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;i&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Voir aussi &lt;a href='https://www.spip.net/fr_article5509.html' class=&#034;spip_in&#034;&gt;Deux it&#233;rateurs simples : les listes et les &#233;num&#233;rations&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;Le-critere-13aa&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Le-critere-13aa'&gt; Le crit&#232;re &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{enum ...}&lt;/code&gt; &lt;a class='sommaire-back sommaire-back-5' href='#s-Le-critere-13aa' 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_enumere(DATA){enum 2,10,2}&gt; #VALEUR &lt;/BOUCLE_enumere&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;R&#233;sultat :&lt;/p&gt;
&lt;blockquote class=&#034;spip&#034;&gt;
&lt;p&gt; 2 4 6 8 10 &lt;/p&gt;
&lt;/blockquote&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_enum(DATA){enum g,m}{&#034;, &#034;}&gt; #VALEUR &lt;/BOUCLE_enum&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;R&#233;sultat :&lt;/p&gt;
&lt;blockquote class=&#034;spip&#034;&gt;
&lt;p&gt; g, h, i, j, k, l, m &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;val1&lt;/code&gt; et &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;val2&lt;/code&gt; sont 2 valeurs num&#233;riques, ou bien 2 caract&#232;res. SPIP d&#233;terminant laquelle des 2 valeurs est la plus petite, cette boucle va &#233;num&#233;rer les valeurs entre &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;val1&lt;/code&gt; et &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;val2&lt;/code&gt;. Dans la premi&#232;re forme, le pas n'est pas pr&#233;cis&#233; : il vaut 1 par d&#233;faut.&lt;/p&gt;
&lt;p&gt;Voir aussi &lt;a href='https://www.spip.net/fr_article5509.html' class=&#034;spip_in&#034;&gt;Deux it&#233;rateurs simples : les listes et les &#233;num&#233;rations&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;Protection-des-donnees-manipulees-par-les-iterateurs&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Protection-des-donnees-manipulees-par-les-iterateurs'&gt;Protection des donn&#233;es manipul&#233;es par les it&#233;rateurs&lt;a class='sommaire-back sommaire-back-5' href='#s-Protection-des-donnees-manipulees-par-les-iterateurs' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;La boucle &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;(DATA)&lt;/code&gt; prot&#232;ge automatiquement toutes les balises qui sont &#224; l'int&#233;rieur, car les donn&#233;es qu'on y manipule sont en g&#233;n&#233;ral de provenance inconnue et potentiellement dangereuse. Cela impacte aussi les balises des formulaires (&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#FORMULAIRE_xx&lt;/code&gt;) qu'il faut donc utiliser avec un * comme expliqu&#233; dans l'&lt;a href=&#034;https://www.spip.net/fr_article4376.html#Balises---toil--es&#034;&gt;article sur les balises &#233;toil&#233;es&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;&lt;BOUCLE_foreach_protege(DATA){liste a,b,c,d,e}&gt; #FORMULAIRE_XXX*{#VALEUR} &lt;/BOUCLE_foreach_protege&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;i&gt;A noter : si vous utilisez le plugin &#034;Bonux&#034;, il suffira d'utiliser une boucle &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;(POUR)&lt;/code&gt;, qui elle n'a pas ce comportement.&lt;/i&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_Foreach_non_protege(POUR){liste a,b,c,d,e}&gt; #FORMULAIRE_XXX{#VALEUR} &lt;/BOUCLE_Foreach_protege&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lire la suite&lt;/strong&gt; : r&#233;galez-vous avec &lt;a href='https://www.spip.net/fr_article5443.html' class=&#034;spip_in&#034;&gt;des exemples de boucles &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;(DATA)&lt;/code&gt;&lt;/a&gt; !&lt;/p&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;Sans surprise, l'it&#233;rateur classique de SPIP s'appelle SQL : il ex&#233;cute la requ&#234;te telle que SPIP l'a calcul&#233;e, et sait parcourir la liste de r&#233;sultats pour les envoyer &#224; la boucle.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Configurer une fonctionnalit&#233; de votre site, ou un plugin</title>
		<link>https://www.spip.net/fr_article5414.html</link>
		<guid isPermaLink="true">https://www.spip.net/fr_article5414.html</guid>
		<dc:date>2011-12-13T07:40:48Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>JLuc, Matthieu Marcillaud, severo</dc:creator>


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

		<description>
&lt;p&gt;La configuration d'une fonctionnalit&#233; ou d'un plugin consiste &#224; d&#233;finir des valeurs pour ses diff&#233;rents param&#232;tres. Il faut donc pour cela d&#233;finir un formulaire et pouvoir acc&#233;der aux valeurs des param&#232;tres, partout dans vos squelettes. &lt;br class='autobr' /&gt;
Les formulaires CVT permettent aussi, simplement, de cr&#233;er une page de configuration pour une fonctionnalit&#233; de votre site, ou pour la configuration d'un plugin. &lt;br class='autobr' /&gt;
Un mode de configuration est int&#233;gr&#233; &#224; SPIP. &lt;br class='autobr' /&gt; Formulaire de configuration &lt;br class='autobr' /&gt;
Supposons que (&#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;, 
&lt;a href="https://www.spip.net/@spip30" rel="tag"&gt;SPIP 3.0&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;La configuration d'une fonctionnalit&#233; ou d'un plugin consiste &#224; d&#233;finir des valeurs pour ses diff&#233;rents param&#232;tres. Il faut donc pour cela d&#233;finir un formulaire et pouvoir acc&#233;der aux valeurs des param&#232;tres, partout dans vos squelettes.&lt;/p&gt;
&lt;p&gt;Les formulaires CVT permettent aussi, simplement, de cr&#233;er une page de configuration pour une fonctionnalit&#233; de votre site, ou pour la configuration d'un plugin.&lt;/p&gt;
&lt;p&gt;Un mode de configuration est int&#233;gr&#233; &#224; SPIP.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;!--sommaire--&gt;&lt;div class=&#034;well nav-sommaire nav-sommaire-6&#034; id=&#034;nav69e3a65ed940f4.77896495&#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-Formulaire-de-configuration&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Formulaire-de-configuration&#034; class=&#034;spip_ancre&#034;&gt;Formulaire de configuration&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Configuration-d-un-plugin&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Configuration-d-un-plugin&#034; class=&#034;spip_ancre&#034;&gt;Configuration d'un plugin&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Acceder-aux-valeurs-configurees&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Acceder-aux-valeurs-configurees&#034; class=&#034;spip_ancre&#034;&gt;Acc&#233;der aux valeurs configur&#233;es&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Autorisations&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Autorisations&#034; class=&#034;spip_ancre&#034;&gt;Autorisations&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Personnaliser-les-traitements&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Personnaliser-les-traitements&#034; class=&#034;spip_ancre&#034;&gt;Personnaliser les traitements&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Utiliser-une-autre-table-pour-stocker-les-valeurs-configurees&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Utiliser-une-autre-table-pour-stocker-les-valeurs-configurees&#034; class=&#034;spip_ancre&#034;&gt;Utiliser une autre table pour stocker les valeurs configur&#233;es&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;Formulaire-de-configuration&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Formulaire-de-configuration'&gt;Formulaire de configuration &lt;a class='sommaire-back sommaire-back-6' href='#s-Formulaire-de-configuration' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Supposons que vous ayez une fonctionnalit&#233; &#034;truc&#034; &#224; configurer.&lt;/p&gt;
&lt;ol class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; cr&#233;ez un formulaire CVT dont le nom commence par &#171; configurer_ &#187;, avec juste le fichier HTML et sans le PHP (et donc sans d&#233;finir les fonctions charger, verifier et traiter)&lt;span class=&#034;spip_note_ref&#034;&gt; [&lt;a href=&#034;#nb4-1&#034; class=&#034;spip_note&#034; rel=&#034;appendix&#034; title=&#034;Pour simplifier encore la cr&#233;ation de ce formulaire, il est possible (&#8230;)&#034; id=&#034;nh4-1&#034;&gt;1&lt;/a&gt;]&lt;/span&gt;.&lt;/li&gt;&lt;li&gt; cr&#233;ez une page &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;configurer_truc.html&lt;/code&gt; dans &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;prive/squelettes/contenu/&lt;/code&gt;, &#224; l'int&#233;rieur de votre plugin ou de votre r&#233;pertoire squelettes. Dedans, appelez le formulaire avec simplement &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#FORMULAIRE_CONFIGURER_TRUC&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;C'est tout !&lt;/p&gt;
&lt;/section&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau1 sommaire-section_h2&#034; aria-labelledby=&#034;Configuration-d-un-plugin&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Configuration-d-un-plugin'&gt;Configuration d'un plugin&lt;a class='sommaire-back sommaire-back-6' href='#s-Configuration-d-un-plugin' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Lorsqu'un plugin dispose d'une page de configuration, une option &#034;Configurer&#034; amenant &#224; cette page appara&#238;t automatiquement dans la ligne pr&#233;sentant ce plugin dans la page d'administration des plugins.&lt;/p&gt;
&lt;p&gt;Cette page est d&#233;finie par le squelette &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;prive/squelettes/contenu/configurer_prefixeplugin.html&lt;/code&gt; et fait le plus souvent appel &#224; un formulaire de configuration.&lt;/p&gt;
&lt;p&gt;Exemple : Pour le plugin 'mediabox', le fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;prive/squelettes/contenu/configurer_mediabox.html&lt;/code&gt; contient :&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;[(#AUTORISER{configurer,mediabox}|oui) &lt;h1&gt;&lt;:mediabox:titre_page_configurer_box:&gt;&lt;/h1&gt; &lt;div class=&#034;ajax&#034;&gt; #FORMULAIRE_CONFIGURER_MEDIABOX &lt;/div&gt; ] &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Si vous souhaitez qu'une entr&#233;e apparaisse &#233;galement dans les menus de la partie priv&#233;e pour vous donner un acc&#232;s direct &#224; cette page de configuration, ajoutez une entr&#233;e &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;menu&gt;&lt;/code&gt; dans le &lt;a href=&#034;https://plugins.spip.net/redaction-du-paquet-xml.html&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;fichier paquet.xml&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Exemple :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;xml&#034; class='spip_code spip_code_block language-xml' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;&lt;menu nom=&#034;truc&#034; titre=&#034;prefixeplugin:itemdelangue_truc&#034; parent=&#034;bando_configuration&#034; icone=&#034;images/truc-16.png&#034; /&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Pour initialiser la valeur d'une configuration (param&#232;tre &#034;a_la_une&#034;, par exemple) lors de la cr&#233;ation ou de la mise &#224; jour du plugin, ajouter, dans le pipeline monplugin_upgrade() :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; lors de la cr&#233;ation :
&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;$maj['create'] = array( array('ecrire_config','monplugin/a_la_une', '3'), ); &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt; lors d'une mise &#224; jour :
&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;$maj['0.1'] = array( array('ecrire_config','monplugin/a_la_une', '3'), ); &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Pour effacer la valeur lors de la d&#233;sinstallation du plugin, ajouter, dans le pipeline monplugin_vider_tables() :&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;effacer_config(&#034;monplugin/a_la_une&#034;); &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;Acceder-aux-valeurs-configurees&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Acceder-aux-valeurs-configurees'&gt;Acc&#233;der aux valeurs configur&#233;es&lt;a class='sommaire-back sommaire-back-6' href='#s-Acceder-aux-valeurs-configurees' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Dans un squelette&lt;/strong&gt;, on acc&#232;de &#224; la valeur d'une configuration au moyen de la balise &lt;a href='https://www.spip.net/fr_article4335.html' class=&#034;spip_in&#034;&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#CONFIG&lt;/code&gt;&lt;/a&gt; (par exemple &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#CONFIG{monplugin/a_la_une}&lt;/code&gt;)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;En php&lt;/strong&gt; on acc&#233;dera en lecture aux valeurs avec la fonction &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;lire_config&lt;/code&gt; avec &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;lire_config('monplugin/a_la_une')&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;En &#233;criture, on utilisera la fonction &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;ecrire_config&lt;/code&gt; :&lt;br class='autobr' /&gt;
&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;ecrire_config('monplugin/a_la_une', 3)&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;Autorisations&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Autorisations'&gt;Autorisations&lt;a class='sommaire-back sommaire-back-6' href='#s-Autorisations' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Tous les internautes n'ont pas acc&#232;s &#224; la page de configuration. Par d&#233;faut, seuls les administrateurs ont cette possibilit&#233;, mais vous pouvez red&#233;finir les droits d'acc&#232;s &#224; votre formulaire de configuration. Utilisez pour cela l'API php &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;autoriser&lt;/code&gt;, ainsi que la balise &lt;a href='https://www.spip.net/fr_article3896.html' class=&#034;spip_in&#034;&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#AUTORISER&lt;/code&gt;&lt;/a&gt; et le filtre &lt;a href='https://www.spip.net/fr_article5668.html' class=&#034;spip_in&#034;&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;sinon_interdire_acces&lt;/code&gt;&lt;/a&gt; pour votre squelette de formulaire.&lt;/p&gt;
&lt;p&gt;Exemple : &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;[(#AUTORISER{configurer,mediabox}|sinon_interdire_acces)]&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;Personnaliser-les-traitements&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Personnaliser-les-traitements'&gt;Personnaliser les traitements&lt;a class='sommaire-back sommaire-back-6' href='#s-Personnaliser-les-traitements' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Parfois, on a besoin de faire d'autres traitements pr&#233;cis lorsque des valeurs de configuration sont chang&#233;es. Dans ce cas il faut ajouter la fonction &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;traiter()&lt;/code&gt; habituelle de l'API CVT, et appeler la fonction commune qui s'occupe de traiter les configurations :&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_configurer_monplugin_traiter_dist() { include_spip('inc/cvt_configurer'); $retours = array(); // On enregistre la nouvelle configuration $trace = cvtconf_formulaires_configurer_enregistre('configurer_monplugin', array()); // Traitements personnalis&#233;s // &#8230; $retours['message_ok'] = _T('config_info_enregistree') . $trace; $retours['editable'] = true; return $retours; } &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;Utiliser-une-autre-table-pour-stocker-les-valeurs-configurees&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Utiliser-une-autre-table-pour-stocker-les-valeurs-configurees'&gt;Utiliser une autre table pour stocker les valeurs configur&#233;es&lt;a class='sommaire-back sommaire-back-6' href='#s-Utiliser-une-autre-table-pour-stocker-les-valeurs-configurees' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Par d&#233;faut, les valeurs configur&#233;es sont stock&#233;es la table &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;spip_meta&lt;/code&gt;, et l'int&#233;gralit&#233; de cette table est charg&#233;e en m&#233;moire &#224; chaque hit. Il est toutefois possible d'utiliser une autre table pour stocker les valeurs configur&#233;es.&lt;/p&gt;
&lt;p&gt;Par exemple, pour utiliser la table meta_monplugin, il faut ajouter la ligne suivante dans le formulaire de configuration :&lt;/p&gt;
&lt;p&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;input type=&#034;hidden&#034; name=&#034;_meta_table&#034; value=&#034;meta_monplugin&#034; /&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Puis, pour acc&#233;der aux valeurs enregistr&#233;es dans cette table, indiquer le nom de la table pr&#233;fix&#233; par un / au d&#233;but de l'argument de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;lire_config&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;ecrire_config('/meta_monplugin/descriptif', 'blah'); lire_config('/meta_monplugin/argument'); &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Outre &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;_meta_table&lt;/code&gt;, le nom de la table o&#249; stocker les valeurs configur&#233;es, il existe 3 autres variables utiles pour varier l'endroit ou la m&#233;thode d'enregistrement de la configuration :&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;_meta_casier&lt;/code&gt; : nom du &#034;casier&#034; dans lequel s&#233;rialiser (par d&#233;faut c'est le xx de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;formulaire_configurer_xx&lt;/code&gt;)&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;_meta_prefixe&lt;/code&gt; : pr&#233;fixer les &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;meta&lt;/code&gt; (alternative au casier) dans la table des meta (pas de pr&#233;fixe par d&#233;faut)&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;_meta_stockage&lt;/code&gt; : utiliser une m&#233;thode externe de stockage. Aucune n'est fournie par le core.&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;nb4-1&#034;&gt;
&lt;p&gt;&lt;span class=&#034;spip_note_ref&#034;&gt;[&lt;a href=&#034;#nh4-1&#034; class=&#034;spip_note&#034; title=&#034;Notes 4-1&#034; rev=&#034;appendix&#034;&gt;1&lt;/a&gt;] &lt;/span&gt;Pour simplifier encore la cr&#233;ation de ce formulaire, il est possible d'utiliser le plugin &lt;a href=&#034;https://contrib.spip.net/Formulaire-de-configuration-avec-le-plugin-Saisies&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Saisies&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Mutualisation : un SPIP pour plusieurs sites</title>
		<link>https://www.spip.net/fr_article3811.html</link>
		<guid isPermaLink="true">https://www.spip.net/fr_article3811.html</guid>
		<dc:date>2010-07-08T22:30:11Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Committo, Ergo Sum., Matthieu Marcillaud</dc:creator>



		<description>&lt;p&gt;Proc&#233;dure pour partager le noyau de SPIP entre plusieurs sites.&lt;/p&gt;

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


		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;Partager les fichiers de SPIP entre plusieurs sites, ce que l'on appelle une mutualisation, permet un gain d'espace disque important, ainsi qu'une possibilit&#233; de mise &#224; jour de SPIP simple de l'ensemble des sites en ne mettant &#224; jour que le noyau.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;!--sommaire--&gt;&lt;div class=&#034;well nav-sommaire nav-sommaire-8&#034; id=&#034;nav69e3a65edb34c4.00555645&#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-Le-concept&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Le-concept&#034; class=&#034;spip_ancre&#034;&gt;Le concept...&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Initialisation-de-la-mutualisation&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Initialisation-de-la-mutualisation&#034; class=&#034;spip_ancre&#034;&gt;Initialisation de la mutualisation&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Mutualiser-des-domaines-ou-des-sous-domaines&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Mutualiser-des-domaines-ou-des-sous-domaines&#034; class=&#034;spip_ancre&#034;&gt;Mutualiser des domaines ou des sous-domaines&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Mutualiser-les-repertoires-d-un-domaine&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Mutualiser-les-repertoires-d-un-domaine&#034; class=&#034;spip_ancre&#034;&gt;Mutualiser les r&#233;pertoires d'un domaine&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Prefixe-des-tables&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Prefixe-des-tables&#034; class=&#034;spip_ancre&#034;&gt;Pr&#233;fixe des tables&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Fichier-config-mes_options-php&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Fichier-config-mes_options-php&#034; class=&#034;spip_ancre&#034;&gt;Fichier config/mes_options.php&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Configurer-Apache-pour-les-domaines-et-sous-domaines&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Configurer-Apache-pour-les-domaines-et-sous-domaines&#034; class=&#034;spip_ancre&#034;&gt;Configurer Apache pour les domaines et sous-domaines&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Note-sur-les-sauvegardes-et-les-restaurations&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Note-sur-les-sauvegardes-et-les-restaurations&#034; class=&#034;spip_ancre&#034;&gt;Note sur les sauvegardes et les restaurations&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;!--/sommaire--&gt;&lt;p&gt;SPIP permet de mutualiser ses fichiers. &lt;br class='autobr' /&gt;
(les restaurations peuvent se r&#233;aliser d'un SPIP &#224; l'autre comme s'il n'&#233;tait pas mutualis&#233;).&lt;/p&gt;
&lt;section class=&#034;sommaire-section sommaire-section_niveau1 sommaire-section_h2&#034; aria-labelledby=&#034;Le-concept&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Le-concept'&gt;Le concept...&lt;a class='sommaire-back sommaire-back-8' href='#s-Le-concept' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Les dossiers n&#233;cessaires au fonctionnement du noyau SPIP (ecrire, prive, squelettes-dist), et ceux marquant l'activit&#233; d'un site (config, IMG, tmp, local) sont clairement identifiables et s&#233;par&#233;s. &lt;br class='autobr' /&gt;
C'est cette s&#233;paration qui permet d'avoir plusieurs sites SPIP autonomes pour un m&#234;me noyau de SPIP.&lt;/p&gt;
&lt;p&gt;Cette autonomie repose sur quatre r&#233;pertoires par site dans lesquels SPIP va &#233;crire les donn&#233;es r&#233;sultant de l'activit&#233; du site. On distingue les donn&#233;es temporaires et permanentes d'une part, et les donn&#233;es accessibles par HTTP et celles qui ne le sont pas d'autre part. Les deux r&#233;pertoires inaccessibles par HTTP seront prot&#233;g&#233;s par un .htaccess install&#233; automatiquement par SPIP (les administrateurs du serveur peuvent mettre ces r&#233;pertoires en dehors de l'arborescence servie par HTTP).&lt;/p&gt;
&lt;p&gt;Ces quatre r&#233;pertoires sont distincts et nomm&#233;s par les constantes PHP suivantes :&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('_NOM_TEMPORAIRES_INACCESSIBLES', &#034;tmp/&#034;); define('_NOM_TEMPORAIRES_ACCESSIBLES', &#034;local/&#034;); define('_NOM_PERMANENTS_INACCESSIBLES', &#034;config/&#034;); define('_NOM_PERMANENTS_ACCESSIBLES', &#034;IMG/&#034;); &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Dans une installation simple de SPIP, ces r&#233;pertoires sont cr&#233;&#233;s &#224; la racine du site avec les valeurs par d&#233;faut ci-dessus.&lt;br class='autobr' /&gt;
La mutualisation des sources de SPIP repose sur l'association de quatre r&#233;pertoires sp&#233;cifiques &#224; chaque site, d&#233;duits de leurs URL.&lt;/p&gt;
&lt;/section&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau1 sommaire-section_h2&#034; aria-labelledby=&#034;Initialisation-de-la-mutualisation&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Initialisation-de-la-mutualisation'&gt;Initialisation de la mutualisation&lt;a class='sommaire-back sommaire-back-8' href='#s-Initialisation-de-la-mutualisation' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Cette association est effectu&#233;e par une fonction,&lt;br class='autobr' /&gt;
&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;spip_initialisation&lt;/code&gt;. Elle admet quatre arguments indiquant la localisation des quatre r&#233;pertoires fondamentaux, et construit &#224; partir de ceux-ci les constantes servant au fonctionnement de SPIP.&lt;br class='autobr' /&gt;
Dans une installation simple, ces quatre arguments sont les quatre constantes ci-dessus. La fonction &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;spip_initialisation&lt;/code&gt; est appel&#233;e juste apr&#232;s le chargement de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;mes_options.php&lt;/code&gt;, &lt;br class='autobr' /&gt;
et refuse silencieusement de s'ex&#233;cuter si elle a d&#233;j&#224; &#233;t&#233; appel&#233;e.&lt;br class='autobr' /&gt;
En cons&#233;quence, si dans ce fichier cette &lt;br class='autobr' /&gt;
fonction est appliqu&#233;e sur des arguments diff&#233;rents d&#233;duits de l'URL du site, on aura autant d'utilisation des sources de SPIP que d'URL de site.&lt;br class='autobr' /&gt;
On peut aussi d&#233;finir dans ce fichier les constantes servant au fonctionnement de SPIP, ces d&#233;finitions ayant priorit&#233; sur celles qu'essaiera de d&#233;finir &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;spip_initialisation&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Le code ci-dessous, plac&#233; dans le fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;config/mes_options.php&lt;/code&gt; prend le nom de domaine et ex&#233;cute une mutualisation sur les quatre r&#233;pertoires &lt;i&gt;tmp, local, config&lt;/i&gt; et &lt;i&gt;IMG&lt;/i&gt; plac&#233;s dans le dossier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;sites/nom_du_domaine/&lt;/code&gt;. &lt;br class='autobr' /&gt;
Auparavant, la d&#233;finition de quelques constantes permet de centraliser les fichiers de journalisation de tous les sites dans un unique r&#233;pertoire, &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;log&lt;/code&gt;, et non dans &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;sites/nom_du_domaine/tmp/&lt;/code&gt; pour chacun. Cette centralisation n'a rien d'obligatoire mais se r&#233;v&#232;le utile ; elle peut s'appliquer aussi aux r&#233;pertoires d'aide et de sauvegarde.&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;&lt;?php $rep = 'sites/'; $site = $_SERVER['HTTP_HOST']; $path = _DIR_RACINE . $rep . $site . '/'; // ordre de recherche des chemins define('_SPIP_PATH', $path . ':' . _DIR_RACINE .':' . _DIR_RACINE .'squelettes-dist/:' . _DIR_RACINE .'prive/:' . _DIR_RESTREINT); // ajout du dossier squelette if (is_dir($path . 'squelettes')) $GLOBALS['dossier_squelettes'] = $rep . $site . '/squelettes'; // exemple de logs a la racine pour tous les sites define('_FILE_LOG_SUFFIX', '_' . $site . '.log'); define('_DIR_LOG', _DIR_RACINE . 'log/'); // prefixes des cookie et des tables : $cookie_prefix = str_replace('.', '_', $site); $table_prefix = 'spip'; // exectution du fichier config/mes_option.php du site mutualise if (is_readable($f = $path . _NOM_PERMANENTS_INACCESSIBLES . _NOM_CONFIG . '.php')) include($f); // demarrage du site spip_initialisation( ($path . _NOM_PERMANENTS_INACCESSIBLES), ($path . _NOM_PERMANENTS_ACCESSIBLES), ($path . _NOM_TEMPORAIRES_INACCESSIBLES), ($path . _NOM_TEMPORAIRES_ACCESSIBLES) ); ?&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;Mutualiser-des-domaines-ou-des-sous-domaines&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Mutualiser-des-domaines-ou-des-sous-domaines'&gt;Mutualiser des domaines ou des sous-domaines&lt;a class='sommaire-back sommaire-back-8' href='#s-Mutualiser-des-domaines-ou-des-sous-domaines' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Pour mutualiser plusieurs domaines ou sous-domaines, vous devez tous les diriger vers le r&#233;pertoire physique contenant SPIP. Par exemple, &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;http://example.org/&lt;/code&gt;, &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;http://example.net/&lt;/code&gt; et &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;http://sous_domaine.example.net/&lt;/code&gt;, pour les mutualiser, doivent tous pointer sur le m&#234;me r&#233;pertoire, comme &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/var/www/spip/&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Ce dossier contient donc SPIP ainsi qu'un fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;config/mes_options.php&lt;/code&gt; pour activer la mutualisation. En reprenant l'exemple de code donn&#233; au dessus, il faudra alors cr&#233;er les dossiers &lt;i&gt;sites&lt;/i&gt; et &lt;i&gt;log&lt;/i&gt; ainsi que &lt;i&gt;sites/example.org&lt;/i&gt;, &lt;i&gt;sites/example.net&lt;/i&gt; et &lt;i&gt;sites/sous_domaine.example.net&lt;/i&gt; avec dans chacun d'eux les r&#233;pertoires &lt;i&gt;config, local, IMG&lt;/i&gt; et &lt;i&gt;tmp&lt;/i&gt; accessibles en &#233;criture. Il n'y a rien d'autre &#224; r&#233;aliser. En allant sur l'un des sites, SPIP devrait vous proposer son installation.&lt;/p&gt;
&lt;p&gt;Si vous souhaitez pouvoir activer des types d'url diff&#233;rents, comme les &#171; url arborescentes &#187; ou les &#171; url propres &#187;, il sera n&#233;cessaire de cr&#233;er un fichier d'acc&#232;s Http, qui est fourni dans la distribution sous le nom de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;htaccess.txt&lt;/code&gt; : il suffit de le renommer en &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;.htaccess&lt;/code&gt; pour le mettre en &#339;uvre. Il s'appliquera &#224; tous les sites mutualis&#233;s, mais il est possible d'avoir des acc&#232;s diff&#233;renci&#233;s en configurant astucieusement le serveur (voir plus bas). Dans les deux cas,&lt;br class='autobr' /&gt;
tout cela ne fonctionnera que si votre serveur accepte d'ex&#233;cuter toutes les directives pr&#233;sentes dans ce fichier, notamment celles concernant&lt;br class='autobr' /&gt;
la r&#233;&#233;criture d'url (&#171; url rewriting &#187;).&lt;/p&gt;
&lt;/section&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau1 sommaire-section_h2&#034; aria-labelledby=&#034;Mutualiser-les-repertoires-d-un-domaine&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Mutualiser-les-repertoires-d-un-domaine'&gt;Mutualiser les r&#233;pertoires d'un domaine&lt;a class='sommaire-back sommaire-back-8' href='#s-Mutualiser-les-repertoires-d-un-domaine' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Chaque dossier (virtuel) d'un domaine, en analysant correctement l'URL, peut aussi devenir un site SPIP mutualis&#233;. Il faut pour cela que l'URL du dossier soit redirig&#233;e de fa&#231;on transparente vers la racine du SPIP. C'est le r&#244;le du fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;.htaccess&lt;/code&gt; modifi&#233;. Ainsi &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;http://example.com/premier_site/&lt;/code&gt; et &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;http://example.com/second_site/&lt;/code&gt; peuvent &#234;tre chacun des sites SPIP mutualis&#233;s (et &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;http://example.com/&lt;/code&gt; aussi).&lt;/p&gt;
&lt;p&gt;Dans un premier temps, il faut renommer le fichier &lt;i&gt;htaccess.txt&lt;/i&gt; en &lt;i&gt;.htaccess&lt;/i&gt; et le modifier pour indiquer que les r&#233;pertoires qui sont virtuels doivent pointer &#224; la racine de SPIP. Pour cela, ajouter dans la partie &#171; R&#233;glages personnalis&#233;s &#187; soit le code g&#233;n&#233;rique qui traite tous les r&#233;pertoires virtuels (mais &lt;i&gt;&lt;a href=&#034;http://example.com/premier_site&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;http://example.com/premier_site&lt;/a&gt;&lt;/i&gt; sans / final renverra une erreur), soit un code indiquant les noms des dossiers (pas d'erreur si aucun / final) :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;apache&#034; class='spip_code spip_code_block language-apache' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;// code g&#233;n&#233;rique RewriteCond %{REQUEST_URI} !^/(config|ecrire|IMG|prive|plugins|plugins-dist|sites|squelettes-dist|squelettes|tmp|lib|local|mutualisation)/(.*) RewriteRule ^[^/]+/(.*) /$1 [QSA,L] // OU code sp&#233;cifique RewriteRule ^(premier_site|second_site)$ /$1/ [R,L] RewriteRule ^(premier_site|second_site)/(.*) /$2 [QSA,L] &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Dans un second temps, il faut cr&#233;er une mutualisation en analysant dans le fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;config/mes_options.php&lt;/code&gt; l'url transmise. Voici un exemple pour avoir les sites mutualis&#233;s dans &lt;i&gt;sites/exemple.com&lt;/i&gt;, &lt;i&gt;sites/premier_site&lt;/i&gt; et &lt;i&gt;sites/second_site&lt;/i&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;&lt;?php if ( ( preg_match(',^/([\.a-zA-Z0-9_-]+)/,', $_SERVER['REQUEST_URI'], $r) AND !is_dir(_DIR_RACINE . $r[1]) ) ) { $site = $r[1]; } else { $site = $_SERVER['HTTP_HOST']; } $rep = 'sites/'; $path = _DIR_RACINE . $rep . $site . '/'; // ordre de recherche des chemins define('_SPIP_PATH', $path . ':' . _DIR_RACINE .':' . _DIR_RACINE .'squelettes-dist/:' . _DIR_RACINE .'prive/:' . _DIR_RESTREINT); // ajout du dossier squelette if (is_dir($path . 'squelettes')) $GLOBALS['dossier_squelettes'] = $rep . $site . '/squelettes'; // prefixes des cookie et des tables : $cookie_prefix = str_replace('.', '_', $site); $table_prefix = 'spip'; // exectution du fichier config/mes_option.php du site mutualise if (is_readable($f = $path . _NOM_PERMANENTS_INACCESSIBLES . _NOM_CONFIG . '.php')) include($f); // demarrage du site spip_initialisation( ($path . _NOM_PERMANENTS_INACCESSIBLES), ($path . _NOM_PERMANENTS_ACCESSIBLES), ($path . _NOM_TEMPORAIRES_INACCESSIBLES), ($path . _NOM_TEMPORAIRES_ACCESSIBLES) ); ?&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;Prefixe-des-tables&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Prefixe-des-tables'&gt;Pr&#233;fixe des tables&lt;a class='sommaire-back sommaire-back-8' href='#s-Prefixe-des-tables' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Les exemples pr&#233;sent&#233;s n&#233;cessitent autant de bases de donn&#233;es que de sites mutualis&#233;s. Cependant, il est possible d'installer tous les sites dans une m&#234;me base de donn&#233;es, en pr&#233;fixant les noms de leurs tables d'un pr&#233;fixe unique.&lt;/p&gt;
&lt;p&gt;L'exemple ci-dessous cr&#233;e un pr&#233;fixe de 8 caract&#232;res : un pr&#233;fixe avec les 4 premi&#232;res lettres du site, suivi de 4 autres caract&#232;res.&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;$table_prefix = substr(str_replace('.', '_', $site),0,4) . substr(md5($site),0,4); &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;Fichier-config-mes_options-php&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Fichier-config-mes_options-php'&gt;Fichier config/mes_options.php&lt;a class='sommaire-back sommaire-back-8' href='#s-Fichier-config-mes_options-php' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Toute modification du fichier &lt;i&gt;config/mes_options.php&lt;/i&gt; du noyau SPIP affectera les options de tous les sites h&#233;berg&#233;s.&lt;/p&gt;
&lt;p&gt;Par exemple, mettre dans ce fichier :&lt;br class='autobr' /&gt;
&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$type_urls = 'propres' ;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;donnera par d&#233;faut &#224; tous les sites ce type d'URL... Mais chaque site peut le changer dans son propre &lt;i&gt;/sites/repertoire_du_site/config/mes_options.php&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;Configurer-Apache-pour-les-domaines-et-sous-domaines&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Configurer-Apache-pour-les-domaines-et-sous-domaines'&gt;Configurer Apache pour les domaines et sous-domaines&lt;a class='sommaire-back sommaire-back-8' href='#s-Configurer-Apache-pour-les-domaines-et-sous-domaines' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;La mutualisation c&#244;t&#233; serveur, pour ce qui concerne la gestion des sous-domaines ou des domaines reste simple. Il suffit de cr&#233;er une redirection entre le nom de domaine et le r&#233;pertoire physique o&#249; est stock&#233; SPIP.&lt;/p&gt;
&lt;p&gt;Voici un exemple de configuration (minimale) pour un serveur nomm&#233; 'exemple.tld' utilisant des sous-domaines. Le fichier de configuration est &#224; cr&#233;er dans &lt;i&gt;/etc/apache2/sites_availables/exemple.tld&lt;/i&gt;, qu'il faut ensuite activer&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;apache&#034; class='spip_code spip_code_block language-apache' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;sudo a2ensite exemple.tld sudo /etc/init.d/apache2 reload &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;SPIP est install&#233; dans cet exemple dans '/var/www/spip/'.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;apache&#034; class='spip_code spip_code_block language-apache' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;&lt;VirtualHost *&gt; ServerName exemple.tld ServerAdmin webmaster@localhost ServerAlias *.exemple.tld DocumentRoot /var/www/spip/ &lt;Directory /var/www/spip/&gt; Options Indexes FollowSymLinks MultiViews AllowOverride All Order allow,deny allow from all &lt;/Directory&gt; &lt;/VirtualHost&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Si vous voulez en plus avoir des fichiers d'acc&#232;s diff&#233;renci&#233;s, il suffit d'utiliser la directive &lt;i&gt;AccessFileName&lt;/i&gt; &#224; l'int&#233;rieur de la directive &lt;br class='autobr' /&gt;
&lt;i&gt;VirtualHost&lt;/i&gt;, de sorte que le fichier d'acc&#232;s du site &lt;i&gt;S&lt;/i&gt; se nomme par exemple &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;.htaccess-&lt;/code&gt;&lt;i&gt;S&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;Note-sur-les-sauvegardes-et-les-restaurations&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Note-sur-les-sauvegardes-et-les-restaurations'&gt;Note sur les sauvegardes et les restaurations&lt;a class='sommaire-back sommaire-back-8' href='#s-Note-sur-les-sauvegardes-et-les-restaurations' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Chaque site copie par d&#233;faut ses fichiers de sauvegardes dans le r&#233;pertoire&lt;br class='autobr' /&gt;
&lt;i&gt;/sites/premier_site/tmp/dump&lt;/i&gt; (ou &lt;i&gt;/sites/premier_site/tmp/upload/login&lt;/i&gt; pour les sauvegardes d'un administrateur restreint).&lt;/p&gt;
&lt;p&gt;Les restaurations se font par le m&#234;me dossier. Le chemin des images est aussi correctement pris en compte .&lt;/p&gt;&lt;/section&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Structure HTML des formulaires de SPIP</title>
		<link>https://www.spip.net/fr_article3791.html</link>
		<guid isPermaLink="true">https://www.spip.net/fr_article3791.html</guid>
		<dc:date>2009-06-27T10:48:14Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>ARNO*, cerdic, Matthieu Marcillaud, tetue</dc:creator>


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

		<description>
&lt;p&gt;Document de r&#233;f&#233;rences pr&#233;cisant comment les formulaires dans SPIP doivent &#234;tre structur&#233;s. &lt;br class='autobr' /&gt; Structure HTML &lt;br class='autobr' /&gt;
Un formulaire de base est ainsi structur&#233; : html Une l&#233;gende &lt;br class='autobr' /&gt;
Un texte d'explication Courriel #AIDERarttitre &lt;br class='autobr' /&gt; Explication du label Message d'erreur &lt;br class='autobr' /&gt;
Le div englobant porte la classe g&#233;n&#233;rique formulaire_spip. Les formulaires d'&#233;dition de l'espace priv&#233; portent de plus la classe (&#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_chapo'&gt;&lt;p&gt;Document de r&#233;f&#233;rences pr&#233;cisant comment les formulaires dans SPIP doivent &#234;tre structur&#233;s.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;!--sommaire--&gt;&lt;div class=&#034;well nav-sommaire nav-sommaire-5&#034; id=&#034;nav69e3a65eddaba3.04207918&#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-Structure-HTML&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Structure-HTML&#034; class=&#034;spip_ancre&#034;&gt;Structure HTML&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Les-classes-speciales&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Les-classes-speciales&#034; class=&#034;spip_ancre&#034;&gt;Les classes sp&#233;ciales&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Cadre-englobant&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Cadre-englobant&#034; class=&#034;spip_ancre&#034;&gt;Cadre englobant&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Gestion-des-messages-reussite-erreur&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Gestion-des-messages-reussite-erreur&#034; class=&#034;spip_ancre&#034;&gt;Gestion des messages r&#233;ussite/erreur&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Particularites-pour-les-styles-css&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Particularites-pour-les-styles-css&#034; class=&#034;spip_ancre&#034;&gt;Particularit&#233;s pour les styles css&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;Structure-HTML&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Structure-HTML'&gt;Structure HTML&lt;a class='sommaire-back sommaire-back-5' href='#s-Structure-HTML' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Un formulaire de base est ainsi structur&#233; :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;html&#034; class='spip_code spip_code_block language-html' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;&lt;div class=&#034;formulaire_spip formulaire_editer formulaire_editer_nomformulaire formulaire_editer_nomformulaire-id&#034;&gt; &lt;a id=&#034;nomformulaire&#034; name=&#034;nomformulaire&#034;&gt;&lt;/a&gt; &lt;form action=&#034;#&#034; method=&#034;post&#034;&gt; &lt;fieldset&gt; &lt;legend&gt;Une l&#233;gende&lt;/legend&gt; &lt;p class=&#034;explication&#034;&gt;Un texte d'explication&lt;/p&gt; &lt;div class=&#034;editer-groupe&#034;&gt; &lt;div class=&#034;editer editer_nomlabel obligatoire erreur&#034;&gt; &lt;label for=&#034;nomlabel&#034;&gt;Courriel&lt;/label&gt; &lt;em class=&#034;aide&#034;&gt;#AIDER{arttitre}&lt;/em&gt; &lt;p class=&#034;explication&#034;&gt; Explication du label&lt;/p&gt; &lt;span class=&#034;erreur_message&#034;&gt;Message d'erreur&lt;/span&gt; &lt;input type=&#034;type&#034; class=&#034;type&#034; name=&#034;nomlabel&#034; id=&#034;nomlabel&#034; value=&#034;&#034; /&gt; &lt;/div&gt; &lt;/div&gt; &lt;/fieldset&gt; &lt;/form&gt; &lt;/div&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Le div englobant porte la classe g&#233;n&#233;rique &lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;formulaire_spip&lt;/code&gt;&lt;/strong&gt;. Les formulaires d'&#233;dition de l'espace priv&#233; portent de plus la classe &lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;formulaire_editer&lt;/code&gt;&lt;/strong&gt; indiquant qu'on a affaire &#224; un formulaire d'&#233;dition de donn&#233;es d'une base.&lt;/p&gt;
&lt;p&gt;Chaque champ de saisie est encapsul&#233; dans un &#233;l&#233;ment de classe &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;.editer&lt;/code&gt;, qui doivent &#234;tre regroup&#233;s dans un &#233;lement de classe &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;.editer-groupe&lt;/code&gt;. Jusqu'&#224; SPIP 3.0 ces classes &#233;taient port&#233;es respectivement par des balises html &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;li&lt;/code&gt; et &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;ul&lt;/code&gt;. A partir de SPIP 3.1 on prend pour convention d'utiliser de simples &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;div&lt;/code&gt; pour r&#233;duire la verbosit&#233; de la synth&#232;se vocale et am&#233;liorer l'accessibilit&#233; des formulaires.&lt;/p&gt;
&lt;p&gt;Le premier fieldset &#233;tant optionnel, on peut aussi &#233;crire, sans le fieldset et sans les paragraphes optionnels :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;html&#034; class='spip_code spip_code_block language-html' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;&lt;div class=&#034;formulaire_spip formulaire_editer formulaire_editer_nomformulaire formulaire_editer_nomformulaire-id&#034;&gt; &lt;a id=&#034;nomformulaire&#034; name=&#034;nomformulaire&#034;&gt;&lt;/a&gt; &lt;form action=&#034;#&#034; method=&#034;post&#034;&gt; &lt;div class=&#034;editer-groupe&#034;&gt; &lt;div class=&#034;editer editer_nomlabel obligatoire&#034;&gt; &lt;label for=&#034;nomlabel&#034;&gt;Courriel&lt;/label&gt; &lt;input type=&#034;type&#034; class=&#034;type&#034; name=&#034;nomlabel&#034; id=&#034;nomlabel&#034; value=&#034;&#034; /&gt; &lt;/div&gt; &lt;/div&gt; &lt;/form&gt; &lt;/div&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;Les-classes-speciales&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Les-classes-speciales'&gt;Les classes sp&#233;ciales&lt;a class='sommaire-back sommaire-back-5' href='#s-Les-classes-speciales' 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; &#171; &lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;explication&lt;/code&gt;&lt;/strong&gt; &#187; : pour indiquer un message d'explication (qui porte soit pour l'ensemble des champs, soit sur une &#233;tape). Exemple : &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;p class=&#034;explication&#034;&gt;&lt;/code&gt;.&lt;/li&gt;&lt;li&gt; &#171; &lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;attention&lt;/code&gt;&lt;/strong&gt; &#187; : pour afficher un message concernant un champ d'&#233;dition critique. Exemple : &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;em class=&#034;attention&#034;&gt;&lt;:texte_login_precaution:&gt;&lt;/em&gt;&lt;/code&gt;.&lt;/li&gt;&lt;li&gt; &#171; &lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;obligatoire&lt;/code&gt;&lt;/strong&gt; &#187; : pour signaler un champ obligatoire, &#224; appliquer &#224; l'&#233;l&#233;ment de liste parent. Exemple : &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;div class=&#034;obligatoire&#034;&gt;&lt;/code&gt;.&lt;/li&gt;&lt;li&gt; &#171; &lt;strong&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;erreur&lt;/code&gt;&lt;/strong&gt; &#187; : pour signaler une &#233;tape en erreur, &#224; appliquer &#224; l'&#233;l&#233;ment de liste parent. Exemple : &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;div class=&#034;erreur&#034;&gt;&lt;/code&gt;. chaque erreur b&#233;n&#233;ficie d'un message explicatif, portant la class &#171; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;erreur_message&lt;/code&gt; &#187; : &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;span class=&#034;erreur_message&#034;&gt;&lt;/code&gt;.&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;Cadre-englobant&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Cadre-englobant'&gt;Cadre englobant&lt;a class='sommaire-back sommaire-back-5' href='#s-Cadre-englobant' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Ce formulaire peut optionnellement &#234;tre inclus dans un cadre-formulaire-editer, et peut alors contenir un entete-formulaire :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;html&#034; class='spip_code spip_code_block language-html' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;&lt;div class=&#034;cadre-formulaire-editer&#034;&gt; &lt;div class=&#034;entete-formulaire&#034;&gt;&lt;/div&gt; &lt;div class=&#034;formulaire_editer formulaire_editer_site formulaire_editer_site-#ENV{id_site,nouveau}&#034;&gt;&lt;/div&gt; &lt;/div&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;Gestion-des-messages-reussite-erreur&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Gestion-des-messages-reussite-erreur'&gt;Gestion des messages r&#233;ussite/erreur&lt;a class='sommaire-back sommaire-back-5' href='#s-Gestion-des-messages-reussite-erreur' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Messages globaux&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Un formulaire comporte obligatoirement deux paragraphes permettant d'afficher les r&#233;ussites et erreurs globales qui ont pu appara&#238;tre &#224; la soumission. Les variables d'environnements &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;message_ok&lt;/code&gt; et &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;message_erreur&lt;/code&gt; sont des retours envoy&#233;s par SPIP (formulaires CVT).&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;html&#034; class='spip_code spip_code_block language-html' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;&lt;div class=&#034;formulaire_editer formulaire_editer_site formulaire_editer_site-#ENV{id_site,nouveau}&#034;&gt; [&lt;div class=&#034;reponse_formulaire reponse_formulaire_ok&#034;&gt;(#ENV*{message_ok})&lt;/div&gt;] [&lt;div class=&#034;reponse_formulaire reponse_formulaire_erreur&#034;&gt;(#ENV*{message_erreur})&lt;/div&gt;] &lt;/div&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Messages sp&#233;cifiques&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Chaque champ de formulaire, encapsul&#233; dans un &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;.editer&lt;/code&gt; peut recevoir un message d'erreur sp&#233;cifique. Celui-ci est contenu dans le tableau d'environnement 'erreurs' et peut &#234;tre obtenu de la sorte :&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**{erreurs}|table_valeur{nom_du_champ})] &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On peut attribuer la classe 'erreur' &#224; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;.editer&lt;/code&gt; et afficher une erreur sp&#233;cifique si elle existe de la sorte :&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;div class=&#034;editer editer_descriptif[ (#ENV**{erreurs}|table_valeur{descriptif}|oui)erreur]&#034;&gt; &lt;label for=&#034;descriptif&#034;&gt;&lt;:texte_descriptif_rapide:&gt;&lt;/label&gt; [&lt;span class='erreur_message'&gt;(#ENV**{erreurs}|table_valeur{desctiptif})&lt;/span&gt;] &lt;textarea name='descriptif' id='descriptif' rows='2' cols='40'&gt;[(#ENV**{descriptif})]&lt;/textarea&gt; &lt;/div&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;Particularites-pour-les-styles-css&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Particularites-pour-les-styles-css'&gt; Particularit&#233;s pour les styles css&lt;a class='sommaire-back sommaire-back-5' href='#s-Particularites-pour-les-styles-css' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Champs input&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Chaque &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;input /&gt;&lt;/code&gt; diff&#233;rent de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;hidden&lt;/code&gt; doit poss&#233;der une classe identique &#224; son type (afin de palier &#224; un d&#233;ficience du navigateur Internet Explorer) :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;html&#034; class='spip_code spip_code_block language-html' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;&lt;input type=&#034;text&#034; class=&#034;text&#034; name=&#034;titre&#034; id=&#034;titre&#034; value=&#034;[(#ENV**{titre})]&#034; /&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Boutons de soumission&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Les boutons de soumissions sont inclus dans une bo&#238;te &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;.boutons&lt;/code&gt; (qui peut recevoir plusieurs boutons) :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;html&#034; class='spip_code spip_code_block language-html' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;&lt;p class=&#034;boutons&#034;&gt;&lt;input type=&#034;submit&#034; class=&#034;submit&#034; value=&#034;&lt;:bouton_enregistrer:&gt;&#034; /&gt;&lt;/p&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;radio/checkbox&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Dans le cas de bouton radio ou checkbox, on peut ne pas reprendre tout a fait la m&#234;me structure, par exemple pour avoir le bouton avant le label, ou pour avoir la liste radio en horizontal.&lt;/p&gt;
&lt;p&gt;Chaque entr&#233;e (radio + label) peut alors &#234;tre encadr&#233;e par un bloc .choix&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;div class=&#034;editer editer_syndication&#034;&gt; &lt;div class=&#034;choix&#034;&gt; &lt;input type='radio' class=&#034;radio&#034; name='syndication' value='non' id='syndication_non'[ (#ENV{syndication}|=={non}|?{'checked=&#034;checked&#034;'})] /&gt; &lt;label for='syndication_non'&gt;&lt;:bouton_radio_non_syndication:&gt;&lt;/label&gt; &lt;/div&gt; &lt;div class=&#034;choix&#034;&gt; &lt;input type='radio' class=&#034;radio&#034; name='syndication' value='oui' id='syndication_oui'[ (#ENV{syndication}|=={oui}|?{'checked=&#034;checked&#034;'})] /&gt; &lt;label for='syndication_oui'&gt;&lt;:bouton_radio_syndication:&gt;&lt;em&gt;#AIDER{rubsyn}&lt;/em&gt;&lt;/label&gt; &lt;/div&gt; &lt;/div&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Par d&#233;faut, la liste est verticale. Pour rendre la liste horizontale,&lt;br class='autobr' /&gt;
il suffit de sp&#233;cifier que .champ en question est de type inline :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;css&#034; class='spip_code spip_code_block language-css' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;.formulaire_editer .editer_syndication .choix {display:inline;} &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/section&gt;&lt;/div&gt;
		&lt;div class='rss_ps'&gt;&lt;p&gt;Principes g&#233;n&#233;raux de ces formulaires pour avoir les labels align&#233;s &#224; gauche&lt;/p&gt;
&lt;p&gt;On se retrouve dans un cas o&#249; l'on a :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;&lt;div class=&#034;editer-groupe&#034;&gt; &lt;div class=&#034;editer&#034;&gt; &lt;label /&gt; &lt;input /&gt; &lt;/div&gt; &lt;div class=&#034;editer&#034;&gt; &lt;label /&gt; &lt;em /&gt; &lt;span /&gt; &lt;input /&gt; &lt;/div&gt; &lt;/div&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;1) on applique un padding gauche au &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;.editer&lt;/code&gt; sup&#233;rieur &#224; la taille du label (ex:120px)&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;.formulaire_spip .editer { margin: 0; padding: 10px 10px 10px 130px; clear:both; border-top: 1px solid #eee; } &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;2) on demande au label d'&#234;tre flottant et d&#233;cal&#233; sur la gauche (via un margin n&#233;gatif)&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;.formulaire_spip .editer label { width: 120px; float:left; margin-left:-125px; text-align: left; vertical-align: top; } &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;3) lorsqu'un fieldset suit un &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;.editer&lt;/code&gt;, on le d&#233;cale aussi vers la gauche&lt;br class='autobr' /&gt; (seul IE n'en tient pas compte) pour que le fieldset prenne toute la&lt;br class='autobr' /&gt; largeur aussi&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;.formulaire_spip .editer fieldset { border:1px solid #888; background:white; margin-left:-125px; /* redecalage vers la gauche... IE &lt; 8 ne le prend pas en compte */ } &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Mutualisation du noyau SPIP</title>
		<link>https://www.spip.net/fr_article3514.html</link>
		<guid isPermaLink="true">https://www.spip.net/fr_article3514.html</guid>
		<dc:date>2007-02-22T21:04:45Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Committo, Ergo Sum., Matthieu Marcillaud</dc:creator>



		<description>&lt;p&gt;Proc&#233;dure pour partager le noyau de SPIP entre plusieurs sites.&lt;/p&gt;

-
&lt;a href="https://www.spip.net/fr_rubrique468.html" rel="directory"&gt;Optimisation / Syst&#232;me&lt;/a&gt;


		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;La mutualisation du noyau de SPIP est possible. Il s'agit de pouvoir g&#233;rer plusieurs sites SPIP sur un seul serveur ou h&#233;bergement en n'utilisant qu'une seule fois les fichiers du noyau de SPIP.&lt;/p&gt;
&lt;p&gt;Cela permet un gain d'espace disque important, ainsi qu'une possibilit&#233; de mise &#224; jour de SPIP simple de l'ensemble des sites en ne mettant &#224; jour que le noyau.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;!--sommaire--&gt;&lt;div class=&#034;well nav-sommaire nav-sommaire-6&#034; id=&#034;nav69e3a65ee076c7.37792538&#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-Le-concept&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Le-concept&#034; class=&#034;spip_ancre&#034;&gt;Le concept...&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Creer-les-bons-repertoires&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Creer-les-bons-repertoires&#034; class=&#034;spip_ancre&#034;&gt;Cr&#233;er les bons r&#233;pertoires&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Des-redirections-bien-faites&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Des-redirections-bien-faites&#034; class=&#034;spip_ancre&#034;&gt;Des redirections bien faites !&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Mutualiser-selon-l-URL-grace-a-mes_options-php&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Mutualiser-selon-l-URL-grace-a-mes_options-php&#034; class=&#034;spip_ancre&#034;&gt;Mutualiser selon l'URL gr&#226;ce &#224; mes_options.php&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Configurer-apache-pour-les-domaines-et-sous-domaines&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Configurer-apache-pour-les-domaines-et-sous-domaines&#034; class=&#034;spip_ancre&#034;&gt;Configurer apache pour les domaines et sous-domaines&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a id=&#034;s-Note-sur-les-sauvegardes-et-les-restaurations&#034;&gt;&lt;/a&gt;&lt;a href=&#034;#Note-sur-les-sauvegardes-et-les-restaurations&#034; class=&#034;spip_ancre&#034;&gt;Note sur les sauvegardes et les restaurations&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;!--/sommaire--&gt;&lt;p&gt;Cet article explique la proc&#233;dure pour &lt;a href='https://www.spip.net/fr_article3567.html' class=&#034;spip_in&#034;&gt;SPIP 1.9.2&lt;/a&gt;, sur des serveurs Apache&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;Pour information : ces proc&#233;dures ont &#233;t&#233; test&#233;es avec Apache 2.0.55 et PHP (&#8230;)&#034; id=&#034;nh5-1&#034;&gt;1&lt;/a&gt;]&lt;/span&gt; autorisant la r&#233;&#233;criture d'url (url_rewriting). Pour les versions ult&#233;rieures de SPIP, voir plut&#244;t l'article &lt;a href=&#034;http://www.spip-contrib.net/Ferme-a-SPIP&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Ferme &#224; SPIP&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Il y a plusieurs m&#233;thodes pour arriver aux m&#234;mes r&#233;sultats, selon que l'on souhaite configurer directement la mutualisation depuis un h&#233;bergement ou depuis un serveur.&lt;/p&gt;
&lt;section class=&#034;sommaire-section sommaire-section_niveau1 sommaire-section_h2&#034; aria-labelledby=&#034;Le-concept&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Le-concept'&gt;Le concept...&lt;a class='sommaire-back sommaire-back-6' href='#s-Le-concept' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Les dossiers n&#233;cessaires au fonctionnement du noyau SPIP (ecrire, plugins-dist, prive, squelettes-dist, ...), et ceux marquant l'activit&#233; d'un site (config, IMG, tmp, local) sont clairement identifiables et s&#233;par&#233;s. C'est cette s&#233;paration qui permet d'avoir plusieurs sites SPIP autonomes pour un m&#234;me noyau de SPIP.&lt;/p&gt;
&lt;p&gt;Cette autonomie repose sur l'existence d'un quatuor de r&#233;pertoires par site, dans lesquels Spip va &#233;crire les donn&#233;es r&#233;sultant de l'activit&#233; du site. Ces r&#233;pertoires sont au nombre de quatre, car on distingue les donn&#233;es temporaires et permanentes d'une part, et les donn&#233;es accessibles par http et celles qui ne le sont pas d'autre part, d'o&#249; quatre types de donn&#233;es. Les deux r&#233;pertoires inaccessibles par http seront prot&#233;g&#233;es par un .htaccess install&#233; automatiquement par SPIP (les administrateurs du serveur pourront m&#234;me mettre ces r&#233;pertoires en dehors de l'arborescence servie par http).&lt;/p&gt;
&lt;p&gt;Ces quatre r&#233;pertoires sont distincts et nomm&#233;s par les constantes PHP suivantes :&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('_NOM_TEMPORAIRES_INACCESSIBLES', &#034;tmp/&#034;); define('_NOM_TEMPORAIRES_ACCESSIBLES', &#034;local/&#034;); define('_NOM_PERMANENTS_INACCESSIBLES', &#034;config/&#034;); define('_NOM_PERMANENTS_ACCESSIBLES', &#034;IMG/&#034;); &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Dans une installation de Spip non mutualis&#233;e, ces r&#233;pertoires sont cr&#233;&#233;s &#224; la racine du site, lors de l'application de la fonction &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;spip_initialisation&lt;/code&gt; sur les quatre valeurs ci-dessus. Pour obtenir la mutualisation des sources de SPIP,&lt;br class='autobr' /&gt;
il suffit de savoir associer une URL sp&#233;cifique &#224; son quatuor de r&#233;pertoires sp&#233;cifiques, en appelant la fonction &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;spip_initialisation&lt;/code&gt; sur quatre autres valeurs, d&#233;duites de l'URL.&lt;/p&gt;
&lt;/section&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau1 sommaire-section_h2&#034; aria-labelledby=&#034;Creer-les-bons-repertoires&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Creer-les-bons-repertoires'&gt;Cr&#233;er les bons r&#233;pertoires&lt;a class='sommaire-back sommaire-back-6' href='#s-Creer-les-bons-repertoires' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Pour d&#233;marrer la mutualisation, il faut tout d'abord partir d'un site fonctionnel. Pour les exemples, nous partirons d'un site appel&#233; par l'url &lt;a href=&#034;http://example.org/&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;http://example.org/&lt;/a&gt; stock&#233; physiquement dans /home/toto/public_html/.&lt;/p&gt;
&lt;p&gt;Il faut cr&#233;er un r&#233;pertoire (par exemple nomm&#233; 'sites') qui va contenir les r&#233;pertoires des sites mutualis&#233;s, &#224; la racine de la distribution (au m&#234;me niveau que /ecrire).&lt;/p&gt;
&lt;p&gt;- mutualisation d'un r&#233;pertoire :&lt;br class='autobr' /&gt;
Si l'on souhaite que les adresses &lt;a href=&#034;http://example.org/premier_site/&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;http://example.org/premier_site/&lt;/a&gt; et &lt;a href=&#034;http://example.org/deuxieme_site/&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;http://example.org/deuxieme_site/&lt;/a&gt; appellent chacun un site spip, il faut cr&#233;er alors les sous-r&#233;pertoires /premier_site et /deuxieme_site dans le r&#233;pertoire /sites, puis dans chacun d'eux cr&#233;er les r&#233;pertoires /config, /IMG, /tmp, /local. Ces quatre r&#233;pertoires doivent &#234;tre accessibles en &#233;criture. Il sera possible par la suite d'ajouter un r&#233;pertoire /squelettes aussi, &#224; c&#244;t&#233; de ces r&#233;pertoires.&lt;/p&gt;
&lt;p&gt;- mutualisation sous-domaine et domaine (quelques id&#233;es) :&lt;br class='autobr' /&gt;
Si l'on souhaite que l'adresse &lt;a href=&#034;http://toto.example.org/&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;http://toto.example.org/&lt;/a&gt;, &lt;a href=&#034;http://exemple.tld/&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;http://exemple.tld/&lt;/a&gt; et &lt;a href=&#034;http://utilisateur.example.com/&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;http://utilisateur.example.com/&lt;/a&gt; appellent chacun un site spip, on peut envisager de cr&#233;er dans /sites les r&#233;pertoires /toto, /exemple.tld, et /example.com/utilisateur&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Remarque :&lt;/strong&gt; Toutes les url doivent pointer &#224; la racine de la distribution SPIP, c'est-&#224;-dire dans /home/toto/public_html/. C'est le r&#244;le que vont remplir soit un fichier .htaccess soit la configuration du serveur Apache expliqu&#233;s plus loin.&lt;/p&gt;
&lt;/section&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau1 sommaire-section_h2&#034; aria-labelledby=&#034;Des-redirections-bien-faites&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Des-redirections-bien-faites'&gt;Des redirections bien faites !&lt;a class='sommaire-back sommaire-back-6' href='#s-Des-redirections-bien-faites' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Pour que SPIP reconnaisse qu'un site est mutualis&#233;, il faut que le script spip.php (appel&#233; par index.php) soit execut&#233;. Celui-ci cherchera, gr&#226;ce &#224; un code ajout&#233; dans /config/mes_options.php si l'URL appel&#233;e correspond &#224; un site mutualis&#233; ou non. Pour cela, il faut qu'une adresse &lt;a href=&#034;http://example.org/premier_site/&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;http://example.org/premier_site/&lt;/a&gt; ou &lt;a href=&#034;http://example.org/deuxieme_site/&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;http://example.org/deuxieme_site/&lt;/a&gt; soit redirig&#233;e vers &lt;a href=&#034;http://example.org/&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;http://example.org/&lt;/a&gt; pour executer alors index.php...&lt;/p&gt;
&lt;p&gt;C'est le r&#244;le attribu&#233; au fichier .htaccess (ou directement dans la configuration du serveur Apache)&lt;/p&gt;
&lt;p&gt;Il faut copier et renommer le fichier htaccess.txt &#224; la racine de la distribution en .htaccess, puis le modifier :&lt;/p&gt;
&lt;p&gt;Pour autoriser la r&#233;&#233;criture d'URL (rien ne change normalement) :&lt;br class='autobr' /&gt;
&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;RewriteEngine On&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Si la distribution SPIP est dans un sous-r&#233;pertoire, modifier rewritebase. Ici, le site est &#224; la racine donc :&lt;br class='autobr' /&gt;
&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;RewriteBase /&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Enfin, dans r&#233;glages personnalis&#233;s, ajouter le code suivant pour que les r&#233;pertoires /premier_site , /deuxieme_site et /troisieme_site soient trait&#233;s depuis la racine de la distribution :&lt;br class='autobr' /&gt;
&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#Mutualisation RewriteRule ^(premier_site|deuxieme_site|troisieme_site)$ /$1/ [R,L] RewriteRule ^(premier_site|deuxieme_site|troisieme_site)/(.*) /$2 [QSA,L]&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Le premier rewriterule redirige les adresses &lt;a href=&#034;http://example.org/premier_site&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;http://example.org/premier_site&lt;/a&gt; vers &lt;a href=&#034;http://example.org/premier_site{{/&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;http://example.org/premier_site{{/&lt;/a&gt;&lt;/strong&gt;. Le deuxi&#232;me redirige tout ce qu'il y a derri&#232;re /premier_site/ &#224; la racine, par exemple : &lt;a href=&#034;http://example.org/premier_site/article112&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;http://example.org/premier_site/article112&lt;/a&gt; est redirig&#233; vers &lt;a href=&#034;http://example.org/article112&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;http://example.org/article112&lt;/a&gt;. (Cependant, cette redirection est transparente, le nom de l'url ne change pas, il est toujours &lt;a href=&#034;http://example.org/premier_site/article112&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;http://example.org/premier_site/article112&lt;/a&gt;, m&#234;me et surtout pour php !)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Et si SPIP est dans un sous r&#233;pertoire ?&lt;/strong&gt;&lt;br class='manualbr' /&gt;Dans ce cas l&#224;, les fichiers de spip se trouvent dans /home/toto/public_html/spip/ , SPIP est appel&#233; par &lt;a href=&#034;http://example.org/spip/&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;http://example.org/spip/&lt;/a&gt;, les sites mutualis&#233;s par &lt;a href=&#034;http://example.org/spip/premier_site/&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;http://example.org/spip/premier_site/&lt;/a&gt; ou &lt;a href=&#034;http://example.org/spip/deuxieme_site/&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;http://example.org/spip/deuxieme_site/&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Il faut alors mettre dans le .htaccess :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;apache&#034; class='spip_code spip_code_block language-apache' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;RewriteEngine On RewriteBase /spip/ #Mutualisation RewriteRule ^(premier_site|deuxieme_site|troisieme_site)$ /spip/$1/ [R,L] RewriteRule ^(premier_site|deuxieme_site|troisieme_site)/(.*) /spip/$2 [QSA,L] &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Et pour rediriger tous les r&#233;pertoires comme des sites mutualis&#233;s ?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Il vous est possible &lt;strong&gt;&#224; la place&lt;/strong&gt; des rewriterules ci-dessus &lt;br class='autobr' /&gt;
d'utiliser un code g&#233;n&#233;rique, utilisable quelque-soit le nom du &lt;br class='autobr' /&gt;
r&#233;pertoire du site mutualis&#233; :&lt;/p&gt;
&lt;p&gt;- &#224; la racine&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;apache&#034; class='spip_code spip_code_block language-apache' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;RewriteCond %{REQUEST_URI} !^/(config|squelettes-dist|ecrire|IMG|oo|plugins|sites|squelettes|tmp|local)/(.*) RewriteRule ^[^/]+/(.*) /$1 [QSA,L] &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;- ou dans un dossier /spip :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;apache&#034; class='spip_code spip_code_block language-apache' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;RewriteCond %{REQUEST_URI} !^/spip/(config|squelettes-dist|ecrire|IMG|oo|plugins|sites|squelettes|tmp|local)/(.*) RewriteRule ^[^/]+/(.*) /spip/$1 [QSA,L] &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Et pour les domaines et sous domaines ?&lt;/strong&gt;&lt;br class='manualbr' /&gt;Par un heureux hasard, il n'y a rien &#224; faire ici puisqu'ils pointent normalement d&#233;j&#224; vers la racine de la distribution SPIP...&lt;/p&gt;
&lt;/section&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau1 sommaire-section_h2&#034; aria-labelledby=&#034;Mutualiser-selon-l-URL-grace-a-mes_options-php&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Mutualiser-selon-l-URL-grace-a-mes_options-php'&gt;Mutualiser selon l'URL gr&#226;ce &#224; mes_options.php&lt;a class='sommaire-back sommaire-back-6' href='#s-Mutualiser-selon-l-URL-grace-a-mes_options-php' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;C'est le fichier /config/mes_options.php &#224; la racine de la distribution qui va r&#233;aliser la majeure partie du travail : il doit chercher si une URL est &#224; mutualiser ou non, et initialiser SPIP en fonction.&lt;/p&gt;
&lt;p&gt;De nombreux cas peuvent se pr&#233;senter, entre les r&#233;pertoires, les domaines et sous domaines. PHP peut utiliser deux variables pour tester les URLs qui ont appel&#233; le script : &lt;br class='autobr' /&gt;
&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$_SERVER['REQUEST_URI']; // contient tout ce qu'il y a derri&#232;re le nom de domaine : /premier_site/article112 par exemple... $_SERVER['SERVER_NAME']; // contient le nom du domaine et sous domaine : utilisateur.example.org par exemple&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Ce sont ces deux variables qui vont &#234;tre compar&#233;es &#224; une expression r&#233;guli&#232;re pour extraire le nom du r&#233;pertoire qui contient la mutualisation.&lt;/p&gt;
&lt;p&gt;Un moyen simple de mutualiser tous les r&#233;pertoires est de copier le code suivant :&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;&lt;?php if ( preg_match(',/([a-zA-Z0-9_-]+)/?,',$_SERVER['REQUEST_URI'],$r)) { if (is_dir($e = _DIR_RACINE . 'sites/' . $r[1]. '/')) { $cookie_prefix = $table_prefix = $r[1]; define('_SPIP_PATH', $e . ':' . _DIR_RACINE .':' . _DIR_RACINE .'squelettes-dist/:' . _DIR_RACINE.'prive/:'. _DIR_RESTREINT); spip_initialisation( ($e . _NOM_PERMANENTS_INACCESSIBLES), ($e . _NOM_PERMANENTS_ACCESSIBLES), ($e . _NOM_TEMPORAIRES_INACCESSIBLES), ($e . _NOM_TEMPORAIRES_ACCESSIBLES) ); $GLOBALS['dossier_squelettes'] = $e.'squelettes'; if (is_readable($f = $e._NOM_PERMANENTS_INACCESSIBLES._NOM_CONFIG.'.php')) include($f); } } ?&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;La ligne preg_match r&#233;cup&#232;re le nom d'un dossier dans l'arborescence de l'URL, par exemple 'premier_site' dans &lt;a href=&#034;http://example.org/premier_site/&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;http://example.org/premier_site/&lt;/a&gt; ... Puis le script tente une mutualisation si le r&#233;pertoire /sites/premier_site/ existe.&lt;/p&gt;
&lt;p&gt;Si SPIP est dans un r&#233;pertoire /spip, il faut modifier la premi&#232;re ligne par :&lt;br class='autobr' /&gt;
&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;if (preg_match(',/spip/([a-zA-Z0-9_-]+)/?,', $_SERVER['REQUEST_URI'], $r)) {&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Il faut dire dire &#224; SPIP quel est le pr&#233;fixe de table de base de donn&#233;es utilis&#233;, ce que fait &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$cookie_prefix = $table_prefix = $r[1];&lt;/code&gt;&lt;br class='autobr' /&gt;
Cette ligne va cr&#233;er des tables MySQL avec des pr&#233;fixes ayant le nom du r&#233;pertoire contenant le site : mon_site_article &#224; la place de spip_article par exemple. Cela permet d'h&#233;berger tous les sites sur une seule et m&#234;me base de donn&#233;es. Vous pouvez garder le pr&#233;fixe par d&#233;faut (spip), mais il faut penser &#224; avoir plusieurs bases de donn&#233;es diff&#233;rentes pour chaque site. &lt;br class='autobr' /&gt;
Pour cela, mettre &#224; la place :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;$cookie_prefix = $r[1]; $table_prefix='spip'; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;La fonction spip_initialisation admet quatre param&#232;tres qui sont l'adresse de chacun des r&#233;pertoires n&#233;cessaires au fonctionnement du site mutualis&#233;.&lt;/p&gt;
&lt;p&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$GLOBALS['dossier_squelettes'] = $e.'squelettes';&lt;/code&gt; d&#233;finit l'emplacement du dossier squelettes du site mutualis&#233;.&lt;/p&gt;
&lt;p&gt;Enfin les derni&#232;res lignes chargent un &#233;ventuel sites/premier_site/config/mes_options.php.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Information :&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Toute modification du fichier config/mes_options.php du noyau SPIP affectera les options de tous les sites h&#233;berg&#233;s.&lt;/p&gt;
&lt;p&gt;Par exemple, mettre dans ce fichier :&lt;br class='autobr' /&gt;
&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$type_urls = 'propres' ;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Donnera par d&#233;faut &#224; tous les sites ce type d'url... Mais chaque site peut le changer dans son propre /sites/mon_site/config/mes_options.php.&lt;/p&gt;
&lt;/section&gt;&lt;section class=&#034;sommaire-section sommaire-section_niveau1 sommaire-section_h2&#034; aria-labelledby=&#034;Configurer-apache-pour-les-domaines-et-sous-domaines&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Configurer-apache-pour-les-domaines-et-sous-domaines'&gt;Configurer apache pour les domaines et sous-domaines&lt;a class='sommaire-back sommaire-back-6' href='#s-Configurer-apache-pour-les-domaines-et-sous-domaines' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;La mutualisation c&#244;t&#233; serveur, pour ce qui concerne la gestion des sous-domaines ou des domaines reste simple, mais n&#233;cessite de cr&#233;er quelques redirections d'URL dans la configuration du serveur Apache pour tenir compte de ces sites.&lt;/p&gt;
&lt;p&gt;Voici un exemple de configuration pour un serveur nomm&#233; 'exemple.tld' (ici un SPIP mutualis&#233;) utilisant des sous-domaines (SPIP appel&#233; par &lt;a href=&#034;http://utilisateur.example.org/spip/&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;http://utilisateur.example.org/spip/&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Le noyau SPIP est dans '/home/toto/public_html/spip/'.&lt;/p&gt;
&lt;p&gt;Il faut alors cr&#233;er les r&#233;pertoires /sites/exemple.tld/ , /sites/exemple.tld/utilisteur/.&lt;/p&gt;
&lt;p&gt;Le fichier de configuration se situe dans Apache 2/linux dans /etc/apache2/sites_availables/default (vous pouvez aussi cr&#233;er un nouveau fichier dans le dossier sites_availables et l'activer).&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;apache&#034; class='spip_code spip_code_block language-apache' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;# SERVEUR exemple.tld # SPIP par sous domaine... &lt;VirtualHost *&gt; ServerName exemple.tld ServerAlias *.exemple.tld # Redirection vers le SPIP noyau DocumentRoot &#034;/home/toto/public_html&#034; &lt;Directory &#034;/home/toto/public_html/&#034;&gt; AllowOverride All Order allow,deny Allow from all &lt;/Directory&gt; # Seule l'adresse http://utilisateur.exemple.tld/spip/* doit &#234;tre redirig&#233;e # (utilisateur.exemple.tld/spip/* -&gt; /home/toto/public_html/*) RewriteCond %{SERVER_NAME} (www\.)?([^.]+)\.example\.net$ RewriteRule ^/spip/(.*) /home/toto/public_html/spip/$1 [QSA,L] # (utilisateur.exemple.tld/* -&gt; /home/toto/public_html/sites/exemple.tld/utilisateur/*) RewriteCond %{SERVER_NAME} (www\.)?([^.]+)\.example\.net$ RewriteRule (.*) /home/toto/public_html/sites/exemple.tld/%1/$1 [QSA,L] &lt;/VirtualHost&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Il est par contre n&#233;cessaire de tester ces mutualisations possibles dans /config/mes_options.php :&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;&lt;?php # pour utilisateur.exemple.tld/spip/ if ( preg_match(',(.*)\.exemple\.tld/spip/?,',$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'],$r)) { if (is_dir($e = _DIR_RACINE . 'sites/exemple.tld/' . $r[1]. '/')) { $cookie_prefix = $table_prefix = $r[1]; define('_SPIP_PATH', $e . ':' . _DIR_RACINE .':' . _DIR_RACINE .'squelettes-dist/:' . _DIR_RACINE.'prive/:'. _DIR_RESTREINT); spip_initialisation( ($e . _NOM_PERMANENTS_INACCESSIBLES), ($e . _NOM_PERMANENTS_ACCESSIBLES), ($e . _NOM_TEMPORAIRES_INACCESSIBLES), ($e . _NOM_TEMPORAIRES_ACCESSIBLES) ); $GLOBALS['dossier_squelettes'] = $e.'squelettes'; if (is_readable($f = $e._NOM_PERMANENTS_INACCESSIBLES._NOM_CONFIG.'.php')) include($f); } } ?&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;Note-sur-les-sauvegardes-et-les-restaurations&#034;&gt;&lt;h2 class=&#034;h2&#034; id='Note-sur-les-sauvegardes-et-les-restaurations'&gt;Note sur les sauvegardes et les restaurations&lt;a class='sommaire-back sommaire-back-6' href='#s-Note-sur-les-sauvegardes-et-les-restaurations' title='Retour au sommaire'&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Chaque site copie ses fichiers de sauvegardes dans le r&#233;pertoire&lt;br class='autobr' /&gt;
/sites/premier_site/tmp/dump (ou /sites/premier_site/tmp/upload/&lt;i&gt;login&lt;/i&gt; pour les sauvegardes d'un administrateur restreint).&lt;br class='autobr' /&gt;
Les restaurations se font par le m&#234;me dossier.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Attention :&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A l'heure actuelle, SPIP enregistre dans la base de donn&#233;es, pour ce qui concerne le dossier /IMG des sites mutualis&#233;s une adresse sites/premier_site/IMG/* au lieu de IMG/* comme pour un site SPIP seul.&lt;/p&gt;
&lt;p&gt;Une restauration ne fonctionnera donc que si elle s'effectue dans le site qui a cr&#233;&#233; la sauvegarde.&lt;/p&gt;
&lt;p&gt;Une astuce pour restaurer le site ailleurs consiste &#224; &#233;diter le fichier dump.xml et &#224; remplacer toutes les occurrences (&#224; l'exception de celles des d&#233;clarations dir_img et dir_logo dans l'ouverture de la balise spip) :
&lt;br /&gt;- sites/premier_site/IMG/&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; par (SPIP seul) : IMG/&lt;/li&gt;&lt;li&gt; ou (SPIP mutualis&#233;) : sites/mon_nouveau_site/IMG/&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Inversement, pour passer un SPIP seul dans un r&#233;pertoire mutualis&#233;, il faut remplacer toutes les occurrences de :
&lt;br /&gt;- IMG/
&lt;br /&gt;- par : sites/mon_site/IMG/&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;Pour information : ces proc&#233;dures ont &#233;t&#233; test&#233;es avec Apache 2.0.55 et PHP 5.1.2 sur serveur Ubuntu Dapper Drake ainsi que sur PHP 5.1.6 sur serveur Ubuntu Edgy Eft&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>



</channel>

</rss>
