<?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>Vader[FR] : ce n'est pas un blog, c'est un Sith</title>
	<link>https://vader-fr.fr/</link>
	
	<language>fr</language>
	<generator>SPIP - www.spip.net</generator>
	<atom:link href="https://vader-fr.fr/spip.php?id_mot=9&amp;page=backend" rel="self" type="application/rss+xml" />

	<image>
		<title>Vader[FR] : ce n'est pas un blog, c'est un Sith</title>
		<url>https://vader-fr.fr/local/cache-vignettes/L144xH144/siteon0-c1872.jpg?1771612673</url>
		<link>https://vader-fr.fr/</link>
		<height>144</height>
		<width>144</width>
	</image>



<item xml:lang="fr">
		<title>Exemples de fonctions PHP</title>
		<link>https://vader-fr.fr/spip.php?article174</link>
		<guid isPermaLink="true">https://vader-fr.fr/spip.php?article174</guid>
		<dc:date>2016-07-27T08:09:54Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Vader[FR]</dc:creator>


		<dc:subject>PHP</dc:subject>
		<dc:subject>D&#233;veloppement web</dc:subject>

		<description>
&lt;p&gt;Retour des erreurs &lt;br class='autobr' /&gt;
Lorsque les erreurs et autres messages &#224; caract&#232;re informatif sont g&#233;r&#233;s dans les diff&#233;rents blocs, et empil&#233;s dans une variable qui sera au final affich&#233;e dans un bloc d&#233;di&#233; (lequel peut &#234;tre d&#233;pliant gr&#226;ce au CSS). Si l'on souhaite un style diff&#233;rent selon le niveau d'erreur atteint, les diff&#233;rents blocs peuvent faire appel &#224; cette fonction, qui use d'op&#233;rateurs ternaires. &lt;br class='autobr' /&gt;
Il est aussi possible d'utiliser une variable globale pour le niveau d'erreur actuel, ce qui (&#8230;)&lt;/p&gt;


-
&lt;a href="https://vader-fr.fr/spip.php?rubrique17" rel="directory"&gt;Les pages dynamiques avec PHP/MySQL&lt;/a&gt;

/ 
&lt;a href="https://vader-fr.fr/spip.php?mot2" rel="tag"&gt;PHP&lt;/a&gt;, 
&lt;a href="https://vader-fr.fr/spip.php?mot9" rel="tag"&gt;D&#233;veloppement web&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;div class=&#034;onglets_bloc_initial&#034;&gt;&lt;div class=&#034;onglets_contenu&#034;&gt;&lt;h2 class=&#034;cs_onglet&#034;&gt;&lt;a href=&#034;#&#034;&gt;Retour des erreurs&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;
&lt;p&gt;Lorsque les erreurs et autres messages &#224; caract&#232;re informatif sont g&#233;r&#233;s dans les diff&#233;rents blocs, et empil&#233;s dans une variable qui sera au final affich&#233;e dans un bloc d&#233;di&#233; (lequel peut &#234;tre d&#233;pliant gr&#226;ce au CSS).&lt;br class='autobr' /&gt;
Si l'on souhaite un style diff&#233;rent selon le niveau d'erreur atteint, les diff&#233;rents blocs peuvent faire appel &#224; cette fonction, qui use d'op&#233;rateurs ternaires.&lt;/p&gt;
&lt;p&gt;Il est aussi possible d'utiliser une variable globale pour le niveau d'erreur actuel, ce qui simplifie les appels &#224; la fonction.&lt;/p&gt;
&lt;p&gt;3 niveaux d'erreur sont g&#233;r&#233;s :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; info : tout va bien, on affiche un (ou plus) message(s) juste pour information&lt;/li&gt;&lt;li&gt; debug : attention, risque d'erreur, tout n'est pas optimal&lt;/li&gt;&lt;li&gt; error : erreur critique&lt;/li&gt;&lt;/ul&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;function raise_debuglvl($lvl,$actuel){ $debuglvl=$actuel; $debuglvl=(($lvl==&#034;info&#034;)&amp;&amp;($actuel==&#034;info&#034;))?&#034;info&#034;:$debuglvl; $debuglvl=(($lvl==&#034;debug&#034;)&amp;&amp;($actuel!=&#034;error&#034;))?&#034;debug&#034;:$debuglvl; $debuglvl=($lvl==&#034;error&#034;)?&#034;error&#034;:$debuglvl; return $debuglvl;
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;La d&#233;claration du bloc d'affichage :&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;// bloc d'information - l'image sert au d&#233;ploiement mais reste affich&#233;e dans le bloc d&#233;pli&#233; if ($debug!=&#034;&#034;){ switch ($debuglvl) { case &#034;info&#034; : $debugimg=&#034;notif-info.gif&#034;; break; // ou action-s-valide case &#034;debug&#034; : $debugimg=&#034;notif-warning.gif&#034;; break; case &#034;error&#034; : $debugimg=&#034;notif-error.gif&#034;; break; default: $debugimg=&#034;notif-warning.gif&#034;; break; } echo &#034;&lt;div id=\&#034;debug\&#034; class=\&#034;$debuglvl\&#034;&gt; &lt;img src=\&#034;imj/$debugimg\&#034; alt=\&#034;$debuglvl\&#034;/&gt; $debug &lt;/div&gt;&#034;; }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;La page appelante d&#233;clare les variables &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$debug&lt;/code&gt; et &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$info&lt;/code&gt; :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$debug&lt;/code&gt; contiendra les messages &#224; afficher dans le bloc d&#233;di&#233;&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$info&lt;/code&gt; contiendra les messages &#224; afficher dans la page.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Les pages appel&#233;es (via &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;include&lt;/code&gt; ou &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;require&lt;/code&gt; empileront dans ces variables les messages qu'elles souhaitent soulever.&lt;br class='autobr' /&gt;
&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$debug.=&#034;message&#034;;&lt;/code&gt; ou &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$info.=&#034;message&#034;;&lt;/code&gt;, cette derni&#232;re variable pouvant &#234;tre affich&#233;e dans la page puis vid&#233;e.&lt;/p&gt;
&lt;div class='cs_blocs'&gt;&lt;h4 class='blocs_titre blocs_replie blocs_click'&gt;&lt;a href='#_foo'&gt;exemple d'utilisation&lt;/a&gt;&lt;/h4&gt;&lt;div class='blocs_destination blocs_invisible blocs_slide'&gt;
&lt;p&gt;dans un script g&#233;rant le login d'un utilisateur, on r&#233;cup&#232;re (en &#233;tape 2) login/mot de passe.&lt;br class='autobr' /&gt;
Selon ce qui est fourni, on retourne en &#233;tape 1 en affichant un message d'erreur.&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;if ($etape==2){ if ((isset($_POST[&#034;user&#034;]))&amp;&amp;($_POST[&#034;user&#034;]!=&#034;&#034;)){ $user=$_POST[&#034;user&#034;]; // v&#233;rifier pas d'espace (entre autre) if (!preg_match(&#034;/^[a-z][a-z0-9]+$/&#034;,$user)){ $debug.=&#034;nom utilisateur non conforme&lt;br/&gt;&#034;; } }else{ $debug.=&#034;nom utilisateur manquant&lt;br/&gt;&#034;; } if ((isset($_POST[&#034;motpass&#034;]))&amp;&amp;($_POST[&#034;motpass&#034;]!=&#034;&#034;)){ $motpass=$_POST[&#034;motpass&#034;]; // v&#233;rifier pas d'espace (entre autre) if (!preg_match(&#034;/^[a-zA-Z0-9]+$/&#034;,$user)){ $debug.=&#034;mot de passe non conforme&lt;br/&gt;&#034;; } }else{ $debug.=&#034;mot de passe manquant&lt;br/&gt;&#034;; } if ($debug!=&#034;&#034;){ $etape=1; $info=$debug; raise_debuglvl(&#034;debug&#034;,$debuglvl); }
}
if ($etape==2){
// comparaison BDD
}
if ($etape==1){ echo &#034;&lt;div id=\&#034;navig\&#034; class=\&#034;$page\&#034;&gt; Bloc navigation &lt;/div&gt; &lt;div id=\&#034;contenu\&#034; class=\&#034;$page\&#034;&gt; $info &#034;; // formulaire }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class='cs_blocs'&gt;&lt;h4 class='blocs_titre blocs_replie blocs_click'&gt;&lt;a href='#_foo'&gt;son style CSS&lt;/a&gt;&lt;/h4&gt;&lt;div class='blocs_destination blocs_invisible blocs_slide'&gt;
&lt;p&gt;pour un bloc d&#233;pliable CSS situ&#233; en haut &#224; gauche de la page :&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;#debug { position:absolute; top:0; left:0; width:32px; height:32px; z-index:42; line-height:0; font-size:0;
}
#debug img { height:auto; width:auto; max-height:32px; max-width:32px; visibility:visible;
}
#debug:hover { height:auto; width:auto; min-height:100px; min-width:200px; line-height:normal; font-size:1em; overflow-y:auto;
}
#debug:hover img { height:auto; width:auto;
}
#debug:hover img#deploi_debug { height:0; width:0; visibility:hidden;
}
/* =========================================== Messages de d&#233;bogages =========================================== */
#debug.error{ background-color:#FF0000;
}
#debug.error:hover { background-color:#FF8C00;
} #debug.debug { background-color:#FF8C00; }
#debug.info { background-color:#ADD8E6;
}
#debug.debug:hover, #debug.info:hover { background-color:#ADD8E6;
}
.debug { color:#FF8C00; /*#FFB30A;*/ /*#FFA501;*/
}
.info { color:#40820D; }
.error { color:#FF0000; font-weight:bold;
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#034;onglets_contenu&#034;&gt;&lt;h2 class=&#034;cs_onglet&#034;&gt;&lt;a href=&#034;#&#034;&gt;redirection en https&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;
&lt;p&gt;Pas vraiment une fonction, mais un petit bout de code &#224; mettre dans la section &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;head&gt;...&lt;/head&gt;&lt;/code&gt;.&lt;br class='autobr' /&gt;
Si la page est acc&#233;d&#233;e en http non s&#233;curis&#233;, on redirige vers le mode s&#233;curis&#233; https, via une balise meta.&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; // 'HTTPS' est d&#233;fini &#224; une valeur non-vide si le script a &#233;t&#233; appel&#233; via le protocole HTTPS. if ((!isset($_SERVER['HTTPS']))||($_SERVER['HTTPS']==&#034;&#034;)){ $url=&#034;https://&#034;.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; echo &#034;&lt;meta http-equiv='Refresh' content=\&#034;0; url=$url\&#034;/&gt;&#034;; }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Script g&#233;n&#233;rique des diaporamas AJAX</title>
		<link>https://vader-fr.fr/spip.php?article144</link>
		<guid isPermaLink="true">https://vader-fr.fr/spip.php?article144</guid>
		<dc:date>2014-10-18T19:53:27Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Vader[FR]</dc:creator>


		<dc:subject>JavaScript</dc:subject>
		<dc:subject>PHP</dc:subject>
		<dc:subject>D&#233;veloppement web</dc:subject>
		<dc:subject>SPIP</dc:subject>

		<description>
&lt;p&gt;Ce script est le m&#234;me pour le diaporama de la page de garde et pour le diaporama de la galerie. &lt;br class='autobr' /&gt;
Il lit des param&#232;tres dans la page (num&#233;ro de rubrique &#224; parcourir, nombre de niveaux de sous-rubriques &#224; chercher, langue) et envoie la requ&#234;te au serveur, puis ins&#232;re dans la page l'image, le titre et le texte de chaque &#233;l&#233;ment du diaporama en l'adaptant &#224; la taille de la fen&#234;tre, avant de demander l'&#233;l&#233;ment suivant. &lt;br class='autobr' /&gt;
En effet, les &#233;l&#233;ments de ce diaporama sont des articles : le logo de (&#8230;)&lt;/p&gt;


-
&lt;a href="https://vader-fr.fr/spip.php?rubrique31" rel="directory"&gt;Isabelle Palenc : artiste peintre sculpteur&lt;/a&gt;

/ 
&lt;a href="https://vader-fr.fr/spip.php?mot1" rel="tag"&gt;JavaScript&lt;/a&gt;, 
&lt;a href="https://vader-fr.fr/spip.php?mot2" rel="tag"&gt;PHP&lt;/a&gt;, 
&lt;a href="https://vader-fr.fr/spip.php?mot9" rel="tag"&gt;D&#233;veloppement web&lt;/a&gt;, 
&lt;a href="https://vader-fr.fr/spip.php?mot10" rel="tag"&gt;SPIP&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;p&gt;Ce script est le m&#234;me pour le diaporama de la page de garde et pour le diaporama de la galerie.&lt;/p&gt;
&lt;p&gt;Il lit des param&#232;tres dans la page (num&#233;ro de &lt;strong&gt;rubrique&lt;/strong&gt; &#224; parcourir, nombre de niveaux de &lt;strong&gt;sous-rubriques&lt;/strong&gt; &#224; chercher, langue) et envoie la requ&#234;te au serveur, puis ins&#232;re dans la page l'image, le titre et le texte de chaque &#233;l&#233;ment du diaporama en l'adaptant &#224; la taille de la fen&#234;tre, avant de demander l'&#233;l&#233;ment suivant.&lt;/p&gt;
&lt;p&gt;En effet, les &#233;l&#233;ments de ce diaporama sont des articles :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; le logo de l'article est une image particuli&#232;re, que l'on peut ais&#233;ment diff&#233;rencier du texte, afin de lui accorder un traitement diff&#233;rent.&lt;/li&gt;&lt;li&gt; un article existe dans une certaine langue, ce qui permet d'afficher un diaporama diff&#233;rent selon la langue souhait&#233;e&lt;/li&gt;&lt;li&gt; un article avec texte, titre et logo est facile &#224; ajouter, modifier ou enlever dans l'espace priv&#233; de SPIP.&lt;/li&gt;&lt;/ul&gt;&lt;div class=&#034;onglets_bloc_initial&#034;&gt;&lt;div class=&#034;onglets_contenu&#034;&gt;&lt;h2 class=&#034;cs_onglet&#034;&gt;&lt;a href=&#034;#&#034;&gt;Lancement des fonctions JavaScript&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;
&lt;p&gt;Comme on peut le voir dans l'aper&#231;u Firebug de la &lt;a href='https://vader-fr.fr/spip.php?article143' class=&#034;spip_in&#034;&gt;structure de la page de garde&lt;/a&gt;, il y a dans chaque page, pour l'&#233;v&#232;nement &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;onLoad&lt;/code&gt; (= &#034;au chargement&#034;) de l'&#233;l&#233;ment HTML &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;body&lt;/code&gt;, appel &#224; une fonction unique et g&#233;n&#233;rique &#034;AuChargement&#034;.&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;function AuChargement(){ pisteIE(); cachejs(); setTimeout(&#034;charger_diapo()&#034;,1000); // 1 seconde traitercadres(); traiterimages();
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Cette fonction unique en invoque d'autres, qui, selon les &#233;l&#233;ments pr&#233;sents ou non dans la page, feront quelque chose :&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;pisteIE&lt;/code&gt; va, comme son nom l'indique, rediriger les utilisateurs du navigateur Internet Explorer vers une page d'avertissement, indiquant les d&#233;ficiences de Microsoft Internet Explorer quand aux &#233;l&#233;ments pourtant normalis&#233;s W3C de la page.
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Un lien &#034;continuer quand m&#234;me&#034; permet aux utilisateurs d'Internet Explorer de poursuivre la navigation, ils ont &#233;t&#233; pr&#233;venus.&lt;/li&gt;&lt;li&gt; Un syst&#232;me de cookie enregistre le fait que l'utilisateur est pr&#233;venu, cela &#233;vite de faire la redirection &#224; chaque ouverture de page.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;cachejs&lt;/code&gt; sert, comme son nom l'indique, &#224; cacher le message selon lequel JavaScript est d&#233;sactiv&#233; sur le navigateur.&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;setTimeout(&#034;charger_diapo()&#034;,1000);&lt;/code&gt; lance la fonction &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;charger_diapo()&lt;/code&gt; au bout d'une seconde.
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; C'est cette fonction qui ira chercher les param&#232;tres du diaporama dans la page et enverra la requ&#234;te au serveur pour le premier &#233;l&#233;ment.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;traitercadres&lt;/code&gt; et &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;traiterimages&lt;/code&gt; vont redimensionner les cadres et images qui en ont besoin.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#034;onglets_contenu&#034;&gt;&lt;h2 class=&#034;cs_onglet&#034;&gt;&lt;a href=&#034;#&#034;&gt;Lancement du diaporama&lt;/a&gt;&lt;/h2&gt;&lt;div&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;function charger_diapo(){ if (this.document.getElementById('diapo')!=null){&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Cette fonction ne s'ex&#233;cutera que si un &#233;l&#233;ment &#034;diapo&#034; est pr&#233;sent dans la page&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; if (this.document.getElementById('nrubrique')!=null){ nrubrique=this.document.getElementById('nrubrique').value; }else{ nrubrique=0; }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Pour chaque param&#232;tre du diaporama, on v&#233;rifie sa pr&#233;sence, et en cas d'absence on utilise une valeur par d&#233;faut&lt;/p&gt;
&lt;div class='cs_blocs'&gt;&lt;h4 class='blocs_titre blocs_replie blocs_click'&gt;&lt;a href='#_foo'&gt;Autres param&#232;tres&lt;/a&gt;&lt;/h4&gt;&lt;div class='blocs_destination blocs_invisible blocs_slide'&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; if (this.document.getElementById('mindepth')!=null){ mindepth=this.document.getElementById('mindepth').value; }else{ mindepth=0; } if (this.document.getElementById('maxdepth')!=null){ maxdepth=this.document.getElementById('maxdepth').value; }else{ maxdepth=1; } if (this.document.getElementById('lang')!=null){ lang=this.document.getElementById('lang').value; }else{ lang=&#034;fr&#034;; }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Puis on initialise quelques valeurs avant d'appeler la fonction qui cr&#233;era et enverra la requ&#234;te.&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; var url_image=null; var texte_diapo=null; var titre_diapo=null; requete_requete_image_diapo('charger_diapo.php?id=0&amp;rub='+nrubrique+'&amp;min='+mindepth+'&amp;max='+maxdepth+'&amp;lang='+lang); }
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#034;onglets_contenu&#034;&gt;&lt;h2 class=&#034;cs_onglet&#034;&gt;&lt;a href=&#034;#&#034;&gt;Cr&#233;ation de la requ&#234;te XMLHTTP&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;
&lt;p&gt;Le script javaScript d&#233;fini quelque variables globales, que plusieurs fonctions utiliseront.&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;var diapo = 0;
var prochain=0;
var nrubrique=0;
var mindepth=0;
var maxdepth=1;
var delai=5000;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Avant de pouvoir cr&#233;er la requ&#234;te XMLHTTP, il faut un objet de type xmlhttprequest pour y mettre les param&#232;tres, l'envoyer au serveur et recevoir sa r&#233;ponse.&lt;br class='autobr' /&gt;
En fonction du navigateur, on utilisera plusieurs m&#233;thodes.&lt;/p&gt;
&lt;div class='cs_blocs'&gt;&lt;h4 class='blocs_titre blocs_replie blocs_click'&gt;&lt;a href='#_foo'&gt;Cr&#233;ation de l'objet xmlhttprequest&lt;/a&gt;&lt;/h4&gt;&lt;div class='blocs_destination blocs_invisible blocs_slide'&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;function get_requete_image_diapo(){ var requete_image_diapo = null; if (window.XMLHttpRequest){ // Firefox requete_image_diapo=new XMLHttpRequest(); }else if (window.ActiveXObject){ // IE try{ requete_image_diapo=new ActiveXObject(&#034;Msxml12.XMLHTTP&#034;); }catch(e){ try{ requete_image_diapo=new ActiveXObject(&#034;Microsoft.XMLHTTP&#034;); }catch(e1){ requete_image_diapo=null; } } }else{ // non support&#233; alert(&#034;Votre navigateur ne supporte pas les XMLHTTPRequest.&#034;); /* + redirection vers page navigs.html */ } return requete_image_diapo;
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;La fonction pr&#233;c&#233;dente, qui cr&#233;&#233; l'objet xmlhttprequest, est appel&#233;e par la fonction de cr&#233;ation et d'envoi de la requ&#234;te que voici :&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;function requete_requete_image_diapo(url){&lt;/code&gt;&lt;/pre&gt;&lt;/div&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;	requete_image_diapo=get_requete_image_diapo(); if (!requete_image_diapo){ alert(&#034;Votre navigateur ne peut cr&#233;er de requ&#234;te AJAX.&#034;); /* + redirectiuon vers page navigs.html */ return; }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On r&#233;cup&#232;re l'objet xmlhttprequest, puis, si celui-ci n'a pu &#234;tre cr&#233;&#233; et que par cons&#233;quent la variable &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;requete_image_diapo&lt;/code&gt; n'existe pas - le &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;!&lt;/code&gt; signifiant la n&#233;gation - on affiche un message et l'on quitte la fonction.&lt;br class='autobr' /&gt;
Sinon, on poursuit&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;	//alert(&#034;envoi de la requete&#034;); requete_image_diapo.onreadystatechange=function(){traitementReponse_requete_image_diapo(requete_image_diapo)} requete_image_diapo.open(&#034;GET&#034;,url,true); requete_image_diapo.send(null);
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;requete_image_diapo.onreadystatechange=&lt;code&gt; d&#233;finit la fonction &lt;code&gt;function(){ ... }&lt;/code&gt; de traitement de la r&#233;ponse, quand la requ&#234;te aura &#034;chang&#233; d'&#233;tat&#034;.&lt;br class='autobr' /&gt;
Puis on ouvre l'url du script du serveur auquel il faut envoyer la requ&#234;te, et qui la traitera pour envoyer la r&#233;ponse selon les param&#232;tres indiqu&#233;s, et on y envoie la requ&#234;te.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class=&#034;onglets_contenu&#034;&gt;&lt;h2 class=&#034;cs_onglet&#034;&gt;&lt;a href=&#034;#&#034;&gt;Modification de la page affich&#233;e&lt;/a&gt;&lt;/h2&gt;&lt;div&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;function traitementReponse_requete_image_diapo(requete_image_diapo){ var contenu; var erreur=0; if (requete_image_diapo.readyState==4){&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Si la requ&#234;te est dans l'&#233;tat &#034;4&#034;, c'est &#224; dire que l'on a re&#231;u la r&#233;ponse du serveur,&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; //alert(&#034;reception de la reponse : traitement&#034;); contenu=requete_image_diapo.responseXML;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On r&#233;cup&#232;re le document XML constituant la r&#233;ponse du serveur.&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; if (contenu.getElementsByTagName(&#034;image&#034;)[0].firstChild.nodeValue!=null){ url_image=contenu.getElementsByTagName(&#034;image&#034;)[0].firstChild.nodeValue; }else{ erreur=1; }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On v&#233;rifie la pr&#233;sence de diff&#233;rents &#233;l&#233;ments de r&#233;ponse, en pr&#233;parant des valeurs par d&#233;faut si besoin.&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;contenu&lt;/code&gt; est le document XML de r&#233;ponse. Celui-ci est organis&#233; selon une arborescence de balises pour les divers &#233;l&#233;ments et leurs valeurs.&lt;/li&gt;&lt;li&gt; on utilise la fonction &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;getElementsByTagName&lt;/code&gt; pour adresser ces balises par leur nom
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; cette fonction renvoie un tableau de balises correspondantes, dont on s'int&#233;resse au premier &#233;l&#233;ment, &#224; la case 0, qui est la premi&#232;re case d'un tableau javaScript.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt; Une fois r&#233;cup&#233;r&#233; la balise souhait&#233;e, on r&#233;cup&#232;re la valeur du n&#339;ud (&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;nodeValue&lt;/code&gt;).&lt;/li&gt;&lt;/ul&gt;&lt;div class='cs_blocs'&gt;&lt;h4 class='blocs_titre blocs_replie blocs_click'&gt;&lt;a href='#_foo'&gt;Autres &#233;l&#233;ments&lt;/a&gt;&lt;/h4&gt;&lt;div class='blocs_destination blocs_invisible blocs_slide'&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; if (contenu.getElementsByTagName(&#034;url_article&#034;)[0].firstChild.nodeValue!=null){ url_article=contenu.getElementsByTagName(&#034;url_article&#034;)[0].firstChild.nodeValue; }else{ erreur=1; } if (contenu.getElementsByTagName(&#034;titre&#034;)[0].firstChild!=null){ if (contenu.getElementsByTagName(&#034;titre&#034;)[0].firstChild.nodeValue!=null){ titre_diapo=contenu.getElementsByTagName(&#034;titre&#034;)[0].firstChild.nodeValue; }else{ erreur=1; } }else{ titre_diapo=&#034;&#034;; } //alert(&#034;titre=&#034;+contenu.getElementsByTagName(&#034;titre&#034;)[0].textContent); // y'a aussi data, wholeText...nodeValue... if (contenu.getElementsByTagName(&#034;texte&#034;)[0].firstChild!=null){ if (contenu.getElementsByTagName(&#034;texte&#034;)[0].firstChild.nodeValue!=null){ texte_diapo=contenu.getElementsByTagName(&#034;texte&#034;)[0].firstChild.nodeValue; if ((texte_diapo==null)||(texte_diapo==&#034;&#034;)){ texte_diapo=&#034;Sans titre&#034;; } }else{ texte_diapo=&#034;&#034;; } }else{ texte_diapo=&#034;&#034;; }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;De m&#234;me, on r&#233;cup&#232;re plusieurs param&#232;tres toujours pr&#233;sents, dont la prochaine image &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;preload&lt;/code&gt; que l'on va commencer &#224; charger comme arri&#232;re plan &#224; taille nulle pour acc&#233;l&#233;rer son chargement lorsque ce sera son tour.&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; prochain=contenu.getElementsByTagName(&#034;prochain&#034;)[0].firstChild.nodeValue; // delai=contenu.getElementsByTagName(&#034;delai&#034;)[0].firstChild.nodeValue; preload=contenu.getElementsByTagName(&#034;preload&#034;)[0].firstChild.nodeValue; //alert(&#034;texte=&#034;+contenu.getElementsByTagName(&#034;texte_diapo&#034;)[0].firstChild.nodeValue);&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Pour comprendre &#224; quoi correspondent ces &#233;l&#233;ments, voir l'onglet d&#233;taillant le script PHP.&lt;/p&gt;
&lt;p&gt;Et si tout va bien (variable &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;erreur&lt;/code&gt; toujours &#224; z&#233;ro)&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;	if (erreur==0){	&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On essaie de r&#233;cup&#233;rer le bloc &#034;image&#034; du diaporama afin de pouvoir y int&#233;grer l'image indiqu&#233;e dans le document XML.&lt;br class='autobr' /&gt;
Dans la m&#234;me structure conditionnelle, l'on s'assure qu'il y a bien une image &#224; y int&#233;grer (l'url de l'image fournie dans la r&#233;ponse XML est non nulle).&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; if ((this.document.getElementById('diapo_image')!=null)&amp;&amp;(url_image!=&#034;&#034;)){ //alert (&#034;on a le div image&#034;);&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Si le bloc image existe, on le r&#233;f&#233;rence afin de pouvoir le modifier, en utilisant la fonction &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;getElementById&lt;/code&gt; qui renvoie un &#233;l&#233;ment unique, puis on y int&#232;gre un lien vers l'article sous la forme d'une image qui est son logo avec la valeur &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;innerHTML&lt;/code&gt; de l'&#233;l&#233;ment, qui correspond au code HTML que l'&#233;l&#233;ment contient.&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; var div_image=this.document.getElementById('diapo_image'); // le div div_image.innerHTML=&#034;&lt;a href=\&#034;&#034;+url_article+&#034;\&#034;&gt;&lt;img src=\&#034;&#034;+url_image+&#034;\&#034; style=\&#034;margin-left:0px;margin-top:0px;\&#034;&gt;&lt;/a&gt;&#034;;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;L'image du diaporama &#233;tant dans son bloc, il est peut &#234;tre utile &#224; pr&#233;sent de la redimensionner afin de l'adapter aux dimensions dudit bloc.&lt;/p&gt;
&lt;p&gt;On r&#233;cup&#232;re donc les dimensions du bloc, par &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;offsetHeight&lt;/code&gt; et &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;offsetWidth&lt;/code&gt;, puis les dimensions r&#233;elles de l'image, par les valeurs &#034;hauteur&#034; et &#034;largeur&#034; fournies dans la r&#233;ponse (voir script PHP).&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; var h_div=this.document.getElementById('diapo_image').offsetHeight; var l_div=this.document.getElementById('diapo_image').offsetWidth; var h_img=parseFloat(contenu.getElementsByTagName(&#034;hauteur&#034;)[0].firstChild.nodeValue); var l_img=parseFloat(contenu.getElementsByTagName(&#034;largeur&#034;)[0].firstChild.nodeValue); //alert(&#034;traitement d'une image de &#034;+h_img+&#034; par &#034;+l_img);&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Selon la diff&#233;rence de dimension entre le bloc et l'image, il faudra la r&#233;duire prioritairement en largeur, en hauteur, ou les deux, et si l'image n'est pas trop grande, on cherchera &#224; la centrer.&lt;/p&gt;
&lt;p&gt;Le reste du script de traitement devrait &#234;tre ais&#233;ment compr&#233;hensible, d'autant que les commentaires permettent de suivre les conditions v&#233;rifi&#233;es et le traitement effectu&#233;.&lt;br class='autobr' /&gt;
Le principe reste toujours le m&#234;me :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; si une dimension de l'image est plus grande que celle du bloc, alors
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; calculer la proportion entre les deux afin de pouvoir r&#233;duire l'image&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt; une fois la bonne proportion de r&#233;duction trouv&#233;e, calculer les marges entre les dimensions du bloc et celles de l'image r&#233;duite, pour centrer l'image.&lt;/li&gt;&lt;/ul&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; if (l_img&gt;l_div){ var reduction=l_img/l_div; // la proportion de r&#233;duction, qui sera la meme en hauteur et largeur // si h_img/reduction&gt;h_div alors if ((h_img/reduction)&gt;h_div){ // image plus large et en r&#233;duite, plus haute que le div // image plus HAUTE que large // r&#233;duction_h = h_img/h_div var reduction_h=h_img/h_div; // appliquer reduction_h en hauteur et largeur var nh=h_img/reduction_h; var nl=l_img/reduction_h; // pour &#234;tre au milieu&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Une fois l'image r&#233;duite, on calcule la marge, puis on applique r&#233;duction et marge de centrage.&lt;br class='autobr' /&gt;
De m&#234;me que pour le bloc diapo, on utilise la fonction &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;getElementById&lt;/code&gt; pour r&#233;f&#233;rencer le bloc, puis, comme pour la r&#233;ponse XML, &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;getElementsByTagName&lt;/code&gt; pour r&#233;cup&#233;rer le tableau des images (balise &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;img ...&gt;&lt;/code&gt; contenues, la premi&#232;re (et seule) &#233;tant &#224; la case 0.&lt;br class='autobr' /&gt;
Puis l'on d&#233;finit les attributs HTML de cette balise &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;img ...&gt;&lt;/code&gt; pour retailler l'image, et lui ajouter un style personnalis&#233; contenant la marge de centrage, ainsi que la prochaine image &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;preload&lt;/code&gt; comme arri&#232;re-plan de taille nulle pour acc&#233;l&#233;rer son chargement lorsque ce sera son tour.&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; var margel=(l_div-nl)/2; // si la marge est &gt; &#224; x px, calculer la diff&#233;rence et r&#233;duire div image pour agrandir div texte image=this.document.getElementById('diapo_image').getElementsByTagName('img')[0]; image.setAttribute(&#034;height&#034;,nh); image.setAttribute(&#034;width&#034;,nl); image.setAttribute(&#034;style&#034;,&#034;margin-left:&#034;+margel+&#034;px; background-image:url(\&#034;&#034;+preload+&#034;\&#034;); background-size: 0px 0px;&#034;);&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class='cs_blocs'&gt;&lt;h4 class='blocs_titre blocs_replie blocs_click'&gt;&lt;a href='#_foo'&gt;Autres cas&lt;/a&gt;&lt;/h4&gt;&lt;div class='blocs_destination blocs_invisible blocs_slide'&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; // sinon }else{ // image plus large mais pas plus haute que le div // image plus LARGE que haute // appliquer r&#233;duction en largeur et hauteur var nh=h_img/reduction; var nl=l_img/reduction; // pour &#234;tre au milieu, il faut que margeh=()h_div-nh/2 var margeh=(h_div-nh)/2; image=this.document.getElementById('diapo_image').getElementsByTagName('img')[0]; image.setAttribute(&#034;height&#034;,nh); image.setAttribute(&#034;width&#034;,nl); image.setAttribute(&#034;style&#034;,&#034;margin-top:&#034;+margeh+&#034;px; background-image:url(\&#034;&#034;+preload+&#034;\&#034;); background-size: 0px 0px;&#034;); //finsi } // fins }else{ // image pas plus large que le div if (h_img&gt;h_div){ // div assez large mais pas assez haut // r&#233;duction_h = h_img/h_div var reduction_h=h_img/h_div; // appliquer reduction_h en hauteur et largeur var nh=h_img/reduction_h; var nl=l_img/reduction_h; // pour &#234;tre au milieu, il faut que margel=()545-nl/2 var margel=(l_div-nl)/2; image=this.document.getElementById('diapo_image').getElementsByTagName('img')[0]; image.setAttribute(&#034;style&#034;,&#034;margin-left:&#034;+margel+&#034;px; background-image:url(\&#034;&#034;+preload+&#034;\&#034;); background-size: 0px 0px;&#034;); image.setAttribute(&#034;height&#034;,nh); image.setAttribute(&#034;width&#034;,nl); }else{ // image pas trop grande // mais cadre peut-&#234;tre trop grand var margeh=(h_div-h_img)/2; var margel=(l_div-l_img)/2; image=this.document.getElementById('diapo_image').getElementsByTagName('img')[0]; image.setAttribute(&#034;style&#034;,&#034;margin-left:&#034;+margel+&#034;px;margin-top:&#034;+margeh+&#034;px; background-image:url(\&#034;&#034;+preload+&#034;\&#034;); background-size: 0px 0px;&#034;); } } }else{ //alert(&#034;div image non trouv&#233;&#034;); }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Puis on fait la m&#234;me chose pour le texte et le titre&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; if (this.document.getElementById('diapo_texte')!=null){ var div_texte=this.document.getElementById('diapo_texte'); // le div //alert (&#034;on a le div texte&#034;); div_texte.innerHTML=&#034;&lt;span class=\&#034;titre_diapo\&#034;&gt;&lt;a href=\&#034;&#034;+url_article+&#034;\&#034;&gt;&#034;+titre_diapo+&#034;&lt;/a&gt;&lt;/span&gt;&lt;p&gt;&lt;span class=\&#034;texte_diapo\&#034;&gt;&#034;+texte_diapo+&#034;&lt;/span&gt;&lt;/p&gt;&#034;; }else{ //alert(&#034;div texte non trouv&#233;&#034;); } }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;...et on demande le prochain &#233;l&#233;ment, si bien s&#251;r cela a du sens.&lt;br class='autobr' /&gt;
Si le diaporama n'a aucun ou qu'un seul &#233;l&#233;ment, il n'est pas utile d'envoyer d'autre requ&#234;te, et le script du serveur indiquera que prochain vaut &#034;-1&#034;, soit une valeur non valide.&lt;/p&gt;
&lt;p&gt;la commande &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;setTimeout(&lt;/code&gt; permet de d&#233;finir un d&#233;lai avant de demander le prochain &#233;l&#233;ment.&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; diapo=prochain; if (prochain!=-1){ //	requete_requete_image_diapo(&#034;charger_diapo.php?id=&#034;+diapo+&#034;&amp;delai=&#034;+delai); setTimeout(&#034;requete_requete_image_diapo('charger_diapo.php?id='+diapo+'&amp;rub='+nrubrique+'&amp;min='+mindepth+'&amp;max='+maxdepth+'&amp;lang='+lang)&#034;,delai); } }
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#034;onglets_contenu&#034;&gt;&lt;h2 class=&#034;cs_onglet&#034;&gt;&lt;a href=&#034;#&#034;&gt;script PHP&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;
&lt;p&gt;Le script PHP &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;charger_diapo.php&lt;/code&gt;, situ&#233; &#224; la racine du serveur web, et appel&#233; comme URL par la fonction &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;charger_diapo&lt;/code&gt; et apr&#232;s chaque traitement de r&#233;ponse, va traiter la requ&#234;te xmlhttp et envoyer une r&#233;ponse au format XML.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;&lt;?php
session_start();&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Dans la mesure o&#249; les scripts PHP de SPIP peuvent utiliser des variables de session pour stocker des param&#232;tres, on se connecte &#224; cette session afin de pouvoir r&#233;cup&#233;rer la langue choisie.&lt;/p&gt;
&lt;p&gt;On cr&#233;&#233; l'ent&#234;te de la r&#233;ponse avant qu'un autre script, de traitement des accents, ne s'en charge.&lt;br class='autobr' /&gt;
le script &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;accents.php&lt;/code&gt; contient plusieurs fonctions, dont une utilis&#233;e pour transformer les caract&#232;res accentu&#233;s contenus dans la base en leur &#233;quivalent en code HTML, permettant un affichage normal quel que soient les encodages de caract&#232;re du serveur et du navigateur.&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;header('content-Type:text/xml,charset=UTF-8');
require &#034;accents.php&#034;;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On se connecte &#224; la base de donn&#233;es.&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;mysql_connect('serveur','utilisateur','mot de passe','MYSQL'); mysql_select_db(&#034;nom de la base&#034;);&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On travaillera sur les tables des rubriques et des articles de SPIP, qui ont g&#233;n&#233;ralement un nom commen&#231;ant par &#034;spip_&#034;.&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;$tablerubriques=&#034;spip_rubriques&#034;;
$tablearticles=&#034;spip_articles&#034;;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;La requ&#234;te xmlhttp envoyant ses param&#232;tres dans l'url, par la m&#233;thode GET (voir &lt;a href='https://vader-fr.fr/spip.php?article63' class=&#034;spip_in&#034;&gt;article&lt;/a&gt; sur PHP), on r&#233;cup&#232;re les param&#232;tres par la variable globale &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$_GET&lt;/code&gt;, qui est un tableau associatif (les colonnes sont identifi&#233;es par nom et non par num&#233;ro).&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;if (isset($_GET[&#034;id&#034;])){ $idd=$_GET[&#034;id&#034;];
}else{ $idd=0; /* id du diapo en cours, &#224; diviser par total de diapo et prendre le reste , ex si idd = 5 pour 3 photos existantes, alors charger photo 2 */
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class='cs_blocs'&gt;&lt;h4 class='blocs_titre blocs_replie blocs_click'&gt;&lt;a href='#_foo'&gt;Autres param&#232;tres&lt;/a&gt;&lt;/h4&gt;&lt;div class='blocs_destination blocs_invisible blocs_slide'&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;if (isset($_GET[&#034;delai&#034;])){ $delai=$_GET[&#034;delai&#034;]; //echo &#034;delai de $delai secondes&lt;br&gt;&#034;;
}else{ $delai=0;
} if (isset($_GET[&#034;rub&#034;])){ $id_rubrique_diapo=$_GET[&#034;rub&#034;];
}else{ $id_rubrique_diapo=0; } if (isset($_GET[&#034;min&#034;])){ $min_depth=$_GET[&#034;min&#034;];
}else{ $min_depth=0; } if (isset($_GET[&#034;max&#034;])){ $max_depth=$_GET[&#034;max&#034;];
}else{ $max_depth=1; } if (isset($_GET[&#034;lang&#034;])){ $_SESSION[&#034;lang&#034;]=$_GET[&#034;lang&#034;];
}else{ if (isset($_SESSION[&#034;languser&#034;])){ $_SESSION[&#034;lang&#034;]=$_SESSION[&#034;languser&#034;]; } if (!isset($_SESSION[&#034;lang&#034;])){ $_SESSION[&#034;lang&#034;]=&#034;fr&#034;; }
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Pour la langue, on essaie d'abord de la r&#233;cup&#233;rer par le param&#232;tre fourni lors de la requ&#234;te et le stocker dans la variable de session &#034;lang&#034;, avant de pendre la variable de session &#034;languser&#034; si elle est d&#233;finie, et enfin, si la variable de session &#034;lang&#034; n'est toujours pas d&#233;finie, on prend par d&#233;faut langue fran&#231;aise.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Une fonction de parcourt de rubrique et sous-rubrique est d&#233;finie, ce qui permet de faire du parcours r&#233;cursif, lorsque la fonction s'appelle elle-m&#234;me.&lt;br class='autobr' /&gt;
La fonction renverra tous les identifiants de sous-rubriques dans lesquelles on est susceptible de trouver des &#233;l&#233;ments de diaporama.&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;function parcourt_rubrik($cur_rubrik,$curdepth,$maxdepth,$mindepth) {&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ces deux param&#232;tres ne pouvant &#234;tre pass&#233;s d'un niveau &#224; l'autre de la boucle r&#233;cursive sans rendre la fonction complexe, on les red&#233;finit localement &#224; chaque niveau.&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;	$tablerubriques=&#034;spip_rubriques&#034;; $tablearticles=&#034;spip_articles&#034;;&lt;/code&gt;&lt;/pre&gt;&lt;/div&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;	$curdepth.=$curdepth+1; $rubs=array(); // le tableau qu'on renverra, contenant dans la case 0 sa taille $reksrub=&#034;select id_rubrique from &#034;.$tablerubriques.&#034; where id_parent=$cur_rubrik&#034;; $resrub=mysql_query($reksrub); while ($rowrub=mysql_fetch_array($resrub,MYSQL_ASSOC)){ $ssrub=$rowrub[&#034;id_rubrique&#034;]; if ($curdepth&gt;=$mindepth){ $rubs[]=$ssrub; } if ($curdepth&lt;$maxdepth){ $rubs=array_merge($rubs,parcourt_rubrik($ssrub,$curdepth,$maxdepth,$mindepth)); } } return $rubs;
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On cr&#233;&#233; donc la liste des rubriques en appelant la fonction r&#233;cursive, en partant de la rubrique fournie en param&#232;tre par la requ&#234;te xmlhttp.&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;$liste_rubriques=parcourt_rubrik($id_rubrique_diapo,$min_depth,$max_depth,$min_depth);&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ici, on construit un morceau de la requ&#234;te SQL, &#224; savoir une partie de la clause conditionnelle WHERE, en ajoutant &#224; un code de base des morceaux de code SQL&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;&#231;a tombe bien, j'avais justement besoin d'exemple de ce genre de m&#233;thode (&#8230;)&#034; id=&#034;nh1&#034;&gt;1&lt;/a&gt;]&lt;/span&gt;&lt;br class='autobr' /&gt;
On utilise une boucle while (tant que) pour parcourir un tableau dont la taille est variable, en s'arr&#234;tant lorsque l'index atteint le nombre de case contenues dans le tableau, et en incr&#233;mentant l'index au fur et &#224; mesure.&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;$liste_rubrik=&#034;(id_rubrique=$id_rubrique_diapo&#034;;
$irub=0; while ($irub&lt;count($liste_rubriques)){ $liste_rubrik.=&#034; or id_rubrique=$liste_rubriques[$irub]&#034;; $irub++;
} $liste_rubrik.=&#034;)&#034;;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Une fois que la partie &#034;liste des rubriques parentes&#034; de la requ&#234;te des articles que l'on va s&#233;lectionner est cr&#233;&#233;e, on l'utilise d'abord dans une requ&#234;te pour compter les &#233;l&#233;ments, puis ensuite dans la requ&#234;te de r&#233;cup&#233;ration.&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;/* requete pour conna&#238;tre le nombre total de photos pouvant &#234;tre affich&#233;es */ $rek_compt=&#034;select count(*) as total from &#034;.$tablearticles.&#034; where $liste_rubrik and statut='publie' and lang='&#034;.$_SESSION[&#034;lang&#034;].&#034;'&#034;; // pas de order by pour compter
$res_compt=mysql_query($rek_compt);
$row_total=mysql_fetch_array($res_compt,MYSQL_ASSOC);
$total=$row_total[&#034;total&#034;];&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; clause SELECT :
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; On compte &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;count&lt;/code&gt;&lt;/li&gt;&lt;li&gt; les lignes dans leur globalit&#233; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;count(*)&lt;/code&gt;&lt;/li&gt;&lt;li&gt; dont on stockera le compte dans une colonne nomm&#233;e &#034;total&#034; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;as total&lt;/code&gt;, plus simple pour la r&#233;f&#233;rencer,&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt; clause FROM
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; depuis la table des articles, dont le nom, susceptible de varier, a &#233;t&#233; mis dans la variable &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;tablearticles&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt; clause WHERE
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; pour les articles faisant partie de la liste des rubriques&lt;/li&gt;&lt;li&gt; et &#233;tant publi&#233;s&lt;/li&gt;&lt;li&gt; et dont la langue est celle d&#233;termin&#233;e plus t&#244;t et stock&#233;e dans la variable de session.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&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;if ($total&gt;0){&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Si il y a effectivement plusieurs articles publi&#233;s dans les rubriques cibl&#233;es et ce dans la langue choisie, alors on va r&#233;cup&#233;rer les deux premiers articles selon un tri d&#233;finit plus bas.&lt;br class='autobr' /&gt;
Le script JavaScript, fournissant toujours un param&#232;tre de num&#233;ro de diapo &#224; charger dans la requ&#234;te xmlhttp, on se base sur ce param&#232;tre pour d&#233;marrer la s&#233;lection dans la liste des articles disponibles.&lt;/p&gt;
&lt;p&gt;Quand au prochain &#233;l&#233;ment de diaporama &#224; charger, c'est soit l'article suivant dans la liste - si l'article en cours n'est pas le dernier de la liste - soit le premier, &#224; savoir le num&#233;ro 0 de la liste (tableau des r&#233;ponses).&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;	$debut=$idd; // 0 par defaut $par_page=1; if (($idd+1)&lt;$total){ $prochain=$idd+1; }else{ $prochain=0; }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;La requ&#234;te de s&#233;lection est la m&#234;me que celle de comptage, logique puisque l'on travaille sur les m&#234;mes &#233;l&#233;ments.&lt;br class='autobr' /&gt;
Seules les clauses SELECT - car on ne compte pas cette fois - et la clause de tri ORDER - qui &#233;tait inutile dans une requ&#234;te de comptage - vont changer&lt;br class='autobr' /&gt;
On ajoute aussi une clause LIMIT qui restreint le nombre de lignes de r&#233;sultat que l'on va finalement traiter.&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; clause SELECT : on s&#233;lectionne tous les champs &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;*&lt;/code&gt;&lt;/li&gt;&lt;li&gt; clause ORDER BY par date d&#233;croissante &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;DESC&lt;/code&gt;, et donc par article le plus r&#233;cent.&lt;/li&gt;&lt;li&gt; on limite les lignes de r&#233;sultat &#224; 1, comme vu plus haut &lt;code class='spip_code spip_code_inline' dir='ltr'&gt; $par_page=1;&lt;/code&gt;, et on d&#233;marre &#224; la ligne num&#233;ro &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$debut&lt;/code&gt;, &#224; savoir &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$idd&lt;/code&gt;, le param&#232;tre de num&#233;ro de diapo fourni &#224; l'appel du script par la requ&#234;te xmlhttp.&lt;/li&gt;&lt;/ul&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;	$rek_sel=&#034;select * from &#034;.$tablearticles.&#034; where $liste_rubrik and statut='publie' and lang='&#034;.$_SESSION[&#034;lang&#034;].&#034;' order by 'date' DESC limit $debut,$par_page &#034;; // order by date DESC $res_sel=mysql_query($rek_sel);&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&#201;tant donn&#233; que l'on traite des articles, et que l'image cherch&#233;e est un logo, il est bon de savoir que sous SPIP, les logos ont un nom particulier :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; type de l'&#233;l&#233;ment SPIP &lt;strong&gt;art&lt;/strong&gt;icles, &lt;strong&gt;rub&lt;/strong&gt;riques, &lt;strong&gt;site&lt;/strong&gt;s&lt;/li&gt;&lt;li&gt; &lt;strong&gt;on&lt;/strong&gt;&lt;/li&gt;&lt;li&gt; num&#233;ro dudit &#233;l&#233;ment&lt;/li&gt;&lt;li&gt; les logos &#233;tant stock&#233;s &#224; la racine du dossier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;IMG&lt;/code&gt;, peu importe leur extension (jpg, png, gif...)&lt;/li&gt;&lt;/ul&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;	$imagebase=&#034;IMG/arton&#034;;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Pour chaque ligne de r&#233;sultat renvoy&#233;e (en fait il n'y en a qu'une)&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;	while ($row_sel=mysql_fetch_array($res_sel,MYSQL_ASSOC)){&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On r&#233;cup&#232;re la valeur de chaque champ dont on a besoin.&lt;br class='autobr' /&gt;
Les champs de type texte (titre et texte) passent par plusieurs filtres pour traiter des caract&#232;res sp&#233;ciaux qui risqueraient de faire planter le document XML r&#233;ponse.&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; $id=$row_sel[&#034;id_article&#034;]; $titre=htmlentities($row_sel[&#034;titre&#034;]); $titre=remet_accents($titre); $titre=str_replace(&#034;'&#034;,&#034;'&#034;,$titre); $titre=str_replace('&#034;','&#034;',$titre); $titre=str_replace(&#034;&#176;&#034;,&#034;&amp;deg;&#034;,$titre); $texte=htmlentities($row_sel[&#034;texte&#034;]); $texte=remet_accents($texte); $texte=str_replace(&#034;'&#034;,&#034;'&#034;,$texte); $texte=str_replace('&#034;','&#034;',$texte); $texte=str_replace(&#034;&#176;&#034;,&#034;&amp;deg;&#034;,$texte); $texte=nl2br($texte); $urlarticle=&#034;spip.php?article$id&#034;;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Pour l'image, on recherche si le fichier &lt;i&gt;artonXX&lt;/i&gt; existe pour plusieurs extensions possibles.&lt;br class='autobr' /&gt;
Si un fichier portant ce nom existe, alors on a trouv&#233;.&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; // image = IMG/arton[+id article].jpg ou autre // =========== existence du fichier jpg, png ou gif ============== $extensions=array(&#034;jpg&#034;,&#034;jpeg&#034;,&#034;JPG&#034;,&#034;png&#034;,&#034;PNG&#034;,&#034;gif&#034;,&#034;GIF&#034;); $i=0; $trouve=false; $image=&#034;&#034;; while (($i&lt;sizeof($extensions))&amp;&amp;($trouve==false)){ $image_test=$imagebase.$id.&#034;.&#034;.$extensions[$i]; //echo &#034;on teste $image_test&lt;br&gt;&#034;; if (file_exists($image_test)){ //echo &#034;$image_test existe&lt;br&gt;&#034;; $image=$image_test; $trouve=true; }else{ //echo &#034;$image_test n'existe pas&lt;br&gt;&#034;; } $i++; } // image par d&#233;faut if (!$trouve){ $image=&#034;interrogation.png&#034;; }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Si aucun fichier image de logo correspondant &#224; l'article n'est trouv&#233;, on prend une image par d&#233;faut.&lt;br class='autobr' /&gt;
Puis on r&#233;cup&#232;re les dimensions de l'image contenue dans le fichier avec une fonction PHP.&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; $infos_image = @getImageSize($image); // info sur la dimension de l'image // '@' est plac&#233; devant la fonction getImageSize() pour empecher l'affichage des erreurs si l'image est absente. //dimension $largeur = $infos_image[0]; // largeur de l'image $hauteur = $infos_image[1]; // hauteur de l'image&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ces informations de taille seront envoy&#233;es dans la r&#233;ponse et utilis&#233;es par le script pour redimensionner l'image si besoin est.&lt;/p&gt;
&lt;p&gt;Et on oublie pas de fermer la boucle de traitement de la ligne de r&#233;sultat des articles correspondants &#224; ce que l'on cherche.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt; }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Puis on s&#233;lectionne l'image suivante afin de pouvoir commencer &#224; la charger plus t&#244;t, de sorte qu'au tour d'apr&#232;s, l'image de la diaporama suivante se chargera plus vite.&lt;br class='autobr' /&gt;
La requ&#234;te est la m&#234;me que la pr&#233;c&#233;dente, mais on ne prendra pas la m&#234;me ligne de r&#233;sultat.&lt;br class='autobr' /&gt;
Le traitement pour trouver le fichier image sera le m&#234;me.&lt;/p&gt;
&lt;div class='cs_blocs'&gt;&lt;h4 class='blocs_titre blocs_replie blocs_click'&gt;&lt;a href='#_foo'&gt;Image suivante&lt;/a&gt;&lt;/h4&gt;&lt;div class='blocs_destination blocs_invisible blocs_slide'&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;	$rek_presel=&#034;select * from &#034;.$tablearticles.&#034; where $liste_rubrik and statut='publie' and lang='&#034;.$_SESSION[&#034;lang&#034;].&#034;' order by 'date' DESC limit $prochain,$par_page &#034;; // order by date DESC $res_presel=mysql_query($rek_presel); while ($row_presel=mysql_fetch_array($res_presel,MYSQL_ASSOC)){ $extensions=array(&#034;jpg&#034;,&#034;jpeg&#034;,&#034;JPG&#034;,&#034;png&#034;,&#034;PNG&#034;,&#034;gif&#034;,&#034;GIF&#034;); $i=0; $trouve=false; $pre_image=&#034;&#034;; while (($i&lt;sizeof($extensions))&amp;&amp;($trouve==false)){ $image_test=$imagebase.$id.&#034;.&#034;.$extensions[$i]; //echo &#034;on teste $image_test&lt;br&gt;&#034;; if (file_exists($image_test)){ //echo &#034;$image_test existe&lt;br&gt;&#034;; $pre_image=$image_test; $trouve=true; }else{ //echo &#034;$image_test n'existe pas&lt;br&gt;&#034;; } $i++; } // image par d&#233;faut if (!$trouve){ $pre_image=&#034;interrogation.png&#034;; } } //echo &#034;image trouvee : $image&lt;br&gt;&#034;;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Si en revanche il n'y a aucun article correspondant &#224; ce que l'on cherche&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;}else{ $image=&#034;interrogation.png&#034;; $texte=&#034;\&#034;\&#034;&#034;; $largeur=0; $hauteur=0; $delai=0; $pre_image=&#034;\&#034;\&#034;&#034;; $urlarticle=&#034;#&#034;; // page actuelle $prochain=-1; $titre=&#034;Aucune image disponible.&#034;; // changer le texte selon la langue if ($_SESSION[&#034;lang&#034;]==&#034;fr&#034;){ $titre=&#034;Aucune image disponible.&#034;; // changer le texte selon la langue } if ($_SESSION[&#034;lang&#034;]==&#034;en&#034;){ $titre=&#034;No article available for this language : english.&#034;; // changer le texte selon la langue } if ($_SESSION[&#034;lang&#034;]==&#034;de&#034;){ } $texte=$titre; // $texte=htmlentities($texte); // $texte=remet_accents($texte);
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Puis il est temps de cr&#233;er le document XML qui servira de r&#233;ponse.&lt;br class='autobr' /&gt;
Dans Firebug, il est possible de voir, dans l'onglet r&#233;seau, les requ&#234;tes avec leurs param&#232;tres, et les r&#233;ponses associ&#233;es en XML.&lt;/p&gt;
&lt;p&gt;On cr&#233;e un objet de type DOMDocument, puis on y ajoute les &#233;l&#233;ments et sous-&#233;l&#233;ments, en commen&#231;ant par la racine du document.&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;// r&#233;ponse du serveur = contenu de l'XmlHttpResponse
$doc=new DOMDocument(&#034;1.0&#034;,&#034;utf-8&#034;);
$racine=$doc-&gt;createElement('root');
$doc-&gt;appendChild($racine);
$url_image=$doc-&gt;createElement('image',$image);
$racine-&gt;appendChild($url_image);
$lien=$doc-&gt;createElement('url_article',$urlarticle);
$racine-&gt;appendChild($lien);
$titre_diapo=$doc-&gt;createElement('titre',$titre);
$racine-&gt;appendChild($titre_diapo);
$texte_diapo=$doc-&gt;createElement('texte',$texte);
$racine-&gt;appendChild($texte_diapo);
$info=$doc-&gt;createElement('largeur',$largeur);
$racine-&gt;appendChild($info);
$info2=$doc-&gt;createElement('hauteur',$hauteur);
$racine-&gt;appendChild($info2);
$tempo=$doc-&gt;createElement('delai',$delai);
$racine-&gt;appendChild($tempo);
$next=$doc-&gt;createElement('prochain',$prochain);
$racine-&gt;appendChild($next);
$pre=$doc-&gt;createElement('preload',$pre_image);
$racine-&gt;appendChild($pre);
$debug=$doc-&gt;createElement('debug',&#034;$debugmsg&#034;);
$racine-&gt;appendChild($debug);&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Et pour finir, on envoie le document par un simple &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;echo&lt;/code&gt; du texte XML renvoy&#233; par la fonction &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;saveXML&lt;/code&gt; sur l'objet.&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;echo $doc-&gt;saveXML();
?&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&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;csfoo htmla&#034;&gt;&lt;/span&gt;&lt;span class=&#034;spip_note_ref&#034;&gt;[&lt;a href=&#034;#nh1&#034; class=&#034;spip_note&#034; title=&#034;Notes 1&#034; rev=&#034;appendix&#034;&gt;1&lt;/a&gt;] &lt;/span&gt;&lt;span class=&#034;csfoo htmlb&#034;&gt;&lt;/span&gt;&#231;a tombe bien, j'avais justement besoin d'exemple de ce genre de m&#233;thode pour un autre article&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Page de garde et structure g&#233;n&#233;rale</title>
		<link>https://vader-fr.fr/spip.php?article143</link>
		<guid isPermaLink="true">https://vader-fr.fr/spip.php?article143</guid>
		<dc:date>2014-10-18T14:40:37Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Vader[FR]</dc:creator>


		<dc:subject>HTML</dc:subject>
		<dc:subject>D&#233;veloppement web</dc:subject>
		<dc:subject>SPIP</dc:subject>
		<dc:subject>CSS</dc:subject>

		<description>
&lt;p&gt;Page de garde &lt;br class='autobr' /&gt;
La toute premi&#232;re page (http://isabellepalenc.com/) est une simple page avec fond gris&#233; et 3 liens de langue. Pour l'instant, seul la langue fran&#231;aise est disponible car les articles n'ont pas encore &#233;t&#233; traduits. &lt;br class='autobr' /&gt;
Le lien de langue m&#232;ne ensuite &#224; la rubrique biographie (http://isabellepalenc.com/spip.php?rubrique2). &lt;br class='autobr' /&gt;
Sur la page de garde furent affich&#233;s la liste des articles les plus r&#233;cents, puis un diaporama automatique des &#339;uvres situ&#233;es dans la rubrique galerie, puis (&#8230;)&lt;/p&gt;


-
&lt;a href="https://vader-fr.fr/spip.php?rubrique31" rel="directory"&gt;Isabelle Palenc : artiste peintre sculpteur&lt;/a&gt;

/ 
&lt;a href="https://vader-fr.fr/spip.php?mot3" rel="tag"&gt;HTML&lt;/a&gt;, 
&lt;a href="https://vader-fr.fr/spip.php?mot9" rel="tag"&gt;D&#233;veloppement web&lt;/a&gt;, 
&lt;a href="https://vader-fr.fr/spip.php?mot10" rel="tag"&gt;SPIP&lt;/a&gt;, 
&lt;a href="https://vader-fr.fr/spip.php?mot12" rel="tag"&gt;CSS&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;div class=&#034;onglets_bloc_initial&#034;&gt;&lt;div class=&#034;onglets_contenu&#034;&gt;&lt;h2 class=&#034;cs_onglet&#034;&gt;&lt;a href=&#034;#&#034;&gt;Page de garde&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;
&lt;p&gt;La toute premi&#232;re page (&lt;a href=&#034;http://isabellepalenc.com/&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;http://isabellepalenc.com/&lt;/a&gt;) est une simple page avec fond gris&#233; et 3 liens de langue. Pour l'instant, seul la langue fran&#231;aise est disponible car les articles n'ont pas encore &#233;t&#233; traduits.&lt;/p&gt;
&lt;p&gt;Le lien de langue m&#232;ne ensuite &#224; la rubrique biographie (&lt;a href=&#034;http://isabellepalenc.com/spip.php?rubrique2&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;http://isabellepalenc.com/spip.php?rubrique2&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Sur la page de garde furent affich&#233;s la liste des articles les plus r&#233;cents, puis un diaporama automatique des &#339;uvres situ&#233;es dans la rubrique galerie, puis enfin un diaporama automatique sur l'artiste et son atelier, ainsi qu'une citation.&lt;/p&gt;
&lt;p&gt;D&#232;s le d&#233;part - et c'est un point commun &#224; tous mes squelettes SPIP/Zpip - fut con&#231;ue une fausse rubrique &#034;Accueil&#034; en tant que rubrique num&#233;ro 1, et ce pour plusieurs raisons :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; La rubrique est list&#233;e automatiquement dans le menu des rubriques principales du bloc navigation&lt;/li&gt;&lt;li&gt; Le nom de cette rubrique dans la liste peut facilement &#234;tre traduit gr&#226;ce &#224; un bloc multilingue dans SPIP, plus facile &#224; &#233;diter qu'un lien en dur dans le squelette.&lt;/li&gt;&lt;li&gt; Le site &#233;tant multilingue, le tri par titre dans la liste des rubriques aurait provoqu&#233; des incoh&#233;rences selon la langue, c'est pourquoi les rubriques sont list&#233;es par num&#233;ro.
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; La fausse rubrique &#233;tant la num&#233;ro 1, elle appara&#238;t toujours en premier, que son nom soit &#034;Accueil&#034; ou &#034;Home&#034;.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt; Cette fausse rubrique peut en cacher d'autres, comme un diaporama d&#233;di&#233; ou une citation, qui ne seront visibles de nulle part ailleurs sur le site, y compris la page de plan ou la page recherche.
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Cette fonctionnalit&#233; n'&#233;tait pas pr&#233;vue au d&#233;part, mais &#233;tait toujours possible, et &#224; fini par servir.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Au sein d'un plugin Zpip, les fichiers de squelette correspondants &#224; la page de garde sont :&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;rubrique=1.html&lt;/code&gt; &#224; la racine du plugin, qui se contente de d&#233;crire pour cette rubrique la m&#234;me structure que la page sommaire &lt;code class='spip_code spip_code_inline' dir='ltr'&gt; &lt;INCLURE{fond=structure}{env}{type=page}{composition=sommaire} /&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;page-sommaire.html&lt;/code&gt; dans le r&#233;pertoire &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;contenu&lt;/code&gt;, qui d&#233;crit donc le contenu commun des pages sommaire et &#034;Accueil&#034; (rubrique 1).&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;rubrique-1.html&lt;/code&gt; dans le r&#233;pertoire &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;contenu&lt;/code&gt;, qui affichera pour les sous rubriques de la rubrique 1 le m&#234;me contenu (que la page sommaire).&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#034;onglets_contenu&#034;&gt;&lt;h2 class=&#034;cs_onglet&#034;&gt;&lt;a href=&#034;#&#034;&gt;Squelette de la page de garde&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;
&lt;p&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;div class=&#034;contenu-principal galeries&#034;&gt;&lt;/code&gt; le bloc conteneur g&#233;n&#233;ral du contenu.&lt;/p&gt;
&lt;div class='cs_blocs'&gt;&lt;h4 class='blocs_titre blocs_replie blocs_click'&gt;&lt;a href='#_foo'&gt;Style CSS associ&#233;&lt;/a&gt;&lt;/h4&gt;&lt;div class='blocs_destination blocs_invisible blocs_slide'&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;.contenu-principal { padding:5px;
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Pour les &#233;l&#233;ments de classe &#034;contenu-principal&#034; : espace interne de 5 pixels &#224; gauche.&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;div.galeries { position:absolute; top:50px; bottom:0; left:0; right:5px; overflow-y:auto;
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Pour les blocs de classe &#034;galeries&#034; : fix&#233; &#224; 50 pixels du bord haut (du cadre conteneur ou de la fen&#234;tre), &#224; 0 pixels du bas et de la gauche, 5 pixels du bord droite, et ascenseur vertical (axe y) automatique.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; le bloc du diaporama&lt;/li&gt;&lt;/ul&gt;&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;&lt;div id=&#034;diapo&#034; class=&#034;diapo-sommaire&#034;&gt; &lt;input type=&#034;hidden&#034; name=&#034;nrubrique&#034; id=&#034;nrubrique&#034; value=&#034;35&#034;/&gt; &lt;input type=&#034;hidden&#034; name=&#034;mindepth&#034; id=&#034;mindepth&#034; value=&#034;0&#034;/&gt; &lt;input type=&#034;hidden&#034; name=&#034;maxdepth&#034; id=&#034;maxdepth&#034; value=&#034;3&#034;/&gt; &lt;input type=&#034;hidden&#034; name=&#034;lang&#034; id=&#034;lang&#034; value=&#034;#LANG&#034;/&gt; &lt;div id=&#034;diapo_image&#034;&gt; &lt;BOUCLE_contenu_rubrique(ARTICLES){id_rubrique=35} {par date}{inverse}{lang}{pagination 1}&gt; [(#LOGO_ARTICLE)] &lt;/BOUCLE_contenu_rubrique&gt; &lt;/div&gt; &lt;div id=&#034;diapo_texte&#034;&gt; &lt;font color=&#034;red&#034;&gt;&lt;b&gt;JavaScript doit &#234;tre activ&#233; pour que le diaporama puisse d&#233;marrer&lt;/b&gt;&lt;/font&gt; &lt;/div&gt; &lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ce bloc contient un formulaire, qui sera lu par le &lt;a href='https://vader-fr.fr/spip.php?article144' class=&#034;spip_in&#034;&gt;script JavaScript g&#233;n&#233;rique des diaporamas&lt;/a&gt;, afin de pr&#233;parer la requ&#234;te XMLHTTP pour le serveur et demander l'&#233;l&#233;ment de diaporama &#224; afficher.&lt;br class='autobr' /&gt;
Seuls les &#233;l&#233;ments (image, titre, texte descriptif) du diaporama seront demand&#233;s et t&#233;l&#233;charg&#233;s depuis le serveur, sans que la page ne soit recharg&#233;e, afin d'all&#233;ger la charge.&lt;/p&gt;
&lt;p&gt;Ce concept de programmation en web se nomme AJAX.&lt;/p&gt;
&lt;p&gt;Une boucle SPIP permet de charger la premi&#232;re image avant m&#234;me le lancement du diaporama.&lt;/p&gt;
&lt;div class='cs_blocs'&gt;&lt;h4 class='blocs_titre blocs_replie blocs_click'&gt;&lt;a href='#_foo'&gt;Style CSS diaporama&lt;/a&gt;&lt;/h4&gt;&lt;div class='blocs_destination blocs_invisible blocs_slide'&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;#diapo { position:absolute; left:0; top:55px; bottom:120px; right:55px; background-color:#999999;
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Pour le bloc &#034;diapo&#034; : fix&#233; &#224; gauche, en haut, en bas et &#224; droite. 120 pixels du bas afin de prendre en compte la hauteur - fixe - du bloc citation situ&#233; dessous.&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;#diapo_image, #bio_texte, #peintures_image { position:absolute; left:25px; top:25px; bottom:25px;
}
#diapo_image, #peintures_image { right:500px;
}
#diapo_texte, #peintures_contenu { width:475px;
}
#diapo_image img, #bio_image img, #peintures_image img { max-height:100%; max-width:100%;
} #diapo_texte, #bio_image, #peintures_contenu { position:absolute; bottom:0; top:25px; right:5px; padding-right:5px;
} #diapo_texte, #bio_texte, #peintures_contenu { overflow-y:auto;
} #diapo.diapo-sommaire #diapo_texte { visibility:hidden;
} #diapo.diapo-sommaire #diapo_image { right:5px;
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Afin de cacher le bloc de texte du diaporama de la page de garde, et seulement celle l&#224;, le bloc diapo dispose d'une classe, &#034;diapo-sommaire&#034;, qui fait que les blocs &#034;diapo_texte&#034; contenus dans un bloc disposant de la classe pr&#233;cit&#233;e seront cach&#233;s.&lt;/p&gt;
&lt;p&gt;De m&#234;me, les blocs &#034;diapo_image&#034; contenus dans un bloc disposant de la classe pr&#233;cit&#233;e seront &#034;fix&#233;s&#034; &#224; 5px du bord droite, au lieu de 500px.&lt;/p&gt;
&lt;p&gt;Cette classe n'est d&#233;finie que dans le squelette de la page sommaire.&lt;br class='autobr' /&gt;
Cela permet d'avoir un seul &#034;squelette&#034; de diaporama, et donc un seul script AJAX, g&#233;n&#233;rique.&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;.titre_diapo { font-size:1.2em; font-weight:bold;
} .titre_diapo, .titre_diapo a, .titre_article { color:#666666;
} .titre_diapo a { text-decoration: none;
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; le bloc citation&lt;/li&gt;&lt;/ul&gt;&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;	&lt;div id=&#034;citation&#034;&gt; &lt;B_citation&gt; &lt;BOUCLE_citation(ARTICLES){id_rubrique=36} {par hasard}{lang} {pagination 1}&gt; [(#TEXTE)] &lt;/BOUCLE_citation&gt; &lt;/B_citation&gt; &lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ici, c'est une simple boucle SPIP qui va chercher un et un seul (&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{pagination 1}&lt;/code&gt;) article (on travaille sur la table des &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;(ARTICLES)&lt;/code&gt;) au hasard (&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{par hasard}&lt;/code&gt;) dans la rubrique 36 (&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{id_rubrique=36}&lt;/code&gt;), rubrique d&#233;di&#233;e qui contient les citations et est cach&#233;e dans la rubrique &#034;Accueil&#034;.&lt;br class='autobr' /&gt;
Le filtre de langue &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{lang}&lt;/code&gt; permet de ne choisir que parmi les articles dans la langue souhait&#233;e, selon le param&#232;tre transmis &#224; SPIP (lien de langue).&lt;br class='autobr' /&gt;
On affiche ensuite le texte de la citation par la balise &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;[(#TEXTE)]&lt;/code&gt;.&lt;/p&gt;
&lt;div class='cs_blocs'&gt;&lt;h4 class='blocs_titre blocs_replie blocs_click'&gt;&lt;a href='#_foo'&gt;Style CSS citation&lt;/a&gt;&lt;/h4&gt;&lt;div class='blocs_destination blocs_invisible blocs_slide'&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;#citation { position:absolute; left:0; bottom:55px; right:55px; background-color:#999999; height:50px; text-align:center;
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Pour le bloc &#034;citation&#034; : fix&#233; &#224; gauche, en bas et &#224; droite, hauteur fixe de 50 pixels.&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;#citation p { font-size: 1.2em; margin: 0;
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;/div&gt;&lt;/code&gt; Puis la fin du bloc conteneur g&#233;n&#233;ral&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class=&#034;onglets_contenu&#034;&gt;&lt;h2 class=&#034;cs_onglet&#034;&gt;&lt;a href=&#034;#&#034;&gt;Structure g&#233;n&#233;rale du site&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;
&lt;p&gt;L'&#233;l&#233;ment body est surcharg&#233; par un bloc &#034;page&#034; positionn&#233; de mani&#232;re absolue et fix&#233; aux bords de la fen&#234;tre.&lt;br class='autobr' /&gt;
Les diff&#233;rents &#233;l&#233;ments du corps de page sont ensuite dispos&#233; dans des blocs d&#233;di&#233;s : ent&#234;te, pied de page, navigation et contenu.&lt;br class='autobr' /&gt;
Les 4 blocs sont positionn&#233;s de mani&#232;re absolue &#224; l'int&#233;rieur du bloc &#034;page&#034;, fix&#233;s aux bords dudit bloc, afin que le bloc &#034;contenu&#034; puisse s'&#233;tendre selon la taille de l'&#233;cran, sans que les autres blocs ne se d&#233;forment (voir &lt;a href='https://vader-fr.fr/spip.php?article30' class=&#034;spip_in&#034;&gt;ici&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Le bloc ent&#234;te contient lui-m&#234;me 2 sous-blocs :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; le bloc unique d'identifiant &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#drapos&lt;/code&gt;, contenant la liste des liens de langue selon les langues utilis&#233;es dans les articles publi&#233;s du site SPIP. Il est situ&#233; de mani&#232;re absolue dans son cadre (entete), fix&#233; &#224; 20% du bord gauche et 20 pixels du haut. Il peut ainsi s'&#233;tendre selon les besoins.&lt;/li&gt;&lt;li&gt; le bloc de classe &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;.accueil&lt;/code&gt;, qui est de fait &#233;galement unique. Il est lui aussi fix&#233; de mani&#232;re absolue dans son cadre (entete), &#224; 150 pixels du bord droite et 20 pixels du haut. Il contient le logo, qui est de largeur fixe.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Cela permet si besoin est de mettre un bloc d'arri&#232;re plan et un bloc filtre sans toucher au contenu, comme c'est le cas pour certains de mes th&#232;mes ZenGarden (&lt;a href='https://vader-fr.fr/spip.php?article132' class=&#034;spip_in&#034;&gt;exemple&lt;/a&gt;).&lt;br class='autobr' /&gt;
L'arri&#232;re plan &#233;tant monochrome, et le bloc contenu disposant g&#233;n&#233;ralement d'un arri&#232;re plan propre, il n'a pas &#233;t&#233; n&#233;cessaire d'utiliser un bloc d&#233;di&#233; &#224; l'arri&#232;re plan et un bloc filtre.&lt;/p&gt;
&lt;dl class='spip_document_279 spip_documents spip_documents_center'&gt;
&lt;dt&gt;&lt;img src='https://vader-fr.fr/local/cache-vignettes/L500xH274/isa_firebug01-d13c3.jpg?1771624584' width='500' height='274' alt='' /&gt;&lt;/dt&gt;
&lt;dt class='spip_doc_titre' style='width:350px;'&gt;&lt;strong&gt;Structure g&#233;n&#233;ral site Isabelle palenc&lt;/strong&gt;&lt;/dt&gt;
&lt;dd class='spip_doc_descriptif' style='width:350px;'&gt;Aper&#231;u par Firebug (module pour Mozilla Firefox)
&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>



</channel>

</rss>
