<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="http://www.foxmask.info/feed/rss2/xslt" ?><rss version="2.0"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
  <title>FoxMaSk'Z h0m3 - Dev-Gamer World - CakePHP</title>
  <link>http://www.foxmask.info/</link>
  <description>La passion du développement web et des jeux en ligne</description>
  <language>fr</language>
  <pubDate>Sun, 13 Jul 2008 15:55:43 +0200</pubDate>
  <copyright>foxmask ownz</copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Dotclear</generator>
  
    
  <item>
    <title>CakePHP - Calendrier et les dates en timestamp</title>
    <link>http://www.foxmask.info/post/2008/06/08/CakePHP-Calendrier-et-les-dates-en-timestamp</link>
    <guid isPermaLink="false">urn:md5:21a8c680ac6fc795d88a93de1d2bc590</guid>
    <pubDate>Sun, 08 Jun 2008 21:39:00 +0200</pubDate>
    <dc:creator>foxmask</dc:creator>
        <category>CakePHP</category>    
    <description>    &lt;p&gt;Bonsoir,
voici un billet sur une de mes mésaventures avec CakePHP et le champ de formulaire type &quot;date&quot;.&lt;/p&gt;


&lt;p&gt;Pour un plugin Calendrier, j'ai besoin d'un sélecteur de dates, voici comme on l'obtient avec CakePHP&amp;nbsp;:&lt;/p&gt;


&lt;p&gt;&lt;code&gt;echo $form-&amp;gt;input('date',array('type'=&amp;gt;'date','label'=&amp;gt;false,'dateFormat'=&amp;gt;'DMY'));&lt;/code&gt;&lt;/p&gt;


&lt;p&gt;ceci affichera donc 3 liste deroulantes &quot;jour&quot;-&quot;mois&quot;-&quot;année&quot;.&lt;/p&gt;


&lt;p&gt;Quand j'ajoute la donnée dans ma base, je recréé ma colonne date (dans ma methode &quot;add&quot;) comme suit pour la transformer en timestamp&amp;nbsp;:&lt;/p&gt;


&lt;p&gt;&lt;code&gt;$this-&amp;gt;data ['Calendar'][ 'date' ] = mktime(0,0,0,$this-&amp;gt;data['Calendar']['date']['month'].&lt;/code&gt;&lt;/p&gt;


&lt;p&gt;&lt;code&gt;$this-&amp;gt;data['Calendar']['date']['day'],&lt;/code&gt;&lt;/p&gt;


&lt;p&gt;&lt;code&gt;$this-&amp;gt;data['Calendar']['date']['year']);&lt;/code&gt;&lt;/p&gt;


&lt;p&gt;Comme j'ai également besoin de modifier l'évènement de mon calendrier, je réutilise la même vue, et m'attends évidement à retrouver ma date (par exemple le 6 juin 2008). Mais Ô surprise, au lieu d'avoir la date voulue, j'obtiens une date du 1 janvier 2028...&lt;/p&gt;


&lt;p&gt;Comment ce fait-ce&amp;nbsp;?&lt;/p&gt;


&lt;p&gt;CakePHP nous fait un caprice&amp;nbsp;! Il ne &quot;comprend&quot; pas que ma colonne de ma table au format INTEGER contient un ENTIER et m'en fait une CHAINE&amp;nbsp;! (hic!)&lt;/p&gt;


&lt;p&gt;Pour contourner cet avatar et l'aider à comprendre voici ce qu'il faut faire dans sa méthode edit&amp;nbsp;:&lt;/p&gt;



&lt;p&gt;&lt;code&gt;public function edit ($id = null) {&lt;/code&gt;&lt;/p&gt;


&lt;p&gt;&lt;code&gt; [...] &lt;/code&gt;&lt;/p&gt;


&lt;p&gt;&lt;code&gt;		if (empty($this-&amp;gt;data)) {&lt;/code&gt;&lt;/p&gt;


&lt;p&gt;&lt;code&gt;			$this-&amp;gt;data = $this-&amp;gt;Calendar-&amp;gt;read(null, $id);&lt;/code&gt;&lt;/p&gt;


&lt;p&gt;&lt;code&gt;		}&lt;/code&gt;&lt;/p&gt;


&lt;p&gt;&lt;code&gt;		$this-&amp;gt;data['Calendar']['date'] = (integer) $this-&amp;gt;data['Calendar']['date'];&lt;/code&gt;&lt;/p&gt;




&lt;p&gt;Comme on le voit, juste après le this-&amp;gt;Calendar-&amp;gt;read je force le typage du contenu de la valeur de ma array &lt;code&gt;$this-&amp;gt;data['Calendar']['date']&lt;/code&gt; par &lt;code&gt;(integer) $this-&amp;gt;data['Calendar']['date']&lt;/code&gt;&lt;/p&gt;


&lt;p&gt;et là ô miracle, le formulaire de modification de l'évènement affiche les 3 selecteurs jour/mois/année avec la date atendue&lt;/p&gt;


&lt;p&gt;Ouf !!!!!!!&lt;/p&gt;


&lt;p&gt;pour la petite histoire, &quot;la faute&quot; incombait à la ligne 1389 du helper form&lt;/p&gt;


&lt;p&gt;extrait ligne 1385 - 1391&amp;nbsp;:&lt;/p&gt;


&lt;p&gt;&lt;code&gt;if (!empty($selected)) {&lt;/code&gt;&lt;/p&gt;


&lt;p&gt;&lt;code&gt;			if (is_array($selected)) {&lt;/code&gt;&lt;/p&gt;


&lt;p&gt;&lt;code&gt;				extract($selected);&lt;/code&gt;&lt;/p&gt;


&lt;p&gt;&lt;code&gt;			} else {&lt;/code&gt;&lt;/p&gt;


&lt;p&gt;&lt;code&gt;				if (is_int($selected)) {&lt;/code&gt;&lt;/p&gt;


&lt;p&gt;&lt;code&gt;					$selected = strftime('%Y-%m-%d %H:%M:%S', $selected);&lt;/code&gt;&lt;/p&gt;


&lt;p&gt;&lt;code&gt;				}&lt;/code&gt;&lt;/p&gt;


&lt;p&gt;la condition if (is_int($selected)) n'est étrangement pas rencontrée avec sa colonne en timestamp tant qu'on ne lui force pas le typage comme je l'ai fait dans ma méthode edit...&lt;/p&gt;


&lt;p&gt;Mais en bon renard que je suis, entêté et curieux, j'ai forcé l'obstacle &lt;img src=&quot;/themes/default/smilies/wink.png&quot; alt=&quot;;)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>CakePHP 1.2.0.7125 RC1</title>
    <link>http://www.foxmask.info/post/2008/06/08/CakePHP-1207125-RC1</link>
    <guid isPermaLink="false">urn:md5:24d89d9ce6d79331a5375cbe7032411b</guid>
    <pubDate>Sun, 08 Jun 2008 17:26:00 +0200</pubDate>
    <dc:creator>foxmask</dc:creator>
        <category>CakePHP</category>    
    <description>    &lt;p&gt;Bonjour à tous,
la RC1 de CakePHP 1.2 vient de sortir du four&lt;/p&gt;


&lt;p&gt;parmi les évolutions les plus importantes on notera&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;renderElement est remplace par element (facile avec un bon editeur)&lt;/li&gt;
&lt;li&gt;dans les controlleurs, si vous effectuez &quot;render(..); exit;&quot;, la vue&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ne sera pas rendue, remplacer le exit par &quot;return;&quot;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;les conditions dans les queries&amp;nbsp;: conditions array(&quot;field&quot; =&amp;gt; &quot;&amp;gt;= value&quot;), à remplacer par &quot;array(&quot;field &amp;gt;=&quot; =&amp;gt; &quot;value&quot;), question de sécurité.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;vérifier aussi dans les conditions l'usage du préfixe magique &quot;-!&quot;,&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;de préférence sans mots-clef avant: array(&quot;field&quot; =&amp;gt; &quot;-! LIKE
MONTH(date)&quot;) a remplacer par array(&quot;field LIKE&quot; =&amp;gt; &quot;-! MONTH(date)&quot;)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;containable behavior remplace &quot;bindable&quot;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;(merci à Francky06 pour le décryptage;)&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;http://groups.google.com/group/cake-php/browse_thread/thread/33950a940eb76401&quot;&gt;l'annonce complète est ici in the Shakespear's language&lt;/a&gt;&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>CakePHP - BehaviorHelper</title>
    <link>http://www.foxmask.info/post/2008/04/18/CakePHP-BehaviorHelper</link>
    <guid isPermaLink="false">urn:md5:7a9697b9aec44a8b4f92c6c035aef233</guid>
    <pubDate>Fri, 18 Apr 2008 10:52:00 +0200</pubDate>
    <dc:creator>foxmask</dc:creator>
        <category>CakePHP</category><category>PHP</category>    
    <description>    &lt;p&gt;CakePHP&amp;nbsp;: recherche globale&lt;/p&gt;


&lt;p&gt;Pour les besoins de son portail il est fort utile d'avoir des fonctionnalités transversales à tout le portail.&lt;/p&gt;


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


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


&lt;p&gt;Donc l'idée va consister à créer une fonction de recherche par plugin (un plugin &quot;cakephp&quot; est une &quot;partie&quot; de l'application globale).&lt;/p&gt;


&lt;p&gt;Puis lorsque le visiteur saisira une phrase sur le moteur de recherche, nous déclencherons la fonction de recherche de chaque plugin.&lt;/p&gt;


&lt;p&gt;Comment procéder&amp;nbsp;?&lt;/p&gt;


&lt;p&gt;Chaque plugin possède son propre répertoire, exemple  &lt;br /&gt;
- app/plugins/news&lt;br /&gt;
- app/plugins/articles &lt;br /&gt;
- app/plugins/blog&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;dans chacun d'eux nous créons un script _prepend.php contenant ceci&amp;nbsp;:&lt;/p&gt;


&lt;p&gt;pour le plugins news&amp;nbsp;:&lt;/p&gt;


&lt;pre&gt;
&amp;lt;?php
$this-&amp;gt;addBehavior('publicSearchHTML', array('newsBehavior','searchNews'));

class newsBehavior
{
	public function searchNews()
	{
	    #appel de son modèle
		App::import('Model','news.News');
		$news = &amp;amp; new News();
		
		$rs = $news-&amp;gt;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.
		*/
		
	}

?&amp;gt;
&lt;/pre&gt;

&lt;p&gt;on comprend ici qu'il faut donc etre muni d'une fonction getNews() dans le model news.&lt;/p&gt;



&lt;p&gt;Mais, pour le moment le _prepend.php est &quot;inerte&quot;, par inerte j'entends, qu'il n'est pas utilisable en l'etat.&lt;/p&gt;


&lt;p&gt;Effectivement, il manque une classe pour exploiter nos &quot;comportements&quot; (les classes xxxBehavior)&lt;/p&gt;


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


&lt;p&gt;(extrait issue de &lt;a href=&quot;http://puncake.foxmask.info&quot; hreflang=&quot;fr&quot;&gt;PunCake&lt;/a&gt;)&lt;/p&gt;
&lt;pre&gt;
&amp;lt;?php
class PcbehaviorHelper extends Helper {

    public $puncake_behaviors = array();
    
    
    public function beforeRender() {
    
        /*
        *
        * ici le code permettant de parcourir le répertoire plugins 
        *
        */
        $this-&amp;gt;path = dirname(__FILE__) . '/../../plugins/';
		foreach ($this-&amp;gt;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-&amp;gt;read()) !== false)
			{
				$full_entry = $root.'/'.$entry;
				
				if ($entry != '.' &amp;amp;&amp;amp; $entry != '..' &amp;amp;&amp;amp; is_dir($full_entry)
				&amp;amp;&amp;amp; file_exists($full_entry.'/_prepend.php')
                    )
				{
					require $full_entry.'/_prepend.php';
				}
			}
			$d-&amp;gt;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-&amp;gt;puncake_behaviors[$behavior][] = $func;						
		}
	}

    
    /*
    * Fonction de rappel de la classe et fonction à éxécuter
    */

	public function callBehavior($behavior)
	{
		if (!empty($this-&amp;gt;puncake_behaviors[$behavior]))
		{
			$args = func_get_args();
			array_shift($args);
			
			$res = '';
			
			foreach ($this-&amp;gt;puncake_behaviors[$behavior] as $f) {
				$res .= call_user_func_array($f,$args);
			}
			
			return $res;
		}
	}
}
?&amp;gt;
&lt;/pre&gt;


&lt;p&gt;Ceci fait, dans la vue de son choix, un simple appel $pcbehavior-&amp;gt;callBehavior('publicSearchHTML');&lt;/p&gt;


&lt;p&gt;déclenchera l'appel de la méthode searchNews de tous les plugins disposant d'un fichier _prepend.php .&lt;/p&gt;



&lt;p&gt;Voilà&amp;nbsp;!&lt;/p&gt;


&lt;p&gt;Ce Helper s'applique donc quelque soit le behavior qu'on veut coder.&lt;/p&gt;


&lt;p&gt;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..&lt;br /&gt;
Tout ceci ce gère de la même maniere que ci dessus.&lt;/p&gt;


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


&lt;p&gt;Happy Cooking&amp;nbsp;!&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Book CakePHP : Version Française !</title>
    <link>http://www.foxmask.info/post/2008/03/09/Book-CakePHP</link>
    <guid isPermaLink="false">urn:md5:9fd3207e19c73aec284d491d444a9322</guid>
    <pubDate>Sun, 09 Mar 2008 14:37:00 +0100</pubDate>
    <dc:creator>foxmask</dc:creator>
        <category>CakePHP</category>    
    <description>    &lt;p&gt;CakePHP lance sa documentation pour la v 1.2.x.x dans la langue de votre choix ici http://book.cakephp.org/fr/&lt;/p&gt;


&lt;p&gt;Vous avez la possibilité de venir y participer pour la traduire et la compléter&amp;nbsp;!&lt;/p&gt;


&lt;p&gt;Extrait&amp;nbsp;:&lt;/p&gt;


&lt;p&gt;Mode d'emploi&amp;nbsp;:&lt;/p&gt;


&lt;p&gt;1. Vous parcourez le site et décelez une erreur, une explication incomplète, une fonctionnalité qui n'est pas couverte, ou tout simplement un article qui n'est pas rédigé comme vous l'auriez rédigé.&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;2. Connectez-vous au Livre de Cuisine avec votre identifiant et votre mot de passe de la Bakery.&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;3. Rédigez des sections ou proposez-en de nouvelles, en utilisant un balisage HTML simple.&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;4. Revenez vérifier que votre contribution a été approuvée quelques jours plus tard.&lt;/p&gt;


&lt;p&gt;Cette application est toute nouvelle, nous comptons donc sur votre indulgence et votre patience le temps que nous corrigions les dernières erreurs, avant la sortie définitive de CakePHP 1.2.&lt;/p&gt;


&lt;p&gt;Cette doc est déjà commencée en  bg · cz · de · en · es · fr · hu · it · ja · nl · pl · pt&lt;/p&gt;


&lt;p&gt;......... Enfin&amp;nbsp;! &lt;img src=&quot;/themes/default/smilies/smile.png&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;


&lt;p&gt;ps&amp;nbsp;: bibi s'est atelé à la tâche pour la VF avec les volontaires de http://groups.google.com/group/cakephp-fr&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>CakePHP : Componsant 'Security' et $form-&gt;input</title>
    <link>http://www.foxmask.info/post/2008/02/19/CakePHP-%3A-Componsant-Security-et-form-input</link>
    <guid isPermaLink="false">urn:md5:868301d6a9c75aa276e1c36c5b0632ba</guid>
    <pubDate>Tue, 19 Feb 2008 21:08:00 +0100</pubDate>
    <dc:creator>foxmask</dc:creator>
        <category>CakePHP</category>    
    <description>    &lt;p&gt;Dans la &quot;Vue&quot;, quand le componsant Security est 'activé (aka public $component = array('Security') dans notre controleur ), il n'y a pas moyen de contourner l'utilisation de $form-&amp;gt;create $form-&amp;gt;end et surtout $form-&amp;gt;input.
Si vous vous contentez de $form-&amp;gt;create / end et codez vos input &quot;à la main&quot; (sans utiliser $form-&amp;gt; ) alors aucune chance pour que 'Security' vous laisse &quot;passer&quot; .&lt;/p&gt;


&lt;p&gt;Ainsi donc ceci ne fonctionne pas pour la raison évoqué à l'instant&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;

&amp;lt;?php echo $form-&amp;gt;create('Themes',array('action'=&amp;gt;'admin_save'));?&amp;gt;
        &amp;lt;p&amp;gt;&amp;lt;?php echo __('Choose the theme to use on your portal.'); ?&amp;gt;&amp;lt;/p&amp;gt;

        &amp;lt;div class=&amp;quot;two-cols&amp;quot;&amp;gt;
        &amp;lt;?php
        $d = dir(PUNCAKE_THEMES_PATH);
        while (($entry = $d-&amp;gt;read()) !== false)
        {
                if ($entry != '.' &amp;amp;&amp;amp; $entry != '..' &amp;amp;&amp;amp; $entry != '.svn'
                        &amp;amp;&amp;amp; is_dir(PUNCAKE_THEMES_PATH.DS.$entry)
                        &amp;amp;&amp;amp; file_exists(PUNCAKE_THEMES_PATH.DS.$entry.'/__infos.php'))
                {

                        $theme_infos = array(
                                'name' =&amp;gt; '',
                                'desc' =&amp;gt; array(),
                                'author' =&amp;gt; '',
                                'version' =&amp;gt; '',
                                'preview' =&amp;gt; ''
                        );
                        require PUNCAKE_THEMES_PATH.DS.$entry.'/__infos.php';
?&amp;gt;

                        &amp;lt;div class=&amp;quot;col&amp;quot;&amp;gt;
                        &amp;lt;h3&amp;gt;
                        &amp;lt;input type=&amp;quot;radio&amp;quot; name=&amp;quot;data[Themes][pt_theme]&amp;quot; value=&amp;quot;&amp;lt;?php echo
$entry;?&amp;gt;&amp;quot; &amp;lt;?php  echo ($pt_theme==$entry) ? &amp;quot;checked=\&amp;quot;checked\&amp;quot;&amp;quot; :
''; ?&amp;gt;/&amp;gt;
                        &amp;lt;label for=&amp;quot;&amp;lt;?php echo $entry ?&amp;gt;&amp;quot;&amp;gt;&amp;lt;?php echo $theme_infos['name']?
&amp;gt;&amp;lt;?php echo (!empty($theme_infos['version']) ? ' (v'.

$theme_infos['version'].')' : '')?&amp;gt;
                        &amp;lt;/label&amp;gt;&amp;lt;/h3&amp;gt;
                        &amp;lt;p class=&amp;quot;field&amp;quot;&amp;gt;
                        &amp;lt;?php echo (!empty($theme_infos['preview']) ? '&amp;lt;label for=&amp;quot;'.
$entry.'&amp;quot;&amp;gt;&amp;lt;img id=&amp;quot;'.$entry.'&amp;quot; src=&amp;quot;'.pt_portal_url.'themed/'.
$entry.'/'.$theme_infos['preview'].'&amp;quot; alt=&amp;quot;&amp;quot; /&amp;gt;&amp;lt;/label&amp;gt;' : '') ?&amp;gt;
                        &amp;lt;span class=&amp;quot;desc&amp;quot;&amp;gt;&amp;lt;?php echo __('by',true).' '.
$theme_infos['author'] ?&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;
                        &amp;lt;?php echo (!empty($theme_infos['desc'][$user['language']]) ? '&amp;lt;p&amp;gt;'.
$theme_infos['desc'][$user['language']].'&amp;lt;/p&amp;gt;' : (!
empty($theme_infos['desc']['English']) ? '&amp;lt;p&amp;gt;'.$theme_infos['desc']
['English'].'&amp;lt;/p&amp;gt;' : ''))?&amp;gt;
                        &amp;lt;/div&amp;gt;
&amp;lt;?php
                }
        }
        $d-&amp;gt;close(); ?&amp;gt;
        &amp;lt;/div&amp;gt;

        &amp;lt;?php echo $form-&amp;gt;submit( __('Save',true) ,array('class'=&amp;gt;'submit'))?&amp;gt;
       &amp;lt;?php echo $form-&amp;gt;end(); ?&amp;gt; 

&lt;/pre&gt;




&lt;p&gt;Pour obtenir exactement le même code html mais qui satisfasse le composant 'Security' il faut la jouer comme ceci&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;

&amp;lt;?php echo $form-&amp;gt;create('Themes',array('action'=&amp;gt;'admin_save'));?&amp;gt;
        &amp;lt;p&amp;gt;&amp;lt;?php echo __('Choose the theme to use on your portal.'); ?&amp;gt;&amp;lt;/p&amp;gt;

        &amp;lt;div class=&amp;quot;two-cols&amp;quot;&amp;gt;
        &amp;lt;?php
        $d = dir(PUNCAKE_THEMES_PATH);
        while (($entry = $d-&amp;gt;read()) !== false)
        {
                if ($entry != '.' &amp;amp;&amp;amp; $entry != '..' &amp;amp;&amp;amp; $entry != '.svn'
                        &amp;amp;&amp;amp; is_dir(PUNCAKE_THEMES_PATH.DS.$entry)
                        &amp;amp;&amp;amp; file_exists(PUNCAKE_THEMES_PATH.DS.$entry.'/__infos.php'))
                {

                        $theme_infos = array(
                                'name' =&amp;gt; '',
                                'desc' =&amp;gt; array(),
                                'author' =&amp;gt; '',
                                'version' =&amp;gt; '',
                                'preview' =&amp;gt; ''
                        );
                        require PUNCAKE_THEMES_PATH.DS.$entry.'/__infos.php';

                        $version = (!empty($theme_infos['version']) ? ' (v'.
$theme_infos['version'].')' : '');

                        $before = '&amp;lt;div class=&amp;quot;col&amp;quot;&amp;gt;'.&amp;quot;\n&amp;quot;;
                        $before .= '&amp;lt;h3&amp;gt;'.&amp;quot;\n&amp;quot;;

            $after = '';
            $after .= '&amp;lt;/h3&amp;gt;';
            $after .= '&amp;lt;p class=&amp;quot;field&amp;quot;&amp;gt;'.&amp;quot;\n&amp;quot;;

            $after .= (!empty($theme_infos['preview']) ? '&amp;lt;label
for=&amp;quot;'.$entry.'&amp;quot;&amp;gt;&amp;lt;img id=&amp;quot;'.$entry.'&amp;quot; src=&amp;quot;'.pt_portal_url.'themed/'.
$entry.'/'.$theme_infos['preview'].'&amp;quot; alt=&amp;quot;&amp;quot; /&amp;gt;&amp;lt;/label&amp;gt;' :
'');
            $after .= '&amp;lt;span class=&amp;quot;desc&amp;quot;&amp;gt;'. __('by',true).' '.
$theme_infos['author'] .'&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;'.&amp;quot;\n&amp;quot;;
            $after .= (!empty($theme_infos['desc']
[$user['language']]) ? '&amp;lt;p&amp;gt;'.$theme_infos['desc']
[$user['language']].'&amp;lt;/p&amp;gt;' : (!empty($theme_infos['desc']
['English']) ? '&amp;lt;p&amp;gt;'.$theme_infos['desc']['English'].'&amp;lt;/p&amp;gt;' : ''));

            $after .= '&amp;lt;/div&amp;gt;'.&amp;quot;\n&amp;quot;;

                        echo $form-&amp;gt;input('pt_theme',
                                array(
                                'div'=&amp;gt;false,
                                    'label'=&amp;gt;true,
                                    'legend'=&amp;gt;false,
                                'type'=&amp;gt;'radio',
                                'before' =&amp;gt; $before,
                                'after' =&amp;gt; $after,
                                'value' =&amp;gt; $pt_theme,
                                'options'=&amp;gt; array($entry=&amp;gt;$theme_infos['name'].
$version)

                        )
                );
                }
        }
        $d-&amp;gt;close(); ?&amp;gt;
        &amp;lt;/div&amp;gt;

        &amp;lt;?php echo $form-&amp;gt;submit( __('Save',true) ,array('class'=&amp;gt;'submit'))?


&amp;lt;?php echo $form-&amp;gt;end(); ?&amp;gt; 

&lt;/pre&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>CakePHP - Security and Sanitize : r0x !</title>
    <link>http://www.foxmask.info/post/2008/02/04/CakePHP-Security-and-Satinize-%3A-r0x</link>
    <guid isPermaLink="false">urn:md5:81b9758e44e3c0a3aaf13662b6fa8b16</guid>
    <pubDate>Mon, 04 Feb 2008 23:20:00 +0100</pubDate>
    <dc:creator>foxmask</dc:creator>
        <category>CakePHP</category>    
    <description>    &lt;p&gt;Avec CakePHP, renforcer son site web devient un jeu d'enfant grâce à 2 libs&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://manual.cakephp.org/chapter/security&quot; hreflang=&quot;en&quot;&gt;Security&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://manual.cakephp.org/chapter/sanitize&quot; hreflang=&quot;en&quot;&gt;Sanitize&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Le premier intervient lors de l'utilisation de formulaire.&lt;br /&gt;
Le second intervient lors du traitement des données des formulaires avant de stocker les infos dans la base de données.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;http://manual.cakephp.org/chapter/security&quot; hreflang=&quot;en&quot;&gt;Security&lt;/a&gt;&lt;/strong&gt;&amp;nbsp;:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;voici le &lt;em&gt;controller&lt;/em&gt; dans lequel on utilise Security&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;

class SettingsController extends AppController {
	public $name = 'Settings';
	public $helpers     = array('Html','Form', );
							
	public $components   = array( 'Security') ;	
	
	public function beforeFilter() {
	    #si des données sont renvoyées, activons la securité !

	    if (!empty($this-&amp;gt;data))
                  #s'il s'agit d'un POST on autorise l'action &amp;quot;index&amp;quot; 
    	          $this-&amp;gt;Security-&amp;gt;requirePost('index');
    	    
	}

	public function admin_index () {
...
		if (!empty($this-&amp;gt;data)) {
...
                }
       }
&lt;/pre&gt;


&lt;p&gt;la fonction beforeFilter agit avant que admin_index ne soit appelé et c'est là que Security entre en jeu.&lt;br /&gt;
&lt;code&gt;$this-&amp;gt;Security-&amp;gt;requirePost('index');&lt;/code&gt;&lt;/p&gt;


&lt;p&gt;ceci permet de filtrer les appels directs à l'action &quot;index&quot; qui ne peuvent avoir lieu que via un POST&amp;nbsp;!
Tout autre action sera envoyée dans un &quot;blackHole&quot; (Trou noir &lt;img src=&quot;/themes/default/smilies/wink.png&quot; alt=&quot;;)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;


&lt;p&gt;voyons donc maintenant la Vue&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;on créé le fomulaire&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;?php echo $form-&amp;gt;create('Settings',array('action'=&amp;gt;'admin_index') ?&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;on ajoute un champ de texte qqconque&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;?php echo $form-&amp;gt;text('p_title' ,array(&quot;size&quot;=&amp;gt;50,&quot;maxlength&quot;=&amp;gt;255,&quot;value&quot;=&amp;gt;pt_portal_title)) ?&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;on ajout un bouton&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;?php echo $form-&amp;gt;submit(__('Save',true)); ?&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;on fini le formulaire&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;?php echo $form-&amp;gt;end(); ?&amp;gt;&lt;/code&gt;&lt;/p&gt;


&lt;p&gt;c'est 4 lignes vont produire les lignes suivantes&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;

&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;/admin/settings&amp;quot;&amp;gt;
&amp;lt;fieldset style=&amp;quot;display:none;&amp;quot;&amp;gt;&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;_method&amp;quot; value=&amp;quot;POST&amp;quot; /&amp;gt;&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;data[__Token][key]&amp;quot; value=&amp;quot;2dc4f7414071176b5eef24ee54f8db34adf83632&amp;quot; id=&amp;quot;Token409653362&amp;quot; /&amp;gt;
&amp;lt;/fieldset&amp;gt;
&amp;lt;input name=&amp;quot;data[Settings][p_title]&amp;quot; type=&amp;quot;text&amp;quot; size=&amp;quot;50&amp;quot; maxlength=&amp;quot;255&amp;quot; value=&amp;quot;&amp;quot; id=&amp;quot;SettingsPTitle&amp;quot; /&amp;gt;	
&amp;lt;div class=&amp;quot;submit&amp;quot;&amp;gt;&amp;lt;fieldset style=&amp;quot;display:none;&amp;quot;&amp;gt;&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;data[__Token][fields]&amp;quot; value=&amp;quot;9a18269dee671707eb5d1dbdaba4b16f9def551a&amp;quot; id=&amp;quot;TokenFields1740898927&amp;quot; /&amp;gt;&amp;lt;/fieldset&amp;gt;&amp;lt;input type=&amp;quot;submit&amp;quot;  value=&amp;quot;Enregistrer&amp;quot; /&amp;gt;&amp;lt;/div&amp;gt;		
&amp;lt;/form&amp;gt;

&lt;/pre&gt;


&lt;p&gt;décortiquons ce qui s'est passé&amp;nbsp;:&lt;/p&gt;


&lt;p&gt;le fait d'avoir ajouté la ligne &lt;code&gt;public $components   = array( 'Security')&amp;nbsp;;	&lt;/code&gt; dans notre controller,
indique à CakePHP, de générer dans la Vue, les champs   __Token,  lors de l'utilisation de  &lt;code&gt;$form-&amp;gt;create()&lt;/code&gt; et &lt;code&gt;$form-&amp;gt;end()&lt;/code&gt;&lt;/p&gt;


&lt;p&gt;Ainsi paré, votre application part à la plupart des tentatives d'accès frauduleuses&amp;nbsp;! :D&lt;/p&gt;


&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;http://manual.cakephp.org/chapter/sanitize&quot; hreflang=&quot;en&quot;&gt;Sanitize&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;simple et efficace, on utilise Sanitize comme suit&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
uses('sanitize');
// Next, create a new Sanitize object:
$mrClean = new Sanitize();
&lt;/pre&gt;


&lt;p&gt;ensuite on filtre toutes les données avec un simple $mrClean-&amp;gt;escape($my_data);&lt;/p&gt;


&lt;p&gt;ceci s'utilise généralement pour filtrer les données provenant de formulaire, avant de les stocker dans notre base.&lt;/p&gt;


&lt;p&gt;plus d'infos sur CakePHP &lt;a href=&quot;http://manual.cakephp.org/chapter/security&quot; hreflang=&quot;en&quot;&gt;Security&lt;/a&gt; et &lt;a href=&quot;http://manual.cakephp.org/chapter/sanitize&quot; hreflang=&quot;en&quot;&gt;Satinize&lt;/a&gt; &lt;img src=&quot;/themes/default/smilies/smile.png&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Bonne lecture&amp;nbsp;!&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>CakePHP (1.2.0.6311) sorti tout chaud du four</title>
    <link>http://www.foxmask.info/post/2008/01/03/CakePHP-sorti-tout-chaud-du-four</link>
    <guid isPermaLink="false">urn:md5:ac67fe1d31eb55bc329b15cfe65879c3</guid>
    <pubDate>Thu, 03 Jan 2008 17:36:00 +0100</pubDate>
    <dc:creator>foxmask</dc:creator>
        <category>CakePHP</category><category>MVC</category>    
    <description>    &lt;p&gt;En cette période d'épiphany, &lt;a href=&quot;http://cakephp.org/&quot; hreflang=&quot;en&quot;&gt;CakePHP&lt;/a&gt; tire (non pas les rois) une version beta 1.2.0.6311 de son zoli :D framework MVC .&lt;/p&gt;


&lt;p&gt;Au menu plein d'améliorations et corrections de bugs ( dont voici &lt;a href=&quot;https://trac.cakephp.org/wiki/changelog/1.2.x.x&quot; hreflang=&quot;en&quot;&gt;la liste complète&lt;/a&gt; ) dont une amélioration qui me fait plaisir concernant la gestions des plugins et des controllers &lt;img src=&quot;/themes/default/smilies/wink.png&quot; alt=&quot;;-)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Pour ceux qui douterait de l'utilité/fiabilité de ce framework, sachez que celui ci est &quot;juste&quot; utilisé par le petit site &lt;a href=&quot;http://addons.mozilla.org/&quot; hreflang=&quot;en&quot;&gt;Mozilla Addons&lt;/a&gt; &lt;img src=&quot;/themes/default/smilies/wink.png&quot; alt=&quot;;)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>CakePHP - PunBB - statistique du forum</title>
    <link>http://www.foxmask.info/post/2007/12/22/CakePHP-PunBB-statistique-du-forum</link>
    <guid isPermaLink="false">urn:md5:1b44d8dbec4490c5160dfc653a150245</guid>
    <pubDate>Wed, 26 Dec 2007 00:00:00 +0100</pubDate>
    <dc:creator>foxmask</dc:creator>
        <category>CakePHP</category><category>MVC</category><category>PunBB</category>    
    <description>    &lt;p&gt;Quelques conceptes de bases.&lt;/p&gt;


&lt;p&gt;Pour pouvoir afficher des info réutilisables dans ses Views CakePHP fourni des &quot;Helpers&quot; et des Elements
Le Helper étend les possibilités des Vues et les Elements sont des petits bouts de code php/html qui peuvent étre affichés plusieurs fois dans la même page.&lt;/p&gt;


&lt;p&gt;Ainsi donc le &quot;bloc de stats&quot; pourrait très bien être affiché dans plusieurs pages pour chacun des plugins news/articles/lexique etc..&lt;/p&gt;


&lt;p&gt;Donc nous allons faire un element &quot;app/views/elements/stats.ctp&quot; comme suit&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
&amp;lt;?php
$bloc-&amp;gt;startBloc(__('Forums statistics',true), 'stats');				
				
$pt_total_users = $this-&amp;gt;requestAction('users/nbUsers');
$pt_last_user 	= $this-&amp;gt;requestAction('users/lastUser');	
$pt_total_posts = $this-&amp;gt;requestAction('forum/stats');
?&amp;gt;
&amp;lt;ul&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;?php echo __('Total numbers of members:',true).' '.$pt_total_users['0']['0']['total_user']?&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;?php echo __('Newest resgistered user:',true).' &amp;lt;a href=&amp;quot;'.pt_forum_url.'profile.php?id='.$pt_last_user['0']['User']['id'].'&amp;quot;&amp;gt;'.$pt_last_user['0']['User']['username']?&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;?php echo __('Total numbers of topics:',true).' '.$pt_total_posts['0']['0']['total_topics']?&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;?php echo __('Total numbers of posts:',true).' '.$pt_total_posts['0']['0']['total_posts']?&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;
&amp;lt;?php
$bloc-&amp;gt;endBloc();
?&amp;gt;
&lt;/pre&gt;


&lt;p&gt;comment tout cela fonctionne&amp;nbsp;:&lt;/p&gt;


&lt;p&gt;dans le script app/app_controller.php de notre applications nous faisons ceci&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
class AppController extends Controller {
public $helpers = array ('Bloc','Html');
...
}
&lt;/pre&gt;

&lt;p&gt;et le helper bloc contient ceci (app/views/helpers/bloc.php):&lt;/p&gt;
&lt;pre&gt;
&amp;lt;?php
class BlocHelper extends Helper {
 	 	
 	function startBloc($title='',$id='') {	
		static $i;	
		$id = $id != '' ? $id : $i;		
		$res = '';
		$res .= &amp;quot;\t&amp;quot;.'&amp;lt;div class=&amp;quot;block&amp;quot; id=&amp;quot;'.$id.'&amp;quot;&amp;gt;'.&amp;quot;\n&amp;quot;;		
		if ($title!='')
			$res .= &amp;quot;\t&amp;quot;.'&amp;lt;h2&amp;gt;&amp;lt;span&amp;gt;'.$title.'&amp;lt;/span&amp;gt;&amp;lt;/h2&amp;gt;'.&amp;quot;\n&amp;quot;;		
		$res .= 
		&amp;quot;\t\t&amp;quot;.'&amp;lt;div class=&amp;quot;box&amp;quot; id=&amp;quot;box_'.$id.'&amp;quot;&amp;gt;'.&amp;quot;\n&amp;quot;;
		
		if (PT_DEFAULT_THEME == 'punbb') 
			$res .= &amp;quot;\t\t\t&amp;quot;.'&amp;lt;div class=&amp;quot;inbox&amp;quot;&amp;gt;'.&amp;quot;\n&amp;quot;;
		
		echo $res;
		$i++;
	}
	function endBloc() {
 		if (PT_DEFAULT_THEME == 'punbb') {		
			echo 
			&amp;quot;\t\t\t&amp;quot;.'&amp;lt;/div&amp;gt;'.&amp;quot;\n&amp;quot;.
			&amp;quot;\t\t&amp;quot;.'&amp;lt;/div&amp;gt;'.&amp;quot;\n&amp;quot;.
			&amp;quot;\t&amp;quot;.'&amp;lt;/div&amp;gt;';
 		} 
 		else {
 			echo 
			&amp;quot;\t\t&amp;quot;.'&amp;lt;/div&amp;gt;'.&amp;quot;\n&amp;quot;.
			&amp;quot;\t&amp;quot;.'&amp;lt;/div&amp;gt;'; 			
 		}
	} 
 	
}
?&amp;gt;
&lt;/pre&gt;


&lt;p&gt;Ainsi paré&amp;nbsp;: le controlleur principal dispose d'un helper bloc &lt;br /&gt;
donc la vue peut utiliser $bloc-&amp;gt;endBloc et -&amp;gt;startBloc&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;ceci est une premiere etape :&lt;br /&gt;
suit ensuite dans notre element les 3 lignes&amp;nbsp;: &lt;br /&gt;&lt;/p&gt;
&lt;pre&gt;

$pt_total_users = $this-&amp;gt;requestAction('users/nbUsers');
$pt_last_user 	= $this-&amp;gt;requestAction('users/lastUser');	
$pt_total_posts = $this-&amp;gt;requestAction('forum/stats');
&lt;/pre&gt;

&lt;p&gt;ces 3 lignes effectuent des &quot;requestAction&quot; lequelles permettent d'accèder aux methodes &lt;em&gt;nbUser&lt;/em&gt; et &lt;em&gt;lastUser&lt;/em&gt; de la class   &lt;strong&gt;UsersController &lt;/strong&gt; et à la methode &lt;em&gt;stats&lt;/em&gt; de la class &lt;strong&gt;ForumControllers&lt;/strong&gt;, en voici le détail :&lt;br /&gt;&lt;/p&gt;

&lt;pre&gt;

&amp;lt;?php
class UsersController extends AppController {
	public $name 	= 'Users';
[...]
	public function lastUser () {		
		$strQuery =  'SELECT id, username FROM '.DB_PREFIX.'users as User' .
						' ORDER BY registered DESC LIMIT 1';
		$resultset = $this-&amp;gt;User-&amp;gt;query($strQuery);
		return $resultset; 									
	}	
	public function nbUsers () {
		
		$strQuery = 'SELECT COUNT(id)-1 AS total_user FROM '.DB_PREFIX.'users AS User ';		  
		$resultset = $this-&amp;gt;User-&amp;gt;query($strQuery);
		return $resultset; 	
     }
[...]
}
&lt;/pre&gt;


&lt;p&gt;ceci nous permet donc d'avoir facilement les information de stats de notre forum de manière utlra simplissime dans un bloc qui s'affichera ou bon vous semble comme suit&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;&amp;lt;?php  echo $this-&amp;gt;renderElement('stats');?&amp;gt;&lt;/pre&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>CakePHP - PunBB - architecture generale</title>
    <link>http://www.foxmask.info/post/2007/12/22/CakePHP-PunBB-architecture-generale</link>
    <guid isPermaLink="false">urn:md5:747dace0ae09ed885374595b9d2be3a8</guid>
    <pubDate>Mon, 24 Dec 2007 10:30:00 +0100</pubDate>
    <dc:creator>foxmask</dc:creator>
        <category>CakePHP</category><category>MVC</category><category>PunBB</category>    
    <description>    &lt;p&gt;Voici l'architecture générale avec la liste des répertoires de son application&lt;/p&gt;


&lt;p&gt;- &lt;strong&gt;app&lt;/strong&gt;&lt;br /&gt;
--- &lt;strong&gt;config&lt;/strong&gt; contient les fichiers de config de son application tel database.php, bootstrap.php etc..&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;--- &lt;strong&gt;controllers&lt;/strong&gt; contient les controllers de votre application&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;--- &lt;strong&gt;locales&lt;/strong&gt; contient les traductions &lt;br /&gt;&lt;/p&gt;


&lt;p&gt;--- &lt;strong&gt;models&lt;/strong&gt; contient les models&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;--- &lt;strong&gt;plugins&lt;/strong&gt; contient des applications nommé plugins (détail plus bas)&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;--- &lt;strong&gt;vendors&lt;/strong&gt; contient des librairies externes à CakePHP et nécéssaire à son application&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;--- &lt;strong&gt;views&lt;/strong&gt; contient les views de votre application&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;--- &lt;strong&gt;webroot&lt;/strong&gt; contient la partie &quot;web&quot; de votre application
--- &lt;strong&gt;webroot&lt;/strong&gt;/forum/ l'endroit où est installé punBB !&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;le répertoire &lt;strong&gt;plugins&lt;/strong&gt; reprend l'integralité de l'arborscence MVC ce qui donne&amp;nbsp;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;plugins&lt;/strong&gt; &lt;br /&gt;&lt;/li&gt;
&lt;li&gt;- &lt;strong&gt;news&lt;/strong&gt; &lt;br /&gt;&lt;/li&gt;
&lt;li&gt;- &lt;strong&gt;news&lt;/strong&gt;/news_app_controller.php class du controller du plugins news &lt;br /&gt;&lt;/li&gt;
&lt;li&gt;- &lt;strong&gt;news&lt;/strong&gt;/news_app_model.php  class du mdel du module du plugin news&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;- &lt;strong&gt;news&lt;/strong&gt;/&lt;em&gt;controllers&lt;/em&gt;/news_controller.php le controlleur du plugin news&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;- &lt;strong&gt;news&lt;/strong&gt;/&lt;em&gt;models&lt;/em&gt;/news.php le model du plugin news&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;- &lt;strong&gt;news&lt;/strong&gt;/&lt;em&gt;views&lt;/em&gt;/themed/punbb/news/index.ctp la vue principale du module news&lt;br /&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;La configuration apache devra donc définir un VirtualHost sur le répertoire app/webroot/ comme DOCUMENT_ROOT.&lt;br /&gt;&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>CakePHP - débuter son projet avec &quot;Bake&quot;</title>
    <link>http://www.foxmask.info/post/2007/12/22/CakePHP-debuter-son-projet-avec-Bake</link>
    <guid isPermaLink="false">urn:md5:ec68cb9855d6db94fc59d92b5342c34d</guid>
    <pubDate>Sat, 22 Dec 2007 11:32:00 +0100</pubDate>
    <dc:creator>foxmask</dc:creator>
        <category>CakePHP</category><category>MVC</category>    
    <description>    &lt;p&gt;&lt;a href=&quot;http://cakephp.org/&quot; hreflang=&quot;en&quot;&gt;CakePHP&lt;/a&gt; permet de générer son application en quelques petites minutes grâce à &quot;bake&quot;&amp;nbsp;!&lt;/p&gt;


&lt;p&gt;Pour ce faire on ouvre une console (windows ou linux c'est kifkif) et on se fait&amp;nbsp;:&lt;/p&gt;


&lt;p&gt;&lt;code&gt;cake bake foxmask&lt;/code&gt;&lt;/p&gt;


&lt;p&gt;pour créer l'arboresence du projet &quot;foxmask&quot;&lt;/p&gt;


&lt;p&gt;ensuite on créé le répertoire config dans le répertoire &quot;foxmask&quot; on défini les paramètre de connexion à sa/ses base(s) de données et on peut se lancer dans la création des Models Views Controller comme suit&amp;nbsp;:&lt;/p&gt;


&lt;p&gt;&lt;code&gt;cake bake -app foxmask&lt;/code&gt;&lt;/p&gt;


&lt;p&gt;Il vous suffira donc de suivre les choix des menus dans la console et en quelques instants vous aurez achevé votre projet &lt;img src=&quot;/themes/default/smilies/wink.png&quot; alt=&quot;;)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Il restera alors à fignoler des détails mais vous pouvez dores et déjà accéder à votre application via http://localhost/foxmask/&lt;/p&gt;


&lt;p&gt;Plus de détails sur le &lt;a href=&quot;http://www.cakephp.org/screencasts/view/3&quot;&gt;Tuto de creation de blog en vidéo&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Poursuivre avec &lt;a href=&quot;http://www.foxmask.info/post/2007/12/06/CakePHP-et-PunBB-%3A-introduction&quot;&gt;CakePHP intégrant PunBB&lt;/a&gt;&lt;/p&gt;</description>
    
    
    
      </item>
    
</channel>
</rss>