PHPUi : créer et manipuler des interfaces utilisateurs en PHP

Posté par seiyar81 le 21 septembre 2012 | Laisser un commentaire (2)

PHPUi Logo

Je présente aujourd’hui un projet commencé pour mon mémoire de fin d’études, puis mis en pause, puis repris, puis complètement réécris …

Il s’agit d’une librairie qui permet de générer des interfaces utilisateurs en écrivant uniquement du PHP (ou presque :p).
Le but est de simplifier la vie aux développeurs qui souhaitent générer dynamiquement du code HTML/CSS ou Javascript côté serveur.
A l’heure actuelle, le support du CSS et du Javascript est en cours d’implémentation/optimisation.

La librairie se veut 100% objet PHP5, utilise les namespaces, est facilement extensible via une abstraction de la plupart de ses fonctionnalités, supporte l’autoload, utilise le pattern Observer etc …
De plus un support particulier des frameworks CSS 960gs et Blueprint a été implémenté (via le système d’abstraction, donc applicable à d’autres frameworks/librairies) afin de réellement faciliter la mise en place d’interfaces aux développeurs.

Si vous souhaitez plus d’infos sur les frameworks cités : 960gs, Blueprint.

Un petit exemple de code :

    $blue = PHPUi::getInstance()->blueprint(array('class' => 'container', 'id' => 'blueprint'));
    $blue->addChild(new Xhtml\Element('h2', array('span' => 24), true, '24 Column Grid - Blueprint'));
    $blue->addChild(new Xhtml\Element('div', array('notice' => true), true, 'This is a div with class notice'));
    $blue->addChild(new Xhtml\Element('div', array('error' => true), true, 'This is a div with class error'));
    $blue->jquery()->click( 
        $blue->jquery()->ajax( 
             array( 
                 'url' => 'ajax.php', 
                 'type' => 'POST', 
                 'dataType' => 'html',
                 'success' => 'function(data) { $("#blueprint").append(data); }' 
             ) 
        ) 
    );

On créé ici un nouvel élément utilisant l’adapter Blueprint, on peut donc directement initialiser des div de type error, notice ou alert en passant le paramètre à true. On applique ensuite un filtre jQuery qui au clic sur la div lancera un appel AJAX avec les paramètres donnés.
La librairie se charge ensuite de générer le code correspondant aux appels effectués.

Sachez qu’il est également possible de charger/décharger un ensemble d’éléments via un système d’adapter.
Exemple avec notre élément $blue de tout à l’heure :

     $dump = Xhtml\Dumper\DumperJson::dump( $blue );
     $loaderJson = new Xhtml\Loader\LoaderJson(array('content' => $dump));
     echo $loaderJson->load();

Ici on dump et on load un élément en JSON mais à terme il sera possible d’exporter/charger via n’importe quel format puisqu’il est possible de définir ses propres classes.

Si vous souhaitez regarder les exemples ou bien le code de la librairie, un dépôt Github existe :
https://github.com/seiyar81/phpui

La librairie est toujours en cours de développement, je suis donc ouvert aux propositions d’améliorations ou aux fonctionnalités à implémenter.

Catégorie: Développement Web, Javascript, PHP | Laisser un commentaire (2)

DataTables : Tri et filtre personnalisés des données

Posté par seiyar81 le 7 avril 2012 | Laisser un commentaire (2)

Un petit moment que je n’ai pas posté de tutoriel ou tout du moins d’articles plus techniques, mais l’occasion s’est présentée lorsque je suis tombé sur un problème avec la librairie DataTables.

Je dis volontairement librairie car aujourd’hui le plugin pour jQuery a tellement évolué qu’on peut le considérer comme une librairie à part entière.

Une des fonctionnalités très pratique et intéressante de DataTables est de permettre l’ajout de de fonctions personnalisées de tri et de filtrage sur les donénes des tableaux.

L’intérêt d’une telle pratique est de pouvoir offrir aux utilisateurs des fonctionnalités avancées de manipulation des données.

Pour commencer voici un exemple tiré permettant d’ajouter un filtrage pour des adresses IP : 

function ip2long (IP) {
 IP = IP.match(/^([1-9]\d*|0[0-7]*|0x[\da-f]+)(?:\.([1-9]\d*|0[0-7]*|0x[\da-f]+))?(?:\.([1-9]\d*|0[0-7]*|0x[\da-f]+))?(?:\.([1-9]\d*|0[0-7]*|0x[\da-f]+))?$/i); // Verify IP format.
 if (!IP) {        return false;
 }
 IP[0] = 0;
 for (i = 1; i < 5; i += 1) {        IP[0] += !! ((IP[i] || '').length);
     IP[i] = parseInt(IP[i]) || 0;
 }
 IP[4 + IP[0]] *= Math.pow(256, 4 - IP[0]);
 if (IP[1] >= IP[5] || IP[2] >= IP[6] || IP[3] >= IP[7] || IP[4] >= IP[8]) {
     return false;    }
 return IP[1] * (IP[0] === 1 || 16777216) + IP[2] * (IP[0] <= 2 || 65536) + IP[3] * (IP[0] <= 3 || 256) + IP[4] * 1;
}

$.fn.dataTableExt.oSort['ip_address-asc'] = function(a, b) {
	var ipA = ip2long(a);
	var ipB = ip2long(b);
	return ((ipA < ipB) ? -1 : ((ipA > ipB) ?  1 : 0));
};

$.fn.dataTableExt.oSort['ip_address-desc'] = function(a, b) {
	var ipA = ip2long(a);
	var ipB = ip2long(b);
	return ((ipA < ipB) ? 1 : ((ipA > ipB) ?  -1 : 0));
};

On a tout d’abord une fonction pour transformer une adresse IP en entier puis deux fonctions pour comparer deux adresses et les trier par ordre ascendant ou descendant.

Une fois ces fonctions ajoutées, il suffit de spécifier le type de données de la colonne lors de la déclaration du tableau :

$('#example').dataTable( {
        "aoColumns": [
             null,
             null,
             null,
             { "sType": "ip_address" },
             null
         ]
} );

Il est donc très simple d’ajouter des fonctions de tri si nos tableaux utilisent des données d’un format un peu exotique.
Plusieurs fonctions sont d’ailleurs disponibles dans la documentation de la librairie.

Si ces fonctions nous permettent d’améliorer le tri des données, on peut également ajouter des fonctionnalités de filtrage.
Imaginons l’exemple suivant : vous disposez d’un tableau listant des factures avec leur état et vous souhaitez filtrer ce tableau en fonction d’une liste de checkbox représentant chacune un état.
A chaque changement d’état d’une de ces checkbox vous souhaitez donc filtrer le tableau.


var etatsCheckbox = new Array("filtre_etat_1", "filtre_etat_2", "filtre_etat_3", "filtre_etat_4", "filtre_etat_5", "filtre_etat_6"); 

var etatsGlobal = null;

$("#filter_etat input").click(function(){
    if($(this).attr("id") != "no_filter_etat") {
	 if(!$(this).is(":checked")) {
               if(getEtatsFiltres().length == 0)
                      $("#no_filter_etat").attr('checked', 'checked');
               }
	       else
		   $("#no_filter_etat").removeAttr('checked');
	 } else if($(this).attr("id") == "no_filter_etat") {
               if(!$(this).is(":checked")) {
                      $("#filtre_etat_1").attr('checked', 'checked');
               } else {
		      for(var i = 0; i < etatsCheckbox .length; i++) {
			$("input[name="+etatsCheckbox [i]+"]").removeAttr("checked");
		      }
               }
         }
	 etatsGlobal = getEtatFiltres();
	 oTable.fnDraw();
});

function getEtatFiltres() {
	var f = new Array();
	if($("#no_filter_etat").is(":checked"))
           return null;
	else {
	   for(var i = 0; i < etatsCheckbox .length; i++) {
		if($("input[name="+etatsCheckbox [i]+"]").is(":checked"))
		      f.push($("input[name="+etatsCk[i]+"]").attr("value"));
	   }
	   return f;
	}
};

On a tout d'abord un tableau avec les id de nos checkbox, un tableau global qui sera utilisé pour le tri, puis une fonction qui a chaque clic va relancer le filtrage du tableau en effectuant quelques contrôles avant (si on coche "no_filter_etat" décocher les autres checkbox ou bien cocher "filtre_etat_1" par défaut) et enfin une fonction pour récupérer les attributs value des checkbox cochées.

Maintenant il ne nous reste plus qu'à ajouter notre fonction à l'API de DataTables :


$.fn.dataTableExt.afnFiltering.push(
	function( oSettings, aData, iDataIndex ) {
		var iColumn = 2; // Numéro de la colonne dans votre tableau
			
		if(etats === null)
			return true;
		
		var iEtat = aData[iColumn];
			
		if(iEtat) {
			if(iEtat.length == 0)
				return false;
			else if(etatsGlobal.indexOf(iEtat) >= 0) {
				return true;
			} else {
				return false;
			}
		} else {
			return true;
		}
	}
);

Petite explication : si la colonne ou est définie l'état de la facture est contenue dans notre tableau global etatsGlobal, elle sera affichée, sinon cachée.

C'est donc très simple et à la portée de tout le monde d'ajouter des fonctions de tri et de filtrage, à vos claviers !

Catégorie: Développement Web, Javascript | Laisser un commentaire (2)

DataTables : Manipuler ses tableaux HTML avec jQuery

Posté par seiyar81 le 12 novembre 2009 | Laisser un commentaire (0)
news-dt

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’internationalisation.

Extrêmement complet, stable (plus de 1300 tests unitaires), offrant un panel d’action très large, DataTables rentre dans ma liste de plugins favoris !

Un petit exemple tiré de la doc officielle :

$(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" }
		] } );
} );

Cet exemple permet de ‘customiser’ 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.

Mais ce n’est qu’un mince aperçu des possibilité du plugin. A essayer d’urgence !

Site Officiel

Catégorie: Développement Web, Javascript | Laisser un commentaire (0)