<?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://preprod.teddypayet.com/</link>
	
	<language>fr</language>
	<generator>SPIP - www.spip.net</generator>
	<atom:link href="https://preprod.teddypayet.com/spip.php?id_mot=52&amp;page=backend" rel="self" type="application/rss+xml" />

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

                   

<item xml:lang="fr">
		<title>SPIP - Lister toutes les tables et leurs entr&#233;es</title>
		<link>https://preprod.teddypayet.com/SPIP-Lister-toutes-les-tables-et-leurs-entrees</link>
		<guid isPermaLink="true">https://preprod.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://preprod.teddypayet.com/Blog" rel="directory"&gt;Blog&lt;/a&gt;

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

		</description>


 <content:encoded>&lt;img src='https://preprod.teddypayet.com/local/cache-vignettes/L150xH140/arton125-5754a.png?1725524434' 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://preprod.teddypayet.com/SPIP-Documentation-technique-construction-des-pages</link>
		<guid isPermaLink="true">https://preprod.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://preprod.teddypayet.com/Blog" rel="directory"&gt;Blog&lt;/a&gt;

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

		</description>


 <content:encoded>&lt;img src='https://preprod.teddypayet.com/local/cache-vignettes/L150xH100/arton124-d37c6.png?1725524434' 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://preprod.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://preprod.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://preprod.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://preprod.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://preprod.teddypayet.com/SPIP-Documentation-technique-nomenclature</link>
		<guid isPermaLink="true">https://preprod.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://preprod.teddypayet.com/Blog" rel="directory"&gt;Blog&lt;/a&gt;

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

		</description>


 <content:encoded>&lt;img src='https://preprod.teddypayet.com/local/cache-vignettes/L150xH100/arton122-c79a9.png?1725524434' 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://preprod.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://preprod.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://preprod.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://preprod.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://preprod.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://preprod.teddypayet.com/Afficher-les-champs-d-un-objet-SPIP-v2</link>
		<guid isPermaLink="true">https://preprod.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://preprod.teddypayet.com/Blog" rel="directory"&gt;Blog&lt;/a&gt;

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

		</description>


 <content:encoded>&lt;img src='https://preprod.teddypayet.com/local/cache-vignettes/L150xH100/arton123-45c4f.jpg?1725524434' 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://preprod.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://preprod.teddypayet.com/Afficher-les-globals-tout-en-boucle-SPIP</link>
		<guid isPermaLink="true">https://preprod.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://preprod.teddypayet.com/Blog" rel="directory"&gt;Blog&lt;/a&gt;

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

		</description>


 <content:encoded>&lt;img src='https://preprod.teddypayet.com/local/cache-vignettes/L150xH95/arton120-cc7f7.png?1725293379' 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>
<item xml:lang="fr">
		<title>Une boucle DATA pour avoir les derni&#232;res versions de SPIP</title>
		<link>https://preprod.teddypayet.com/Une-boucle-DATA-pour-avoir-les-dernieres-versions-de-SPIP</link>
		<guid isPermaLink="true">https://preprod.teddypayet.com/Une-boucle-DATA-pour-avoir-les-dernieres-versions-de-SPIP</guid>
		<dc:date>2013-09-24T15: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>Notes de d&#233;veloppement</dc:subject>
		<dc:subject>Boucle DATA</dc:subject>
		<dc:subject>XML</dc:subject>

		<description>
&lt;p&gt;Avec SPIP 3, nous avons nativement la boucle DATA issue du plugin It&#233;rateur r&#233;alis&#233; par Fil. Cette boucle nous permet de parser presque tout ce que l'on veut ! C'est purement magique ! &lt;br class='autobr' /&gt; Un xml Voici un exemple d'utilisation de la boucle DATA &#224; partir d'un xml obtenu de la page &lt;br class='autobr' /&gt; [(#VALEUR0)] &lt;br class='autobr' /&gt;
Explications l'url sp&#233;cifi&#233;e est fournis par la console de YQL : (Cliquez sur &#034;Test&#034; pour voir le rendu) Le r&#233;sultat de cette premi&#232;re boucle DATA est un tableau qui (&#8230;)&lt;/p&gt;


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

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

		</description>


 <content:encoded>&lt;img src='https://preprod.teddypayet.com/local/cache-vignettes/L150xH99/arton116-0aa80.png?1726073173' class='spip_logo spip_logo_right' width='150' height='99' alt=&#034;&#034; /&gt;
		&lt;div class='rss_chapo'&gt;&lt;p&gt;Avec SPIP 3, nous avons nativement la boucle DATA issue du plugin It&#233;rateur r&#233;alis&#233; par Fil. Cette boucle nous permet de parser presque tout ce que l'on veut ! C'est purement magique !&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;h2 class=&#034;spip&#034;&gt;Un xml&lt;/h2&gt;
&lt;p&gt;Voici un exemple d'utilisation de la boucle DATA &#224; partir d'un xml obtenu de la page &lt;a href=&#034;http://files.spip.org/spip/archives/&#034; class=&#034;spip_url spip_out&#034; rel=&#034;external&#034;&gt;http://files.spip.org/spip/archives/&lt;/a&gt;&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='prettyprint linenums spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;&lt;B_archives&gt; &lt;ul&gt; &lt;BOUCLE_archives(DATA) {source xml, &#034;http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20html%20where%20url%3D'http%3A%2F%2Ffiles.spip.org%2Fspip%2Farchives%2F'%20and%20xpath%3D'%2Fhtml%2Fbody%2Fdiv%2Fdiv%5B3%5D%2Fdiv%2Fdiv%2Fdiv%2Ful%5B2%5D%2Fli%2Fdiv%5B1%5D%2Fa'&amp;format=xml&#034;}&gt; &lt;BOUCLE_nom(DATA) {source table, #VALEUR{0}} {cle==a}&gt; &lt;li&gt;&lt;a href=&#034;#VALEUR{href}&#034;&gt;[(#VALEUR{0})]&lt;/a&gt; &lt;/li&gt; &lt;/BOUCLE_nom&gt; &lt;/BOUCLE_archives&gt; &lt;/ul&gt; &lt;/B_archives&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;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; l'url sp&#233;cifi&#233;e est fournis par la console de YQL : &lt;a href=&#034;http://developer.yahoo.com/yql/console/#h=select+*+from+html+where+url%3D'http%3A%2F%2Ffiles.spip.org%2Fspip%2Farchives%2F'+and+xpath%3D'%2Fhtml%2Fbody%2Fdiv%2Fdiv%5B3%5D%2Fdiv%2Fdiv%2Fdiv%2Ful%5B2%5D%2Fli%2Fdiv%5B1%5D%2Fa'&#034; class=&#034;spip_url spip_out&#034; rel=&#034;external&#034;&gt;http://developer.yahoo.com/yql/cons...&lt;/a&gt; (Cliquez sur &#034;Test&#034; pour voir le rendu)&lt;br class='autobr' /&gt;
Le r&#233;sultat de cette premi&#232;re boucle DATA est un tableau qui contient uniquement les liens vers les archives de SPIP. Il nous suffit de le passer en crit&#232;re &#224; une seconde boucle DATA. &lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; gr&#226;ce au crit&#232;re &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{cle==a}&lt;/code&gt;, on r&#233;cup&#232;re uniquement les cl&#233;s contenant 'a' (&#233;quivalent &#224; la balise html &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;a&gt;&lt;/code&gt;).
&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;#VALEUR{href}&lt;/code&gt; : r&#233;cup&#233;ration de l'attribut &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;href&lt;/code&gt; de la balise &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;a&gt;.&lt;/code&gt;
&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;#VALEUR{0}&lt;/code&gt; : r&#233;cup&#233;ration du contenu de la balise &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;a&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Et voil&#224;. Nous avons sur la page toutes nos versions officielles de SPIP.&lt;/p&gt;
&lt;p&gt;J'&#233;tofferai un peu plus tard cet article avec une boucle DATA avec une source YQL.&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>



</channel>

</rss>
