FoxMaSk'Z h0m3 - Dev-Gamer World


vendredi, avril 18 2008

CakePHP - BehaviorHelper

CakePHP : recherche globale

Pour les besoins de son portail il est fort utile d'avoir des fonctionnalités transversales à tout le portail.

C'est le cas de la fonction de recherche, qui peut aller à la pêche aux actualités/articles/billets/bogues etc...

La solution serait d'avoir une grosse fonction php qui parcourt toutes les tables,
mais cela n'est bien évidement pas satisfaisant, car inmaintenable, pas portable, trop lourd...

Donc l'idée va consister à créer une fonction de recherche par plugin (un plugin "cakephp" est une "partie" de l'application globale).

Puis lorsque le visiteur saisira une phrase sur le moteur de recherche, nous déclencherons la fonction de recherche de chaque plugin.

Comment procéder ?

Chaque plugin possède son propre répertoire, exemple
- app/plugins/news
- app/plugins/articles
- app/plugins/blog

dans chacun d'eux nous créons un script _prepend.php contenant ceci :

pour le plugins news :

<?php
$this->addBehavior('publicSearchHTML', array('newsBehavior','searchNews'));

class newsBehavior
{
	public function searchNews()
	{
	    #appel de son modèle
		App::import('Model','news.News');
		$news = & new News();
		
		$rs = $news->getNews(); 		
		
		/*
		* Ici le code sur l'iteration sur le recordset pour afficher le resultat
		* en invoquant le Helper HtmlHelper() pour le rendu bien sûr.
		*/
		
	}

?>

on comprend ici qu'il faut donc etre muni d'une fonction getNews() dans le model news.

Mais, pour le moment le _prepend.php est "inerte", par inerte j'entends, qu'il n'est pas utilisable en l'etat.

Effectivement, il manque une classe pour exploiter nos "comportements" (les classes xxxBehavior)

Voici donc le Helper (oui car il s'agit d'afficher des données, donc un helper;) qui gère tout cela :

(extrait issue de PunCake)

<?php
class PcbehaviorHelper extends Helper {

    public $puncake_behaviors = array();
    
    
    public function beforeRender() {
    
        /*
        *
        * ici le code permettant de parcourir le répertoire plugins 
        *
        */
        $this->path = dirname(__FILE__) . '/../../plugins/';
		foreach ($this->path as $root)
		{
			if (!is_dir($root) || !is_readable($root))
				continue;
			
			if (substr($root,-1) != '/') 
				$root .= '/';
			
			if (($d = @dir($root)) === false)
				continue;
			
			while (($entry = $d->read()) !== false)
			{
				$full_entry = $root.'/'.$entry;
				
				if ($entry != '.' && $entry != '..' && is_dir($full_entry)
				&& file_exists($full_entry.'/_prepend.php')
                    )
				{
					require $full_entry.'/_prepend.php';
				}
			}
			$d->close();
		}

    }
    
    /*
    * la fonction d'ajout du behavior 
    * au tableau des behaviors (utilisé par chaque _prepend.php)
    */
	public function addBehavior($behavior,$func)
	{
		if (is_callable($func)) {
			$this->puncake_behaviors[$behavior][] = $func;						
		}
	}

    
    /*
    * Fonction de rappel de la classe et fonction à éxécuter
    */

	public function callBehavior($behavior)
	{
		if (!empty($this->puncake_behaviors[$behavior]))
		{
			$args = func_get_args();
			array_shift($args);
			
			$res = '';
			
			foreach ($this->puncake_behaviors[$behavior] as $f) {
				$res .= call_user_func_array($f,$args);
			}
			
			return $res;
		}
	}
}
?>

Ceci fait, dans la vue de son choix, un simple appel $pcbehavior->callBehavior('publicSearchHTML');

déclenchera l'appel de la méthode searchNews de tous les plugins disposant d'un fichier _prepend.php .

Voilà !

Ce Helper s'applique donc quelque soit le behavior qu'on veut coder.

Par exemple, qd je me connecte sur mon portail, je veux etre avertis si j'ai des news/articles à modérer, des billets reçus etc.. etc..
Tout ceci ce gère de la même maniere que ci dessus.

1) ajout d'une fonction newToValidate de plus à ma class newsBehavior
2) ajout du behavior à la pile via $this->addBehavior('toValidate',array('newsBehavior','newsToValidate'))
3) appel du behavior dans la vue de mon choix par un $pcbehavior->callBehavior('toValidate');

Happy Cooking !

mardi, mars 25 2008

La maturité de PHP en entreprise

Suite à quelques rencontres (pro/perso) diverses et variées, j'ai pu me rendre compte à quel point PHP perçait dans le monde professionnel.

Un (trop long) temps, PHP était perçu comme un langage de bidouilleurs pour faire des sites écrit à la vas-vite.
Mais ces derniers temps, avec la naissance et l'arrivée de framweworks MVC en PHP, tels CakePHP, Jelix, Zend Framwork, PHP fini sa "puberté" pour entrer dans la court des grands.

Zend Framework est d'ailleurs paru en version 1.5 avec derrière Zend, de grosses compagnies qui ont contribué telles Google et IBM ou encore Microsoft, FoxMedia interactive.

Tout cela laisse augurer un bel avenir pour le langage PHP et toute la communauté qui gravite autour de lui ;-)

dimanche, novembre 11 2007

Framework PHP5 - Comparatif

A la recherche d'un Framwork PHP5 utilisant l'architecture bien connu qu'est le "Modèle - Vue - Controleur" ou MVC pour coder un logiciel libre "dernière génération" :) , j'ai croisé sur mon chemin nombre de ceux cités sur wikipedia

Pour ceux ne connaissant pas le MVC, le principe est le suivant : le Modèle gère la logique métier et les accès aux bases de données, la Vue gère l'affichage de ce que voit l'utilisateur avec l'écran, le Controleur gère les evenements déclenchés par l'utilsateur. La force de cette architecture est sa modularité.

  • Jelix écrit en PHP5 - projet jeune et dynamique.
  1. Avantage : pour ceux codant déjà en POO ; tout y est ; DAO, CRUD et tout le toutim.
  2. Inconvénient : un peu "jeune" et pas si facile que cela à apréhender à prime abord mais en prennant bien son temps on fini par arriver à faire ce qu'on veut.
  3. Cible : Tout developpeur, webmaster, pas de restriction pour projet de logiciel libre
  • CakePHP écrit en PHP (tout court) et supportant PHP5 parfaitement - on peut donc coder en PHP5 en utilisant celui ci.
  1. Avantage : très complet ; communauté active ; projet dynamique.
  2. Inconvénient : pas préhemptif (à mon goût), manque cruellement de doc ... version beta ...
  3. Cible : Tout developpeur, webmaster, pas de restriction pour projet de logiciel libre
  1. Avantage : très facile de mise en oeuvre - tuto videos de 9et 20mn bleuffant !
  2. Inconvénient : ... pas encore trouvé ...
  3. Cible : les developpeurs de site web ne publiant pas de soft sous GPL ....
  • Symfony écrit en PHP5 - le mastodonte
  1. Avantage : complet et adapté pour un milieu pro ou pour un hébergement permettant de toucher à la config PHP. Dispose de scripts permettant de generer les class modèle via des scripts de CRUD (Create Request Update Delete).
  2. Inconvénient : on ne peut pas coder un logiciel libre "portable" d'hebergeur à hébergeur pour la raison évoquer ci dessus ... on doit pouvoir toucher au include_path dans le php.ini. Même si certains directive apache le permette ; tous les hébergeurs ne l'autorisent pas.
  3. Cible : les developpeurs en entreprise
  1. Avantage : la référence ? :D
  2. Incovénient : je réitèrerai l'inconvénient pour Symfony. Si vous pouvez toucher au include_path de php.ini alors le coeur balance entre ZF ou Symfony.
  3. Cible : les developpeurs en entreprise

Addendum  : après avoir approfondi l'histoire de licence pour CodeIgniter, il apparait que CI permette de releaser son soft sous GPL tant qu'on ne touche pas au core ou bien qu'on en averti son auteur.

Conclusion :

mon choix se porterait sur :

  1. CakePHP pour les avantages évoqués ;)
  2. CodeIgniter (puisque utilisable à souhait !)

vendredi, mai 25 2007

Wanted : Echo2 pour PHP

Je suis à la recherche d'un framework AJAX en PHP capable des prouesses de Echo2.

En effet Echo2 est un framework AJAX mais ecrit en JAVA. et vu comment ca "déchire" je me demandais bien s'il n'existerait pas un alter-ego meme eloigné ; en PHP ;)

Laissez moi donc un petit mot si vous en connaissez ;)

Merci !