<?xml
version="1.0" encoding="utf-8"?>
<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>Teddy Payet</title>
	<link>https://www.teddypayet.com/</link>
	
	<language>fr</language>
	<generator>SPIP - www.spip.net</generator>
	<atom:link href="https://www.teddypayet.com/spip.php?id_mot=18&amp;page=backend" rel="self" type="application/rss+xml" />

	<image>
		<title>Teddy Payet</title>
		<url>https://www.teddypayet.com/local/cache-vignettes/L144xH162/siteon0-84dcb.png?1748259078</url>
		<link>https://www.teddypayet.com/</link>
		<height>162</height>
		<width>144</width>
	</image>

                    

<item xml:lang="fr">
		<title>Automatisation et scripts bash, gagner du temps au quotidien</title>
		<link>https://www.teddypayet.com/Automatisation-et-scripts-bash-gagner-du-temps-au-quotidien</link>
		<guid isPermaLink="true">https://www.teddypayet.com/Automatisation-et-scripts-bash-gagner-du-temps-au-quotidien</guid>
		<dc:date>2024-07-15T07:00:00Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Teddy Payet</dc:creator>


		<dc:subject>Astuce</dc:subject>
		<dc:subject>Notes de d&#233;veloppement</dc:subject>
		<dc:subject>Lignes de commandes</dc:subject>

		<description>
&lt;p&gt;Salut &#224; tous ! Aujourd'hui, nous allons plonger dans l'univers fascinant de l'automatisation avec les scripts Bash. Que vous soyez un d&#233;veloppeur web ou un administrateur syst&#232;me, les scripts Bash peuvent vous faire gagner un temps pr&#233;cieux en automatisant des t&#226;ches r&#233;p&#233;titives. Pr&#234;ts &#224; d&#233;couvrir comment devenir plus efficaces au quotidien ? C'est parti ! &lt;br class='autobr' /&gt; Pourquoi automatiser avec Bash ? &lt;br class='autobr' /&gt;
Comme vous avez pu le voir en parcourant mes diff&#233;rents articles, j'utilise beaucoup de script bash (&#8230;)&lt;/p&gt;


-
&lt;a href="https://www.teddypayet.com/Blog" rel="directory"&gt;Blog&lt;/a&gt;

/ 
&lt;a href="https://www.teddypayet.com/Astuce" rel="tag"&gt;Astuce&lt;/a&gt;, 
&lt;a href="https://www.teddypayet.com/Notes-de-developpement" rel="tag"&gt;Notes de d&#233;veloppement&lt;/a&gt;, 
&lt;a href="https://www.teddypayet.com/Lignes-de-commandes" rel="tag"&gt;Lignes de commandes&lt;/a&gt;

		</description>


 <content:encoded>&lt;img src='https://www.teddypayet.com/local/cache-vignettes/L150xH113/gabriel-heinzer-4mw7nkqdbyk-unsplash-2500-7633f.jpg?1748259151' class='spip_logo spip_logo_right' width='150' height='113' alt=&#034;&#034; /&gt;
		&lt;div class='rss_chapo'&gt;&lt;p&gt;Salut &#224; tous ! Aujourd'hui, nous allons plonger dans l'univers fascinant de l'automatisation avec les scripts Bash. Que vous soyez un d&#233;veloppeur web ou un administrateur syst&#232;me, les scripts Bash peuvent vous faire gagner un temps pr&#233;cieux en automatisant des t&#226;ches r&#233;p&#233;titives. Pr&#234;ts &#224; d&#233;couvrir comment devenir plus efficaces au quotidien ? C'est parti !&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;h2 class=&#034;spip&#034;&gt;Pourquoi automatiser avec Bash ?&lt;/h2&gt;
&lt;p&gt;Comme vous avez pu le voir en parcourant mes diff&#233;rents articles, j'utilise beaucoup de script bash pour automatiser des actions. J'ai une r&#232;gle : &#034;Si on r&#233;alise plus de 2 fois une action, nous pouvons l'automatiser&#034;. L'automatisation permet de se concentrer sur les t&#226;ches &#224; forte valeur ajout&#233;e en laissant les scripts faire le travail r&#233;p&#233;titif. Bash, l'un des langages de script les plus couramment utilis&#233;s sur les syst&#232;mes Unix et Linux, est parfait pour cela. Voici quelques avantages de l'automatisation avec Bash :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;strong&gt;Gain de temps&lt;/strong&gt; : Les scripts ex&#233;cutent rapidement des t&#226;ches qui prendraient beaucoup de temps manuellement.&lt;/li&gt;&lt;li&gt; &lt;strong&gt;R&#233;duction des erreurs&lt;/strong&gt; : Automatiser minimise les risques d'erreurs humaines.&lt;/li&gt;&lt;li&gt; &lt;strong&gt;Productivit&#233; accrue&lt;/strong&gt; : Vous pouvez automatiser les sauvegardes, les d&#233;ploiements et bien plus encore.&lt;/li&gt;&lt;/ul&gt;&lt;h2 class=&#034;spip&#034;&gt;Les bases de Bash : comment d&#233;buter ?&lt;/h2&gt;
&lt;p&gt;Pour commencer avec Bash, il suffit d'ouvrir votre terminal et de cr&#233;er un fichier script. Voici un exemple simple de script Bash pour vous familiariser :&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;#!/bin/bash echo &#034;Bonjour, monde !&#034;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Enregistrez ce script dans un fichier nomm&#233; &#034;bonjour.sh&#034;, puis donnez-lui les permissions d'ex&#233;cution avec la commande suivante :&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;chmod +x bonjour.sh&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Enfin, ex&#233;cutez le script avec :&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;./bonjour.sh&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Voil&#224;, vous venez de cr&#233;er et d'ex&#233;cuter votre premier script Bash !&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Automatiser les t&#226;ches courantes&lt;/h2&gt;
&lt;p&gt;Voyons maintenant quelques exemples concrets d'automatisation avec Bash.&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;strong&gt;Sauvegardes automatiques :&lt;/strong&gt; Cr&#233;ez un script pour sauvegarder r&#233;guli&#232;rement vos fichiers importants.
&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;#!/bin/bash tar -czf sauvegarde_$(date +%F).tar.gz /chemin/vers/dossier&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ce script cr&#233;e une archive compress&#233;e de votre dossier et y ajoute la date du jour.&lt;/p&gt;
&lt;/li&gt;&lt;li&gt; &lt;strong&gt;Nettoyage de fichiers temporaires :&lt;/strong&gt; Un script pour supprimer les fichiers temporaires peut lib&#233;rer de l'espace disque.
&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;#!/bin/bash rm -rf /tmp/* echo &#034;Fichiers temporaires supprim&#233;s.&#034;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt; &lt;strong&gt;D&#233;ploiement de site web :&lt;/strong&gt; Automatisez le d&#233;ploiement de votre site avec un script.
&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;#!/bin/bash cd /chemin/vers/votre/site git pull origin main echo &#034;Site mis &#224; jour avec succ&#232;s.&#034;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Vous pouvez voir aussi sur mes diff&#233;rents articles d'autres utilisations que j'ai avec les scripts Bash :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;a href='https://www.teddypayet.com/MagicMirror2-un-miroir-qui-vous-veut-du-bien' class=&#034;spip_in&#034;&gt;MagicMirror&#178;, un miroir qui vous veut du bien.&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href='https://www.teddypayet.com/MagicMirror2-on-recommence-depuis-le-debut' class=&#034;spip_in&#034;&gt;MagicMirror&#178;, on recommence depuis le d&#233;but&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href='https://www.teddypayet.com/Des-astuces-et-memos-pour-SVN' class=&#034;spip_in&#034;&gt;Des astuces et m&#233;mos pour SVN&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href='https://www.teddypayet.com/MagicMirror2-configuration-scriptee' class=&#034;spip_in&#034;&gt;MagicMirror&#178;, configuration script&#233;e&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href='https://www.teddypayet.com/MagicMirror&#178;-configuration-scriptee-2eme-partie' class=&#034;spip_in&#034;&gt;MagicMirror&#178;, configuration script&#233;e, 2&#232;me partie&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 class=&#034;spip&#034;&gt;Meilleures pratiques pour &#233;crire des scripts Bash&lt;/h2&gt;
&lt;p&gt;Pour que vos scripts soient efficaces et maintenables, voici quelques bonnes pratiques &#224; suivre :&lt;/p&gt;
&lt;ol class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;strong&gt;Utilisez des commentaires :&lt;/strong&gt; Expliquez ce que fait chaque section de votre script.
&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;#!/bin/bash # Ce script sauvegarde un dossier tar -czf sauvegarde_$(date +%F).tar.gz /chemin/vers/dossier&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt; &lt;strong&gt;V&#233;rifiez les erreurs :&lt;/strong&gt; Utilisez des structures conditionnelles pour g&#233;rer les erreurs.
&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;#!/bin/bash if [ -d /chemin/vers/dossier ]; then tar -czf sauvegarde_$(date +%F).tar.gz /chemin/vers/dossier else echo &#034;Le dossier n'existe pas.&#034; fi&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt; &lt;strong&gt;Cr&#233;ez des scripts modulaires :&lt;/strong&gt; &#201;vitez les scripts trop longs en les divisant en fonctions.
&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;#!/bin/bash sauvegarder() { tar -czf sauvegarde_$(date +%F).tar.gz /chemin/vers/dossier echo &#034;Sauvegarde termin&#233;e.&#034; } sauvegarder&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h2 class=&#034;spip&#034;&gt;Outils pour am&#233;liorer vos scripts&lt;/h2&gt;
&lt;p&gt;Plusieurs outils peuvent vous aider &#224; &#233;crire de meilleurs scripts Bash :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;strong&gt;ShellCheck :&lt;/strong&gt; Un linter pour d&#233;tecter les erreurs dans vos scripts Bash. &lt;a href=&#034;https://www.shellcheck.net/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;ShellCheck&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;strong&gt;Bash-it : &lt;/strong&gt; Un framework pour am&#233;liorer votre configuration Bash avec des plugins et des th&#232;mes. &lt;a href=&#034;https://github.com/Bash-it/bash-it&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Bash-it&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 class=&#034;spip&#034;&gt;Pour r&#233;sumer&lt;/h2&gt;
&lt;p&gt;L'automatisation avec les scripts Bash est un moyen puissant de gagner du temps et d'augmenter votre productivit&#233;. En suivant les bonnes pratiques et en utilisant les outils ad&#233;quats, vous pouvez simplifier de nombreuses t&#226;ches quotidiennes. J'esp&#232;re que cet article vous a donn&#233; des id&#233;es pour commencer &#224; automatiser vos propres t&#226;ches.&lt;/p&gt;
&lt;p&gt;N'h&#233;sitez pas &#224; partager vos exp&#233;riences et vos scripts Bash pr&#233;f&#233;r&#233;s dans les commentaires. Quels sont les scripts que vous utilisez le plus souvent ? Quels d&#233;fis avez-vous rencontr&#233;s ? Partageons nos astuces et apprenons ensemble !&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;N'attendez plus, lancez-vous dans l'automatisation et faites de Bash votre alli&#233; du quotidien !&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;L'automatisation avec Bash peut transformer votre fa&#231;on de travailler. Partagez vos exp&#233;riences, posez vos questions et construisons ensemble une communaut&#233; de d&#233;veloppeurs plus efficaces et collaboratifs !&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_ps'&gt;&lt;p&gt;Photo de &lt;a href=&#034;https://unsplash.com/fr/@6heinz3r?utm_content=creditCopyText&amp;utm_medium=referral&amp;utm_source=unsplash&#034;&gt;Gabriel Heinzer&lt;/a&gt; sur &lt;a href=&#034;https://unsplash.com/fr/photos/texte-4Mw7nkQDByk?utm_content=creditCopyText&amp;utm_medium=referral&amp;utm_source=unsplash&#034;&gt;Unsplash&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>MagicMirror&#178;, configuration script&#233;e, 2&#232;me partie</title>
		<link>https://www.teddypayet.com/MagicMirror%C2%B2-configuration-scriptee-2eme-partie</link>
		<guid isPermaLink="true">https://www.teddypayet.com/MagicMirror%C2%B2-configuration-scriptee-2eme-partie</guid>
		<dc:date>2020-04-14T22:55:42Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Teddy Payet</dc:creator>


		<dc:subject>Astuce</dc:subject>
		<dc:subject>Notes de d&#233;veloppement</dc:subject>
		<dc:subject>Lignes de commandes</dc:subject>
		<dc:subject>MagicMirror</dc:subject>
		<dc:subject>Domotique</dc:subject>

		<description>
&lt;p&gt;Comme vous le savez tous, nous sommes en confinement depuis mi-mars. Pour m'occuper un peu en ch&#244;mage partiel, en plus de ma vie de famille, je me suis inscris &#224; une groupe d'entraide sur le MagicMirror sur Facebook. J'ai eu l'agr&#233;able surprise de voir qu'un article de mon blog &#233;tait cit&#233;. Merci de la confiance de ces utilisateurs ! Apr&#232;s quelques &#233;changes, j'ai propos&#233; d'expliquer plus en d&#233;tail mon installation script&#233;e et notamment ce &#224; quoi correspond mes diff&#233;rents principaux scripts. (&#8230;)&lt;/p&gt;


-
&lt;a href="https://www.teddypayet.com/Blog" rel="directory"&gt;Blog&lt;/a&gt;

/ 
&lt;a href="https://www.teddypayet.com/Astuce" rel="tag"&gt;Astuce&lt;/a&gt;, 
&lt;a href="https://www.teddypayet.com/Notes-de-developpement" rel="tag"&gt;Notes de d&#233;veloppement&lt;/a&gt;, 
&lt;a href="https://www.teddypayet.com/Lignes-de-commandes" rel="tag"&gt;Lignes de commandes&lt;/a&gt;, 
&lt;a href="https://www.teddypayet.com/MagicMirror" rel="tag"&gt;MagicMirror&lt;/a&gt;, 
&lt;a href="https://www.teddypayet.com/Domotique" rel="tag"&gt;Domotique&lt;/a&gt;

		</description>


 <content:encoded>&lt;img src='https://www.teddypayet.com/local/cache-vignettes/L150xH100/arton158-32c60.jpg?1755172268' class='spip_logo spip_logo_right' width='150' height='100' alt=&#034;&#034; /&gt;
		&lt;div class='rss_chapo'&gt;&lt;p&gt;Comme vous le savez tous, nous sommes en confinement depuis mi-mars. Pour m'occuper un peu en ch&#244;mage partiel, en plus de ma vie de famille, je me suis inscris &#224; une groupe &lt;a href=&#034;https://www.facebook.com/groups/2832574870153883/about/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;d'entraide sur le MagicMirror&lt;/a&gt; sur Facebook. J'ai eu l'agr&#233;able surprise de voir qu'un article de mon blog &#233;tait cit&#233;. Merci de la confiance de ces utilisateurs ! &lt;br class='autobr' /&gt;
Apr&#232;s quelques &#233;changes, j'ai propos&#233; d'expliquer plus en d&#233;tail mon installation script&#233;e et notamment ce &#224; quoi correspond mes diff&#233;rents principaux scripts.&lt;/p&gt;
&lt;p&gt;Tout a &#233;t&#233; d&#233;pos&#233; sur github (vous pourrez trouver le lien en bas de l'article). Je reprends ici plus ou moins le contenu du fichier Readme.&lt;/p&gt;
&lt;p&gt;Cet article est un &lt;strong&gt;exemple d'automatisation de la maintenance &lt;/strong&gt; de mon installation de MagicMirror. Le d&#233;p&#244;t github a pour but de montrer la possibilit&#233; d'automatiser la maintenance d'une installation d'un MagicMirror.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;h2 class=&#034;spip&#034;&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Le d&#233;p&#244;t s'appelle mm_config_automate. Son existence n'est que p&#233;dagogique. Il n'est en aucun cas un module de MagicMirror.&lt;/p&gt;
&lt;p&gt;De plus, je ne suis pas responsable d'une alt&#233;ration de vos donn&#233;es. Il vous faudra tester et adapter chaque script pour correspondre &#224; VOS attentes.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Liste des scripts&lt;/h2&gt;
&lt;p&gt;L'ensemble des scripts sont en bash. Ils restent simples &#224; comprendre et &#224; prendre en main avec un peu de patience et de lecture. Voici la liste des scripts :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; first_install.sh&lt;/li&gt;&lt;li&gt; mm_reset.sh&lt;/li&gt;&lt;li&gt; mm_update.sh&lt;/li&gt;&lt;li&gt; update_files_config.sh&lt;/li&gt;&lt;li&gt; disk_usage.sh&lt;/li&gt;&lt;/ul&gt;&lt;h2 class=&#034;spip&#034;&gt;first_install.sh&lt;/h2&gt;
&lt;p&gt;Ce script permet &lt;strong&gt;d'installer l'ensemble des &#233;l&#233;ments de base pour qu'un MagicMirror puisse fonctionner.&lt;/strong&gt; Il est &#224; lancer sur une installation toute belle, toute neuve d'un Raspberry Pi 3. Je n'ai pas test&#233; sur un Raspberry Pi 4 pour le moment. Il prend en compte un Raspbian bas&#233; sur un Debian Buster (10) mis &#224; disposition des utilisateurs en f&#233;vrier 2020.&lt;/p&gt;
&lt;p&gt;Il fera dans l'ordre :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;i&gt;sudo apt update -y&lt;/i&gt; : R&#233;cup&#232;re la liste des mises &#224; jour disponibles&lt;/li&gt;&lt;li&gt; &lt;i&gt;sudo apt upgrade -y&lt;/i&gt; : Installe quelques mises &#224; jour, ne supprime pas les packages&lt;/li&gt;&lt;li&gt; &lt;i&gt;sudo apt autoremove -y&lt;/i&gt; : Supprime tous les anciens paquets qui ne sont plus n&#233;cessaires&lt;/li&gt;&lt;li&gt; &lt;i&gt;sudo apt clean -y&lt;/i&gt; : Cette commande de terminal lib&#232;re de l'espace disque en nettoyant les fichiers .deb t&#233;l&#233;charg&#233;s du r&#233;f&#233;rentiel local.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Puis :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; On active le son par le HDMI ;&lt;/li&gt;&lt;li&gt; Forcer le HDMI ;&lt;/li&gt;&lt;li&gt; Forcer l'affichage vertical de l'&#233;cran ;&lt;/li&gt;&lt;li&gt; Enlever des programmes inutiles ;&lt;/li&gt;&lt;li&gt; Installation de quelques packages ;&lt;/li&gt;&lt;li&gt; Installation de Nodejs et NPM selon la m&#233;thode indiqu&#233;e ici : &lt;a href=&#034;https://github.com/audstanley/NodeJs-Raspberry-Pi&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://github.com/audstanley/NodeJs-Raspberry-Pi&lt;/a&gt;&lt;/li&gt;&lt;li&gt; Ajouter les binaires de node dans le PATH ;&lt;/li&gt;&lt;li&gt; Installation de PM2 ;&lt;/li&gt;&lt;li&gt; Enregistrer les variables d'environnement (le home de MagicMirror, ainsi que de PM2) ;&lt;/li&gt;&lt;li&gt; Cr&#233;ation du fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;mm.sh&lt;/code&gt; dans &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/home/pi/&lt;/code&gt; ;&lt;/li&gt;&lt;li&gt; Ex&#233;cution du script d'installation du MagicMirror ;&lt;/li&gt;&lt;li&gt; Sauvegarder les r&#233;glages de pm2 et lancement des scripts au d&#233;marrage ;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Et enfin, on enregistre le contenu du fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;crontab.txt&lt;/code&gt; dans le &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;crontab&lt;/code&gt; de l'utilisateur en cours.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;mm_reset.sh&lt;/h2&gt;
&lt;p&gt;Ce script installe MagicMirror &#224; partir du d&#233;p&#244;t github dudit projet. Il s'appelle &lt;i&gt;&#034;mm_reset&#034;&lt;/i&gt; au lieu de &lt;i&gt;&#034;mm_install&#034;&lt;/i&gt; car il supprime le r&#233;pertoire &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/home/pi/MagicMirror/&lt;/code&gt; s'il existe. Donc, il faut faire attention &#224; ce point si vous d&#233;sirez garder une pr&#233;c&#233;dente installation.&lt;/p&gt;
&lt;p&gt;A son tour, ce script va lancer une s&#233;rie de commandes :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Arr&#234;t de MM gr&#226;ce &#224; pm2 stop mm ;&lt;/li&gt;&lt;li&gt; Effacer le r&#233;pertoire de MagicMirror si existant ;&lt;/li&gt;&lt;li&gt; R&#233;cup&#233;ration du d&#233;p&#244;t de MagicMirror ;&lt;/li&gt;&lt;li&gt; Passer sur la branche develop de MagicMirror ;&lt;/li&gt;&lt;li&gt; Cr&#233;ation des liens symboliques dans MM (&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;custom.css&lt;/code&gt; et &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;config.js&lt;/code&gt;) ;&lt;/li&gt;&lt;li&gt; Installation des d&#233;pendances de MM gr&#226;ce &#224; npm ;&lt;/li&gt;&lt;li&gt; Lancement du script d'update des modules de MM (cf. &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;update_files_config.sh&lt;/code&gt;) ;&lt;/li&gt;&lt;li&gt; Relancer MM sur pm2.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Liens symboliques&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Dans le script &lt;i&gt;mm_reset.sh&lt;/i&gt;, il est pr&#233;sum&#233; que le fichier &lt;i&gt;&#034;config.js&#034;&lt;/i&gt; et le fichier de personnalisation de css vitaux &#224; MagicMirror soient pr&#233;sents dans votre r&#233;pertoire &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/home/pi/mm_config_automate/&lt;/code&gt;. Un lien symbolique dans &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/home/pi/MagicMirror/css/&lt;/code&gt; et &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/home/pi/MagicMirror/config/&lt;/code&gt; sera fait pointant vers votre r&#233;pertoire &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;mm_config_automate&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;MagicMirror n'y verra que du feu !&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;mm_update.sh&lt;/h2&gt;
&lt;p&gt;Ce script est plus rapide. Dans ce d&#233;p&#244;t d'exemple, il n'est pas utilis&#233; dans le crontab. Il est &#224; utiliser manuellement lorsque MM doit &#234;tre mis &#224; jour.&lt;/p&gt;
&lt;p&gt;Il arr&#234;te MM par pm2, puis va dans le r&#233;pertoire de MagicMirror. A partir de l&#224;, le d&#233;p&#244;t git est mis &#224; jour avec les derniers fichiers. Une installation et une mise &#224; jour des packages npm sont lanc&#233;es.&lt;/p&gt;
&lt;p&gt;Cela fait, on relance MM sur pm2.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;update_files_config.sh&lt;/h2&gt;
&lt;p&gt;Ce script bash est le nerf de la guerre. Crontab appellera dans notre exemple le fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;update_files_config.sh&lt;/code&gt; tous les jours &#224; 00h15.&lt;/p&gt;
&lt;p&gt;Ce script contient 2 fonctions cl&#233;s :&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;import_module&lt;/code&gt; ;&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;delete_modules&lt;/code&gt;.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Apr&#232;s l'utilisation de ces fonctions, une boucle est lanc&#233;e pour v&#233;rifier l'existence du module MMM-AlarmClock. Ce dernier peut utiliser des fichiers mp3 comme sonnerie d'alarme.&lt;/p&gt;
&lt;p&gt;Si vous d&#233;sirez ajouter des fichiers mp3 &#224; votre convenance, il vous suffira de les copier dans le r&#233;pertoire sounds de votre d&#233;p&#244;t &lt;i&gt;&#034;mm_config_automate&#034;&lt;/i&gt;. Automatiquement, tous les soirs (selon le crontab mis en place), chaque fichier mp3 pr&#233;sent sera copi&#233; dans &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/home/pi/MagicMirror/modules/MMM-AlarmClock/sounds/&lt;/code&gt;. Vous n'aurez plus &#224; vous soucier d'autres choses que sa bonne utilisation dans votre fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;config.js&lt;/code&gt;&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;update_files_config.sh : fonction import_module&lt;/h2&gt;
&lt;p&gt;Cette fonction bash attend un param&#232;tre : l'url vers le d&#233;p&#244;t git du module que vous d&#233;sirez installer sur votre MagicMirror.&lt;/p&gt;
&lt;p&gt;Par exemple, si vous d&#233;sirez utiliser le module de pages de MM, vous devez indiquer dans le fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;update_files_config.sh&lt;/code&gt; la commande suivante :&lt;/p&gt; &lt;textarea readonly='readonly' cols='40' rows='2' class='spip_cadre spip_cadre_block' dir='ltr'&gt;import_module https://github.com/edward-shen/MMM-pages.git&lt;/textarea&gt;
&lt;p&gt;Elle ira dans le r&#233;pertoire &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/home/pi/MagicMirror/modules/&lt;/code&gt;, v&#233;rifiera si le module existe d&#233;j&#224; (en gros l'existence du r&#233;pertoire &#034;MMM-pages&#034;) ou pas. S'il n'existe pas, elle clonera le r&#233;pertoire. Puis :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Acc&#233;der au r&#233;pertoire du module ;&lt;/li&gt;&lt;li&gt; Si un fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;package.json &lt;/code&gt;existe, l'installation des packages &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;npm&lt;/code&gt; est lanc&#233;e.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Il faudra utiliser cette fonction autant de fois que de modules d&#233;sir&#233;s. Vous trouverez des exemples dans ledit fichier. &lt;br class='autobr' /&gt;
Cerise sur le gateau, si le module existe d&#233;j&#224;, il le mettra &#224; jour avec les derniers fichiers provenant du d&#233;p&#244;t que vous avez indiqu&#233; en param&#232;tre.&lt;/p&gt;
&lt;div style=&#034;width:100%;height:0;padding-bottom:92%;position:relative;&#034;&gt;&lt;iframe src=&#034;https://giphy.com/embed/12NUbkX6p4xOO4&#034; width=&#034;100%&#034; height=&#034;100%&#034; style=&#034;position:absolute&#034; frameBorder=&#034;0&#034; class=&#034;giphy-embed&#034; allowFullScreen&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;update_files_config.sh : fonction delete_modules&lt;/h2&gt;
&lt;p&gt;Cette fonction se lance apr&#232;s l'ensemble des appels &#224; &lt;i&gt;import_module&lt;/i&gt;. Elle a pour but de supprimer les modules pr&#233;sents dans &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/home/pi/MagicMirror/modules/&lt;/code&gt; devenus obsol&#232;tes.&lt;/p&gt;
&lt;p&gt;Comme vous le savez, pour utiliser un module dans MagicMirror, nous devons l'avoir t&#233;l&#233;charg&#233; d'une part dans &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/home/pi/MagicMirror/modules/&lt;/code&gt; mais d'autre part l'avoir indiqu&#233; dans notre fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;config.js&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Si le r&#233;pertoire &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/home/pi/MagicMirror/modules/nom_repertoire/&lt;/code&gt; n'est pas indiqu&#233; dans ce fichier, le r&#233;pertoire sera consid&#233;r&#233; comme obsol&#232;te. Donc, qu'il peut &#234;tre supprim&#233;. La pr&#233;sente fonction v&#233;rifiera chaque r&#233;pertoire dans &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;modules/&lt;/code&gt; &#224; l'exclusion de :&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;default/&lt;/code&gt;&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;node_modules/&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Cela pr&#233;servera l'espace disque de votre Raspberry Pi et &#233;vitera des erreurs dans votre MagicMirror.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;disk_usage.sh&lt;/h2&gt;
&lt;p&gt;Ce script permet de savoir le pourcentage d'utilisation d'espace disque. Dans le pr&#233;sent exemple, si le taux d'utilisation arrive &#224; 90% de sa capacit&#233;, un email est envoy&#233; (je vous laisse le soin de configurer le serveur d'envoi d'emails).&lt;/p&gt;
&lt;p&gt;Il faut savoir que pm2 &#233;crit beaucoup d'information dans les logs (cela d&#233;pend surtout des applications lanc&#233;es sous pm2 mais c'est un autre sujet). En prenant cela en compte, si le taux d'utilisation exc&#232;de les 90%, le script lance en premier lieu la commande pm2 flush pour vider l'ensemble des fichiers logs de pm2. Puis v&#233;rifie &#224; nouveau le taux de remplissage. Si la commande n'a pas chang&#233; la donne, l'email est envoy&#233;.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;crontab.txt&lt;/h2&gt;
&lt;p&gt;Ce petit bout de fichier vous permet d'indiquer l'heure &#224; laquelle vos routines doivent &#234;tre mises en place.&lt;/p&gt;
&lt;p&gt;Dans le pr&#233;sent exemple, voici les routines :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; A 0h00 : On v&#233;rifie d'abord l'espace disque&lt;/li&gt;&lt;li&gt; A 0h05 : On met &#224; jour les fichiers de mm_config_automate&lt;/li&gt;&lt;li&gt; A 0h10 : On importe le contenu du fichier crontab.txt dans le crontab &#224; 00h10&lt;/li&gt;&lt;li&gt; A 0h15 : On peut maintenant lancer les scripts de routine (update_files_config.sh)&lt;/li&gt;&lt;li&gt; A 0h20 : On relance MagicMirror pour prendre en compte la configuration &#224; jour.&lt;/li&gt;&lt;li&gt; Tous les mois, on red&#233;marre le Raspberry Pi&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Si vous &#234;tes parents et/ou assujetti &#224; des p&#233;riodes de vacances et un planning diff&#233;rents durant ces p&#233;riodes, il est possible de mettre en place un fichier de config d&#233;di&#233; &#224; cette p&#233;riode.&lt;/p&gt;
&lt;p&gt;Dans notre exemple, le contenu de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;config.js&lt;/code&gt; et &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;config_vac.js&lt;/code&gt; sont identiques. Le but est d'illustrer l'existence des fichiers selon la p&#233;riode. En ayant en t&#234;te les dates de vacances qui vous int&#233;ressent, vous pouvez ajouter une ligne d&#233;di&#233;e dans crontab pour que le lien symbolique de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/home/pi/MagicMirror/config/config.js&lt;/code&gt; pointe vers le fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/home/pi/mm_config_automate/config_vac.js&lt;/code&gt; au lieu de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/home/pi/mm_config_automate/config.js&lt;/code&gt;. Le jour o&#249; vous devez revenir au travail (donc la fin de votre p&#233;riode de vacances) &#224; 00h30, il suffira de remettre le lien symbolique vers &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/home/pi/mm_config_automate/config.js&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Exemple pour les vacances de l'Ascension de la zone C :&lt;/p&gt; &lt;textarea readonly='readonly' cols='40' rows='9' class='spip_cadre spip_cadre_block' dir='ltr'&gt;############### # Vacances Ascension : 20 mai 30 0 20 5 0 cd /home/pi/MagicMirror/config/; rm -rf config.js; ln -s /home/pi/mm_config_automate/config_vac.js config.js; pm2 restart mm # Rentr&#233;e : 25 mai 30 0 25 5 * cd /home/pi/MagicMirror/config/; rm -rf config.js; ln -s /home/pi/mm_config_automate/config.js config.js; pm2 restart mm&lt;/textarea&gt;
&lt;p&gt;Voil&#224;. A vous de prendre en main ce projet en le copiant dans un d&#233;p&#244;t personnel priv&#233; et de le faire vivre.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Le projet sur github&lt;/h2&gt;
&lt;p&gt;Comme indiqu&#233; en d&#233;but de cet article, les diff&#233;rents fichiers ont &#233;t&#233; d&#233;pos&#233; sur github. Ils ont pour but de vous aider &#224; mettre en place votre automatisation :&lt;br class='autobr' /&gt;
&lt;a href=&#034;https://github.com/Ybbet/mm_config_automate&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://github.com/Ybbet/mm_config_automate&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Attention de ne pas mettre le projet en public si vous l'utiliser sur VOTRE installation. Pr&#233;servez votre vie... priv&#233;e.&lt;/p&gt;
&lt;div class=&#034;row&#034;&gt; &lt;div class=&#034;col-xs-12&#034;&gt; &lt;h2&gt;A lire aussi&lt;/h2&gt; &lt;ul class=&#034;spip spip-list&#034;&gt; &lt;li class=&#034;item&#034;&gt;&lt;a href='https://www.teddypayet.com/MagicMirror2-un-miroir-qui-vous-veut-du-bien'&gt;MagicMirror&#178;, un miroir qui vous veut du bien.&lt;/a&gt; &lt;/li&gt; &lt;li class=&#034;item&#034;&gt;&lt;a href='https://www.teddypayet.com/MagicMirror2-on-recommence-depuis-le-debut'&gt;MagicMirror&#178;, on recommence depuis le d&#233;but&lt;/a&gt; &lt;/li&gt; &lt;li class=&#034;item&#034;&gt;&lt;a href='https://www.teddypayet.com/MagicMirror2-un-socle-qui-lui-va-comme-un-gant'&gt;MagicMirror&#178;, un socle qui lui va comme un gant&lt;/a&gt; &lt;/li&gt; &lt;li class=&#034;item&#034;&gt;&lt;a href='https://www.teddypayet.com/MagicMirror2-un-Raspberry-Pi-un-ecran-et-cie-sont-dans-un-bateau'&gt;MagicMirror&#178;, un Raspberry Pi, un &#233;cran et cie sont dans un bateau&lt;/a&gt; &lt;/li&gt; &lt;li class=&#034;item&#034;&gt;&lt;a href='https://www.teddypayet.com/MagicMirror2-ma-configuration-personnalisee'&gt;MagicMirror&#178;, ma configuration personnalis&#233;e&lt;/a&gt; &lt;/li&gt; &lt;li class=&#034;item&#034;&gt;&lt;a href='https://www.teddypayet.com/MagicMirror2-configuration-scriptee'&gt;MagicMirror&#178;, configuration script&#233;e&lt;/a&gt; &lt;/li&gt; &lt;li class=&#034;item&#034;&gt;&lt;em&gt;MagicMirror&#178;, configuration script&#233;e, 2&#232;me partie&lt;/em&gt;&lt;/li&gt; &lt;li class=&#034;item&#034;&gt;&lt;a href='https://www.teddypayet.com/Pourquoi-j-ai-integre-Home-Assistant-dans-mon-MagicMirror'&gt;Pourquoi j'ai int&#233;gr&#233; Home Assistant dans mon MagicMirror&lt;/a&gt; &lt;/li&gt; &lt;li class=&#034;item&#034;&gt;&lt;a href='https://www.teddypayet.com/Installer-et-configurer-HACS-pour-enrichir-Home-Assistant'&gt;Installer et configurer HACS pour enrichir Home Assistant&lt;/a&gt; &lt;/li&gt; &lt;li class=&#034;item&#034;&gt;&lt;a href='https://www.teddypayet.com/Construire-les-pages-Lovelace-du-Magic-Mirror'&gt;Construire les pages Lovelace du Magic Mirror&lt;/a&gt; &lt;/li&gt; &lt;li class=&#034;item&#034;&gt;&lt;a href='https://www.teddypayet.com/Calendriers-routines-et-organisation-familiale-Page-2'&gt;Calendriers, routines et organisation familiale (Page 2)&lt;/a&gt; &lt;/li&gt; &lt;li class=&#034;item&#034;&gt;&lt;a href='https://www.teddypayet.com/Suivi-de-l-environnement-et-bien-etre-Page-3'&gt;Suivi de l'environnement et bien-&#234;tre (Page 3)&lt;/a&gt; &lt;/li&gt; &lt;li class=&#034;item&#034;&gt;&lt;a href='https://www.teddypayet.com/Automatiser-la-rotation-des-pages-du-Magic-Mirror'&gt;Automatiser la rotation des pages du Magic Mirror&lt;/a&gt; &lt;/li&gt; &lt;li class=&#034;item&#034;&gt;&lt;a href='https://www.teddypayet.com/Personnalisation-et-astuces-d-affichage-avec-card_mod'&gt;Personnalisation et astuces d'affichage avec card_mod&lt;/a&gt; &lt;/li&gt; &lt;li class=&#034;item&#034;&gt;&lt;a href='https://www.teddypayet.com/Magic-Mirror-avec-Home-Assistant-pour-aller-plus-loin'&gt;Magic Mirror avec Home Assistant, pour aller plus loin&#8230;&lt;/a&gt; &lt;/li&gt; &lt;li class=&#034;item&#034;&gt;&lt;a href='https://www.teddypayet.com/20-ans-de-blogging-technique-ce-que-j-ai-appris'&gt;20 ans de blogging technique : ce que j'ai appris&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt; &lt;/div&gt; &lt;/div&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Plugin &#171; Agrandir la largeur de page &#187;</title>
		<link>https://www.teddypayet.com/Plugin-Agrandir-la-largeur-de-page</link>
		<guid isPermaLink="true">https://www.teddypayet.com/Plugin-Agrandir-la-largeur-de-page</guid>
		<dc:date>2015-08-03T07:00:00Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Teddy Payet</dc:creator>


		<dc:subject>SPIP</dc:subject>
		<dc:subject>HTML</dc:subject>
		<dc:subject>Astuce</dc:subject>
		<dc:subject>Communaut&#233; SPIP</dc:subject>
		<dc:subject>PHP</dc:subject>
		<dc:subject>B&#233;n&#233;vole</dc:subject>
		<dc:subject>Sublime Text</dc:subject>
		<dc:subject>SVN</dc:subject>

		<description>
&lt;p&gt;Ce plugin permet d'agrandir la largeur de la page dans l'espace priv&#233; de SPIP. Vous pourrez personnaliser cette largeur si besoin. &lt;br class='autobr' /&gt;
Pour informations, le pr&#233;fixe du plugin est spip_hop. Il vient de l'onomatop&#233;e &#034;Hop&#034; qui, selon Wikipedia, signifie une &#171; exclamation sugg&#233;rant l'ex&#233;cution d'un saut ou d'une man&#339;uvre habile &#187;. De par sa fonctionnalit&#233; principale &#034;les &#233;crans&#034;, j'aurais pu l'appeler spip_ecran mais ce terme est trop proche de l'id&#233;e &#034;&#233;cran de s&#233;curit&#233;&#034; induisant ainsi (&#8230;)&lt;/p&gt;


-
&lt;a href="https://www.teddypayet.com/Plugins" rel="directory"&gt;Plugins&lt;/a&gt;

/ 
&lt;a href="https://www.teddypayet.com/SPIP" rel="tag"&gt;SPIP&lt;/a&gt;, 
&lt;a href="https://www.teddypayet.com/HTML" rel="tag"&gt;HTML&lt;/a&gt;, 
&lt;a href="https://www.teddypayet.com/Astuce" rel="tag"&gt;Astuce&lt;/a&gt;, 
&lt;a href="https://www.teddypayet.com/Communaute-SPIP" rel="tag"&gt;Communaut&#233; SPIP&lt;/a&gt;, 
&lt;a href="https://www.teddypayet.com/PHP" rel="tag"&gt;PHP&lt;/a&gt;, 
&lt;a href="https://www.teddypayet.com/Benevole" rel="tag"&gt;B&#233;n&#233;vole&lt;/a&gt;, 
&lt;a href="https://www.teddypayet.com/Sublime-Text" rel="tag"&gt;Sublime Text&lt;/a&gt;, 
&lt;a href="https://www.teddypayet.com/SVN" rel="tag"&gt;SVN&lt;/a&gt;

		</description>


 <content:encoded>&lt;img src='https://www.teddypayet.com/local/cache-vignettes/L150xH100/arton143-adfed.png?1748349715' class='spip_logo spip_logo_right' width='150' height='100' alt=&#034;&#034; /&gt;
		&lt;div class='rss_texte'&gt;&lt;p&gt;Ce plugin permet d'agrandir la largeur de la page dans l'espace priv&#233; de SPIP. Vous pourrez personnaliser cette largeur si besoin.&lt;/p&gt;
&lt;p&gt;Pour informations, le pr&#233;fixe du plugin est &lt;i&gt;spip_hop&lt;/i&gt;. Il vient de l'onomatop&#233;e &#034;Hop&#034; qui, selon Wikipedia, signifie une &#171; exclamation sugg&#233;rant l'ex&#233;cution d'un saut ou d'une man&#339;uvre habile &#187;. De par sa fonctionnalit&#233; principale &#034;les &#233;crans&#034;, j'aurais pu l'appeler &lt;i&gt;spip_ecran&lt;/i&gt; mais ce terme est trop proche de l'id&#233;e &#034;&#233;cran de s&#233;curit&#233;&#034; induisant ainsi l'utilisateur en erreur.&lt;br class='autobr' /&gt;
Mais &#034;Hop&#034; est aussi la r&#233;action des beta-testeurs de ce plugin apr&#232;s son activation. &lt;i&gt;&#034;Et hop !&#034;&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;Pour plus d'informations :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;a href=&#034;http://contrib.spip.net/Plugin-Agrandir-la-largeur-de-page&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;http://contrib.spip.net/Plugin-Agrandir-la-largeur-de-page&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;http://plugins.spip.net/spip_hop.html&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;http://plugins.spip.net/spip_hop.html&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Cr&#233;er un trunk sur la zone SPIP</title>
		<link>https://www.teddypayet.com/Creer-un-trunk-sur-la-zone-SPIP</link>
		<guid isPermaLink="true">https://www.teddypayet.com/Creer-un-trunk-sur-la-zone-SPIP</guid>
		<dc:date>2015-07-30T07:00:00Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Teddy Payet</dc:creator>


		<dc:subject>Astuce</dc:subject>
		<dc:subject>Notes de d&#233;veloppement</dc:subject>
		<dc:subject>Mac OS</dc:subject>
		<dc:subject>SVN</dc:subject>

		<description>
&lt;p&gt;Il arrive parfois que lorsqu'on a cr&#233;&#233; un plugin sur SPIP-Zone (ou qu'on veuille reprendre le d&#233;veloppement d'un plugin sur SPIP-Zone) que ce plugin n'est pas sur la structure trunk/branches/tags. Pour reprendre ce plugin, il est conseill&#233; de mettre le r&#233;pertoire sous cette structure avant de commencer. &lt;br class='autobr' /&gt; Un script pour les commander tous ! Au lieu de faire cela ligne par ligne, commande par commande, vous pouvez lancer un script &#224; personnaliser selon le besoin. Les lignes de commande &#224; (&#8230;)&lt;/p&gt;


-
&lt;a href="https://www.teddypayet.com/Blog" rel="directory"&gt;Blog&lt;/a&gt;

/ 
&lt;a href="https://www.teddypayet.com/Astuce" rel="tag"&gt;Astuce&lt;/a&gt;, 
&lt;a href="https://www.teddypayet.com/Notes-de-developpement" rel="tag"&gt;Notes de d&#233;veloppement&lt;/a&gt;, 
&lt;a href="https://www.teddypayet.com/Mac-OS" rel="tag"&gt;Mac OS&lt;/a&gt;, 
&lt;a href="https://www.teddypayet.com/SVN" rel="tag"&gt;SVN&lt;/a&gt;

		</description>


 <content:encoded>&lt;img src='https://www.teddypayet.com/local/cache-vignettes/L150xH100/arton135-764e1.jpg?1754353680' class='spip_logo spip_logo_right' width='150' height='100' alt=&#034;&#034; /&gt;
		&lt;div class='rss_chapo'&gt;&lt;p&gt;Il arrive parfois que lorsqu'on a cr&#233;&#233; un plugin sur SPIP-Zone (ou qu'on veuille reprendre le d&#233;veloppement d'un plugin sur SPIP-Zone) que ce plugin n'est pas sur la structure &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;trunk/branches/tags&lt;/code&gt;. Pour reprendre ce plugin, il est conseill&#233; de mettre le r&#233;pertoire sous cette structure avant de commencer.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;h2 class=&#034;spip&#034;&gt;Un script pour les commander tous !&lt;/h2&gt;
&lt;p&gt;Au lieu de faire cela ligne par ligne, commande par commande, vous pouvez lancer un script &#224; personnaliser selon le besoin. Les lignes de commande &#224; taper ne sont pas forc&#233;ment tr&#232;s nombreuses mais elles sont r&#233;p&#233;titives. Je vais de ce fait vous montrer un script bash qui simplifiera cette migration. Mais qui dit &lt;i&gt;&#034;bash&#034;&lt;/i&gt;, dit &#234;tre donc sous un environnement UNIX : Linux, Mac OS.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Le script&lt;/h2&gt;
&lt;textarea readonly='readonly' cols='40' rows='23' class='spip_cadre spip_cadre_block' dir='ltr'&gt;#!/bin/bash
url_svn=svn://zone.spip.org/spip-zone/_plugins_/
plugin_nom=votreplugin
plugin_numero=0.9.0
svn mv ${url_svn}${plugin_nom} ${url_svn}${plugin_nom}_trunk -m &#034;On commence la migration du plugin ${plugin_nom} en trunk/branches/tags&#034;
svn mkdir ${url_svn}${plugin_nom} ${url_svn}${plugin_nom}/branches/ ${url_svn}${plugin_nom}/tags/ -m &#034;On recr&#233;e le nom du r&#233;pertoire ${plugin_nom} avec le r&#233;pertoire branches/ et tags/&#034;
svn cp ${url_svn}${plugin_nom}_trunk ${url_svn}${plugin_nom}/branches/v${plugin_numero:0:1} -m &#034;On copie les fichiers du plugin ${plugin_nom} dans sa branche v${plugin_numero:0:1}&#034;
svn cp ${url_svn}${plugin_nom}/branches/v${plugin_numero:0:1} ${url_svn}${plugin_nom}/tags/${plugin_numero} -m &#034;On pose le tag correspondant &#224; la version ${plugin_numero} du plugin ${plugin_nom}&#034;
svn mv ${url_svn}${plugin_nom}_trunk ${url_svn}${plugin_nom}/trunk -m &#034;On d&#233;place enfin le r&#233;pertoire initial vers le trunk pour le plugin ${plugin_nom} v${plugin_numero}&#034;&lt;/textarea&gt;&lt;h2 class=&#034;spip&#034;&gt;Personnalisation&lt;/h2&gt;
&lt;p&gt;Il faut copier-coller ces lignes de commande dans un fichier qui aura pour extension &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;.sh&lt;/code&gt;. Pour votre plugin, vous devez changer 2 valeurs :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;i&gt;plugin_nom&lt;/i&gt; : le nom du r&#233;pertoire de votre plugin&lt;/li&gt;&lt;li&gt; &lt;i&gt;plugin_numero&lt;/i&gt; : le num&#233;ro du plugin (sous la forme &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;x.y.z&lt;/code&gt;) que vous trouverez dans le fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;plugin.xml&lt;/code&gt; ou &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;paquet.xml&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Vous n'avez pas besoin de changer l'URL du serveur svn de la zone sauf si le plugin que vous d&#233;sirez reprendre le d&#233;veloppement n'est pas dans le r&#233;pertoire &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;_plugins_&lt;/code&gt;.&lt;br class='autobr' /&gt;
Ce script va faire &lt;strong&gt;5 commits&lt;/strong&gt; au final avec les commentaires qui vont bien avec. Pour cela, ouvrez votre terminal et lancer le script que vous avez cr&#233;&#233;.&lt;/p&gt;
&lt;p&gt;J'ai d&#233;j&#224; &#233;prouv&#233; ce script &#224; mon travail sur mes diff&#233;rents projets. &lt;strong&gt;Il est simple et efficace.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Explications&lt;/h2&gt;
&lt;p&gt;M&#234;me si le script est simple, on peut expliquer ce qui se passe et notamment l'&#233;criture particuli&#232;re de la syntaxe de bash.&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Tout fichier bash commence par la ligne &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#!/bin/bash&lt;/code&gt;. Cela indique (en plus de l'extension &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;.sh&lt;/code&gt;) que c'est bien un fichier&#8230; bash.&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;url_svn=&lt;/code&gt; : lorsque vous voyez un texte suivi d'un simple signe &#233;gal &lt;i&gt;&#034;=&#034;&lt;/i&gt;, c'est que vous cr&#233;ez une variable avec une valeur ;&lt;/li&gt;&lt;li&gt; Pour rappeler au besoin la variable, vous devez taper &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$&lt;/code&gt; puis le nom de la variable d&#233;sir&#233;e.&lt;/li&gt;&lt;li&gt; Pour pouvoir mettre du texte coll&#233; &#224; votre variable, il faut mettre le nom de la variable entre accolades. Exemple : &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;${plugin_nom}_trunk&lt;/code&gt; donnera &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;votreplugin_trunk&lt;/code&gt;&lt;/li&gt;&lt;li&gt; Si vous d&#233;sirez avoir les premiers caract&#232;res de votre variable, dans le rappel de votre variable, vous pouvez utiliser la forme &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;${nom_variable:debut:longueur}&lt;/code&gt; o&#249; :
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;i&gt;nom_variable&lt;/i&gt; : le nom de votre variable ;&lt;/li&gt;&lt;li&gt; &lt;i&gt;debut&lt;/i&gt; : emplacement o&#249; commencer (0 &#233;tant le num&#233;ro du premier caract&#232;re) ;&lt;/li&gt;&lt;li&gt; &lt;i&gt;longueur&lt;/i&gt; : le nombre de caract&#232;res que vous d&#233;sirez r&#233;cup&#233;rer.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 class=&#034;spip&#034;&gt;Plus de lecture&lt;/h2&gt;
&lt;p&gt;Le sujet du rangement sur la zone a &#233;t&#233; abord&#233; &#224; plusieurs reprises :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;a href=&#034;http://contrib.spip.net/La-Zone-Facile&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;http://contrib.spip.net/La-Zone-Facile&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;http://www.weblog.eliaz.fr/article113.html&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;http://www.weblog.eliaz.fr/article113.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;http://plugins.spip.net/distribuer-une-contribution.html&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;http://plugins.spip.net/distribuer-une-contribution.html&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;
		&lt;div class='rss_ps'&gt;&lt;p&gt;Image : &#169; &lt;a href=&#034;http://www.lifeofpix.com/gallery/squirrel/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;By Leroy&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Squelettes &#034;Z-core&#034; sous SPIP 3 - astuces</title>
		<link>https://www.teddypayet.com/Squelettes-Z-core-sous-SPIP-3-astuces</link>
		<guid isPermaLink="true">https://www.teddypayet.com/Squelettes-Z-core-sous-SPIP-3-astuces</guid>
		<dc:date>2014-01-14T12:10:10Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Teddy Payet</dc:creator>


		<dc:subject>SPIP</dc:subject>
		<dc:subject>HTML</dc:subject>
		<dc:subject>Astuce</dc:subject>
		<dc:subject>Notes de d&#233;veloppement</dc:subject>
		<dc:subject>Javascript</dc:subject>

		<description>
&lt;p&gt;Il n'est plus n&#233;cessaire, je pense, de pr&#233;senter l'architecture des squelettes sous la nomenclature &#034;Z&#034;. Beaucoup l'utilise aujourd'hui, moi le premier. &lt;br class='autobr' /&gt; Pr&#233;ambule Le plugin Z-core est l'h&#233;ritage du plugin Zpip d&#233;velopp&#233; par Matthieu Marcillaud, C&#233;dric Morin, Romy T&#234;tue et un collectif SPIP. Z-core est le moteur offrant le d&#233;coupage des squelettes. Il ne fournit pas de squelettes. C'est &#224; nous ou au plugin choisi de fournir les pages qui vont bien. C'est rapide et efficace. Il faut savoir (&#8230;)&lt;/p&gt;


-
&lt;a href="https://www.teddypayet.com/Blog" rel="directory"&gt;Blog&lt;/a&gt;

/ 
&lt;a href="https://www.teddypayet.com/SPIP" rel="tag"&gt;SPIP&lt;/a&gt;, 
&lt;a href="https://www.teddypayet.com/HTML" rel="tag"&gt;HTML&lt;/a&gt;, 
&lt;a href="https://www.teddypayet.com/Astuce" rel="tag"&gt;Astuce&lt;/a&gt;, 
&lt;a href="https://www.teddypayet.com/Notes-de-developpement" rel="tag"&gt;Notes de d&#233;veloppement&lt;/a&gt;, 
&lt;a href="https://www.teddypayet.com/Javascript" rel="tag"&gt;Javascript&lt;/a&gt;

		</description>


 <content:encoded>&lt;img src='https://www.teddypayet.com/local/cache-vignettes/L150xH100/arton127-cdfe0.jpg?1755172352' class='spip_logo spip_logo_right' width='150' height='100' alt=&#034;&#034; /&gt;
		&lt;div class='rss_chapo'&gt;&lt;p&gt;Il n'est plus n&#233;cessaire, je pense, de pr&#233;senter l'architecture des squelettes sous la &lt;a href=&#034;http://contrib.spip.net/Le-Squelette-Zpip&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;nomenclature &#034;Z&#034;&lt;/a&gt;. Beaucoup l'utilise aujourd'hui, moi le premier.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;h2 class=&#034;spip&#034;&gt;Pr&#233;ambule&lt;/h2&gt;
&lt;p&gt;Le plugin &lt;a href=&#034;http://plugins.spip.net/zcore.html&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Z-core&lt;/a&gt; est l'h&#233;ritage du plugin &lt;a href=&#034;http://plugins.spip.net/plugin4344.html&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Zpip&lt;/a&gt; d&#233;velopp&#233; par Matthieu Marcillaud, C&#233;dric Morin, Romy T&#234;tue et un collectif SPIP. Z-core est le moteur offrant le d&#233;coupage des squelettes. Il ne fournit pas de squelettes. C'est &#224; nous ou au plugin choisi de fournir les pages qui vont bien.&lt;br class='autobr' /&gt;
&lt;strong&gt;C'est rapide et efficace.&lt;/strong&gt; Il faut savoir aussi que les noms de blocs/zones ont chang&#233; par rapport &#224; Zpip. Presque que chaque zone correspond &#224; un r&#233;pertoire.&lt;br class='autobr' /&gt;
C'est un peu complexe &#224; appr&#233;hender au d&#233;part. Mais c'est un aspect &#034;vite oubli&#233;&#034; au profit de son efficacit&#233;.&lt;/p&gt;
&lt;blockquote class=&#034;alert alert-info&#034;&gt;&lt;h2 class=&#034;spip&#034;&gt;Remarque&lt;/h2&gt;
&lt;p&gt;L'un des premiers jeux de squelettes offerts &#224; la communaut&#233; SPIP utilisant cette m&#233;canique &lt;i&gt;zcore&lt;/i&gt; est le plugin &#034;SPIP-r&#034; d&#233;velopp&#233; par C&#233;dric.&lt;br class='manualbr' /&gt;Toute la doc sur ce site : &lt;a href=&#034;http://spipr.nursit.com/&#034; class=&#034;spip_url spip_out&#034; rel=&#034;external&#034;&gt;http://spipr.nursit.com/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;&lt;h2 class=&#034;spip&#034;&gt;Probl&#233;matique&lt;/h2&gt;
&lt;p&gt;Il arrive parfois que l'on d&#233;sire que la page sommaire ait sa propre architecture, diff&#233;rente du reste des pages classiques.&lt;br class='autobr' /&gt;
On pourrait ajouter des balises conditionnelles si on se trouve sur un &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#ENV{type-page}|=={sommaire}&lt;/code&gt; mais &#231;a risque de faire lourd si votre mise en page est complexe.&lt;/p&gt;
&lt;p&gt;Voici le &lt;strong&gt;code initial de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;structure.html&lt;/code&gt;&lt;/strong&gt; fournit par Zcore :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='prettyprint spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;[(#VAL{_Z_DOCTYPE}|defined|?{#VAL{_Z_DOCTYPE}|constant}|sinon{&lt;!DOCTYPE HTML&gt;})][
(#SET{class,[page_(#ENV{type-page,page})[ #ENV{type-page,page}_(#ENV{composition,''})]][ composition_(#ENV{composition})]})][
(#REM) http://paulirish.com/2008/conditional-stylesheets-vs-css-hacks-answer-neither/]
&lt;!--[if lt IE 7 ]&gt; &lt;html class=&#034;[(#GET{class})][ (#LANG_DIR)][ (#LANG)] no-js ie ie6 lte9 lte8 lte7&#034; xmlns=&#034;http://www.w3.org/1999/xhtml&#034; xml:lang=&#034;#LANG&#034; lang=&#034;#LANG&#034; dir=&#034;#LANG_DIR&#034;&gt; &lt;![endif]--&gt;
&lt;!--[if IE 7 ]&gt; &lt;html class=&#034;[(#GET{class})][ (#LANG_DIR)][ (#LANG)] no-js ie ie7 lte9 lte8 lte7&#034; xmlns=&#034;http://www.w3.org/1999/xhtml&#034; xml:lang=&#034;#LANG&#034; lang=&#034;#LANG&#034; dir=&#034;#LANG_DIR&#034;&gt; &lt;![endif]--&gt;
&lt;!--[if IE 8 ]&gt; &lt;html class=&#034;[(#GET{class})][ (#LANG_DIR)][ (#LANG)] no-js ie ie8 lte9 lte8&#034; xmlns=&#034;http://www.w3.org/1999/xhtml&#034; xml:lang=&#034;#LANG&#034; lang=&#034;#LANG&#034; dir=&#034;#LANG_DIR&#034;&gt; &lt;![endif]--&gt;
&lt;!--[if IE 9 ]&gt; &lt;html class=&#034;[(#GET{class})][ (#LANG_DIR)][ (#LANG)] no-js ie ie9 lte9&#034; xmlns=&#034;http://www.w3.org/1999/xhtml&#034; xml:lang=&#034;#LANG&#034; lang=&#034;#LANG&#034; dir=&#034;#LANG_DIR&#034;&gt; &lt;![endif]--&gt;
&lt;!--[if (gt IE 9)|!(IE)]&gt;&lt;!--&gt;
&lt;html class=&#034;[(#GET{class})][ (#LANG_DIR)][ (#LANG)] no-js&#034; xmlns=&#034;http://www.w3.org/1999/xhtml&#034; xml:lang=&#034;#LANG&#034; lang=&#034;#LANG&#034; dir=&#034;#LANG_DIR&#034;&gt;
&lt;!--&lt;![endif]--&gt; &lt;head&gt; &lt;script type='text/javascript'&gt;/*&lt;![CDATA[*/(function(H){H.className=H.className.replace(/\bno-js\b/,'js')})(document.documentElement);/*]]&gt;*/&lt;/script&gt;[ (#REM) Debut du head particulier a chaque page pour inserer un title, des css particulieres(mais surchargees), ou des js *inline* ]&lt;INCLURE{fond=head/#ENV{type-page},env}&gt;[ (#REM) Partie commune a toutes les pages, sans env ]&lt;INCLURE{fond=inclure/head}&gt;[ (#REM) Fin du head particulier a chaque page, pour inserer des js specifiques par exemple pour inserer des js *externes* ]&lt;INCLURE{fond=head_js/#ENV{type-page},env}&gt; &lt;/head&gt; &lt;INCLURE{fond=body,env}&gt;
&lt;/html&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Zcore renvoie vers un &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;body.html&lt;/code&gt; unique pour tout le monde.&lt;br class='autobr' /&gt;
Comment dire &#224; Zcore/SPIP qu'on veut une mise en page particuli&#232;re pour le sommaire ?&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Astuce&lt;/h2&gt;
&lt;p&gt;Pour cela, on peut tr&#232;s facilement ajouter 2 ou 3 lignes de codes pour que SPIP s&#233;lectionne le &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;body.html&lt;/code&gt; appropri&#233; pour le sommaire. &lt;br class='autobr' /&gt;
Comme dit plus haut et vu dans le code initial, Z-core envoie une variable d'environnement nomm&#233; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;type-page&lt;/code&gt;. &lt;br class='autobr' /&gt;
Une page &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;sommaire.html&lt;/code&gt; aura pour variable &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;type-page=sommaire&lt;/code&gt;. Pour un article, nous aurons &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;type-page=article&lt;/code&gt;, rubrique &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;type-page=rubrique&lt;/code&gt;, etc.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Le code magique&lt;/h2&gt;
&lt;p&gt;Pour se faire, on va remplacer &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;INCLURE{fond=body,env} /&gt;&lt;/code&gt; par ceci :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='prettyprint spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;#SET{body,body}
[(#CHEMIN{body_#ENV{type-page}.html}|?{#SET{body,body_#ENV{type-page}},#SET{body,#GET{body}}})]
[(#CHEMIN{body_#ENV{type-page}-#ENV{composition}.html}|?{#SET{body,body_#ENV{type-page}-#ENV{composition}},#SET{body,#GET{body}}})]
&lt;INCLURE{fond=#GET{body},env} /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Explications&lt;/strong&gt;&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; On initialise une variable &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;body&lt;/code&gt; avec pour valeur par d&#233;faut &#034;body&#034;.&lt;/li&gt;&lt;li&gt; Gr&#226;ce &#224; la premi&#232;re balise &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#CHEMIN&lt;/code&gt;&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;La doc est par ici&#034; id=&#034;nh1&#034;&gt;1&lt;/a&gt;]&lt;/span&gt;, on va chercher l'existence d'un &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;body_sommaire.html&lt;/code&gt;. Mais avec ce code, on va aussi regarder si &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;body_article.html&lt;/code&gt;, &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;body_rubrique.html&lt;/code&gt; ou autre existent. Sinon, on garde &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;body.html&lt;/code&gt; par d&#233;faut.&lt;/li&gt;&lt;li&gt; La deuxi&#232;me balise &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#CHEMIN&lt;/code&gt; va plus loin en regardant s'il existe une composition en plus de notre type de page. Soit pour une composition &lt;i&gt;&#034;ma_super_compo&#034;&lt;/i&gt; pour mon article, Zcore/SPIP regardera l'existence de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;body_article-ma_super_compo.html&lt;/code&gt;. Si elle n'existe pas, on garde la valeur pr&#233;c&#233;dente de la variable &#034;body&#034;.&lt;/li&gt;&lt;/ul&gt;&lt;h2 class=&#034;spip&#034;&gt;Erratum du 17/01/2014&lt;/h2&gt;&lt;blockquote class=&#034;alert alert-error&#034;&gt;
&lt;strong&gt;Attention&lt;/strong&gt;&lt;br class='manualbr' /&gt;Il n'est pas n&#233;cessaire de faire tout cela. Rendons justice en pointant vers l'article de la doc expliquant cela : &lt;a href=&#034;http://spipr.nursit.com/framework-z#layoutsspecifiques&#034; class=&#034;spip_url spip_out&#034; rel=&#034;external&#034;&gt;http://spipr.nursit.com/framework-z...&lt;/a&gt;
&lt;/blockquote&gt;
&lt;p&gt;Gr&#226;ce au message de Val&#233;ry dans le forum ci dessous, j'ai fouill&#233; un peu plus dans le code de z-core et il s'av&#232;re qu'il n'est pas n&#233;cessaire d'utiliser le code ci-dessus pour le &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;body.html&lt;/code&gt;&lt;br class='autobr' /&gt;
Z-core va d&#233;tecter &#034;naturellement&#034; et sans artifice la pr&#233;sence de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;body-rubrique.html&lt;/code&gt; ou &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;body-rubrique-ma_compo.html&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mais le code ci-dessous est toujours d'actualit&#233; :&lt;/strong&gt;&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Aller plus loin&lt;/h2&gt;
&lt;p&gt;On pourrait &#233;tendre ce principe sur les zones de d&#233;coupage dans notre &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;body.html&lt;/code&gt;.&lt;br class='autobr' /&gt;
En effet, on pourrait avoir besoin pour un &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;aside&lt;/code&gt;, d'une composition de rubrique particuli&#232;re, un autre contenu que celui donner par &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;aside/rubrique.html&lt;/code&gt;. Pour cela, ajouter en d&#233;but de votre fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;body.html&lt;/code&gt; le code suivant :&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;[(#SET{html,#ENV{type-page}})]
[(#SET{html2,#ENV{type-page}-#ENV{composition}})]&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On instancie 2 valeurs :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &#034;html&#034; qui contient le type de page ;&lt;/li&gt;&lt;li&gt; &#034;html2&#034; contient le type de page et la composition associ&#233;e.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;A la place de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;INCLURE{fond=aside/#ENV{type-page},env} /&gt;&lt;/code&gt; de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;body.html&lt;/code&gt;, mettre &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;INCLURE{fond=aside/#GET{aside},env} /&gt;&lt;/code&gt;.&lt;br class='autobr' /&gt;
Et la ligne juste au dessus, mettre ce code :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='prettyprint spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;[(#CHEMIN{aside/#GET{html2}.html}|?{#SET{aside,#GET{html2}},#SET{aside,#GET{html}}})]&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;L'astuce est donc la m&#234;me que plus haut. Pour une composition &lt;i&gt;&#034;ma_super_compo&#034;&lt;/i&gt; pour une rubrique, on va chercher l'existence de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;aside/rubrique-ma_super_compo.html&lt;/code&gt;, sinon on prend &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;aside/rubrique.html&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Et voil&#224; !&lt;br class='autobr' /&gt;
A vous de tester si cette m&#233;canique vous convient ou pas ! &lt;strong&gt;Pour ma part c'est test&#233; et approuv&#233; !&lt;/strong&gt;&lt;/p&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;La doc est par &lt;a href=&#034;http://www.spip.net/fr_article4332.html&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;ici&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
		&lt;div class='rss_ps'&gt;&lt;p&gt;Image : &#169; &lt;a href=&#034;http://skitterphoto.com/?portfolio=fish-skeleton&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Skitterphoto&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>SPIP - Lister toutes les tables et leurs entr&#233;es</title>
		<link>https://www.teddypayet.com/SPIP-Lister-toutes-les-tables-et-leurs-entrees</link>
		<guid isPermaLink="true">https://www.teddypayet.com/SPIP-Lister-toutes-les-tables-et-leurs-entrees</guid>
		<dc:date>2013-12-06T08:00:00Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Teddy Payet</dc:creator>


		<dc:subject>SPIP</dc:subject>
		<dc:subject>Astuce</dc:subject>
		<dc:subject>Boucle DATA</dc:subject>

		<description>
&lt;p&gt;En discutant sur l'IRC de #spip, Charles2 d&#233;sirait lister une table et toutes ses entr&#233;es sur une page. Voici un bout de code qui permet de le faire. &lt;br class='autobr' /&gt; Voici tout simplement le code qui vous permettra de faire cela : Liste des tables et leurs valeurs &lt;br class='autobr' /&gt; [ (#ENV**|unserialize|foreach) ] [(#SELF|parametre_url'table',''|form_hidden)] #VALEURName [(#GRAND_TOTAL) enregistrement(s) pour #ENVtable] #ANCRE_PAGINATION (#VALEUR (#VALEUR [ (&#8230;)&lt;/p&gt;


-
&lt;a href="https://www.teddypayet.com/Blog" rel="directory"&gt;Blog&lt;/a&gt;

/ 
&lt;a href="https://www.teddypayet.com/SPIP" rel="tag"&gt;SPIP&lt;/a&gt;, 
&lt;a href="https://www.teddypayet.com/Astuce" rel="tag"&gt;Astuce&lt;/a&gt;, 
&lt;a href="https://www.teddypayet.com/Boucle-DATA" rel="tag"&gt;Boucle DATA&lt;/a&gt;

		</description>


 <content:encoded>&lt;img src='https://www.teddypayet.com/local/cache-vignettes/L150xH140/arton125-5754a.png?1755102075' class='spip_logo spip_logo_right' width='150' height='140' alt=&#034;&#034; /&gt;
		&lt;div class='rss_chapo'&gt;&lt;p&gt;En discutant sur l'IRC de #spip, Charles2 d&#233;sirait lister une table et toutes ses entr&#233;es sur une page. Voici un bout de code qui permet de le faire.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;p&gt;Voici tout simplement le code qui vous permettra de faire cela :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='prettyprin linenum spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;&lt;h1&gt;Liste des tables et leurs valeurs&lt;/h1&gt; &lt;div class=&#034;nettoyeur&#034;&gt; &lt;/div&gt;
&lt;div class=&#034;pied&#034;&gt;
[&lt;pre&gt;
(#ENV**|unserialize|foreach)
&lt;/pre&gt;]
&lt;B_lestables&gt;
&lt;form action=&#034;#SELF&#034; method=&#034;get&#034;&gt; [(#SELF|parametre_url{'table',''}|form_hidden)]
&lt;select name=&#034;table&#034;&gt;
&lt;BOUCLE_lestables(DATA) {source sql, SHOW TABLE STATUS}&gt;
&lt;option value=&#034;#VALEUR{Name}&#034;[(#ENV{table}|=={#VALEUR{Name}}|oui) selected=&#034;selected&#034;]&gt;#VALEUR{Name}&lt;/option&gt;
&lt;/BOUCLE_lestables&gt;
&lt;/select&gt;
&lt;input type=&#034;submit&#034; value=&#034;ok&#034;/&gt;
&lt;/form&gt;
&lt;/B_lestables&gt;
&lt;B_table&gt;
[&lt;h3&gt;(#GRAND_TOTAL) enregistrement(s) pour #ENV{table}&lt;/h3&gt;]
#ANCRE_PAGINATION
&lt;table&gt;
&lt;BOUCLE_table(DATA){source sql, SELECT * FROM #ENV{table}} {pagination 10}&gt; &lt;B_thead&gt; &lt;thead&gt; &lt;tr&gt; &lt;BOUCLE_thead(DATA){source table, (#VALEUR|array_keys)}&gt; [&lt;th&gt;(#VALEUR|unique)&lt;/th&gt;] &lt;/BOUCLE_thead&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;/B_thead&gt; &lt;B_valeur&gt; &lt;tr&gt; &lt;BOUCLE_valeur(DATA){source table, #VALEUR}&gt; &lt;td&gt;[(#VALEUR|sinon{' '})]&lt;/td&gt; &lt;/BOUCLE_valeur&gt; &lt;/tr&gt; &lt;/B_valeur&gt;
&lt;/BOUCLE_table&gt;
&lt;/table&gt;
[&lt;p class=&#034;pagination&#034;&gt;(#PAGINATION)&lt;/p&gt;]
&lt;/B_table&gt;
[&lt;p&gt;Aucun enregistrement dans (#ENV{table})&lt;/p&gt;]
&lt;//B_table&gt;
&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;Explications&lt;/h2&gt;&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;strong&gt;La boucle &#034;lestables&#034;&lt;/strong&gt; va cr&#233;er un select contenant toutes les tables connues par SPIP dans sa base de donn&#233;es ;&lt;/li&gt;&lt;li&gt; &lt;strong&gt;La boucle &#034;table&#034;&lt;/strong&gt; va lancer un requ&#234;te SQL pour avoir toutes ses entr&#233;es en base ;&lt;/li&gt;&lt;li&gt; &lt;strong&gt;La boucle &#034;thead&#034;&lt;/strong&gt; s'occupe d'afficher dans un&#8230; &lt;i&gt;thead&lt;/i&gt; les noms des champs ;&lt;/li&gt;&lt;li&gt; &lt;strong&gt;La boucle &#034;valeur&#034;&lt;/strong&gt; affiche&#8230; roulement de tambours&#8230; les valeurs de la table. ;-)&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;C'est b&#244; SPIP !&lt;/strong&gt;&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Encore plus beau&lt;/h2&gt;
&lt;p&gt;En SPIP 2, nous avions la page &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;?page=table:nom_de_la_table&lt;/code&gt; accessible depuis l'espace public ET en &#233;tant authentifi&#233;. &lt;br class='autobr' /&gt;
Encore mieux en SPIP 3 gr&#226;ce au plugin &lt;i&gt;Vert&#232;bres&lt;/i&gt; (int&#233;gr&#233; &#224; la dist). Il vous suffit d'aller sur la page &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;ecrire/?exec=vertebres&lt;/code&gt; et de cliquer sur la table qui vous int&#233;resse. Et &#212; magie ! Un beau tableau appara&#238;t.&lt;br class='autobr' /&gt;
Tout cela est expliqu&#233; ici : &lt;a href=&#034;http://www.spip.net/fr_article4453.html#afficher_table&#034; class=&#034;spip_url spip_out&#034; rel=&#034;external&#034;&gt;http://www.spip.net/fr_article4453....&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ils sont b&#244; les core-dev de SPIP !&lt;/strong&gt;&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>SPIP - Documentation technique : construction des pages</title>
		<link>https://www.teddypayet.com/SPIP-Documentation-technique-construction-des-pages</link>
		<guid isPermaLink="true">https://www.teddypayet.com/SPIP-Documentation-technique-construction-des-pages</guid>
		<dc:date>2013-12-02T11:06:17Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Teddy Payet</dc:creator>


		<dc:subject>SPIP</dc:subject>
		<dc:subject>Astuce</dc:subject>
		<dc:subject>Notes de d&#233;veloppement</dc:subject>
		<dc:subject>Boucle DATA</dc:subject>

		<description>
&lt;p&gt;Nous avons vu dans le pr&#233;c&#233;dent article la nomenclature pour constituer notre documentation technique. Dans le pr&#233;sent article, nous allons voir comment am&#233;liorer un peu les choses. &lt;br class='autobr' /&gt; Rappel Nous avons construis une page ?exec=vins_doc qui affichera sous forme de tableau notre documentation. La page peut &#234;tre longue, tr&#232;s longue. Les cha&#238;nes de langue &#233;tant construites (n'est ce pas ?), nous allons am&#233;liorer un peu l'affichage. Am&#233;lioration Il serait int&#233;ressant de mettre une table des (&#8230;)&lt;/p&gt;


-
&lt;a href="https://www.teddypayet.com/Blog" rel="directory"&gt;Blog&lt;/a&gt;

/ 
&lt;a href="https://www.teddypayet.com/SPIP" rel="tag"&gt;SPIP&lt;/a&gt;, 
&lt;a href="https://www.teddypayet.com/Astuce" rel="tag"&gt;Astuce&lt;/a&gt;, 
&lt;a href="https://www.teddypayet.com/Notes-de-developpement" rel="tag"&gt;Notes de d&#233;veloppement&lt;/a&gt;, 
&lt;a href="https://www.teddypayet.com/Boucle-DATA" rel="tag"&gt;Boucle DATA&lt;/a&gt;

		</description>


 <content:encoded>&lt;img src='https://www.teddypayet.com/local/cache-vignettes/L150xH100/arton124-d37c6.png?1755102076' class='spip_logo spip_logo_right' width='150' height='100' alt=&#034;&#034; /&gt;
		&lt;div class='rss_chapo'&gt;&lt;p&gt;Nous avons vu dans le pr&#233;c&#233;dent article &lt;a href='https://www.teddypayet.com/SPIP-Documentation-technique-nomenclature' class=&#034;spip_in&#034;&gt;la nomenclature&lt;/a&gt; pour constituer notre documentation technique. Dans le pr&#233;sent article, nous allons voir comment am&#233;liorer un peu les choses.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;h2 class=&#034;spip&#034;&gt;Rappel&lt;/h2&gt;
&lt;p&gt;Nous avons construis une page &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;?exec=vins_doc&lt;/code&gt; qui affichera sous forme de tableau notre documentation. La page peut &#234;tre longue, tr&#232;s longue.&lt;br class='autobr' /&gt;
Les cha&#238;nes de langue &#233;tant construites (n'est ce pas ?), nous allons am&#233;liorer un peu l'affichage.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Am&#233;lioration&lt;/h2&gt;
&lt;p&gt;Il serait int&#233;ressant de mettre une table des mati&#232;res sur cette page.&lt;/p&gt;
&lt;p&gt;Pour cela, nous allons utiliser le zoning que nous offre les squelettes du back office de SPIP 3. Pour notre page &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;?exec=vins_doc&lt;/code&gt;, nous avons cr&#233;&#233; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;prive/squelettes/contenu/vins_doc.html&lt;/code&gt; ce qui sous-entend que nous nous sommes occup&#233; de la zone de contenu de notre page. La structure du BO de SPIP fournit une zone d'extra et une autre de navigation.&lt;br class='autobr' /&gt;
La table des mati&#232;res est un &#034;extra&#034; alors cr&#233;ons le fichier ad&#233;quate : &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;prive/squelettes/extra/vins_doc.html&lt;/code&gt;&lt;br class='autobr' /&gt;
On reste sur le nom &#034;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;vins_doc.html&lt;/code&gt;&#034; selon la r&#232;gle de SPIP.&lt;br class='autobr' /&gt;
Voici le code &#224; y ins&#233;rer :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='prettyprint linenum spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;#SET{tables, #LISTE{'vin','vins_producteur'}} &lt;B_tables&gt; [(#BOITE_OUVRIR{&lt;:vins:sommaire:&gt;})] &lt;BOUCLE_tables(DATA) {source table, #GET{tables}} {si #SESSION{webmestre}|=={oui}}&gt; #SET{spip_table,#VAL{'spip_'}|concat{#VALEUR,'s'}} &lt;B_info_table&gt; &lt;BOUCLE_info_table(DATA) {source table, #EVAL{$GLOBALS['tables_principales'][#GET{spip_table}]}}{cle==field}&gt; &lt;ul class=&#034;menu-liste menu-items&#034;&gt; &lt;li class=&#034;menu-entree item&#034;&gt;&lt;a href=&#034;[#(#_tables:GET{spip_table}|attribut_html)]&#034;&gt;[(#_tables:GET{spip_table}|replace{'spip_',''}|ucfirst)]&lt;/a&gt; &lt;B_label&gt; &lt;ul class=&#034;menu-liste menu-items&#034;&gt; &lt;BOUCLE_label(DATA) {source table, #VALEUR} {par cle}&gt; &lt;li class=&#034;menu-entree item&#034;&gt;&lt;a class=&#034;spip&#034; href=&#034;[#(#_tables:GET{spip_table}|attribut_html)][_(#CLE|attribut_html)]&#034;&gt;#CLE&lt;/a&gt;&lt;/li&gt; &lt;/BOUCLE_label&gt; &lt;/ul&gt; &lt;/B_label&gt; &lt;/li&gt; &lt;/ul&gt; &lt;/BOUCLE_info_table&gt; &lt;/B_info_table&gt; &lt;/BOUCLE_tables&gt; [(#BOITE_FERMER)] &lt;/B_tables&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Bien, une liste est construite mais elle ne servira &#224; rien si nous ne nous occupons pas des identifiants du contenu.&lt;/p&gt;
&lt;p&gt;Allons dans &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;prive/squelettes/contenu/vins_doc.html&lt;/code&gt;&lt;br class='autobr' /&gt;
Recherchons &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;tr&gt;&lt;/code&gt; et rempla&#231;ons le par &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;tr id=&#034;[(#_tables:VALEUR|attribut_html)][_(#CLE|attribut_html)]&#034;&gt;&lt;/code&gt;&lt;br class='autobr' /&gt;
Nous aurons ainsi quelques choses comme &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;tr id=&#034;spip_vins_id_vin&#034;&gt;&lt;/code&gt;&lt;br class='autobr' /&gt;
&#199;a, c'est cool. Mais il faut aussi faire la m&#234;me chose pour le nom de la table.&lt;br class='autobr' /&gt;
Recherchons &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;caption&gt;&lt;/code&gt; et rempla&#231;ons le par &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;caption id=&#034;[(#_tables:VALEUR|attribut_html)]&#034;&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Voil&#224; ! C'est nettement mieux.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Et une version texte ?&lt;/h2&gt;
&lt;p&gt;Cette page en tableau est tr&#232;s pratique &#224; la lecture mais on peut avoir le besoin de cr&#233;er un fichier word avec du texte au kilom&#232;tre.&lt;br class='autobr' /&gt;
Nous avons la structure de code qu'il faut pour cela. On ne va pas r&#233;inventer la roue. Il suffit de renommer la structure html.&lt;/p&gt;
&lt;p&gt;Nous n'allons pas perdre le code que nous avons d&#233;j&#224; r&#233;alis&#233;. Transformons-le en inclure et affichons conditionnellement le type d'affichage d&#233;sir&#233;.&lt;/p&gt;
&lt;p&gt;Coupons-collons le code suivant de notre page &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;contenu/vins_doc.html&lt;/code&gt; dans &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;prive/squelettes/inclure/vins_doc_tableau.html&lt;/code&gt;&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='prettyprint linenum spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;&lt;B_tables&gt; &lt;BOUCLE_tables(DATA) {source table, #GET{tables}} {si #SESSION{webmestre}|=={oui}}&gt; #SET{spip_table,#VAL{'spip_'}|concat{#VALEUR,'s'}} &lt;B_info_table&gt; &lt;table&gt; &lt;BOUCLE_info_table(DATA) {source table, #EVAL{$GLOBALS['tables_principales'][#GET{spip_table}]}}{cle==field}&gt; &lt;caption&gt;#_tables:GET{spip_table}&lt;/caption&gt; &lt;thead&gt; &lt;th&gt;[(#VAL{#GET{prefixe}}|concat{':nom_du_champ'}|_T)]&lt;/th&gt; &lt;th&gt;[(#VAL{#GET{prefixe}}|concat{':definition_mysql'}|_T)]&lt;/th&gt; &lt;th&gt;[(#VAL{#GET{prefixe}}|concat{':label_label'}|_T)]&lt;/th&gt; &lt;th&gt;[(#VAL{#GET{prefixe}}|concat{':documentation'}|_T)]&lt;/th&gt; &lt;/thead&gt; &lt;B_label&gt; &lt;BOUCLE_label(DATA) {source table, #VALEUR}&gt; &lt;tr&gt; &lt;td&gt;&lt;strong&gt;#CLE&lt;/strong&gt;&lt;/td&gt; &lt;td&gt;&lt;em&gt;#VALEUR&lt;/em&gt;&lt;/td&gt; &lt;td&gt;[(#VAL{#_tables:VALEUR}|concat{':label_',#CLE}|_T)]&lt;/td&gt; &lt;td&gt;[&lt;strong&gt;[(#VAL{#GET{prefixe}}|concat{':aide_a_la_saisie'}|_T)]&lt;/strong&gt;&lt;br/&gt; (#VAL{#_tables:VALEUR}|concat{':label_',#CLE,'_explication'}|_T)&lt;br/&gt;] [&lt;strong&gt;[(#VAL{#GET{prefixe}}|concat{':documentation'}|_T)]&lt;/strong&gt;&lt;br/&gt; (#VAL{#_tables:VALEUR}|concat{':label_',#CLE,'_documentation''}|_T)]&lt;/td&gt; &lt;/tr&gt; &lt;/BOUCLE_label&gt; &lt;/B_label&gt; &lt;/BOUCLE_info_table&gt; &lt;/table&gt; &lt;/B_info_table&gt; &lt;/BOUCLE_tables&gt; &lt;/B_tables&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Transformons les &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#GET{prefixe}&lt;/code&gt; en &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#ENV{prefixe}&lt;/code&gt; et le &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#GET{tables}&lt;/code&gt; en &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#ENV{tables}&lt;/code&gt;&lt;br class='autobr' /&gt;
Dans &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;contenu/vins_doc.html&lt;/code&gt;, faisons l'appel &#224; l'inclure &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;vins_doc_tableau.html&lt;/code&gt; :&lt;br class='autobr' /&gt;
&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;INCLURE{fond=prive/squelettes/inclure/vins_doc_tableau,tables=#GET{tables},prefixe=vins} /&gt;&lt;/code&gt;&lt;br class='autobr' /&gt;
Simple, non ?&lt;/p&gt;
&lt;p&gt;Nous avions parl&#233; d'un texte au kilom&#232;tre, alors cr&#233;ons sur le m&#234;me mod&#232;le le fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;inclure/vins_doc_texte.html&lt;/code&gt; en dupliquant &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;inclure/vins_doc_tableau.html&lt;/code&gt; et apportons-y quelques modifications.&lt;/p&gt;
&lt;p&gt;Rempla&#231;ons &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;table&gt;&lt;/code&gt; par &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;div class=&#034;table&#034;&gt;&lt;/code&gt;&lt;br class='autobr' /&gt;
Rempla&#231;ons &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;caption&gt;&lt;/code&gt; par un &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;h1&gt;&lt;/code&gt; en gardant le id.&lt;br class='autobr' /&gt;
Le premier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;td&gt;&lt;/code&gt; devient un &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;h2&gt;&lt;/code&gt; et nous lui appliquons aussi le id issu de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;tr&gt;&lt;/code&gt;&lt;br class='autobr' /&gt;
Supprimons les &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;tr&gt;&lt;/code&gt; maintenant.&lt;br class='autobr' /&gt;
Le &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;td&gt;&lt;/code&gt; de la d&#233;finition mysql devient un &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;div class=&#034;mysql&#034;&gt;&lt;/code&gt;&lt;br class='autobr' /&gt;
Le &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;td&gt;&lt;/code&gt; de l'aide de saisie et de la documentation devient un &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;div class=&#034;texte&#034;&gt;&lt;/code&gt;.&lt;br class='autobr' /&gt;
Devant &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#CLE&lt;/code&gt; de la boucle &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;info_table&lt;/code&gt;, mettons &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;[&lt;strong&gt;(#VAL{#ENV{prefixe}}|concat{':nom_du_champ'}|_T) :&lt;/strong&gt; ]&lt;/code&gt;.&lt;br class='autobr' /&gt;
Devant &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#VALEUR&lt;/code&gt; de la boucle &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;info_table&lt;/code&gt;, mettons &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;[&lt;strong&gt;(#VAL{#ENV{prefixe}}|concat{':definition_mysql'}|_T) :&lt;/strong&gt; ]&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Tout cela fait, on peut supprimer les lignes &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;thead&gt;...&lt;/thead&gt;&lt;/code&gt; qui ne sont plus n&#233;cessaires.&lt;br class='autobr' /&gt;
Normalement, nous ne rencontrons pas de difficult&#233;s particuli&#232;res ici. Ce n'est que du code html. Notre inclure est pr&#234;t.&lt;/p&gt;
&lt;p&gt;Revenons sur la page &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;contenu/vins_doc.html&lt;/code&gt; pour y apporter quelques am&#233;liorations. Nous pourrions ajouter un autre inclure pour notre texte pour l'avoir sur la m&#234;me page. Mais avoir la m&#234;me information en doublon ne sert &#224; rien. Alors nous allons faire un petit formulaire qui indiquera quel type d'affichage prendre en compte.&lt;br class='autobr' /&gt;
Voici le code :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='prettyprint linenum spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;	&lt;form action=&#034;#SELF&#034; method=&#034;GET&#034;&gt; [(#SELF|parametre_url{affichage,''}|form_hidden)] &lt;div class=&#034;groupe&#034;&gt; &lt;label for=&#034;champ_affichage&#034;&gt;&lt;:vins:affichage:&gt;&lt;/label&gt; &lt;select name=&#034;affichage&#034; id=&#034;champ_affichage&#034;&gt; &lt;option value=&#034;tableau&#034;[ (#ENV{affichage}|=={tableau}|oui)selected=&#034;selected&#034;]&gt;tableau&lt;/option&gt; &lt;option value=&#034;texte&#034;[ (#ENV{affichage}|=={texte}|oui)selected=&#034;selected&#034;]&gt;texte&lt;/option&gt; &lt;/select&gt; &lt;/div&gt; &lt;input type=&#034;submit&#034; value=&#034;OK&#034; /&gt; &lt;/form&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;A partir de l&#224;, nous modifions l'inclure dans &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;contenu/vins_doc.html&lt;/code&gt; :&lt;br class='autobr' /&gt;
&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;INCLURE{fond=prive/squelettes/inclure/vins_doc_[(#ENV{affichage,tableau})],tables=#GET{tables},prefixe=vins} /&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Avec ce code, SPIP ira chercher l'inclure &#171; tableau &#187; si nous n'avons pas dans l'url le param&#232;tre &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;affichage&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Et voil&#224;, on peut changer l'affichage de notre documentation en 2 coups de cuill&#232;re &#224; pot.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Avec cette m&#233;thode, il est &lt;i&gt;simple&lt;/i&gt; de faire une documentation. Cela ne nous dispense pas de son &#233;criture bien entendu. Mais cela permet d'avoir la documentation directement dans le plugin. Ces diff&#233;rents squelettes et cha&#238;nes de langue ne sont que du texte, ce qui ne va pas alourdir &#224; outrance le poids des fichiers du plugin.&lt;br class='autobr' /&gt;
On peut m&#234;me &#233;toffer la documentation annexe avec des &lt;i&gt;inclure&lt;/i&gt; pour des &#233;l&#233;ments qui ne sont pas issus des tables en elles-m&#234;mes mais de fonctions, d'interface, etc.&lt;br class='autobr' /&gt;
Je n'ai plus qu'une derni&#232;re &#224; vous dire : Bonne documentation ! :-P&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_ps'&gt;&lt;p&gt;Vous pouvez lire aussi :
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; &lt;a href='https://www.teddypayet.com/SPIP-Documentation-technique-nomenclature' class=&#034;spip_in&#034;&gt;SPIP - Documentation technique : nomenclature&lt;/a&gt;
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; &lt;a href='https://www.teddypayet.com/SPIP-Documentation-technique-construction-des-pages' class=&#034;spip_in&#034;&gt;SPIP - Documentation technique : construction des pages&lt;/a&gt;
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; &lt;a href='https://www.teddypayet.com/SPIP-Documentation-technique-mise-en-conformite' class=&#034;spip_in&#034;&gt;SPIP - Documentation technique : mise en conformit&#233;&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>SPIP - Documentation technique : nomenclature</title>
		<link>https://www.teddypayet.com/SPIP-Documentation-technique-nomenclature</link>
		<guid isPermaLink="true">https://www.teddypayet.com/SPIP-Documentation-technique-nomenclature</guid>
		<dc:date>2013-12-02T07:02:42Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Teddy Payet</dc:creator>


		<dc:subject>SPIP</dc:subject>
		<dc:subject>Astuce</dc:subject>
		<dc:subject>Notes de d&#233;veloppement</dc:subject>
		<dc:subject>PHP</dc:subject>
		<dc:subject>Boucle DATA</dc:subject>
		<dc:subject>XML</dc:subject>

		<description>
&lt;p&gt;Lorsque nous avons l'utilit&#233; d'un nouvel objet (&#233;ditorial) dans SPIP, il est plus simple et m&#234;me conseill&#233; de passer par la cr&#233;ation d'un plugin. A force de cr&#233;er des plugins, je me suis cr&#233;&#233; une nomenclature d'&#233;criture des fichiers. En fait, je n'ai rien invent&#233; de particulier. La base des fichiers est cr&#233;&#233;e par le plugin &#034;La Fabrique&#034; (merci marcimat !). &lt;br class='autobr' /&gt; Pr&#233;ambule Malgr&#233; un titre &#034;racoleur&#034;, cet article ne va pas traiter de la nomenclature d'&#233;criture des fichiers de SPIP mais d'une (&#8230;)&lt;/p&gt;


-
&lt;a href="https://www.teddypayet.com/Blog" rel="directory"&gt;Blog&lt;/a&gt;

/ 
&lt;a href="https://www.teddypayet.com/SPIP" rel="tag"&gt;SPIP&lt;/a&gt;, 
&lt;a href="https://www.teddypayet.com/Astuce" rel="tag"&gt;Astuce&lt;/a&gt;, 
&lt;a href="https://www.teddypayet.com/Notes-de-developpement" rel="tag"&gt;Notes de d&#233;veloppement&lt;/a&gt;, 
&lt;a href="https://www.teddypayet.com/PHP" rel="tag"&gt;PHP&lt;/a&gt;, 
&lt;a href="https://www.teddypayet.com/Boucle-DATA" rel="tag"&gt;Boucle DATA&lt;/a&gt;, 
&lt;a href="https://www.teddypayet.com/XML" rel="tag"&gt;XML&lt;/a&gt;

		</description>


 <content:encoded>&lt;img src='https://www.teddypayet.com/local/cache-vignettes/L150xH100/arton122-c79a9.png?1755102076' class='spip_logo spip_logo_right' width='150' height='100' alt=&#034;&#034; /&gt;
		&lt;div class='rss_chapo'&gt;&lt;p&gt;Lorsque nous avons l'utilit&#233; d'un nouvel objet (&#233;ditorial) dans SPIP, il est plus simple et m&#234;me conseill&#233; de passer par la cr&#233;ation d'un plugin.&lt;br class='autobr' /&gt;
A force de cr&#233;er des plugins, je me suis cr&#233;&#233; une nomenclature d'&#233;criture des fichiers. En fait, je n'ai rien invent&#233; de particulier. La base des fichiers est cr&#233;&#233;e par le plugin &#034;&lt;a href=&#034;http://contrib.spip.net/La-Fabrique&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;La Fabrique&lt;/a&gt;&#034; (merci marcimat !).&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;h2 class=&#034;spip&#034;&gt;Pr&#233;ambule&lt;/h2&gt;
&lt;p&gt;Malgr&#233; un titre &#034;racoleur&#034;, cet article ne va pas traiter de la nomenclature d'&#233;criture des fichiers de SPIP mais d'une nomenclature que j'ai mis en place personnellement.&lt;br class='autobr' /&gt;
Si vous d&#233;sirez avoir des informations particuli&#232;res sur la nomenclature de SPIP (ses API, etc.), je vous conseille quelques sites :
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; &lt;a href=&#034;http://programmer.spip.net&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Programmer avec SPIP&lt;/a&gt; ;
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; &lt;a href=&#034;http://code.spip.net&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Documentation du code de SPIP&lt;/a&gt; ;
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; &lt;a href=&#034;http://code.spip.net/autodoc/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Autodoc de SPIP&lt;/a&gt; : une zone particuli&#232;re de code.spip.net. Il est autoaliment&#233; par le PHPDoc ins&#233;r&#233; dans le code source de SPIP.
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; &lt;a href=&#034;http://contrib.spip.net&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;SPIP-Contrib&lt;/a&gt; ;
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; &lt;a href=&#034;http://plugins.spip.net&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;L'annuaire des plugins de SPIP&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;De plus, je ne traitera pas non plus de l'utilisation du plugin &lt;a href=&#034;http://contrib.spip.net/La-Fabrique&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;La Fabrique&lt;/a&gt;. Sa page de documentation est tr&#232;s compl&#232;te.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Contexte&lt;/h2&gt;
&lt;p&gt;Pour l'expression de cette nomenclature, je prendrai pour ligne de conduite la cr&#233;ation d'un objet &#034;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;vins&lt;/code&gt;&#034;. Cela sera plus parlant. Je me r&#233;f&#232;rerai, sauf mention contraire, toujours &#224; cet objet &#233;ditorial.&lt;br class='autobr' /&gt;
&lt;strong&gt;Le but de cet article n'est pas la cr&#233;ation d'un plugin mais la m&#233;thodologie pour une bonne nomination des fichiers et des chaines de langue associ&#233;es.&lt;br class='autobr' /&gt;
De ce fait, nous partons de z&#233;ro pour arriver &#224; la fin de ce cycle &#224; la r&#233;alisation de l'affichage de la documentation technique.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Vif du sujet&lt;/h2&gt;
&lt;p&gt;La Fabrique cr&#233;e les bons fichiers selon les API de SPIP. Au d&#233;part c'est un &#034;clicodrome&#034;. Mais il ne nous dispense strictement pas de penser, au pr&#233;alable, notre structure de donn&#233;es. On ne fonce pas t&#234;te baiss&#233;e dans un projet.&lt;/p&gt;
&lt;p&gt;Dans le formulaire &#034;Ajouter un objet &#233;ditorial&#034;, nous pouvons rajouter tous les &lt;strong&gt;champs&lt;/strong&gt; n&#233;cessaires :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; nom&lt;/li&gt;&lt;li&gt; mill&#233;sime&lt;/li&gt;&lt;li&gt; id_producteur&lt;/li&gt;&lt;li&gt; id_couleur&lt;/li&gt;&lt;li&gt; id_appellation&lt;/li&gt;&lt;li&gt; id_region&lt;/li&gt;&lt;li&gt; etc.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Une des premi&#232;res choses &#224; laquelle je fais attention autant que possible est le respect de &#034;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;id_objet&lt;/code&gt;&#034;. La Fabrique cr&#233;era la table &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;spip_vins&lt;/code&gt; (au pluriel) associ&#233; &#224; mon objet &#034;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;vin&lt;/code&gt;&#034;. De l&#224;, il cr&#233;e un &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;ID&lt;/code&gt; : &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;id_vin&lt;/code&gt; (mon &#233;quivalent &#224; &#034;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;id_objet&lt;/code&gt;&#034; cit&#233; en d&#233;but de paragraphe.)&lt;br class='autobr' /&gt;
Surtout, ne modifions pas cela m&#234;me si la Fabrique nous le permet. Vous comprendrez pourquoi un peu plus loin.&lt;/p&gt;
&lt;p&gt;Ici, ce n'est pas tellement le nom et/ou le nombre de champs qui m'int&#233;resse dans &#034;ma&#034; nomenclature. Le but de cette derni&#232;re est de g&#233;n&#233;rer semi-automatiquement une information technique sur la table et ses champs gr&#226;ce aux fichiers de langue.&lt;/p&gt;
&lt;p&gt;La Fabrique adopte donc la philosophie des API de SPIP. Lorsque nous respectons &#034;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;id_vin&lt;/code&gt;&#034; pour l'objet &#034;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;vin&lt;/code&gt;&#034;, la Fabrique cr&#233;era les fichiers :
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;lang/vin_fr.php&lt;/code&gt; : toutes les langues li&#233;es &#224; l'objet &#034;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;vin&lt;/code&gt;&#034; ;
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;lang/vins_fr.php&lt;/code&gt; : toutes les cha&#238;nes li&#233;es au plugin ayant le pr&#233;fixe &#034;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;vins&lt;/code&gt;&#034; ;
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;lang/paquet-vins_fr.php&lt;/code&gt; : les cha&#238;nes de langues g&#233;n&#233;ralement utilis&#233;es dans &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;paquet.xml&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Si nous n'avions pas utilis&#233; &#034;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;id_vin&lt;/code&gt;&#034; mais par exemple &#034;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;ref_vin&lt;/code&gt;&#034;, la Fabrique aurait cr&#233;&#233; le fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;lang/ref_vin_fr.php&lt;/code&gt;&#8230; ce qui ne nous aurait pas arrang&#233; pour la suite. J'ai rencontr&#233; ce cas r&#233;cemment.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Un objet, deux objets, etc.&lt;/h2&gt;
&lt;p&gt;Pour aller un peu plus loin, nous allons cr&#233;er une table pour les producteurs de vins. Nous nommerons cette table &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;spip_vins_producteurs&lt;/code&gt;, l'objet associ&#233; sera &#034;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;vins_producteur&lt;/code&gt;&#034;. &lt;i&gt;Laissez-le tel quel.&lt;/i&gt; &lt;br class='autobr' /&gt;
Lorsque nous serons dans l'espace priv&#233; de SPIP sur la fiche d'un producteur, nous aurons une URL de type &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;?exec=vins_producteur&amp;id_vins_producteur=XX&lt;/code&gt;&lt;/p&gt;
&lt;blockquote class=&#034;alert alert-info&#034;&gt;&lt;h2 class=&#034;spip&#034;&gt;Remarque&lt;/h2&gt;
&lt;p&gt;J'aurai pu cr&#233;er la table &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;spip_producteurs&lt;/code&gt;. Mais le soucis est que ce nom est trop g&#233;n&#233;rique et pourrait se t&#233;lescoper avec une autre table qui n'a rien &#224; voir avec notre plugin.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Vous aurez compris que l'ID du producteur est sous la forme &#034;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;id_vins_producteur&lt;/code&gt;&#034;. La Fabrique a enlev&#233; le &#034;s&#034; final &#224; producteur.&lt;/p&gt;
&lt;blockquote class=&#034;alert alert-success&#034;&gt;
&lt;strong&gt;Normalement, vous m'avez suivi sans trop de soucis jusqu'&#224; maintenant sans pour autant savoir o&#249; je voulais en venir. Pas vrai ? ;-)&lt;/strong&gt;&lt;br class='manualbr' /&gt;Alors, continuons :
&lt;/blockquote&gt;
&lt;p&gt;Pour la cha&#238;ne de langue de l'objet &#034;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;vins_producteur&lt;/code&gt;&#034;, la Fabrique va cr&#233;er &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;lang/vins_producteur_fr.php&lt;/code&gt;.&lt;br class='autobr' /&gt;
&#199;a ne vous rappelle rien ? Je vous aide un peu : &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;lang/vin_fr.php&lt;/code&gt;&#8230; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;lang/objet_fr.php&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;C'est la r&#232;gle d'&#233;criture adopt&#233;e par la Fabrique.&lt;/p&gt;
&lt;blockquote class=&#034;alert alert-info&#034;&gt;&lt;h2 class=&#034;spip&#034;&gt;Rappel&lt;/h2&gt;
&lt;p&gt;Dans mes pr&#233;c&#233;dents articles, je vous avez montr&#233; (gr&#226;ce &#224; b_b, denisb et kent1) comment reconstruire une cha&#238;ne de langue pour l'afficher sur notre page :&lt;br class='autobr' /&gt;
&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;[(#VAL{#GET{prefixe}}|concat{':nom_du_champ'}|_T)]&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;On ne change pas une &#233;quipe qui gagne.&lt;/p&gt;
&lt;/blockquote&gt;&lt;h2 class=&#034;spip&#034;&gt;Cr&#233;er les cha&#238;nes de langue&lt;/h2&gt;
&lt;p&gt;Nous allons utiliser cette m&#234;me r&#232;gle pour construire notre documentation technique. Une sorte de &lt;i&gt;PHPdoc&lt;/i&gt; &#034;linguistique&#034; &#224; la SPIP.&lt;/p&gt;
&lt;blockquote class=&#034;alert alert-info&#034;&gt;&lt;h2 class=&#034;spip&#034;&gt;Remarque&lt;/h2&gt;
&lt;p&gt;Mon but dans cette nomenclature n'est pas de documenter des fonctions (au sens PHP) car il existe des m&#233;thodes robustes aujourd'hui. SPIP a adopt&#233;, sous l'impulsion de Marcimat, PHPDoc pour cette documentation.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Dans ma documentation technique, en fait, je d&#233;sire afficher 4 choses dans un tableau :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; le nom du champ ;&lt;/li&gt;&lt;li&gt; son label ;&lt;/li&gt;&lt;li&gt; sa d&#233;finition MySQL ;&lt;/li&gt;&lt;li&gt; son aide &#224; la saisie (explication) ;&lt;/li&gt;&lt;li&gt; et sa documentation.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Pour cela, on va prendre l'habitude d'&#233;crire nos cha&#238;nes de langue sous la forme :&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_champ&lt;/code&gt;&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;label_champ_explication&lt;/code&gt;&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;label_champ_documentation&lt;/code&gt;&lt;br class='manualbr' /&gt;La d&#233;finition MySQL du champ est directement issu des variables globales de SPIP ce qui rend inutile de cr&#233;er une cha&#238;ne de langue pour elle. Nous aurons alors 3 cha&#238;nes de langue par &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;champ&lt;/code&gt;.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Donc, soit pour notre objet &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;vin&lt;/code&gt;, nous aurons :&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_id_vin&lt;/code&gt;&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;label_id_vin_documentation&lt;/code&gt;&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;label_id_vin_explication&lt;/code&gt;&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;label_nom&lt;/code&gt;&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;label_nom_documentation&lt;/code&gt;&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;label_nom_explication&lt;/code&gt;&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;label_millesime&lt;/code&gt;&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;label_millesime_documentation&lt;/code&gt;&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;label_millesime_explication&lt;/code&gt;&lt;/li&gt;&lt;li&gt; etc.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Dans les fichiers de langues ad&#233;quates, nous devons y renseigner ce dont nous avons besoin.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Afficher le contenu sur la page de documentation&lt;/h2&gt;
&lt;p&gt;Bon, tout est pr&#234;t maintenant pour construire notre page, y compris le contenu. Nous devons maintenant cr&#233;er un fichier &#034;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;prive/squelettes/contenu/vins_doc.html&lt;/code&gt;&#034;. Voici le code &#224; y ins&#233;rer :&lt;/p&gt; &lt;textarea readonly='readonly' cols='40' rows='50' class='spip_cadre spip_cadre_block' dir='ltr'&gt;[(#SET{prefixe,'vins'})]
&lt;h1&gt;[(#VAL{#GET{prefixe}}|concat{':documentation_technique'}|_T)]&lt;/h1&gt;
#SET{tables, #LISTE{'vin','vins_producteur'}} &lt;B_tables&gt;
&lt;BOUCLE_tables(DATA) {source table, #GET{tables}} {si #SESSION{webmestre}|=={oui}}&gt;
#SET{spip_table,#VAL{'spip_'}|concat{#VALEUR,'s'}}
&lt;B_info_table&gt;
&lt;table&gt;
&lt;BOUCLE_info_table(DATA) {source table, #EVAL{$GLOBALS['tables_principales'][#GET{spip_table}]}}{cle==field}&gt; &lt;caption&gt;#_tables:GET{spip_table}&lt;/caption&gt;
&lt;thead&gt; &lt;th&gt;[(#VAL{#GET{prefixe}}|concat{':nom_du_champ'}|_T)]&lt;/th&gt; &lt;th&gt;[(#VAL{#GET{prefixe}}|concat{':definition_mysql'}|_T)]&lt;/th&gt; &lt;th&gt;[(#VAL{#GET{prefixe}}|concat{':label_label'}|_T)]&lt;/th&gt; &lt;th&gt;[(#VAL{#GET{prefixe}}|concat{':documentation'}|_T)]&lt;/th&gt;
&lt;/thead&gt;
&lt;B_label&gt;
&lt;BOUCLE_label(DATA) {source table, #VALEUR}&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;#CLE&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;#VALEUR&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;[(#VAL{#_tables:VALEUR}|concat{':label_',#CLE}|_T)]&lt;/td&gt;
&lt;td&gt;[&lt;strong&gt;[(#VAL{#GET{prefixe}}|concat{':aide_a_la_saisie'}|_T)]&lt;/strong&gt;&lt;br/&gt;
(#VAL{#_tables:VALEUR}|concat{':label_',#CLE,'_explication'}|_T)&lt;br/&gt;]
[&lt;strong&gt;[(#VAL{#GET{prefixe}}|concat{':documentation'}|_T)]&lt;/strong&gt;&lt;br/&gt;
(#VAL{#_tables:VALEUR}|concat{':label_',#CLE,'_documentation''}|_T)]&lt;/td&gt;
&lt;/tr&gt;
&lt;/BOUCLE_label&gt;
&lt;/B_label&gt;
&lt;/BOUCLE_info_table&gt;
&lt;/table&gt;
&lt;/B_info_table&gt;
&lt;/BOUCLE_tables&gt;
&lt;/B_tables&gt;&lt;/textarea&gt;
&lt;p&gt;Ce code va construire le tableau comme pr&#233;vu.&lt;br class='autobr' /&gt;
Sur cette page, on peut voir que parfois la cha&#238;ne de langue ne s'affiche pas. En tout cas, pas son contenu mais bel et bien la cha&#238;ne en elle m&#234;me sans les underscores. Exemple : &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;label id vin&lt;/code&gt;, &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;label id vin documentation&lt;/code&gt;, &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;label id vin explication&lt;/code&gt;.&lt;br class='autobr' /&gt;
La raison en est tr&#232;s simple : nous n'avons pas encore renseign&#233; cette cha&#238;ne de langue.&lt;br class='autobr' /&gt;
Mais parfois, nous n'avons rien &#224; dire de particulier sur un champ. Il parle de lui m&#234;me. Alors l'astuce est de cr&#233;er tout de m&#234;me cette cha&#238;ne de langue dans le bon fichier et de mettre un espace blanc/vide, soit &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;'label_id_vin_documentation' =&gt; ' '&lt;/code&gt;.&lt;/p&gt;
&lt;blockquote class=&#034;alert alert-success&#034;&gt;&lt;h2 class=&#034;spip&#034;&gt;Astuce&lt;/h2&gt;
&lt;p&gt;Pour ceux qui ont lu le code ci dessus, vous avez pu voir un &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;[(#SET{prefixe,'vins'})]&lt;/code&gt;. En fait, ceci est pour nous simplifier la t&#226;che si on d&#233;sire mettre ce bout de code dans un autre plugin. Il nous suffira de mettre le pr&#233;fixe de notre nouveau plugin ici pour que la cha&#238;ne de langue se construise.&lt;/p&gt;
&lt;/blockquote&gt;&lt;blockquote class=&#034;alert alert-info&#034;&gt;&lt;h2 class=&#034;spip&#034;&gt;Remarque&lt;/h2&gt;
&lt;p&gt;Denisb nous a rappel&#233; l'existence depuis SPIP 3.0.13 d'une nouvelle &#233;criture de construction d'une cha&#238;ne de langue. Vous pouvez voir son commentaire &lt;a href='https://www.teddypayet.com/Afficher-les-champs-d-un-objet-SPIP-v2#forum113' class=&#034;spip_in&#034;&gt;ici&lt;/a&gt; et &lt;a href='https://www.teddypayet.com/Afficher-les-champs-d-un-objet-SPIP-v2#forum117' class=&#034;spip_in&#034;&gt;ici&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;La page &#233;tant construite, il nous faut maintenant compl&#233;ter nos diff&#233;rentes cha&#238;nes de langue. Alors &#224; vos claviers et rendez-vous dans mon prochain article.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_ps'&gt;&lt;p&gt;Vous pouvez lire aussi :
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; &lt;a href='https://www.teddypayet.com/SPIP-Documentation-technique-nomenclature' class=&#034;spip_in&#034;&gt;SPIP - Documentation technique : nomenclature&lt;/a&gt;
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; &lt;a href='https://www.teddypayet.com/SPIP-Documentation-technique-construction-des-pages' class=&#034;spip_in&#034;&gt;SPIP - Documentation technique : construction des pages&lt;/a&gt;
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; &lt;a href='https://www.teddypayet.com/SPIP-Documentation-technique-mise-en-conformite' class=&#034;spip_in&#034;&gt;SPIP - Documentation technique : mise en conformit&#233;&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Afficher les champs d'un objet #SPIP v2</title>
		<link>https://www.teddypayet.com/Afficher-les-champs-d-un-objet-SPIP-v2</link>
		<guid isPermaLink="true">https://www.teddypayet.com/Afficher-les-champs-d-un-objet-SPIP-v2</guid>
		<dc:date>2013-11-26T08:00:00Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Teddy Payet</dc:creator>


		<dc:subject>SPIP</dc:subject>
		<dc:subject>Astuce</dc:subject>
		<dc:subject>PHP</dc:subject>
		<dc:subject>Boucle DATA</dc:subject>

		<description>
&lt;p&gt;Dans la m&#234;me trempe que Afficher les champs d'un objet #SPIP, je vais prendre le m&#234;me principe mais l'&#233;tendre en affichant une cha&#238;ne de langue&#8230; Tout un programme. J'ai r&#233;ussi cette performance gr&#226;ce au code que m'a donn&#233; kent1. Merci &#224; lui pour ce code. &lt;br class='autobr' /&gt; L'utilit&#233; de cette boucle est de lister les diff&#233;rents champs d'un objet sur sa page de vue. Exemple : ?exec=projet_site&amp;id_site=XX &lt;br class='autobr' /&gt;
L'espace priv&#233; de SPIP 3 &#233;tant g&#233;r&#233; par des squelettes, il suffit de cr&#233;er un fichier (&#8230;)&lt;/p&gt;


-
&lt;a href="https://www.teddypayet.com/Blog" rel="directory"&gt;Blog&lt;/a&gt;

/ 
&lt;a href="https://www.teddypayet.com/SPIP" rel="tag"&gt;SPIP&lt;/a&gt;, 
&lt;a href="https://www.teddypayet.com/Astuce" rel="tag"&gt;Astuce&lt;/a&gt;, 
&lt;a href="https://www.teddypayet.com/PHP" rel="tag"&gt;PHP&lt;/a&gt;, 
&lt;a href="https://www.teddypayet.com/Boucle-DATA" rel="tag"&gt;Boucle DATA&lt;/a&gt;

		</description>


 <content:encoded>&lt;img src='https://www.teddypayet.com/local/cache-vignettes/L150xH100/arton123-45c4f.jpg?1755102076' class='spip_logo spip_logo_right' width='150' height='100' alt=&#034;&#034; /&gt;
		&lt;div class='rss_chapo'&gt;&lt;p&gt;Dans la m&#234;me trempe que &lt;a href='https://www.teddypayet.com/Afficher-les-champs-d-un-objet-SPIP' class=&#034;spip_in&#034;&gt;Afficher les champs d'un objet #SPIP&lt;/a&gt;, je vais prendre le m&#234;me principe mais l'&#233;tendre en affichant une cha&#238;ne de langue&#8230; Tout un programme.&lt;br class='autobr' /&gt;
J'ai r&#233;ussi cette performance gr&#226;ce au code que m'a donn&#233; kent1. Merci &#224; lui pour ce code.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;p&gt;L'utilit&#233; de cette boucle est de lister les diff&#233;rents champs d'un objet sur sa page de vue. Exemple : &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;?exec=projet_site&amp;id_site=XX&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;L'espace priv&#233; de SPIP 3 &#233;tant g&#233;r&#233; par des squelettes, il suffit de cr&#233;er un fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/prive/squelettes/extra/projet_site.html&lt;/code&gt; avec le code suivant :&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;[(#BOITE_OUVRIR{[(#VAL{#ENV{exec}}|concat{':label_',#ENV{exec},'_champs'}|_T)],'info','titrem'})]
[(#ENV{singulier}|=={oui}|non)
[(#SET{valeurs,#VAL{#ENV{exec}}|concat{'s'}|description_table|table_valeur{field}|array_keys|print})]
][(#ENV{singulier}|=={oui}|oui)
[(#SET{valeurs,#VAL{#ENV{exec}}|description_table|table_valeur{field}|array_keys|print})]
]
[(#SET{tableau,#GET{valeurs}|explode{', '}})]
&lt;B_label&gt;
&lt;ul class=&#034;liste-items[ (#VAL{#ENV{exec}}|concat{':label_',#ENV{exec},'_champs'})]&#034;&gt;
&lt;BOUCLE_label(DATA){si #SESSION{webmestre}|=={oui}} {source table, #GET{tableau}}&gt;
&lt;li class=&#034;item&#034;&gt;&lt;strong&gt;#VALEUR : &lt;/strong&gt;[&lt;br/&gt;(#VAL{#ENV{exec}}|concat{':label_',#VALEUR}|_T)]&lt;/li&gt;
&lt;/BOUCLE_label&gt;
&lt;/ul&gt;
&lt;/B_label&gt;
[(#BOITE_FERMER)]&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;Structure &#224; respecter&lt;/h2&gt;
&lt;p&gt;En premier lieu, il faut avoir le fichier de langue nommer sous cette forme : &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;lang/projet_site_fr.php&lt;/code&gt;. Puis chaque champ doit avoir son label : &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;label_champ&lt;/code&gt;, soit &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;label_id_site&lt;/code&gt;, &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;label_logiciel_nom&lt;/code&gt;, &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;label_logiciel_version&lt;/code&gt;, etc.&lt;br class='autobr' /&gt;
Apr&#232;s cela, tout roule !&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;L'astuce magique de kent1&lt;/h2&gt;
&lt;p&gt;Je vous avais dit que kent1 m'avait communiqu&#233; un code qui permettait de reconstruire une cha&#238;ne de langue. Voici ce bout de code : &lt;br class='autobr' /&gt;
&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;[(#VAL{#ENV{exec}}|concat{':label_',#VALEUR}|_T)]&lt;/code&gt;&lt;br class='autobr' /&gt;
L'application du filtre &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;|_T&lt;/code&gt; permet de transformer notre variable en cha&#238;ne de langue. Magique !&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_ps'&gt;&lt;p&gt;Image : &#169; &lt;a href=&#034;https://picjumbo.com/girl-with-watches-typing-on-macbook/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;By Vikto Hanacek&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Afficher les globals tout en boucle SPIP</title>
		<link>https://www.teddypayet.com/Afficher-les-globals-tout-en-boucle-SPIP</link>
		<guid isPermaLink="true">https://www.teddypayet.com/Afficher-les-globals-tout-en-boucle-SPIP</guid>
		<dc:date>2013-11-15T17:11:41Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Teddy Payet</dc:creator>


		<dc:subject>SPIP</dc:subject>
		<dc:subject>Astuce</dc:subject>
		<dc:subject>Notes de d&#233;veloppement</dc:subject>
		<dc:subject>PHP</dc:subject>
		<dc:subject>Javascript</dc:subject>
		<dc:subject>Boucle DATA</dc:subject>
		<dc:subject>Boucle CONDITION</dc:subject>
		<dc:subject>jQuery</dc:subject>

		<description>
&lt;p&gt;Lorsqu'on fait un d&#233;veloppement PHP, on a besoin parfois de savoir ce qu'on a dans nos $GLOBALS. Il en va de m&#234;me lorsqu'on est en d&#233;veloppement avec SPIP. Voici un bout de code qui peut d&#233;panner. &lt;br class='autobr' /&gt; Pr&#233;ambule Il existe des solutions plus pouss&#233;es comme les logiciels IDE qui permettent de voir les fonctions appell&#233;es dans la page. Malheureusement, on n'a pas toujours la possibilit&#233; de coder avec ces logiciels dans l'infrastructure o&#249; nous sommes. Dans SPIP, on peut m&#234;me utiliser le plugin (&#8230;)&lt;/p&gt;


-
&lt;a href="https://www.teddypayet.com/Blog" rel="directory"&gt;Blog&lt;/a&gt;

/ 
&lt;a href="https://www.teddypayet.com/SPIP" rel="tag"&gt;SPIP&lt;/a&gt;, 
&lt;a href="https://www.teddypayet.com/Astuce" rel="tag"&gt;Astuce&lt;/a&gt;, 
&lt;a href="https://www.teddypayet.com/Notes-de-developpement" rel="tag"&gt;Notes de d&#233;veloppement&lt;/a&gt;, 
&lt;a href="https://www.teddypayet.com/PHP" rel="tag"&gt;PHP&lt;/a&gt;, 
&lt;a href="https://www.teddypayet.com/Javascript" rel="tag"&gt;Javascript&lt;/a&gt;, 
&lt;a href="https://www.teddypayet.com/Boucle-DATA" rel="tag"&gt;Boucle DATA&lt;/a&gt;, 
&lt;a href="https://www.teddypayet.com/Boucle-CONDITION" rel="tag"&gt;Boucle CONDITION&lt;/a&gt;, 
&lt;a href="https://www.teddypayet.com/jQuery" rel="tag"&gt;jQuery&lt;/a&gt;

		</description>


 <content:encoded>&lt;img src='https://www.teddypayet.com/local/cache-vignettes/L150xH95/arton120-cc7f7.png?1755102076' class='spip_logo spip_logo_right' width='150' height='95' alt=&#034;&#034; /&gt;
		&lt;div class='rss_chapo'&gt;&lt;p&gt;Lorsqu'on fait un d&#233;veloppement PHP, on a besoin parfois de savoir ce qu'on a dans nos &lt;i&gt;$GLOBALS&lt;/i&gt;. Il en va de m&#234;me lorsqu'on est en d&#233;veloppement avec SPIP. Voici un bout de code qui peut d&#233;panner.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;h2 class=&#034;spip&#034;&gt;Pr&#233;ambule&lt;/h2&gt;
&lt;p&gt;Il existe des solutions plus pouss&#233;es comme les logiciels IDE qui permettent de voir les fonctions appell&#233;es dans la page. Malheureusement, on n'a pas toujours la possibilit&#233; de coder avec ces logiciels dans l'infrastructure o&#249; nous sommes.&lt;br class='autobr' /&gt;
Dans SPIP, on peut m&#234;me utiliser le plugin &lt;a href=&#034;http://contrib.spip.net/TestBuilder&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Test Builder&lt;/a&gt; pour cr&#233;er... nos tests. C'est super pratique quand on a pris le coup de main.&lt;/p&gt;
&lt;p&gt;Mais voil&#224;... Ca, c'est dans le meilleur des mondes. Parfois, tout cela n'est pas possible ou on a juste besoin d'une information sans avoir &#224; utiliser un couteau Suisse(c) l&#224; o&#249; un cure-dent suffirait.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Le code&lt;/h2&gt;
&lt;p&gt;Pour faire illustrer notre exemple, on va cr&#233;er dans notre r&#233;pertoire squelettes l'arborescence suivante :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; squelettes/
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; prive/
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; squelettes/
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; contenu/
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; globals.html&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Le fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;globals.html&lt;/code&gt; contiendra, soyons originaux, l'affichage de nos globals. Tout se fera par cette page.&lt;/p&gt;
&lt;p&gt;Pour l'appeller, aller &#224; l'adresse &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;ecrire/?exec=globals&lt;/code&gt;. Comme le fichier est vide, vous devriez peut-&#234;tre avoir une erreur ou au mieux une page &#034;blanche&#034;.&lt;/p&gt;
&lt;p&gt;Voici le code &#224; ins&#233;rer dans la page &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;globals.html&lt;/code&gt; :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='prettyprint html spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;&lt;div class=&#034;nettoyeur&#034;&gt; &lt;/div&gt; &lt;BOUCLE_index(CONDITION){si #ENV{index}}&gt; #SET{global,$GLOBALS[#ENV{index}]} &lt;/BOUCLE_index&gt; #SET{global,$GLOBALS} &lt;//B_index&gt; &lt;B_form&gt; &lt;div class=&#034;liste globals&#034;&gt; &lt;h2 class=&#034;h2&#034;&gt;Index des $GLOBALS&lt;/h2&gt; &lt;form method=&#034;GET&#034; action=&#034;#SELF&#034; class=&#034;ajax&#034;&gt; [(#SELF|parametre_url{'index',''}|parametre_url{'affichage',''}|form_hidden)] &lt;select id=&#034;index_select&#034; name=&#034;index&#034;&gt; &lt;BOUCLE_form(DATA) {source table, #EVAL{$GLOBALS}|array_keys} {par valeur}&gt;[(#SET{nom_index,#VAL{&#034;'&#034;}|concat{#VALEUR,&#034;'&#034;}})] #SET{datatype,$GLOBALS[#GET{nom_index}]} &lt;option value=&#034;#VALEUR&#034;[ (#ENV{index}|=={#VALEUR}|oui) selected=&#034;selected&#034;] data-type=&#034;[(#EVAL{#GET{datatype}}|gettype)]&#034;&gt;#VALEUR&lt;/option&gt; &lt;/BOUCLE_form&gt; &lt;/select&gt; &lt;select id=&#034;affichage_select&#034; name=&#034;affichage&#034;&gt; &lt;option value=&#034;var_dump&#034;[ (#ENV{affichage}|=={#VALEUR}|oui) selected=&#034;selected&#034;]&gt;var_dump&lt;/option&gt; &lt;option value=&#034;cles&#034;[ (#ENV{affichage}|=={#VALEUR}|oui) selected=&#034;selected&#034;]&gt;Afficher uniquement les cl&#233;s&lt;/option&gt; &lt;/select&gt; &lt;input type=&#034;submit&#034; value=&#034;Valider&#034; /&gt; &lt;/form&gt; &lt;/div&gt; &lt;/B_form&gt; [(#SET{nom_index,#VAL{&#034;'&#034;}|concat{#ENV{index},&#034;'&#034;}})] #SET{datatype,$GLOBALS[#GET{nom_index}]} [(#ENV{index}|non) &lt;h3&gt;$GLOBALS [ &lt;br/&gt;&lt;small&gt;(#EVAL{$GLOBALS}|gettype)&lt;/small&gt;] &lt;/h3&gt; ] [(#ENV{index}|oui) [&lt;h3&gt;(#GET{datatype}) [ &lt;br/&gt;&lt;small&gt;(#EVAL{#GET{datatype}}|gettype)&lt;/small&gt;] &lt;/h3&gt;] ] [(#ENV{affichage}|=={var_dump}|oui) [&lt;pre&gt;(#EVAL{#GET{global}}|print|sinon{'vide'})&lt;/pre&gt;] ] [(#ENV{affichage}|=={cles}|oui) [&lt;pre&gt;(#EVAL{#GET{global}}|array_keys|foreach|sinon{'vide'})&lt;/pre&gt;] ] [(#ENV{affichage}|non) [&lt;pre&gt;(#EVAL{#GET{global}}|array_keys|foreach|sinon{'vide'})&lt;/pre&gt;] ] &lt;script type=&#034;text/javascript&#034;&gt; (function($) { $('#index_select').change(function(){ var datatype = $(this).find('option:selected').attr('data-type'); if (datatype == 'array') { $('#affichage_select').val('cles'); } else { $('#affichage_select').val('var_dump'); } }); })(jQuery); &lt;/script&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;Explications&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;La boucle &#034;index&#034;&lt;/strong&gt;&lt;br class='autobr' /&gt;
Elle va tout simplement regarder si on a pass&#233; un param&#232;tre &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;index&lt;/code&gt; dans notre URL. Si oui, on affichera le contenu de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$GLOBALS[#ENV{index}]&lt;/code&gt;. Sinon, on prend &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$GLOBALS&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;La boucle &#034;form&#034;&lt;/strong&gt;&lt;br class='autobr' /&gt;
Elle va cr&#233;er un formulaire avec 2 champs &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;select&lt;/code&gt;. Le premier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;select&lt;/code&gt; listera tous les &#034;index&#034; de notre super variable PHP &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$GLOBALS&lt;/code&gt;.&lt;br class='autobr' /&gt;
Le deuxi&#232;me &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;select&lt;/code&gt; se charge d'indiquer quel type d'affichage d&#233;sire-t-on avoir pour notre variable :
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; &lt;i&gt;var_dump&lt;/i&gt; : pour les utilisateurs PHP, cela parle de source : &#034;affiche les informations structur&#233;es d'une variable, y compris son type et sa valeur.&#034; Sauf que dans notre cas, on n'a pas le type :-P
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; &lt;i&gt;cles&lt;/i&gt; : affiche le tableau associatif des cl&#233;s de notre variable.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Les ENV&lt;/strong&gt;&lt;br class='autobr' /&gt;
Les &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#ENV&lt;/code&gt; apr&#232;s notre boucle &#034;form&#034; v&#233;rifie la pr&#233;sence du param&#232;tre &#034;affichage&#034; dans notre url. Selon sa valeur, on affichera d'une certaine fa&#231;on le contenu de notre variable.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Le javascript&lt;/strong&gt;&lt;br class='autobr' /&gt;
Le javascript en fin de page va juste changer la s&#233;lection du deuxi&#232;me &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;select&lt;/code&gt; selon le type de variable qu'on aura. Si notre variable est de type &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;array&lt;/code&gt;, le &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;select&lt;/code&gt; affichage sera &#034;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;cles&lt;/code&gt;&#034;. Tous les autres types (Object, string, etc.) auront un affichage &#034;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;var_dump&lt;/code&gt;&#034;.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Fini...&lt;/h2&gt;
&lt;p&gt;Ce code vous permet donc depuis l'espace priv&#233; d'avoir les globals. Mais il vous suffit de faire une page accessible sur la partie publique de votre site avec exactement le m&#234;me code pour avoir les globals dans cet environnement.&lt;/p&gt;
&lt;p&gt;Encore une fois, ce n'est qu'une astuce parmis d'autres. Si vous en avez aussi, elles sont les bienvenues en commentaires !&lt;br class='autobr' /&gt;
Cela permettra d'avoir d'autres pratiques de d&#233;veloppeurs SPIP/PHP.&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>



</channel>

</rss>
