<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>{ rawsrc::code() }</title>
	<atom:link href="https://blog.developpez.com/rawsrc/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/rawsrc</link>
	<description></description>
	<lastBuildDate>Fri, 07 Sep 2012 20:16:17 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.42</generator>
	<item>
		<title>Minifier (compresser) du code PHP 5.3+</title>
		<link>https://blog.developpez.com/rawsrc/p10324/php-5-3/outils/minifier_compresser_du_code_php</link>
		<comments>https://blog.developpez.com/rawsrc/p10324/php-5-3/outils/minifier_compresser_du_code_php#comments</comments>
		<pubDate>Thu, 19 Jan 2012 13:46:07 +0000</pubDate>
		<dc:creator><![CDATA[rawsrc]]></dc:creator>
				<category><![CDATA[outils]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Bonjour, J&#8217;ai eu à développer un outil qui se charge de minifier le code source d&#8217;un ou plusieurs fichiers. Je vous propose une source PHP qui se charge de ce travail. CODE SOURCE DE LA CLASSE 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195class PhpMinifier { &#160; &#160;/** &#160; &#160; * List of tokens that can be written without sourrounding spaces &#160; &#160; * @var array array([] =&#38;gt; token) &#160; &#160; */ &#160; &#160;static private $noSpaces = array( &#160; &#160; &#160; T_AND_EQUAL, [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Bonjour,</p>
<p>J&rsquo;ai eu à développer un outil qui se charge de minifier le code source d&rsquo;un ou plusieurs fichiers.<br />
Je vous propose une source PHP qui se charge de ce travail.<br />
<span id="more-2"></span></p>
<p><strong>CODE SOURCE DE LA CLASSE</strong></p>
<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br />72<br />73<br />74<br />75<br />76<br />77<br />78<br />79<br />80<br />81<br />82<br />83<br />84<br />85<br />86<br />87<br />88<br />89<br />90<br />91<br />92<br />93<br />94<br />95<br />96<br />97<br />98<br />99<br />100<br />101<br />102<br />103<br />104<br />105<br />106<br />107<br />108<br />109<br />110<br />111<br />112<br />113<br />114<br />115<br />116<br />117<br />118<br />119<br />120<br />121<br />122<br />123<br />124<br />125<br />126<br />127<br />128<br />129<br />130<br />131<br />132<br />133<br />134<br />135<br />136<br />137<br />138<br />139<br />140<br />141<br />142<br />143<br />144<br />145<br />146<br />147<br />148<br />149<br />150<br />151<br />152<br />153<br />154<br />155<br />156<br />157<br />158<br />159<br />160<br />161<br />162<br />163<br />164<br />165<br />166<br />167<br />168<br />169<br />170<br />171<br />172<br />173<br />174<br />175<br />176<br />177<br />178<br />179<br />180<br />181<br />182<br />183<br />184<br />185<br />186<br />187<br />188<br />189<br />190<br />191<br />192<br />193<br />194<br />195<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">class PhpMinifier <br />
{<br />
&nbsp; &nbsp;/**<br />
&nbsp; &nbsp; * List of tokens that can be written without sourrounding spaces<br />
&nbsp; &nbsp; * @var array array([] =&amp;gt; token)<br />
&nbsp; &nbsp; */ <br />
&nbsp; &nbsp;static private $noSpaces = array( <br />
&nbsp; &nbsp; &nbsp; T_AND_EQUAL, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// &amp;amp;= <br />
&nbsp; &nbsp; &nbsp; T_ARRAY_CAST, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // (array) <br />
&nbsp; &nbsp; &nbsp; T_BOOLEAN_AND, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// &amp;amp;&amp;amp; <br />
&nbsp; &nbsp; &nbsp; T_BOOLEAN_OR, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // || <br />
&nbsp; &nbsp; &nbsp; T_BOOL_CAST, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// (bool), (boolean) <br />
&nbsp; &nbsp; &nbsp; T_CASE, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // case <br />
&nbsp; &nbsp; &nbsp; T_CLOSE_TAG, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/* ?&amp;gt; */ <br />
&nbsp; &nbsp; &nbsp; T_CONCAT_EQUAL, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // .= <br />
&nbsp; &nbsp; &nbsp; T_CONSTANT_ENCAPSED_STRING, // 'string' <br />
&nbsp; &nbsp; &nbsp; T_DEC, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// -- (one exception, see below) <br />
&nbsp; &nbsp; &nbsp; T_DIV_EQUAL, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// /= <br />
&nbsp; &nbsp; &nbsp; T_DNUMBER, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// float number <br />
&nbsp; &nbsp; &nbsp; T_DOLLAR_OPEN_CURLY_BRACES, // ${ <br />
&nbsp; &nbsp; &nbsp; T_DOUBLE_ARROW, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // =&amp;gt; <br />
&nbsp; &nbsp; &nbsp; T_DOUBLE_CAST, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// (real), (double), (float) <br />
&nbsp; &nbsp; &nbsp; T_DOUBLE_COLON, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // :: <br />
&nbsp; &nbsp; &nbsp; T_INC, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// ++ (one exception, see below) <br />
&nbsp; &nbsp; &nbsp; T_INCLUDE, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// include <br />
&nbsp; &nbsp; &nbsp; T_INCLUDE_ONCE, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // include_once <br />
&nbsp; &nbsp; &nbsp; T_INT_CAST, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // (int), (integer) <br />
&nbsp; &nbsp; &nbsp; T_IS_EQUAL, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // == <br />
&nbsp; &nbsp; &nbsp; T_IS_GREATER_OR_EQUAL, &nbsp; &nbsp; &nbsp;// &amp;gt;= <br />
&nbsp; &nbsp; &nbsp; T_IS_IDENTICAL, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // === <br />
&nbsp; &nbsp; &nbsp; T_IS_NOT_EQUAL, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // != or &nbsp;<br />
&nbsp; &nbsp; &nbsp; T_IS_NOT_IDENTICAL, &nbsp; &nbsp; &nbsp; &nbsp; // !== <br />
&nbsp; &nbsp; &nbsp; T_IS_SMALLER_OR_EQUAL, &nbsp; &nbsp; &nbsp;// &nbsp;<br />
&nbsp; &nbsp; &nbsp; T_OPEN_TAG_WITH_ECHO, &nbsp; &nbsp; &nbsp; // &amp;lt;?= ou &amp;lt;%= <br />
&nbsp; &nbsp; &nbsp; T_OR_EQUAL, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // |= <br />
&nbsp; &nbsp; &nbsp; T_PAAMAYIM_NEKUDOTAYIM, &nbsp; &nbsp; // :: <br />
&nbsp; &nbsp; &nbsp; T_PLUS_EQUAL, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // += <br />
&nbsp; &nbsp; &nbsp; T_REQUIRE, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// require <br />
&nbsp; &nbsp; &nbsp; T_REQUIRE_ONCE, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // require_once <br />
&nbsp; &nbsp; &nbsp; T_SL, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // &amp;lt;&amp;lt; <br />
&nbsp; &nbsp; &nbsp; T_SL_EQUAL, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // &amp;lt;&amp;gt; <br />
&nbsp; &nbsp; &nbsp; T_SR_EQUAL, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // &amp;gt;&amp;gt;= <br />
&nbsp; &nbsp; &nbsp; T_STRING_CAST, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// (string) <br />
&nbsp; &nbsp; &nbsp; T_UNSET_CAST, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // (unset) <br />
&nbsp; &nbsp; &nbsp; T_XOR_EQUAL &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // ^= <br />
&nbsp; &nbsp;); <br />
&nbsp;<br />
&nbsp; &nbsp;/** <br />
&nbsp; &nbsp; * Minify PHP source code of files in the $paths argument <br />
&nbsp; &nbsp; * and store the minified code in the $outputFile argument <br />
&nbsp; &nbsp; * @param array $paths Array([] =&amp;gt; path) <br />
&nbsp; &nbsp; * @param string $outputFile <br />
&nbsp; &nbsp; */ <br />
&nbsp; &nbsp;static function minify(array $paths, $outputFile) { <br />
&nbsp; &nbsp; &nbsp; $openTag = FALSE; <br />
&nbsp; &nbsp; &nbsp; $code = ''; <br />
&nbsp; &nbsp; &nbsp; foreach($paths as $path) { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (is_file($path)) { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $min = self::compress($path, TRUE); <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (strlen($min['code'])) { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if ($openTag) { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if ( ! $min['openTag']) { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$code .= '?&amp;gt;'; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$openTag = FALSE; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if ($min['openTag']) { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$code .= ''; <br />
&nbsp; &nbsp; &nbsp; } <br />
&nbsp; &nbsp; &nbsp; file_put_contents($outputFile, $code); <br />
&nbsp; &nbsp;} <br />
&nbsp;<br />
&nbsp; &nbsp;/** <br />
&nbsp; &nbsp; * @param string $path <br />
&nbsp; &nbsp; * @param bool $removeOpenCloseTags <br />
&nbsp; &nbsp; * @return array Array(openTag =&amp;gt; bool, code =&amp;gt; string) <br />
&nbsp; &nbsp; */ <br />
&nbsp; &nbsp;static private function compress($path, $removeOpenCloseTags = TRUE) { <br />
&nbsp; &nbsp; &nbsp; $src = php_strip_whitespace($path); <br />
&nbsp;<br />
&nbsp; &nbsp; &nbsp; $code = ''; <br />
&nbsp; &nbsp; &nbsp; $openFound = FALSE; <br />
&nbsp;<br />
&nbsp; &nbsp; &nbsp; if(empty($src)) { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return array('openTag' =&amp;gt; $openFound, 'code' =&amp;gt; $code); <br />
&nbsp; &nbsp; &nbsp; } <br />
&nbsp;<br />
&nbsp; &nbsp; &nbsp; $tokens = token_get_all($src); <br />
&nbsp; &nbsp; &nbsp; $nb &nbsp; &nbsp; = count($tokens); <br />
&nbsp;<br />
&nbsp; &nbsp; &nbsp; $nextToken &nbsp; &nbsp;= NULL; <br />
&nbsp; &nbsp; &nbsp; $prevToken &nbsp; &nbsp;= NULL; <br />
&nbsp; &nbsp; &nbsp; $prevIsSymbol = FALSE; <br />
&nbsp; &nbsp; &nbsp; $prevSymbol &nbsp; = NULL; <br />
&nbsp;<br />
&nbsp; &nbsp; &nbsp; for($i = 0; $i &amp;lt; $nb; ++$i) { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$token = $tokens[$i]; <br />
&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// symbols <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if ( ! is_array($token)) { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $code &nbsp; &nbsp; &nbsp; &nbsp; .= $token; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $prevIsSymbol &nbsp;= TRUE; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $prevSymbol &nbsp; &nbsp;= $token; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; continue; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} <br />
&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// use of named variables instead of array $token <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;list($index, $value) = $token; <br />
&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if ($removeOpenCloseTags) { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // ignore open token at the begining <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (($i === 0) &amp;amp;&amp;amp; ($index === T_OPEN_TAG)) { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$openFound = TRUE; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;continue; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // ignore close token at the end <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (($i === $nb-1) &amp;amp;&amp;amp; ($index === T_CLOSE_TAG)) { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;continue; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} <br />
&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// HEREDOC/NOWDOC syntax: go to the end of the block without compression because of some special render <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if ($index === T_START_HEREDOC) { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $code .= $value; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; while(++$i &amp;lt; $nb) { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (is_array($tokens[$i])) { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $code .= $tokens[$i][1]; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if ($tokens[$i][0] === T_END_HEREDOC) { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$code .= &amp;quot;;&amp;quot;; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;++$i; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;break; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $code .= $tokens[$i]; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// SPACE between two keywords <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if ($index === T_WHITESPACE) { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if ($i === 1) { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;continue; // sometimes space at the begining <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } <br />
&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if ($i) { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$prevToken = $tokens[$i-1]; // used below <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } <br />
&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if ($i &nbsp;minified: $a+++$b -&amp;gt; error: must keep space: $a+ ++$b <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// case: $a - --$b =&amp;gt; minified: $a---$b -&amp;gt; error: must keep space: $a- --$b <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if ($prevIsSymbol &amp;amp;&amp;amp; is_array($nextToken)) { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (($nextToken[0] === T_INC) &amp;amp;&amp;amp; ($prevSymbol === '+') <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; || ($nextToken[0] === T_DEC) &amp;amp;&amp;amp; ($prevSymbol === '-')) <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$code .= $value; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$prevIsSymbol = FALSE; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$prevSymbol = NULL; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; continue; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// if the nextToken is a symbol or is in the array of &quot;no surrounding spaces&quot; tags <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// -&amp;gt; ignore the current token (T_WHITSPACE) <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (( ! is_array($nextToken)) || (in_array($nextToken[0], self::$noSpaces))) { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; continue; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (is_array($nextToken)) { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // special user case: compression of &quot;else if&quot; to &quot;elseif&quot; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (($nextToken[0] === T_IF) &amp;amp;&amp;amp; is_array($prevToken) &amp;amp;&amp;amp; ($prevToken[0] === T_ELSE)) { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;continue; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } <br />
&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (($nextToken[0] === T_VARIABLE) <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &amp;amp;&amp;amp; (is_array($prevToken) <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &amp;amp;&amp;amp; in_array($prevToken[0], array(T_PUBLIC, T_PROTECTED, T_PRIVATE, T_VAR, T_CASE, T_AS, T_RETURN, T_STATIC, T_ARRAY)))) <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;continue; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $code .= $value; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// if the current token is in the array of &quot;no surrounding spaces&quot; tags <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// -&amp;gt; keep the current token and ignore the next only if it corresponds to T_WHITESPACE <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (in_array($index, self::$noSpaces)) { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $code .= $value; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if ($i &nbsp;$openFound, 'code' =&amp;gt; $code); <br />
&nbsp; &nbsp;} <br />
} <br />
?&amp;gt;</div></td></tr></tbody></table></div>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Dépendances et couplage des classes en POO</title>
		<link>https://blog.developpez.com/rawsrc/p10377/conception/dependances_et_couplage_des_classes_poo</link>
		<comments>https://blog.developpez.com/rawsrc/p10377/conception/dependances_et_couplage_des_classes_poo#comments</comments>
		<pubDate>Fri, 07 Oct 2011 23:00:00 +0000</pubDate>
		<dc:creator><![CDATA[rawsrc]]></dc:creator>
				<category><![CDATA[conception]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Dans le cadre d’une discussion j’ai été amené à faire une digression sur les dépendances entre les classes dans la programmation orientée objet. A des fins d’éclaircissement, je vous propose donc un récapitulatif des quatre manières possibles de coupler deux classes entre-elles. Les interfaces seront abordées ultérieurement. Pour illustrer les propos, nous allons travailler sur un exemple parlant à tous : le corps humain, ses organes et ses accessoires. A noter que le code d’exemple [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Dans le cadre d’une discussion j’ai été amené à faire une digression sur les dépendances entre les classes dans la programmation orientée objet.<br />
A des fins d’éclaircissement, je vous propose donc un récapitulatif des quatre manières possibles de coupler deux classes entre-elles.<br />
Les interfaces seront abordées ultérieurement.<br />
<span id="more-1"></span><br />
Pour illustrer les propos, nous allons travailler sur un exemple parlant à tous : le corps humain, ses organes et ses accessoires.<br />
A noter que le code d’exemple sera en PHP.</p>
<p><strong>1. Aperçu rapide des couplages possibles avec la notation UML correspondante</strong></p>
<p><img src="http://www.proside.fr/dvp/php/tutos/couplage/img/recap.png" alt="Récapitulatif des méthodes de couplage des classes entre-elles" title="Couplages des classes" /><br />
La notation UML n’est qu’à titre de rappel, ce n’est pas le propos de cet article.</p>
<p><strong>2. HERITAGE OU DERIVATION</strong></p>
<p>De tous les liens possibles, c’est le plus fort. Le concept d’héritage s’insère dans une approche très pragmatique de notre environnement à savoir : la généricité et la spécialisation. L’héritage permet dans un sens la factorisation (généricité, abstraction) et dans l&rsquo;autre, la spécialisation (héritage, dérivation) des classes. De ce lien découle une contrainte très forte à laquelle il est essentiel de s’y conformer : les classes dérivées doivent obligatoirement être de même nature que leur classe mère.<br />
<strong>En clair, il doit être toujours possible de considérer que la classe dérivée est une classe mère spécialisée.</strong> </p>
<p>Pour un organisme cela donnerait par exemple ceci :</p>
<p><img src="http://www.proside.fr/dvp/php/tutos/couplage/img/heritage_uml.png" alt="Exemple d'héritage" title="Héritage" /><br />
En conséquence, il est tout à fait possible de dire que la classe Poumon est une instance de la classe Organe. Les classes Rein et Estomac sont également des instances de la classe Organe.</p>
<p>Et voici le code PHP correspondant :</p>
<p><img src="http://www.proside.fr/dvp/php/tutos/couplage/img/heritage_php.png" alt="Code PHP - Héritage" title="PHP Héritage" /></p>
<p><strong>HERITAGE FONCTIONNEL : ATTENTION DANGER</strong><br />
L&rsquo;héritage n&rsquo;est qu&rsquo;une forme de couplage parmi d&rsquo;autres, dès que la contrainte sur la nature des classes mères et dérivées n&rsquo;est plus respectée, il faut absolument changer la manière de coupler les classes entre elles. Dériver les classes n&rsquo;importe comment &#8211; sans justifier d&rsquo;un quelconque lien conceptuel &#8211; dans le but de récupérer les fonctions d&rsquo;une classe est un abus sévère du concept d&rsquo;héritage. Cette méthode s&rsquo;appelle : héritage fonctionnel et est à proscrire.</p>
<p>L&rsquo;erreur la plus courante consiste à dériver la classe d&rsquo;accès aux données afin que le concept ainsi créé puisse accéder aux fonctions d&rsquo;écriture, de lecture&#8230; de la base de données. En plus d&rsquo;être une ineptie &#8211; conceptuellement parlant &#8211;  cela dégrade grandement les performances parce que chaque instanciation de classe va probablement ouvrir une connexion avec la base de données, alors que généralement, une seule connexion suffit amplement.</p>
<p>Dans notre cas cela donnerait ceci :</p>
<p><img src="http://www.proside.fr/dvp/php/tutos/couplage/img/heritage_fonctionnel_uml.png" alt="Exemple d'héritage fonctionnel" title="Héritage fonctionnel" /></p>
<p>Et voici le code PHP correspondant :</p>
<p><img src="http://www.proside.fr/dvp/php/tutos/couplage/img/heritage_fonctionnel_php.png" alt="Code PHP - Héritage fonctionnel" title="PHP Héritage fonctionnel" /></p>
<p><strong>3. COMPOSITION</strong></p>
<p>C&rsquo;est un lien très fort entre les classes.<br />
La composition définit par principe que les classes composites ne peuvent exister en dehors de la classe composée.<br />
Le corollaire est que la destruction de la classe composée implique la destruction des classes composites.<br />
Pour faire plus clair : le corps humain ne peut exister sans ses organes et réciproquement les organes ne peuvent exister en-dehors du corps humain.<br />
Donc, la classe composée contrôle la totalité de la vie de ses composites (de leur naissance à leur mort), son constructeur doit se charger de les instancier et son destructeur de les détruire. L&rsquo;accès aux composites est limité et toujours sous contrôle de la classe composée.</p>
<p>Pour un corps humain cela donnerait par exemple ceci :</p>
<p><img src="http://www.proside.fr/dvp/php/tutos/couplage/img/composition_uml.png" alt="Exemple de composition" title="Composition" /></p>
<p>Et voici le code PHP correspondant :</p>
<p><img src="http://www.proside.fr/dvp/php/tutos/couplage/img/composition_php.png" alt="Code PHP - Composition" title="PHP Composition" /></p>
<p><strong>3. AGREGATION</strong></p>
<p>C&rsquo;est un lien fort entre les classes.<br />
L&rsquo;agrégation définit par principe que les classes agrégées ont une existance indépendante de la classe agrégat.<br />
Généralement cela se traduit au sein de la classe agrégat : par le passage au constructeur des instances des classes à agréger ou par la définition de mutateurs avec des paramètres typés.<br />
Ex : <code class="codecolorer text default"><span class="text">setPoumons(Poumon $poumon) { }</span></code><br />
Pour suivre notre exemple, il faut se placer dans un futur proche dans lequel il serait possible de remplacer ses organes à la carte.<br />
Cela impliquerait que les organes pourraient exister en dehors du corps humain qui ne ferait du coup que les agréger pour assurer son fonctionnement.</p>
<p>Pour un corps humain cela donnerait par exemple ceci :</p>
<p><img src="http://www.proside.fr/dvp/php/tutos/couplage/img/agregation_uml.png" alt="Exemple d'agrégation" title="Agrégation" /></p>
<p>Et voici le code PHP correspondant :</p>
<p><img src="http://www.proside.fr/dvp/php/tutos/couplage/img/agregation_php.png" alt="Code PHP - Agrégation" title="PHP Agrégation" /></p>
<p><strong>4. ASSOCIATION</strong></p>
<p>C&rsquo;est un lien faible entre les classes.<br />
L&rsquo;association se résume à un paramètre typé que l&rsquo;on passe à une fonction d&rsquo;une classe.<br />
La classe qui exécute la fonction se sert du paramètre mais ne garde aucune trace de ce dernier.</p>
<p>Pour un corps humain cela donnerait par exemple ceci :</p>
<p><img src="http://www.proside.fr/dvp/php/tutos/couplage/img/association_uml.png" alt="Exemple d'association" title="Association" /></p>
<p>Et voici le code PHP correspondant :</p>
<p><img src="http://www.proside.fr/dvp/php/tutos/couplage/img/association_php.png" alt="Code PHP - Association" title="PHP Association" /></p>
<p><strong>5. CONCLUSION</strong></p>
<p>Vous avez eu un aperçu des différents couplages possibles en programmation orientée objet. On pourrait encore en écrire beaucoup dessus.<br />
A noter que la tendance actuelle est au découplage et à l&rsquo;injection dynamique des dépendances afin de faciliter la portabilité et la maintenance des application.<br />
Enfin un dernier point, notez que dans tous les cas, l&rsquo;organisation et la décomposition de vos classes reste subjective.<br />
Outre une compréhension exacte de la problématique, c&rsquo;est un mélange de finesse et d&rsquo;expérience.<br />
Dans la plupart des cas, votre architecture sera discutable mais le plus important est de rester clair, concis et apte à justifier ses choix.<br />
Un vrai travail de concepteur.</p>
<p>Attention toutefois, si vous commencez à tout séparer et hiérarchiser dans votre vie (copine, amis, collègues&#8230;), c&rsquo;est qu&rsquo;il est temps d&rsquo;aller consulter&#8230;</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Listes liéee : PHP, mySql, jQuery (ajax)</title>
		<link>https://blog.developpez.com/rawsrc/p10256/php-5-3/tutos/listes_lieee_php_mysql_jquery_ajax</link>
		<comments>https://blog.developpez.com/rawsrc/p10256/php-5-3/tutos/listes_lieee_php_mysql_jquery_ajax#comments</comments>
		<pubDate>Wed, 21 Sep 2011 10:50:00 +0000</pubDate>
		<dc:creator><![CDATA[rawsrc]]></dc:creator>
				<category><![CDATA[tutos]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Bonjour, Faisant suite à ma participation à une discussion concernant la gestion de listes liées en PHP, j&#8217;ai décidé de faire un exemple détaillé afin de faciliter la vie de certains. Je tiens à remericer CinePhil pour la problématique d&#8217;exemple. Environnement technique PHP 5.3+ jQuery 1.6.3 MySql 5.1.53 Community 1. Problématique On gère un planning de sessions d&#8217;examens ayant les règles suivantes : Une session est obligatoirement datée et localisée dans une ville Une session [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Bonjour,</p>
<p>Faisant suite à ma participation à une discussion concernant la gestion de listes liées en PHP, j&rsquo;ai décidé de faire un exemple détaillé afin de faciliter la vie de certains.<br />
Je tiens à remericer <a href="http://www.developpez.net/forums/u111343/cinephil/"><strong>CinePhil</strong></a> pour la problématique d&rsquo;exemple.<br />
<span id="more-3"></span></p>
<p><strong>Environnement technique</strong></p>
<p>PHP 5.3+<br />
jQuery 1.6.3<br />
MySql 5.1.53 Community</p>
<p><strong>1. Problématique</strong></p>
<p>On gère un planning de sessions d&rsquo;examens ayant les règles suivantes :</p>
<ul>
<li>Une session est obligatoirement datée et localisée dans une ville</li>
<li>Une session propose indépendammment une liste de matières</li>
<li>Pour chaque couple session/matiere, on suit un nombre d&rsquo;inscrits</li>
</ul>
<p>On souhaite permettre à un utilisateur d&rsquo;affiner une recherche par des sélections successives de critères dans des listes déroulantes.</p>
<p><strong>2. Concept et fonctionnalités</strong></p>
<p>L&rsquo;idée principale est de mettre à jour le contenu des listes de sélection <strong>non encore sélectionnées</strong> en fonction des critères des listes voisines déjà sélectionnées.<br />
Au démarrage chaque liste contient toutes les données possibles et le filtrage commence dès la première sélection.<br />
Il doit être possible de retirer un critère de filtrage en ne sélectionnant aucune donnée de la liste. Le retrait du critère est matérialisé par une ligne vide au début de chaque liste.<br />
A chaque sélection, les données répondant aux critères doivent être immédiatement affichées.</p>
<p><strong>3. Base de données</strong></p>
<p>On va élaborer une simple base de données mySql correspondant à l&rsquo;ennoncé et la remplir avec quelques données :</p>
<p><img src="http://www.proside.fr/dvp/php/tutos/listesLiees/img/mcd.png" alt="MCD" title="Schéma de la base de données" /></p>
<p><strong>Extrait de données des sessions :</strong></p>
<p><img src="http://www.proside.fr/dvp/php/tutos/listesLiees/img/data.png" alt="DATA" title="Extrait des données" /></p>
<p><a href="http://www.proside.fr/dvp/php/tutos/listesLiees/mysql.sql"><strong>SCRIPT SQL</strong></a></p>
<p><strong>4. Rendu et affichage</strong></p>
<p>Intéressons nous maintenant au code HTML.<br />
Une zone de liste est codée ainsi :</p>
<p><img src="http://www.proside.fr/dvp/php/tutos/listesLiees/img/zdlm.png" alt="select" title="Liste de sélection" /></p>
<p>Notre liste gère l&rsquo;évènement <code class="codecolorer text default"><span class="text">onchange</span></code> ce qui permet de lui rattacher une fonction javascript qui sera appelée à chaque changement de sélection.<br />
Concrètement, nous allons donc remplacer la totalité des <code class="codecolorer text default"><span class="text">&lt;option value=&quot;...&quot;&gt;...&lt;/option&gt;</span></code> des listes voisines par des valeurs filtrées et renvoyées par le serveur après un appel ajax.</p>
<p><strong>4.A Inventaire des zones de liste</strong></p>
<ol>
<li>Jours</li>
<li>Mois</li>
<li>Années</li>
<li>Villes</li>
<li>Matières</li>
</ol>
<p><strong>4.B Tableau des données</strong></p>
<p>On affiche les colonnes suivantes :</p>
<ol>
<li>Villes</li>
<li>Dates</li>
<li>Matières</li>
<li>NB inscrits</li>
</ol>
<p>Les données seront triées par : Ville ASC, Date DESC, Matière ASC<br />
Notre table de données est codée ainsi :</p>
<p><img src="http://www.proside.fr/dvp/php/tutos/listesLiees/img/table.png" alt="select" title="Table de données
" /></p>
<p><strong>5. Format d&rsquo;échange des données</strong></p>
<p>jQuery manipule parfaitement les formats XML et JSON.<br />
Par convention, toutes les données (code des listes et code du tableau des données) seront renvoyées par le serveur au format XML :</p>
<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt; <br />
&lt;xml&gt; <br />
&nbsp; &nbsp; &nbsp; &lt;jours&gt;&lt;/jours&gt; <br />
&nbsp; &nbsp; &nbsp; &lt;mois&gt;&lt;/mois&gt; <br />
&nbsp; &nbsp; &nbsp; &lt;annees&gt;&lt;/annees&gt; <br />
&nbsp; &nbsp; &nbsp; &lt;villes&gt;&lt;/villes&gt; <br />
&nbsp; &nbsp; &nbsp; &lt;matieres&gt;&lt;/matieres&gt; <br />
&nbsp; &nbsp; &nbsp; &lt;table&gt;&lt;/table&gt; <br />
&lt;/xml&gt;</div></td></tr></tbody></table></div>
<p><strong>6. Code de la page de démarrage : appel initial</strong></p>
<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br />72<br />73<br />74<br />75<br />76<br />77<br />78<br />79<br />80<br />81<br />82<br />83<br />84<br />85<br />86<br />87<br />88<br />89<br />90<br />91<br />92<br />93<br />94<br />95<br />96<br />97<br />98<br />99<br />100<br />101<br />102<br />103<br />104<br />105<br />106<br />107<br />108<br />109<br />110<br />111<br />112<br />113<br />114<br />115<br />116<br />117<br />118<br />119<br />120<br />121<br />122<br />123<br />124<br />125<br />126<br />127<br />128<br />129<br />130<br />131<br />132<br />133<br />134<br />135<br />136<br />137<br />138<br />139<br />140<br />141<br />142<br />143<br />144<br />145<br />146<br />147<br />148<br />149<br />150<br />151<br />152<br />153<br />154<br />155<br />156<br />157<br />158<br />159<br />160<br />161<br />162<br />163<br />164<br />165<br />166<br />167<br />168<br />169<br />170<br />171<br />172<br />173<br />174<br />175<br />176<br />177<br />178<br />179<br />180<br />181<br />182<br />183<br />184<br />185<br />186<br />187<br />188<br />189<br />190<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0 Transitional//EN&quot;&gt; <br />
&lt;html&gt; <br />
&lt;head&gt; <br />
&nbsp; &nbsp;&lt;meta http-equiv=&quot;Cache-Control&quot; content=&quot;no-cache&quot;&gt; <br />
&nbsp; &nbsp;&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot;&gt; <br />
&nbsp; &nbsp;&lt;title&gt;Listes liées&lt;/title&gt; <br />
&nbsp; &nbsp;&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;my.css&quot;&gt; <br />
&nbsp; &nbsp;&lt;script type=&quot;application/javascript&quot; charset=&quot;utf-8&quot; src=&quot;http://code.jquery.com/jquery-1.6.3.min.js&quot;&gt;&lt;/script&gt; <br />
&nbsp; &nbsp;&lt;script type=&quot;application/javascript&quot;&gt; <br />
&nbsp; &nbsp; &nbsp; function filterLists() { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// ici on récupère les valeurs sélectionnées pour chaque liste avec les sélecteurs de jQuery <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;var jour &nbsp; &nbsp;= $('#jours option:selected').val(); <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;var mois &nbsp; &nbsp;= $('#mois option:selected').val(); <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;var annee &nbsp; = $('#annees option:selected').val(); <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;var ville &nbsp; = $('#villes option:selected').val(); <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;var matiere = $('#matieres option:selected').val(); <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// on fait notre appel ajax paramétré (pas besoin de s'occuper de l'implémentation du XMLHttpRequest, jQuery le fait pour toi) <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$.ajax({ <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; type: 'POST', &nbsp; // méthode de transmission des données <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; url: 'filterLists.php', &nbsp; // script à exécuter sur le serveur <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; data: 'jour='+jour+'&amp;mois='+mois+'&amp;annee='+annee+'&amp;ville='+ville+'&amp;matiere='+matiere, &nbsp; // données à passer au script via le tableau $_POST <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dataType: 'xml', &nbsp; // type des données attendues en retour : ici xml <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cache: false, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; success: function(response) { &nbsp; // traitement du résultat (= données reçues du serveur) une fois l'appel ajax réussi <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;var code; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// vu que la réponse est au format xml, on demande à jquery de trouver des noeuds spécifiques <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// et si ces noeuds contiennent des données alors on remplace les données des listes liées par celles renvoyées par le serveur <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// en clair : on remplace si nécessaire l'ensemble des lignes &lt;option value=&quot;&quot;&gt;&lt;/option&gt; pour chaque liste qui n'a pas encore de sélection <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if ((code = $(response).find('jours').text()).length) &nbsp; &nbsp;$('#jours').html(code); <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if ((code = $(response).find('mois').text()).length) &nbsp; &nbsp; $('#mois').html(code); <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if ((code = $(response).find('annees').text()).length) &nbsp; $('#annees').html(code); <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if ((code = $(response).find('villes').text()).length) &nbsp; $('#villes').html(code); <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if ((code = $(response).find('matieres').text()).length) $('#matieres').html(code); <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if ((code = $(response).find('table').text()).length) &nbsp; &nbsp;$('#table').html(code); <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}); <br />
&nbsp; &nbsp; &nbsp; } <br />
&nbsp; &nbsp;&lt;/script&gt; <br />
&nbsp; &nbsp;&lt;style type=&quot;text/css&quot;&gt; <br />
&nbsp; &nbsp; &nbsp; body { font-family: &quot;arial&quot;; } <br />
&nbsp; &nbsp; &nbsp; table { width: 600px;;} <br />
&nbsp; &nbsp; &nbsp; table, tr, th, td { border: 1px solid black; border-collapse: collapse; padding: 4px;} <br />
&nbsp; &nbsp; &nbsp; .alignr { text-align: right; } <br />
&nbsp; &nbsp; &nbsp; .alignc { text-align: center; } <br />
&nbsp; &nbsp;&lt;/style&gt; <br />
&lt;/head&gt; <br />
&lt;body&gt; <br />
&nbsp; &nbsp;&lt;?php <br />
&nbsp; &nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; // ICI MODIFIEZ LE PARAMETRAGE <br />
&nbsp; &nbsp; &nbsp; // Connexion à la base de données <br />
&nbsp; &nbsp; &nbsp; $server = 'localhost'; <br />
&nbsp; &nbsp; &nbsp; $user &nbsp; = 'root'; <br />
&nbsp; &nbsp; &nbsp; $pwd &nbsp; &nbsp;= 'root'; <br />
&nbsp; &nbsp; &nbsp; $dbName = 'test'; <br />
&nbsp; &nbsp; &nbsp; $cnx &nbsp; &nbsp;= mysql_connect($server, $user, $pwd); <br />
&nbsp; &nbsp; &nbsp; $db &nbsp; &nbsp; = mysql_select_db($dbName); <br />
&nbsp; &nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; // Au démarrage, aucune sélection : on extrait toutes les données individuellement pour chaque liste <br />
&nbsp; &nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; // JOURS <br />
&nbsp; &nbsp; &nbsp; $sql = 'SELECT DISTINCT DAY(t_session.date_) FROM t_session ORDER BY DAY(t_session.date_);'; <br />
&nbsp; &nbsp; &nbsp; $qry = mysql_query($sql); <br />
&nbsp; &nbsp; &nbsp; while($row = mysql_fetch_row($qry)) { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$jours[] = $row[0]; <br />
&nbsp; &nbsp; &nbsp; } <br />
&nbsp; &nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; // MOIS <br />
&nbsp; &nbsp; &nbsp; $sql = 'SELECT DISTINCT MONTH(t_session.date_) FROM t_session ORDER BY MONTH(t_session.date_);'; <br />
&nbsp; &nbsp; &nbsp; $qry = mysql_query($sql); <br />
&nbsp; &nbsp; &nbsp; while($row = mysql_fetch_row($qry)) { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$mois[] = $row[0]; <br />
&nbsp; &nbsp; &nbsp; } <br />
&nbsp; &nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; // ANNEES <br />
&nbsp; &nbsp; &nbsp; $sql = 'SELECT DISTINCT YEAR(t_session.date_) FROM t_session ORDER BY YEAR(t_session.date_);'; <br />
&nbsp; &nbsp; &nbsp; $qry = mysql_query($sql); <br />
&nbsp; &nbsp; &nbsp; while($row = mysql_fetch_row($qry)) { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$annees[] = $row[0]; <br />
&nbsp; &nbsp; &nbsp; } <br />
&nbsp; &nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; // VILLES <br />
&nbsp; &nbsp; &nbsp; $sql = 'SELECT DISTINCT t_ville.idVille, t_ville.ville FROM t_ville ORDER BY t_ville.ville;'; <br />
&nbsp; &nbsp; &nbsp; $qry = mysql_query($sql); <br />
&nbsp; &nbsp; &nbsp; while($row = mysql_fetch_row($qry)) { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$villes[$row[0]] = $row[1]; <br />
&nbsp; &nbsp; &nbsp; } <br />
&nbsp; &nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; // MATIERES <br />
&nbsp; &nbsp; &nbsp; $sql = 'SELECT DISTINCT t_matiere.idMatiere, t_matiere.matiere FROM t_matiere ORDER BY t_matiere.matiere;'; <br />
&nbsp; &nbsp; &nbsp; $qry = mysql_query($sql); <br />
&nbsp; &nbsp; &nbsp; while($row = mysql_fetch_row($qry)) { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$matieres[$row[0]] = $row[1]; <br />
&nbsp; &nbsp; &nbsp; } <br />
&nbsp; &nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; // DONNES DE LA TABLE <br />
&nbsp; &nbsp; &nbsp; $sql = &lt;&lt;&lt;SQL <br />
SELECT t_ville.ville, t_session.date_, t_matiere.matiere, t_session_matiere.nbInscrit <br />
FROM t_session_matiere &nbsp;<br />
&nbsp; &nbsp;INNER JOIN t_matiere ON t_session_matiere.idMatiere = t_matiere.idMatiere <br />
&nbsp; &nbsp;INNER JOIN t_session ON t_session_matiere.idSession = t_session.idSession <br />
&nbsp; &nbsp;INNER JOIN t_ville &nbsp; ON t_session.idVille &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = t_ville.idVille <br />
ORDER BY <br />
&nbsp; &nbsp;t_ville.ville ASC, &nbsp;<br />
&nbsp; &nbsp;t_session.date_ DESC, &nbsp;<br />
&nbsp; &nbsp;t_matiere.matiere ASC; <br />
SQL; <br />
&nbsp; &nbsp; &nbsp; $qry = mysql_query($sql); <br />
&nbsp; &nbsp; &nbsp; while($row = mysql_fetch_assoc($qry)) { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$data[] = $row; <br />
&nbsp; &nbsp; &nbsp; } <br />
&nbsp; &nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; // pour chaque liste il faut prévoir leur retrait du filtre &nbsp;<br />
&nbsp; &nbsp; &nbsp; // en insérant une ligne vide en début de liste : &lt;option value=&quot;&quot;&gt;&lt;/option&gt; <br />
&nbsp; &nbsp;?&gt; <br />
&nbsp;<br />
&nbsp; &nbsp;&lt;p&gt;&lt;strong&gt;SESSIONS D'EXAMENS&lt;/strong&gt;&lt;/p&gt; <br />
&nbsp; &nbsp;&lt;p&gt;Sélectionnez de un à plusieurs critères de recherche.&lt;/p&gt; <br />
&nbsp; &nbsp;&lt;form id=&quot;frmRecherche&quot;&gt; <br />
&nbsp;<br />
&nbsp; &nbsp; &nbsp; &lt;!-- Liste des jours --&gt; <br />
&nbsp; &nbsp; &nbsp; &lt;label for=&quot;jours&quot;&gt;Jours&lt;/label&gt; <br />
&nbsp; &nbsp; &nbsp; &lt;select id=&quot;jours&quot; onchange=&quot;filterLists();&quot;&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;option value=&quot;&quot;&gt;&lt;/option&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;?php foreach($jours as$jour): ?&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;option value=&quot;&lt;?php echo $jour; ?&gt;&quot;&gt;&lt;?php echo $jour; ?&gt;&lt;/option&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;?php endforeach; ?&gt; <br />
&nbsp; &nbsp; &nbsp; &lt;/select&gt; <br />
&nbsp;<br />
&nbsp; &nbsp; &nbsp; &lt;!-- Liste des mois --&gt; <br />
&nbsp; &nbsp; &nbsp; &lt;label for=&quot;mois&quot;&gt;Mois&lt;/label&gt; <br />
&nbsp; &nbsp; &nbsp; &lt;select id=&quot;mois&quot; onchange=&quot;filterLists();&quot;&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;option value=&quot;&quot;&gt;&lt;/option&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;?php foreach($mois as $unMois): ?&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;option value=&quot;&lt;?php echo $unMois; ?&gt;&quot;&gt;&lt;?php echo $unMois; ?&gt;&lt;/option&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;?php endforeach; ?&gt; <br />
&nbsp; &nbsp; &nbsp; &lt;/select&gt; <br />
&nbsp;<br />
&nbsp; &nbsp; &nbsp; &lt;!-- Liste des années --&gt; <br />
&nbsp; &nbsp; &nbsp; &lt;label for=&quot;annees&quot;&gt;Années&lt;/label&gt; <br />
&nbsp; &nbsp; &nbsp; &lt;select id=&quot;annees&quot; onchange=&quot;filterLists();&quot;&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;option value=&quot;&quot;&gt;&lt;/option&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;?php foreach($annees as $annee): ?&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;option value=&quot;&lt;?php echo $annee; ?&gt;&quot;&gt;&lt;?php echo $annee; ?&gt;&lt;/option&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;?php endforeach; ?&gt; <br />
&nbsp; &nbsp; &nbsp; &lt;/select&gt; <br />
&nbsp;<br />
&nbsp; &nbsp; &nbsp; &lt;!-- Liste des villes --&gt; <br />
&nbsp; &nbsp; &nbsp; &lt;label for=&quot;villes&quot;&gt;Villes&lt;/label&gt; <br />
&nbsp; &nbsp; &nbsp; &lt;select id=&quot;villes&quot; onchange=&quot;filterLists();&quot;&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;option value=&quot;&quot;&gt;&lt;/option&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;?php foreach($villes as $id =&gt; $ville): ?&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;option value=&quot;&lt;?php echo $id; ?&gt;&quot;&gt;&lt;?php echo $ville; ?&gt;&lt;/option&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;?php endforeach; ?&gt; <br />
&nbsp; &nbsp; &nbsp; &lt;/select&gt; <br />
&nbsp;<br />
&nbsp; &nbsp; &nbsp; &lt;!-- Liste des matières --&gt; <br />
&nbsp; &nbsp; &nbsp; &lt;label for=&quot;matieres&quot;&gt;Matières&lt;/label&gt; <br />
&nbsp; &nbsp; &nbsp; &lt;select id=&quot;matieres&quot; onchange=&quot;filterLists();&quot;&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;option value=&quot;&quot;&gt;&lt;/option&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;?php foreach($matieres as $id =&gt; $matiere): ?&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;option value=&quot;&lt;?php echo $id; ?&gt;&quot;&gt;&lt;?php echo $matiere; ?&gt;&lt;/option&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;?php endforeach; ?&gt; <br />
&nbsp; &nbsp; &nbsp; &lt;/select&gt; <br />
&nbsp; &nbsp;&lt;/form&gt; <br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp;&lt;!-- Données de la table --&gt; <br />
&nbsp; &nbsp;&lt;table&gt; <br />
&nbsp; &nbsp; &nbsp; &lt;thead&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;tr&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;th&gt;VILLES&lt;/th&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;th&gt;DATES&lt;/th&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;th&gt;MATIERES&lt;/th&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;th&gt;NB Inscrits&lt;/th&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;/tr&gt; <br />
&nbsp; &nbsp; &nbsp; &lt;/thead&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &lt;tbody id=&quot;table&quot;&gt; <br />
&nbsp; &nbsp; &nbsp; &lt;?php foreach($data as $row): ?&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;tr&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;td&gt;&lt;?php echo $row['ville']; ?&gt;&lt;/td&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;td class=&quot;alignc&quot;&gt;&lt;?php echo $row['date_']; ?&gt;&lt;/td&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;td&gt;&lt;?php echo $row['matiere']; ?&gt;&lt;/td&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;td class=&quot;alignr&quot;&gt;&lt;?php echo $row['nbInscrit']; ?&gt;&lt;/td&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;/tr&gt; <br />
&nbsp; &nbsp; &nbsp; &lt;?php endforeach; ?&gt; <br />
&nbsp; &nbsp; &nbsp; &lt;/tbody&gt; <br />
&nbsp; &nbsp;&lt;/table&gt; <br />
&lt;/body&gt; <br />
&lt;/html&gt;</div></td></tr></tbody></table></div>
<p><strong>7. Code de la page de traitement à chaque séléction d&rsquo;un élément d&rsquo;une liste : filterLists.php</strong></p>
<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br />72<br />73<br />74<br />75<br />76<br />77<br />78<br />79<br />80<br />81<br />82<br />83<br />84<br />85<br />86<br />87<br />88<br />89<br />90<br />91<br />92<br />93<br />94<br />95<br />96<br />97<br />98<br />99<br />100<br />101<br />102<br />103<br />104<br />105<br />106<br />107<br />108<br />109<br />110<br />111<br />112<br />113<br />114<br />115<br />116<br />117<br />118<br />119<br />120<br />121<br />122<br />123<br />124<br />125<br />126<br />127<br />128<br />129<br />130<br />131<br />132<br />133<br />134<br />135<br />136<br />137<br />138<br />139<br />140<br />141<br />142<br />143<br />144<br />145<br />146<br />147<br />148<br />149<br />150<br />151<br />152<br />153<br />154<br />155<br />156<br />157<br />158<br />159<br />160<br />161<br />162<br />163<br />164<br />165<br />166<br />167<br />168<br />169<br />170<br />171<br />172<br />173<br />174<br />175<br />176<br />177<br />178<br />179<br />180<br />181<br />182<br />183<br />184<br />185<br />186<br />187<br />188<br />189<br />190<br />191<br />192<br />193<br />194<br />195<br />196<br />197<br />198<br />199<br />200<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&lt;?php <br />
&nbsp;<br />
// Ce script est appelé à chaque sélection d'un élément d'une liste <br />
&nbsp;<br />
// suivi du critère <br />
$where &nbsp; = array(); <br />
$data &nbsp; &nbsp;= array(); <br />
&nbsp;<br />
// données sélectionnées =&gt; filtres <br />
$jour &nbsp; &nbsp;= NULL; <br />
$mois &nbsp; &nbsp;= NULL; <br />
$annee &nbsp; = NULL; <br />
$ville &nbsp; = NULL; <br />
$matiere = NULL; <br />
&nbsp;<br />
/** <br />
&nbsp;* CE SCRIPT ANALYSE LES SELECTIONS ET RENVOIE DES DONNEES AU FORMAT XML &nbsp;<br />
&nbsp;* La structure correspond à ce que jQuery attend pour mettre à jour la page <br />
&nbsp;* &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt; &nbsp;<br />
&nbsp;* &nbsp; &nbsp;&lt;xml&gt; &nbsp;<br />
&nbsp;* &nbsp; &nbsp;&lt;jours&gt;&lt;/jours&gt; &nbsp;<br />
&nbsp;* &nbsp; &nbsp;&lt;mois&gt;&lt;/mois&gt; &nbsp;<br />
&nbsp;* &nbsp; &nbsp;&lt;annees&gt;&lt;/annees&gt; &nbsp;<br />
&nbsp;* &nbsp; &nbsp;&lt;villes&gt;&lt;/villes&gt; &nbsp;<br />
&nbsp;* &nbsp; &nbsp;&lt;matieres&gt;&lt;/matieres&gt; &nbsp;<br />
&nbsp;* &nbsp; &nbsp;&lt;table&gt;&lt;/table&gt; &nbsp;<br />
&nbsp;* &lt;/xml&gt; &nbsp;<br />
&nbsp;* <br />
&nbsp;* @var SimpleXMLElement <br />
&nbsp;*/ <br />
$xml = simplexml_load_string('&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;&lt;xml&gt;&lt;/xml&gt;'); <br />
&nbsp;<br />
// on parcourt le tableau $_POST et on vérifie quelles sont les listes qui ont une sélection <br />
&nbsp;<br />
// jour <br />
if (isset($_POST['jour']) &amp;&amp; (ctype_digit(&quot;{$_POST['jour']}&quot;))) { <br />
&nbsp; &nbsp;$jour = $_POST['jour']; <br />
&nbsp; &nbsp;$where[] = 'DAY(t_session.date_) = ' . intval($jour); <br />
} <br />
&nbsp;<br />
//mois <br />
if (isset($_POST['mois']) &amp;&amp; (ctype_digit(&quot;{$_POST['mois']}&quot;))) { <br />
&nbsp; &nbsp;$mois = $_POST['mois']; <br />
&nbsp; &nbsp;$where[] = 'MONTH(t_session.date_) = ' . intval($mois); <br />
} <br />
&nbsp;<br />
// année <br />
if (isset($_POST['annee']) &amp;&amp; (ctype_digit(&quot;{$_POST['annee']}&quot;))) { <br />
&nbsp; &nbsp;$annee = $_POST['annee']; <br />
&nbsp; &nbsp;$where[] = 'YEAR(t_session.date_) = ' . intval($annee); <br />
} <br />
&nbsp;<br />
// villes <br />
if (isset($_POST['ville']) &amp;&amp; (ctype_digit(&quot;{$_POST['ville']}&quot;))) { <br />
&nbsp; &nbsp;$ville = $_POST['ville']; <br />
&nbsp; &nbsp;$where[] = 't_session.idVille = ' . intval($ville); <br />
} <br />
&nbsp;<br />
// matière <br />
if (isset($_POST['matiere']) &amp;&amp; (ctype_digit(&quot;{$_POST['matiere']}&quot;))) { <br />
&nbsp; &nbsp;$matiere = $_POST['matiere']; <br />
&nbsp; &nbsp;$where[] = 't_session_matiere.idMatiere = ' . intval($matiere); <br />
} <br />
&nbsp;<br />
### FILTRAGE DES DONNÉES DES LISTES (SSI RIEN N'A DÉJÀ ÉTÉ SÉLECTIONNÉ) &nbsp;<br />
$where = ( ! empty($where)) ? 'WHERE ' . implode(' AND ', $where) : NULL; <br />
&nbsp;<br />
// ICI MODIFIEZ LE PARAMETRAGE <br />
// Connexion à la base de données <br />
$server = 'localhost'; <br />
$user &nbsp; = 'root'; <br />
$pwd &nbsp; &nbsp;= 'root'; <br />
$dbName = 'test'; <br />
$cnx &nbsp; &nbsp;= mysql_connect($server, $user, $pwd); <br />
$db &nbsp; &nbsp; = mysql_select_db($dbName); <br />
&nbsp;<br />
&nbsp;<br />
// on définit le code SQL commun à toutes les requêtes <br />
// voir la chaine SQL d'extraction des données de la table (plus bas) <br />
$fromAndWhere = &lt;&lt;&lt;SQL <br />
t_session_matiere &nbsp;<br />
&nbsp; &nbsp;INNER JOIN t_matiere ON t_session_matiere.idMatiere = t_matiere.idMatiere <br />
&nbsp; &nbsp;INNER JOIN t_session ON t_session_matiere.idSession = t_session.idSession <br />
&nbsp; &nbsp;INNER JOIN t_ville &nbsp; ON t_session.idVille &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = t_ville.idVille <br />
$where <br />
SQL; <br />
&nbsp;<br />
/** <br />
&nbsp;* Crée le code HTML pour les liste relatives aux dates : Jours Mois Années <br />
&nbsp;* @param mixed $sql <br />
&nbsp;* @return string <br />
&nbsp;*/ <br />
function filtrageDates($sql) { <br />
&nbsp; &nbsp;$data = array(); <br />
&nbsp; &nbsp;$qry &nbsp;= mysql_query($sql); <br />
&nbsp; &nbsp;$data[] = '&lt;option value=&quot;&quot;&gt;&lt;/option&gt;'; // ligne vide <br />
&nbsp; &nbsp;while($row = mysql_fetch_row($qry)) { <br />
&nbsp; &nbsp; &nbsp; $data[] = '&lt;option value=&quot;' . $row[0] . '&quot;&gt;' . $row[0] . '&lt;/option&gt;'; <br />
&nbsp; &nbsp;} <br />
&nbsp; &nbsp;return implode(&quot;\n&quot;, $data); <br />
} <br />
&nbsp;<br />
/** <br />
&nbsp;* Crée le code HTML pour les liste relatives aux villes et matières <br />
&nbsp;* @param mixed $sql <br />
&nbsp;* @return string <br />
&nbsp;*/ <br />
function filtrageVillesMatieres($sql) { <br />
&nbsp; &nbsp;$data = array(); <br />
&nbsp; &nbsp;$qry = mysql_query($sql); <br />
&nbsp; &nbsp;$data[] = '&lt;option value=&quot;&quot;&gt;&lt;/option&gt;'; // ligne vide <br />
&nbsp; &nbsp;while($row = mysql_fetch_row($qry)) { <br />
&nbsp; &nbsp; &nbsp; $data[] = '&lt;option value=&quot;' . $row[0] . '&quot;&gt;' . $row[1] . '&lt;/option&gt;'; <br />
&nbsp; &nbsp;} <br />
&nbsp; &nbsp;return implode(&quot;\n&quot;, $data); <br />
} <br />
&nbsp;<br />
// si aucun where -&gt; on repart sur l'extraction de toutes les données possibles (pareil qu'au 1er appel index.php) <br />
$fromDates = (NULL === $where) ? 't_session' : $fromAndWhere; <br />
&nbsp;<br />
// si le jour n'a pas déjà été sélectionné -&gt; filtrage de la liste <br />
if (NULL === $jour) { <br />
&nbsp; &nbsp;$sql = &quot;SELECT DISTINCT DAY(t_session.date_) FROM $fromDates ORDER BY DAY(t_session.date_);&quot;; <br />
&nbsp; &nbsp;$xml-&gt;addChild('jours', filtrageDates($sql)); <br />
} <br />
&nbsp;<br />
// si le mois n'a pas déjà été sélectionné -&gt; filtrage de la liste <br />
if (NULL === $mois) { <br />
&nbsp; &nbsp;$sql = &quot;SELECT DISTINCT MONTH(t_session.date_) FROM $fromDates ORDER BY MONTH(t_session.date_);&quot;; <br />
&nbsp; &nbsp;$xml-&gt;addChild('mois', filtrageDates($sql)); <br />
} <br />
&nbsp;<br />
// si l'année n'a pas déjà été sélectionnée -&gt; filtrage de la liste <br />
if (NULL === $annee) { <br />
&nbsp; &nbsp;$sql = &quot;SELECT DISTINCT YEAR(t_session.date_) FROM $fromDates ORDER BY YEAR(t_session.date_);&quot;; <br />
&nbsp; &nbsp;$xml-&gt;addChild('annees', filtrageDates($sql)); <br />
&nbsp; &nbsp;$data = array(); <br />
} <br />
&nbsp;<br />
// si la ville n'a pas déjà été sélectionnée -&gt; filtrage de la liste <br />
if (NULL === $ville) { <br />
&nbsp; &nbsp;// si aucun where -&gt; on repart sur l'extraction de toutes les données possibles (pareil qu'au 1er appel index.php) <br />
&nbsp; &nbsp;$from = (NULL === $where) ? 't_ville' : $fromAndWhere; <br />
&nbsp; &nbsp;$sql = &quot;SELECT DISTINCT t_ville.idVille, t_ville.ville FROM $from ORDER BY t_ville.ville;&quot;; <br />
&nbsp; &nbsp;$xml-&gt;addChild('villes', filtrageVillesMatieres($sql)); &nbsp;<br />
&nbsp; &nbsp;$data = array(); <br />
} <br />
&nbsp;<br />
// si la matière n'a pas déjà été sélectionnée -&gt; filtrage de la liste <br />
if (NULL === $matiere) { <br />
&nbsp; &nbsp;// si aucun where -&gt; on repart sur l'extraction de toutes les données possibles (pareil qu'au 1er appel index.php) <br />
&nbsp; &nbsp;$from = (NULL === $where) ? 't_matiere' : $fromAndWhere; <br />
&nbsp; &nbsp;$sql = &quot;SELECT DISTINCT t_matiere.idMatiere, t_matiere.matiere FROM $from ORDER BY t_matiere.matiere;&quot;; <br />
&nbsp; &nbsp;$xml-&gt;addChild('matieres', filtrageVillesMatieres($sql)); <br />
&nbsp; &nbsp;$data = array(); <br />
} <br />
&nbsp;<br />
&nbsp;<br />
// données de la table <br />
$sql = &lt;&lt;&lt;SQL <br />
SELECT &nbsp;<br />
&nbsp; &nbsp;t_ville.ville, &nbsp;<br />
&nbsp; &nbsp;t_session.date_, &nbsp;<br />
&nbsp; &nbsp;t_matiere.matiere, &nbsp;<br />
&nbsp; &nbsp;t_session_matiere.nbInscrit &nbsp;<br />
FROM &nbsp;<br />
&nbsp; &nbsp;$fromAndWhere <br />
ORDER BY <br />
&nbsp; &nbsp;t_ville.ville ASC, &nbsp;<br />
&nbsp; &nbsp;t_session.date_ DESC, &nbsp;<br />
&nbsp; &nbsp;t_matiere.matiere ASC; <br />
SQL; <br />
&nbsp;<br />
$data = array(); <br />
$qry = mysql_query($sql); <br />
// mise en forme des données <br />
// ici on reconstruit les données de la table <br />
while($row = mysql_fetch_assoc($qry)) { <br />
&nbsp; &nbsp;$data[] = &lt;&lt;&lt;HTML <br />
&lt;tr&gt; <br />
&nbsp; &nbsp;&lt;td&gt;{$row['ville']}&lt;/td&gt; <br />
&nbsp; &nbsp;&lt;td class=&quot;alignc&quot;&gt;{$row['date_']}&lt;/td&gt; <br />
&nbsp; &nbsp;&lt;td&gt;{$row['matiere']}&lt;/td&gt; <br />
&nbsp; &nbsp;&lt;td class=&quot;alignr&quot;&gt;{$row['nbInscrit']}&lt;/td&gt; <br />
&lt;/tr&gt; <br />
HTML; <br />
} <br />
&nbsp;<br />
if (empty($data)) { // pas de données correspondant au filtre <br />
&nbsp; &nbsp;$data[] = '&lt;tr&gt;&lt;/tr&gt;'; <br />
} <br />
&nbsp;<br />
$xml-&gt;addChild('table', implode(&quot;\n&quot;, $data)); # noeud attendu par jQuery dans filterLists() <br />
&nbsp;<br />
&nbsp;<br />
// Envoi du header et des données <br />
header('content-type: text/xml'); <br />
echo $xml-&gt;asXML(); <br />
&nbsp;<br />
?&gt;</div></td></tr></tbody></table></div>
<p><strong>8. Captures</strong></p>
<p><img src="http://www.proside.fr/dvp/php/tutos/listesLiees/img/cap1.png" alt="capture" title="Capture" /></p>
<p><img src="http://www.proside.fr/dvp/php/tutos/listesLiees/img/cap2.png" alt="capture" title="Capture" /></p>
<p><img src="http://www.proside.fr/dvp/php/tutos/listesLiees/img/cap3.png" alt="capture" title="Capture" /></p>
<p><img src="http://www.proside.fr/dvp/php/tutos/listesLiees/img/cap4.png" alt="capture" title="Capture" /></p>
<p>Amusez-vous bien <img src="https://blog.developpez.com/rawsrc/wp-includes/images/smilies/icon_smile.gif" alt=":-)" class="wp-smiley" /><br />
Commentaires bienvenus<br />
@plus</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
	</channel>
</rss>
