<?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>Yriase &#187; jQuery</title>
	<atom:link href="http://www.yriase.fr/tag/jquery/feed" rel="self" type="application/rss+xml" />
	<link>http://www.yriase.fr</link>
	<description>Actu, Développement, Tutoriaux, Geek ...</description>
	<lastBuildDate>Sun, 05 Feb 2012 15:33:22 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=</generator>
<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>Créer un calendrier dynamique en Javascript avec FullCalendar</title>
		<link>http://www.yriase.fr/865-fullcalendar-calendrier-dynamique.html</link>
		<comments>http://www.yriase.fr/865-fullcalendar-calendrier-dynamique.html#comments</comments>
		<pubDate>Sun, 24 Oct 2010 15:10:20 +0000</pubDate>
		<dc:creator>
<img alt="" src="http://0.gravatar.com/avatar/8d419a54322fb4b031f344a82a2f58ea?s=12&amp;d=identicon&amp;r=G" class="avatar avatar-12 photo" height="12" width="12" style=" border: 1px solid; border-color: #000000;"/>
seiyar81</dc:creator>
				<category><![CDATA[Développement Web]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[fullcalendar]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://www.yriase.fr/?p=865</guid>
		<description><![CDATA[Comme on le sait jQuery possède un nombre de plugins tout simplement énorme ! Il y a certes du tri à faire et certains plugins tente de réinventer la roue, en vain&#8230; FullCalendar ne fait pas partie de ceux-là. Vous avez besoin d&#8217;ajouter un calendrier permettant une gestion des évènements, un affichage par jour/semaine/mois, et [...]]]></description>
			<content:encoded><![CDATA[<div class="post-pic"><img src="http://www.yriase.fr/wp-content/uploads/2010/10/fullcalendar.png" alt="" title="FullCalendar" width="670" height="100" class="alignnone size-full wp-image-866" /></div>
<p>Comme on le sait jQuery possède un nombre de plugins tout simplement énorme ! Il y a certes du tri à faire et certains plugins tente de réinventer la roue, en vain&#8230;</p>
<p><a href="http://arshaw.com/fullcalendar/">FullCalendar</a> ne fait pas partie de ceux-là. Vous avez besoin d&#8217;ajouter un calendrier permettant une gestion des évènements, un affichage par jour/semaine/mois, et thèmable ? Alors il vous faut <a href="http://arshaw.com/fullcalendar/">FullCalendar</a> !</p>
<p>Le plugin offre plusieurs vues pour afficher les évènements : par jour, semaine, mois avec des versions type agenda ou basique.<br />
Un de ces autres points forts c&#8217;est d&#8217;être compatible avec jQuery UI et il s&#8217;adapte ainsi à votre thème tout seul, plutôt pratique.<br />
Une extension lui permet même de récupérer les évènements de votre Google Calendar !</p>
<p>Voyons voir un peu comment le mettre en place : </p>
<pre class="brush: jscript">
	$(document).ready(function() {

		var date = new Date();
		var d = date.getDate();
		var m = date.getMonth();
		var y = date.getFullYear();

		$('#calendar').fullCalendar({
			header: {
				left: 'prev,next today',
				center: 'title',
				right: 'month,agendaWeek,agendaDay'
			},
			theme: true,
			editable: true,
			events: [
				{
					id: 1
					title: 'Aller sur Yriase.fr',
					start: new Date(y, m, 28),
					end: new Date(y, m, 29),
					url: 'http://www.yriase.fr/',
					allDay: true
				},
				{
					id: 2
					title: 'Nourrir le chat !',
					start: new Date(y, m, 28, 8, 0),
					end: new Date(y, m, 29, 8, 15),
					allDay: false
				}
			]
		});

	});
</pre>
<p>Ce bout de code plutôt simple, inialise votre Calendrier avec 2 évènements et l&#8217;adaptation au thème jQuery UI. Le proriété <em>editable</em> indique que les évènements ne peuvent être déplacés (peut être remplacée par la propriété editable de chanque évènement).</p>
<p>Comme vous pouvez le constater les évènements sont en réalité des objets JSON, auxquels on peut donc ajouter des proriétés.<br />
Ainsi on peut par exemple ajouter une propriété type qui pourrait nous permettre de filtrer les évènements par type.<br />
Ce qui serait encore mieux serait de pouvoir ajouter un bouton ou ensemble de boutons pour filtrer, qui soient intégrés au calendrier.<br />
Ca tombe bien, j&#8217;avais prévu d&#8217;expliquer comme faire !</p>
<p>Le but de la manoeuvre est simple, ajouter des boutons au calendrier simplement en modifiant les valeurs dans la déclaration de la propriété <em>header</em>. Par exemple : </p>
<pre class="brush: jscript">
			header: {
				left: 'prev,next today',
				center: 'title',
				right: 'all,mandatory,not_mandatory month,agendaWeek,agendaDay'
			}
</pre>
<p>On ajoute ici trois boutons donc <em>all,mandatory, not_mandatory</em> pour afficher/cacher les évènements obligatoires ou pas. Pas très original mais c&#8217;est bon pour l&#8217;exemple !</p>
<p>Maintenant il va nous falloir modifier un petit peu le fichier <em>fullcalendar.js</em>.<br />
Aux alentours de la ligne 80, la déclaration de la propriété <em>buttonText</em>.<br />
Ajouter au tableau les lignes :<br />
                all: &#8216;All&#8217;,<br />
                mandatory: &#8216;Mandatory&#8217;,<br />
                not_mandatory: &#8216;Not Mandatory&#8217;,</p>
<p>Ensuite vers la ligne 710 cherchez : </p>
<pre class="brush: jscript">
              if (publicMethods[buttonName]) {
			buttonClick = publicMethods[buttonName];
	      }
	       else if (views[buttonName]) {
			buttonClick = function() {
			  button.removeClass(tm + '-state-hover');
			  changeView(buttonName)
			};
	     }
</pre>
<p>et ajoutez après : </p>
<pre class="brush: jscript">
else {
      buttonClick = function() {
	button.removeClass(tm + '-state-hover');
        button.addClass(tm + '-state-active');
        if(button.hasClass('fc-button-all')) {
              $('.fc-button-mandatory').removeClass(tm + '-state-active');
              $('.fc-button-not_mandatory').removeClass(tm + '-state-active');
        } else if (button.hasClass('fc-button-mandatory')) {
              $('.fc-button-all').removeClass(tm + '-state-active');
              $('.fc-button-not_mandatory').removeClass(tm + '-state-active');
        } else if (button.hasClass('fc-button-not_mandatory')) {
              $('.fc-button-all').removeClass(tm + '-state-active');
              $('.fc-button-mandatory').removeClass(tm + '-state-active');
        }
      };
 }
</pre>
<p>Cette partie s&#8217;occupe de marquer comme actif le bouton cliqué.<br />
Enfin juste après se trouve cette partie : </p>
<pre class="brush: jscript">
if (icon) {
	button = $("
<div class='fc-button-" + buttonName + " ui-state-default'><a><span class='ui-icon ui-icon-" + icon + "'/></a></div>

");
}
else if (text) {
...
</pre>
<p>Mettez dans le corps du <em>else if(text)</em> : </p>
<pre class="brush: jscript">
if(buttonName == 'all')
  button = $("
<div class='fc-button-" + buttonName + " " + tm + "-state-active " + tm + "-state-default'>" +
		"<a><span>" + text + "</span></a></div>

");
else
  button = $("
<div class='fc-button-" + buttonName + " " + tm + "-state-default'>" +
		"<a><span>" + text + "</span></a></div>

");
</pre>
<p>Maintenant il ne vous reste plus qu&#8217;a mettre en place les fonctions pour filtrer les évènements selon leur type.<br />
Mais ça ce sera pour une autre fois !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.yriase.fr/865-fullcalendar-calendrier-dynamique.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ZendX_JQuery : view helper pour les bouttons</title>
		<link>http://www.yriase.fr/749-zendx_jquery-view-helper-pour-les-bouttons.html</link>
		<comments>http://www.yriase.fr/749-zendx_jquery-view-helper-pour-les-bouttons.html#comments</comments>
		<pubDate>Tue, 13 Apr 2010 13:49:11 +0000</pubDate>
		<dc:creator>
<img alt="" src="http://0.gravatar.com/avatar/8d419a54322fb4b031f344a82a2f58ea?s=12&amp;d=identicon&amp;r=G" class="avatar avatar-12 photo" height="12" width="12" style=" border: 1px solid; border-color: #000000;"/>
seiyar81</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[zend framework]]></category>
		<category><![CDATA[zendx_jquery]]></category>

		<guid isPermaLink="false">http://www.yriase.fr/?p=749</guid>
		<description><![CDATA[Après le view helper pour la progressbar de jQuery UI, je me suis amusé à coder un view helper pour les bouttons. Le principe reste le même, cependant j&#8217;ai ajouté un paramètre pour gérer le passage des évènements à la création du boutton. /** * Zend Framework * * LICENSE * * This source file [...]]]></description>
			<content:encoded><![CDATA[<p>Après le view helper pour la progressbar de jQuery UI, je me suis amusé à coder un view helper pour les bouttons. Le principe reste le même, cependant j&#8217;ai ajouté un paramètre pour gérer le passage des évènements à la création du boutton.</p>
<pre class="brush: php">
/**
 * Zend Framework
 *
 * LICENSE
 *
 * This source file is subject to the new BSD license that is bundled
 * with this package in the file LICENSE.txt.
 * It is also available through the world-wide-web at this URL:
 * http://framework.zend.com/license/new-bsd
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to license@zend.com so we can send you a copy immediately.
 *
 * @category    ZendX
 * @package     ZendX_JQuery
 * @subpackage  View
 * @copyright  Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
 * @license     http://framework.zend.com/license/new-bsd     New BSD License
 * @version     $Id: Slider.php 20165 2010-01-09 18:57:56Z bkarwin $
 */

/**
 * @see ZendX_JQuery_View_Helper_UiWidget
 */
require_once "ZendX/JQuery/View/Helper/UiWidget.php";

/**
 * jQuery Button View Helper
 *
 * @uses 	   Zend_Json
 * @package    ZendX_JQuery
 * @subpackage View
 * @copyright  Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
 * @license    http://framework.zend.com/license/new-bsd     New BSD License
 */
class ZendX_JQuery_View_Helper_Button extends ZendX_JQuery_View_Helper_UiWidget
{
    /**
     * Create a jQuery button
     *
     * @link   http://docs.jquery.com/UI/Button
     * @param  string $id
     * @param  string $value
     * @param  array  $params
     * @param  array  $attribs
     * @param  array  $events
     * @return string
     */
    public function button($id, $value, array $params = array(), array $attribs = array(), array $events = array())
    {
        if(!isset($attribs['id'])) {
            $attribs['id'] = $id;
        }

        $jqh = ZendX_JQuery_View_Helper_JQuery::getJQueryHandler();
        $params = ZendX_JQuery::encodeJson($params);
        $events = $this->getEvents($events);

        $js = sprintf('%s("#%s").button(%s)%s;', $jqh, $attribs['id'], $params, $events);
        $this->jquery->addOnLoad($js);

        $html = &quot;&lt;button &quot;.$this-&gt;_htmlAttribs($attribs).&quot; &gt;&quot;;
        $html .= $value;
        $html .= '&lt;/button&gt;';

        return $html;
    }

    public function getEvents($events)
    {
        if(!count($events)) return '';
        else {
            $retour = '';
            foreach ($events as $event => $function) {
                $retour .= '.'.$event.'('.$function.')';
            }
            return $retour;
        }
    }

}
</pre>
<p>Pour l&#8217;utiliser on place le fichier Button.php (avec le code ci-dessus) dans le dossier <em>ZendX/JQuery/View/Helper/</em> et pour l&#8217;utiliser : </p>
<pre class="brush: php">
echo $this->button("button1", "Mon Button", array('icons' => new Zend_Json_Expr("{primary: 'ui-icon-gear'}")),
        array(), array('click'=> "function(){ alert('Hello World !'); }" ));
</pre>
<p>Enjoy !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.yriase.fr/749-zendx_jquery-view-helper-pour-les-bouttons.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Zend Framework / jQuery : Exemple de &#171;&#160;view helper&#160;&#187;</title>
		<link>http://www.yriase.fr/686-zend-framework-jquery-exemple-de-view-helper-personnalise.html</link>
		<comments>http://www.yriase.fr/686-zend-framework-jquery-exemple-de-view-helper-personnalise.html#comments</comments>
		<pubDate>Mon, 29 Mar 2010 08:00:58 +0000</pubDate>
		<dc:creator>
<img alt="" src="http://0.gravatar.com/avatar/8d419a54322fb4b031f344a82a2f58ea?s=12&amp;d=identicon&amp;r=G" class="avatar avatar-12 photo" height="12" width="12" style=" border: 1px solid; border-color: #000000;"/>
seiyar81</dc:creator>
				<category><![CDATA[Développement Web]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[zend]]></category>
		<category><![CDATA[zend framework]]></category>
		<category><![CDATA[zendx_jquery]]></category>

		<guid isPermaLink="false">http://www.yriase.fr/?p=686</guid>
		<description><![CDATA[Dans la continuité du précédent billet sur le Zend Framework et jQuery, j&#8217;ai codé un view helper pour la ProgressBar de jQuery UI. Je suis tout simplement parti du code du slider que j&#8217;ai bien rogné et un peu modifié pour arriver à un code fonctionnel. Sans plus attendre le voici : /** * Zend [...]]]></description>
			<content:encoded><![CDATA[<p>Dans la continuité du précédent billet sur le Zend Framework et jQuery, j&#8217;ai codé un view helper pour la ProgressBar de jQuery UI.</p>
<p>Je suis tout simplement parti du code du slider que j&#8217;ai bien rogné et un peu modifié pour arriver à un code fonctionnel.</p>
<p>Sans plus attendre le voici :</p>
<pre class="brush: php">
/**
 * Zend Framework
 *
 * LICENSE
 *
 * This source file is subject to the new BSD license that is bundled
 * with this package in the file LICENSE.txt.
 * It is also available through the world-wide-web at this URL:
 * http://framework.zend.com/license/new-bsd
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to license@zend.com so we can send you a copy immediately.
 *
 * @category    ZendX
 * @package     ZendX_JQuery
 * @subpackage  View
 * @copyright  Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
 * @license     http://framework.zend.com/license/new-bsd     New BSD License
 * @version     $Id: Slider.php 20165 2010-01-09 18:57:56Z bkarwin $
 */

/**
 * @see ZendX_JQuery_View_Helper_UiWidget
 */
require_once "ZendX/JQuery/View/Helper/UiWidget.php";

/**
 * jQuery ProgressBar View Helper
 *
 * @uses 	   Zend_Json
 * @package    ZendX_JQuery
 * @subpackage View
 * @copyright  Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
 * @license    http://framework.zend.com/license/new-bsd     New BSD License
 */
class ZendX_JQuery_View_Helper_ProgressBar extends ZendX_JQuery_View_Helper_UiWidget
{
    /**
     * Create a jQuery progressbar
     *
     * @link   http://docs.jquery.com/UI/Progressbar
     * @param  string $id
     * @param  string $value
     * @param  array  $params
     * @param  array  $attribs
     * @return string
     */
    public function progressBar($id, $value, array $params = array(), array $attribs = array())
    {
        if(!isset($attribs['id'])) {
            $attribs['id'] = $id;
        }

        $jqh = ZendX_JQuery_View_Helper_JQuery::getJQueryHandler();

        if(count($params) <= 0) {
            $params = ZendX_JQuery::encodeJson(array('value'=>$value));
        } else {
            $params = ZendX_JQuery::encodeJson($params);
        }

        $js = sprintf('%s("#%s").progressbar(%s);', $jqh, $attribs['id'], $params);
        $this->jquery->addOnLoad($js);

        $html = &quot;&lt;div &quot;.$this-&gt;_htmlAttribs($attribs).&quot; &gt;&quot;;
        $html .= '&lt;/div&gt;';

        return $html;
    }
}
</pre>
<p>C&#8217;est simple et ça fonctionne !<br />
Il suffit de créer le fichier : &laquo;&nbsp;<em>ZendX/JQuery/View/Helper/ProgressBar.php</em>&nbsp;&raquo; et d&#8217;y placer ensuite le code ci-dessus.</p>
<p>Ensuite pour l&#8217;utiliser c&#8217;est très simple dans vos vues : </p>
<pre class="brush: php">
echo $this->progressBar("progressBarId", 65);
</pre>
<p>Voilà en espérant que cela serve <img src='http://www.yriase.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.yriase.fr/686-zend-framework-jquery-exemple-de-view-helper-personnalise.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>jQuery : poster un formulaire simplement avec AJAX</title>
		<link>http://www.yriase.fr/617-jquery-poster-un-formulaire-simplement-avec-ajax.html</link>
		<comments>http://www.yriase.fr/617-jquery-poster-un-formulaire-simplement-avec-ajax.html#comments</comments>
		<pubDate>Thu, 18 Mar 2010 16:54:22 +0000</pubDate>
		<dc:creator>
<img alt="" src="http://0.gravatar.com/avatar/8d419a54322fb4b031f344a82a2f58ea?s=12&amp;d=identicon&amp;r=G" class="avatar avatar-12 photo" height="12" width="12" style=" border: 1px solid; border-color: #000000;"/>
seiyar81</dc:creator>
				<category><![CDATA[Développement Web]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://www.yriase.fr/?p=617</guid>
		<description><![CDATA[jQuery, ce merveilleux framework qui nous permet de faire tellement de choses &#8230; Bien souvent je suis passé à côté de fonctionnalités on ne peut plus simple à utiliser mais tellement utiles. Du genre, je dois envoyer ce formulaire avec AJAX, il contient plein de champs différents, comment faire pour que ce soit le plus [...]]]></description>
			<content:encoded><![CDATA[<p><strong><a href="http://docs.jquery.com/Main_Page">jQuery</a></strong>, ce merveilleux framework qui nous permet de faire tellement de choses &#8230; Bien souvent je suis passé à côté de fonctionnalités on ne peut plus simple à utiliser mais tellement utiles.</p>
<p>Du genre, je dois envoyer ce formulaire avec AJAX, il contient plein de champs différents, comment faire pour que ce soit le plus simple et rapide possible ?</p>
<p>Tout d&#8217;abord imaginons un formulaire regroupant plusieurs champs sur toute la page.</p>
<pre class="brush: php">
<form method="post" id="formulaire">
<h3>Coordonnées</h3>

<label>Mail :
<input type="text" name="mail" value="" /></label>

<label>Téléphone :
<input type="text" name="tel" value="" /></label>

...

<label>Newsletter :
<input type="checkbox" name="newsletter" /></label>

...
<input type="submit" value="Envoyer" />
</form>
<div id="post"></div>
</pre>
<p>Rien de bien compliqué jusque là mais n&#8217;oubliez pas d&#8217;inclure la librairie jQuery !<br />
On créé ensuite la page qui va traiter nos données, appelons-la post.php : </p>
<pre class="brush: php">
<ul>
  &lt;?php
    foreach($_POST as $key => $value)
      echo "
<li>$key => $value</li>

";
  ?&gt;
 </ul>
</pre>
<p>Il ne nous reste plus que la partie qui nous intéresse ici, le code javascript : </p>
<pre class="brush: jscript">
$(document).ready(function(){
	$("#formulaire").submit(function(){
		$.ajax({type:"POST", data: $(this).serialize(), url:"post.php",
			success: function(data){
				$("#post").html(data);
			},
                        error: function(){
			        $("#post").html('Une erreur est survenue.');
			}
		});
		return false;
	});
});
</pre>
<p>Tout ce qu&#8217;on a à faire c&#8217;est ré-implémenter la fonction submit du formulaire et sérialiser ses champs avec la fonction <em>&#8216;serialize()&#8217;</em> pour envoyer les données.<br />
C&#8217;est tout bête mais je ne connaissais pas cette fonction et on ne développe pas toujours avec un IDE qui liste pour nous les fonctions à utiliser !<br />
Enfin comme dit le vieil adage : RTFM !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.yriase.fr/617-jquery-poster-un-formulaire-simplement-avec-ajax.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Datatables : base de données, traduction et jQuery-UI</title>
		<link>http://www.yriase.fr/554-datatables-base-de-donnees-traduction-et-jquery-ui.html</link>
		<comments>http://www.yriase.fr/554-datatables-base-de-donnees-traduction-et-jquery-ui.html#comments</comments>
		<pubDate>Tue, 02 Feb 2010 16:03:53 +0000</pubDate>
		<dc:creator>
<img alt="" src="http://0.gravatar.com/avatar/8d419a54322fb4b031f344a82a2f58ea?s=12&amp;d=identicon&amp;r=G" class="avatar avatar-12 photo" height="12" width="12" style=" border: 1px solid; border-color: #000000;"/>
seiyar81</dc:creator>
				<category><![CDATA[Développement Web]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[datatables]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[json]]></category>

		<guid isPermaLink="false">http://www.yriase.fr/?p=554</guid>
		<description><![CDATA[J&#8217;avais présenté ce fabuleux plugin pour jQuery qu&#8217;est Datatables et expliqué rapidement ce dont il est capable. Aujourd&#8217;hui je vous propose une mise en situation, avec comme objectif l&#8217;interaction avec une base de données, une traduction en français (ou une autre langue parmi les 29 disponibles), la mise en forme avec l&#8217;aide jQuery-UI, et d&#8217;autres [...]]]></description>
			<content:encoded><![CDATA[<div class="post-pic"><img src="http://www.yriase.fr/wp-content/uploads/2009/11/news-dt.png" alt="" title="news-dt" width="670" height="100" class="aligncenter size-full wp-image-254" /></div>
<p>J&#8217;avais présenté ce fabuleux plugin pour jQuery qu&#8217;est <a href="http://datatables.net/">Datatables</a> et expliqué rapidement ce dont il est capable.<br />
Aujourd&#8217;hui je vous propose une mise en situation, avec comme objectif l&#8217;interaction avec une base de données, une traduction en français (ou une autre langue parmi les 29 disponibles), la mise en forme avec l&#8217;aide jQuery-UI, et d&#8217;autres fonctionnalités.</p>
<p>Tout d&#8217;abord si vous ne possédez pas encore le plugin téléchargez-le <a href="http://datatables.net/releases/dataTables-1.6.1.zip">ici</a>.<br />
Ensuite nous allons placer le code de notre tableau dans notre page, imaginons que l&#8217;on souhaite afficher des utilisateurs : </p>
<pre class="brush: php">
&lt;table id="datatable" &gt;
  &lt;thead&gt;
       &lt;tr&gt;
            &lt;th&gt;Nom&lt;/th&gt;
            &lt;th&gt;Prénom&lt;/th&gt;
            &lt;th&gt;Inscription&lt;/th&gt;
            &lt;th&gt;Mail&lt;/th&gt;
            &lt;th&gt;&lt;/th&gt;
        &lt;/tr&gt;
  &lt;/thead&gt;
 &lt;tbody&gt;
       &lt;tr&gt;
            &lt;td colspan="4"&gt;Chargement des données...&lt;/td&gt;
        &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
</pre>
<p>Maintenant le code Javascript. Nous allond indiquer que l&#8217;on souhaite récupérer les données via un fichier côté serveur : </p>
<pre class="brush: jscript">
$(document).ready(function() {
	$('#datatable').dataTable( {
		"bProcessing": true,
		"bServerSide": true,
		"sAjaxSource": "get_data.php"
	} );
} );
</pre>
<p>Le plugin ira donc récupérer le fichier <em>get_data.php</em> pour remplir le tableau. Les données renvoyées par le fichier php doivent être au format <a href="http://fr.wikipedia.org/wiki/JavaScript_Object_Notation"><strong>JSON</strong></a>.<br />
Voici un exemple du contenu de get_data.php inspiré de la documentation de Datatables mais vous êtes libre de modifier le code pour utiliser PDO, ou une autre méthode d&#8217;accès à la base de données si vous utilisez un autre SGBD que MySQL.</p>
<pre class="brush: php">
&lt;?php
  /* MySQL connection */
	$gaSql['user']       = "username";
	$gaSql['password']   = "password";
	$gaSql['db']         = "mydb";
	$gaSql['server']     = "localhost";
	$gaSql['type']       = "mysql";

	$gaSql['link'] =  mysql_pconnect( $gaSql['server'], $gaSql['user'], $gaSql['password']  ) or
		die( 'Could not open connection to server' );

	mysql_select_db( $gaSql['db'], $gaSql['link'] ) or
		die( 'Could not select database '. $gaSql['db'] );

	/* Paging */
	$sLimit = "";
	if ( isset( $_GET['iDisplayStart'] ) )
	{
		$sLimit = "LIMIT ".mysql_real_escape_string( $_GET['iDisplayStart'] ).", ".
			mysql_real_escape_string( $_GET['iDisplayLength'] );
	}

	/* Ordering */
	if ( isset( $_GET['iSortCol_0'] ) )
	{
		$sOrder = "ORDER BY  ";
		for ( $i=0 ; $i&lt;mysql_real_escape_string( $_GET['iSortingCols'] ) ; $i++ )
		{
			$sOrder .= fnColumnToField(mysql_real_escape_string( $_GET['iSortCol_'.$i] ))."
			 	".mysql_real_escape_string( $_GET['sSortDir_'.$i] ) .", ";
		}
		$sOrder = substr_replace( $sOrder, "", -2 );
	}

	/* Filtrage - Remplace le filtrage côté client, peut donc être long si la base de données est importante
	 */
	$sWhere = "";
	if ( $_GET['sSearch'] != "" )
	{
		$sWhere = "WHERE nom LIKE '%".mysql_real_escape_string( $_GET['sSearch'] )."%' OR ".
		                "prenom LIKE '%".mysql_real_escape_string( $_GET['sSearch'] )."%' OR ".
		                "inscription = '".mysql_real_escape_string( $_GET['sSearch'] )."' OR ".
		                "mail = '".mysql_real_escape_string( $_GET['sSearch'] )."'";
	}

	$sQuery = "SELECT id, nom, prenom, inscription, mail FROM users $sWhere $sOrder $sLimit";
	$rResult = mysql_query( $sQuery, $gaSql['link'] ) or die(mysql_error());

	$sQuery = "SELECT FOUND_ROWS()";

	$rResultFilterTotal = mysql_query( $sQuery, $gaSql['link'] ) or die(mysql_error());
	$aResultFilterTotal = mysql_fetch_array($rResultFilterTotal);
	$iFilteredTotal = $aResultFilterTotal[0];

	$sQuery = "SELECT COUNT(id)	FROM users";
	$rResultTotal = mysql_query( $sQuery, $gaSql['link'] ) or die(mysql_error());
	$aResultTotal = mysql_fetch_array($rResultTotal);
	$iTotal = $aResultTotal[0];

	$sOutput = '{';
	$sOutput .= '"sEcho": '.intval($_GET['sEcho']).', ';
	$sOutput .= '"iTotalRecords": '.$iTotal.', ';
	$sOutput .= '"iTotalDisplayRecords": '.$iFilteredTotal.', ';
	$sOutput .= '"aaData": [ ';
	while ( $aRow = mysql_fetch_array( $rResult ) )
	{
		$sOutput .= "[";
		$sOutput .= '"'.addslashes($aRow['nom']).'",';
		$sOutput .= '"'.addslashes($aRow['prenom']).'",';
		$sOutput .= '"'.addslashes(date(H:i d/m/Y'', $aRow['inscription'])).'",';
		$sOutput .= '"'.addslashes($aRow['mail']).'"';
		$sOutput .= '"<a href="user.php?id="'.$aRow['id'].'>Détails</a>"';
		$sOutput .= "],";
	}
	$sOutput = substr_replace( $sOutput, "", -1 );
	$sOutput .= '] }';

	echo $sOutput;

	function fnColumnToField( $i )
	{
		if ( $i == 0 )
			return "nom";
		else if ( $i == 1 )
			return "prenom";
		else if ( $i == 2 )
			return "inscription";
		else if ( $i == 3 )
			return "mail";
	}
?&gt;
</pre>
<p>Et voilà notre tableau se remplit automatiquement avec les données renvoyées par le fichier <em>get_data.php</em>.<br />
La méthode utilisée dans l&#8217;exemple pour renvoyer les données au format JSON est un peu barbare, utiliser json-encode sur un array serait à mon humble avis plus approprié, à vous de voir.</p>
<pre class="brush: php">
  <?php
 $sOutput = array('sEcho'=>intval($_GET['sEcho']),
				  'iTotalRecords'=>$iTotal,
				  'iTotalDisplayRecords'=>$iFilteredTotal);
 $aaData = array();        

	while ( $aRow = mysql_fetch_array( $rResult ) )
	{
            $tmp = array();
	    $tmp[] = addslashes($aRow['nom']);
		$tmp[] = addslashes($aRow['prenom']);
		$tmp[] = date(H:i d/m/Y'', $aRow['inscription']);
		$tmp[] = addslashes($aRow['mail']);
		$tmp[] = '&lt;a href="user.php?id='.$aRow['id'].'"&gt;Détails&lt;/a&gt;';

		$aaData[] = $tmp;
	}
   $sOutput['aaData'] = $aaData;

   echo json_encode($sOutput);
</pre>
<p>Je n&#8217;ai pas testé le code mais cela devrait fonctionner.</p>
<p>Bon tout ça c&#8217;est bien beau mais on aimerait bien avoir une traduction en français plutôt que d&#8217;avoir <em>Show 10 entries, Search</em> ect, car même si on comprend ça fait tâche.<br />
Et bien le plugin nous offre la possibilité de traduire le plugin dans pas moins de 29 langues dont l&#8217;anglais, l&#8217;allemand, l&#8217;espagnol, le portugais, le chinois etc.<br />
Pour mettre en place la traduction il n&#8217;y a rien de plus simple, on va rajouter une option dans la déclaration de notre tableau : </p>
<pre class="brush: jscript">
$(document).ready(function() {
	$('#datatable').dataTable( {
		"bProcessing": true,
		"bServerSide": true,
		"sAjaxSource": "get_data.php",
                "oLanguage": { "sUrl": "datatable_fr.txt" }
	} );
} );
</pre>
<p>Il suffit ensuite de placer la traduction correspondante dans le fichier <em>datatable_fr.txt</em>. La liste des codes à placer est <a href="http://datatables.net/plug-ins/i18n">disponible ici</a>.<br />
Vous pouvez modifier les traductions ou bien créer les vôtres très simplement. Pour éviter un appel du fichier sur le serveur vous pouvez également faire comme ceci : </p>
<pre class="brush: jscript">
$(document).ready(function() {
	$('#datatable').dataTable( {
		"bProcessing": true,
		"bServerSide": true,
		"sAjaxSource": "get_data.php",
                "oLanguage": { "sProcessing":   "Traitement en cours...",
                   "sLengthMenu":   "Afficher _MENU_ éléments",
	           "sZeroRecords":  "Aucun élément à afficher",
	           "sInfo": "Affichage de l'élement _START_ à _END_ sur _TOTAL_ éléments",
	           "sInfoEmpty": "Affichage de l'élement 0 à 0 sur 0 éléments",
	           "sInfoFiltered": "(filtré de _MAX_ éléments au total)",
	           "sInfoPostFix":  "",
	           "sSearch":       "Rechercher:",
	           "sUrl":          "",
	           "oPaginate": {
		        "sFirst":    "Premier",
		        "sPrevious": "Précédent",
		        "sNext":     "Suivant",
		        "sLast":     "Dernier"
	               }
                }
	} );
} );
</pre>
<p>Enfin on aimerait styliser notre tableau et donc utiliser la puissance de jQuery-UI. Pour cela rien de plus simple, il suffit de posséder les fichiers de jQuery-UI (.js, .css et les images) et de les avoir inclus. Comme pour la traduction une simple ligne suffit : </p>
<pre class="brush: jscript">
       ...
       "bJQueryUI": true,
       ...
</pre>
<p>Vous pouvez voir encore plus d&#8217;exemple sur <a href="http://datatables.net/examples/">cette page</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.yriase.fr/554-datatables-base-de-donnees-traduction-et-jquery-ui.html/feed</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>DataTables : Manipuler ses tableaux HTML avec jQuery</title>
		<link>http://www.yriase.fr/253-datatables-manipuler-ses-tableaux-html-avec-jquery.html</link>
		<comments>http://www.yriase.fr/253-datatables-manipuler-ses-tableaux-html-avec-jquery.html#comments</comments>
		<pubDate>Wed, 11 Nov 2009 22:49:34 +0000</pubDate>
		<dc:creator>
<img alt="" src="http://0.gravatar.com/avatar/8d419a54322fb4b031f344a82a2f58ea?s=12&amp;d=identicon&amp;r=G" class="avatar avatar-12 photo" height="12" width="12" style=" border: 1px solid; border-color: #000000;"/>
seiyar81</dc:creator>
				<category><![CDATA[Développement Web]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[tableaux]]></category>

		<guid isPermaLink="false">http://www.yriase.fr/?p=253</guid>
		<description><![CDATA[DataTables est tout simplement un plugin pour jQuery hallucinant ! Il permet la manipulation complète des tableaux HTML. Il offre tout aussi bien le filtrage des données à la volée que le tri des colonnes avec auto-détection du type de données que la pagination ou bien encore l&#8217;internationalisation. Extrêmement complet, stable (plus de 1300 tests [...]]]></description>
			<content:encoded><![CDATA[<div class="post-pic"><img src="http://www.yriase.fr/wp-content/uploads/2009/11/news-dt.png" alt="news-dt" title="news-dt"  class="aligncenter size-full wp-image-254" /></div>
<p>DataTables est tout simplement un plugin pour jQuery hallucinant ! Il permet la manipulation complète des tableaux HTML.</p>
<p>Il offre tout aussi bien le filtrage des données à la volée que le tri des colonnes avec auto-détection du type de données que la pagination ou bien encore l&#8217;internationalisation.</p>
<p>Extrêmement complet, stable (plus de 1300 tests unitaires), offrant un panel d&#8217;action très large, DataTables rentre dans ma liste de plugins favoris !</p>
<p>Un petit exemple tiré de la doc officielle : </p>
<pre class="brush: jscript">
$(document).ready(function() {
	$('#example').dataTable( {
		"aoColumns": [
			/* Engine */   { "fnRender": function ( oObj ) {
				return oObj.aData[0] +' '+ oObj.aData[3];
			} },
			/* Browser */  null,
			/* Platform */ null,
			/* Version */  { "bVisible": false },
			/* Grade */    { "sClass": "center" }
		] } );
} );
</pre>
<p>Cet exemple permet de &#8216;customiser&#8217; le rendu de chaque colonne. Ainsi la première colonne se voit ajouter la valeur de la 4ème, qui elle se retrouve cachée, alors que la dernière est centrée.</p>
<p>Mais ce n&#8217;est qu&#8217;un mince aperçu des possibilité du plugin. A essayer d&#8217;urgence !</p>
<p><a href="http://www.datatables.net/index" title="DataTables">Site Officiel</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.yriase.fr/253-datatables-manipuler-ses-tableaux-html-avec-jquery.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

