• Aucun résultat trouvé

Utiliser les blocs de vues

Introduit dans la version 2.1. Les blocs de vue remplacent les $scripts_for_layout et fournissent une API flexible qui vous permet de définir des slots (emplacements), ou blocs, dans vos vues / layouts qui peuvent être définies ailleurs. Par exemple, les blocs pour implémenter des choses telles que les sidebars, ou des régions pour charger des ressources dans l’en-tête / pied de page du layout. Un bloc peut être définit de deux manières. Soit en tant que bloc capturant, soit en le déclarant explicitement. Les méthodes start(),

append()et end() vous permettent de travailler avec les blocs capturant.

// Creer le bloc sidebar. $this->start(‘sidebar’) ; echo $this->element(‘sidebar/recent_topics’) ; echo $this->element(‘sidebar/recent_comments’) ; $this->end() ;

// Le rattacher a la sidebar plus tard. $this->append(‘sidebar’) ; echo $this-

>element(‘sidebar/popular_topics’) ; $this->end() ;

Vous pouvez aussi le rattacher à l’intérieur d’un bloc en utilisant start() pluieurs fois. La méthode

assign()peut être utilisée pour nettoyer ou outrepasser un bloc à n’importe quel moment :

// Nettoyer le contenu précedent de la sidebar.

$this->assign(’sidebar’, ’’);

Dans 2.3, certaines nouvelles méthodes ont été ajoutées pour travailler avec les blocs. Le prepend() pour ajouter du contenu avant un bloc existant :

// Ajoutez avant la sidebar

$this->prepend(’sidebar’, ’ce contenu va au-dessus de la sidebar’);

La méthode startIfEmpty() peut être utilisée pour commencer un bloc seulement si il est vide ou non défini. Si le bloc existe déjà, le contenu capturé va être écarté. C’est utile quand vous voulez définir le contenu par défaut de façon conditionnel pour un bloc, qui ne doit pas déjà exister :

.. code-block:: php

// Dans un fichier de vue. // Crée un bloc de navbar $this->startIfEmpty(‘navbar’) ; echo $this- >element(‘navbar’) ; echo $this->element(‘notifications’) ; $this->end() ;

// Dans une vue/layout parente

<?php $this->startIfEmpty(’navbar’); ?>

<p>Si le block n est pas défini pour l instant - montrer ceci à la place</p>

<?php $this->end(); ?>

// Quelque part plus loin dans la vue/layout parent echo $this->fetch(’navbar’);

Dans l’exemple ci-dessus, le bloc navbar va seulement contenir le contenu ajouté dans la première section. Puisque le bloc a été défini dans la vue enfant, le contenu par défaut avec la balise <p> sera écarté.

Note : Vous devriez éviter d’utiliser content comme nom de bloc. Celui-ci est utilisé par CakePHP en interne pour étendre les vues, et le contenu des vues dans le layout.

Afficher les blocs

Introduit dans la version 2.1. Vous pouvez afficher les blocs en utilisant la méthode fetch(). Cette dernière va, de manière sécurisée, générer un bloc, en retournant ‘’ si le bloc n’existe pas :

echo $this->fetch(’sidebar’);

Vous pouvez également utiliser fetch pour afficher du contenu, sous conditions, qui va entourer un bloc existant. Ceci est très utile dans les layouts, ou dans les vues étendues où vous voulez, sous conditions, afficher des en-têtes ou autres balises :

// dans app/View/Layouts/default.ctp

<?php if ($this->fetch(’menu’)): ?>

<div class="menu">

<h3>Menu options</h3>

<?php echo $this->fetch(’menu’); ?>

</div>

<?php endif; ?>

Depuis 2.3.0, vous pouvez aussi fournir une valeur par défaut pour un bloc qui ne devrait pas avoir de contenu. Cela vous permet d’ajouter facilement du contenu placeholder, pour des déclarations vides. Vous pouvez fournir une valeur par défaut en utilisant le 2ème argument :

CakePHP Cookbook Documentation, Version 2.x

<div class="shopping-cart"> <h3>Your Cart</h3>

<?php echo $this->fetch(’cart’, ’Votre cart est vide’); ?>

</div>

Modifié dans la version 2.3 : L’argument $default a été ajouté dans 2.3.

Utiliser des blocks pour les fichiers de script et les css

Introduit dans la version 2.1. Les Blocks remplacent la variable de layout $scripts_for_layout qui

est dépréciée. A la place, vous devrez utiliser les blocks. HtmlHelperlie dans les blocks de vues avec

les méthodesscript(),css(), etmeta()qui chacune met à jour un block avec le même nom quand

l’option inline = false est utilisée :

<?php

// dans votre fichier de vue

$this->Html->script(’carousel’, array(’inline’ => false));

$this->Html->css(’carousel’, null, array(’inline’ => false));

?>

// dans votre fichier de layout. <!DOCTYPE html>

<html lang="en"> <head>

<title><?php echo $this->fetch(’title’); ?></title>

<?php echo $this->fetch(’script’); ?> <?php echo $this->fetch(’css’); ?>

</head>

// rest du layout suit

LeHtmlHelpervous permet aussi de contrôler vers quels blocks vont les scripts : // dans votre vue

$this->Html->script(’carousel’, array(’block’ => ’scriptBottom’)); // dans votre layout

echo $this->fetch(’scriptBottom’);

Layouts

Un layout contient le code de présentation qui entoure une vue. Tout ce que vous voulez voir dans toutes vos vues devra être placé dans un layout.

Le fichier de layout par défaut de CakePHP est placé dans /app/View/Layouts. Si vous voulez changer entièrement le look de votre application, alors c’est le bon endroit pour commencer, parce que le code de vue de rendu du controller est placé à l’intérieur du layout par défaut quand la page est rendue.

Les autres fichiers de layout devront être placés dans /app/View/Layouts. Quand vous créez un layout, vous devez dire à CakePHP où placer la sortie pour vos vues. Pour ce faire, assurez-vous que votre layout contienne $this->fetch(’content’). Voici un exemple auquel un layout pourrait ressembler :

<!DOCTYPE html> <html lang="en"> <head>

<title><?php echo $title_for_layout?></title>

<link rel="shortcut icon" href="favicon.ico" type="image/x-icon">

<!-- Include external files and scripts here (See HTML helper for more info.) --> echo $this->fetch(’meta’); echo $this->fetch(’css’); echo $this->fetch(’script’); ?> </head> <body>

<!-- Si vous voulez afficher une sorte de menu pour toutes vos vues, mettez le ici -->

<div id="header">

<div id="menu">...</div> </div>

<!-- Voilà l’endroit ou je souhaite que mes vues soient affichées -->

<?php echo $this->fetch(’content’); ?>

<!-- Ajoute un footer sur chaque page affichée --> <div id="footer">...</div>

</body> </html>

Note : Avant la version 2.1, la méthode fetch() n’était pas disponible, fetch(’content’) remplace

$content_for_layoutet les lignes fetch(’meta’), fetch(’css’) et fetch(’script’)

étaient contenues dans la variable $scripts_for_layout dans la version 2.0.

Les blocks script, css et meta contiennent tout contenu défini dans les vues en utilisant le helper HTML intégré. Il est utile pour inclure les fichiers javascript et les CSS à partir des vues.

Note : Quand vous utilisezHtmlHelper::css()ouHtmlHelper::script()dans les fichiers de

vues, spécifiez ‘false’ dans l’option ‘inline’ option pour placer la source html dans un block avec le même nom. (Regardez l’API pour plus de détails sur leur utilisation).

Le block content contient les contenus de la vue rendue.

$title_for_layoutcontient le titre de la page. Cette variable est générée automatiquement, mais vous

pouvez la surcharger en la configurant dans votre controller/view.

Pour définir le titre pour le layout, il est plus facile de le faire dans le controller, en configurant la variable

$title_for_layout:

class UsersController extends AppController {

public function view_active() {

$this->set(’title_for_layout’, ’Voir les Utilisateurs actifs’);

CakePHP Cookbook Documentation, Version 2.x

} }

Vous pouvez aussi définir la variable title_for_layout depuis l’intérieur d’un fichier de vue :

$this->set(’title_for_layout’, $titleContent);

Vous pouvez créer autant de layouts que vous souhaitez : placez les juste dans le répertoire app/View/Layouts, et passez de l’un à l’autre depuis les actions de votre controller en utilisant la

propriété$layoutde votre controller ou de votre vue :

// A partir d’un controller

public function admin_view() { // stuff

$this->layout = ’admin’; }

// A partir d’un fichier de vue

$this->layout = ’loggedin’;

Par exemple, si une section de mon site incorpore un plus petit espace pour une bannière publicitaire, je peux créer un nouveau layout avec le plus petit espace de publicité et le spécifier comme un layout pour toutes les actions du controller en utilisant quelque chose comme :

class UsersController extends AppController {

public function view_active() {

$this->set(’title_for_layout’, ’Voir les Utilisateurs actifs’);

$this->layout = ’default_small_ad’; }

public function view_image() {

$this->layout = ’image’;

//sort une image de l\’utilisateur }

}

CakePHP dispose de deux fonctionnalités de layout dans le coeur (en plus du layout default de CakePHP) vous pouvez utiliser dans votre propre application : ‘ajax’ et ‘flash’. Le layout Ajax est pratique pour élaborer des réponses Ajax - c’est un layout vide (la plupart des appels ajax ne nécessitent qu’un peu de balise en retour, et pas une interface de rendu complète). Le layout flash est utilisé pour les messages montrés par la

méthodeController::flash().

Trois autres layouts, xml, js, et rss, existent dans le coeur pour une façon rapide et facile pour servir du contenu qui n’est pas du text/hmtl.

Utiliser les layouts à partir de plugins

Introduit dans la version 2.1. Si vous souhaitez utiliser un layout qui existe dans un plugin, vous pouvez utilisersyntaxe de plugin. Par exemple pour utiliser le layout de contact à partir du plugin Contacts :

class UsersController extends AppController {

public function view_active() {

$this->layout = ’Contacts.contact’; }

}

Elements

Beaucoup d’applications ont des petits blocks de code de présentation qui doivent être répliqués d’une page à une autre, parfois à des endroits différents des le layout. CakePHP peut vous aider à répéter des parties de votre site web qui doivent être réutilisées. Ces parties réutilisables sont appelées des Elements. Les Publicités, les boites d’aides, les contrôles de navigation, les menus supplémentaires, les formulaires de connexion et de sortie sont souvent intégrés dans CakePHP en elements. Un element est tout bêtement une mini-vue qui peut être inclue dans d’autres vues, dans les layouts, et même dans d’autres elements. Les elements peuvent être utilisés pour rendre une vue plus lisible, en plaçant le rendu d’éléments répétitifs dans ses propres fichiers. Ils peuvent aussi vous aider à réutiliser des fragments de contenu dans votre application. Les elements se trouvent dans le dossier /app/View/Elements/, et ont une extension .ctp. Ils sont affichés en utilisant la méthode element de la vue :

echo $this->element(’helpbox’);

Passer des Variables à l’intérieur d’un Element

Vous pouvez passer des données dans un element grâce au deuxième argument de element :

echo $this->element(’helpbox’, array(

"helptext" => "Oh, this text is very helpful." ));

Dans le fichier element, toutes les variables passés sont disponibles comme des membres du paramètre du

tableau (de la même manière que Controller::set()fonctionne dans le controller avec les fichiers

de vues). Dans l’exemple ci-dessus, le fichier /app/View/Elements/helpbox.ctp peut utiliser la variable $helptext :

// A l’intérieur de app/View/Elements/helpbox.ctp

echo $helptext; //outputs "Oh, this text is very helpful."

La méthode View::element() supporte aussi les options pour l’element. Les options supoortés sont

‘cache’ et ‘callbacks’. Un exemple :

echo $this->element(’helpbox’, array(

"helptext" => "Ceci est passé à l’element comme $helptext", "foobar" => "Ceci est passé à l’element via $foobar",

),

array(

"cache" => "long_view", // utilise la configuration de cache "long_view"

"callbacks" => true // défini à true pour avoir before/afterRender appelé pour l’element

CakePHP Cookbook Documentation, Version 2.x

) );

La mise en cache d’element est facilitée par la classeCache. Vous pouvez configurer les elements pour

être stockés dans toute configuration de Cache que vous avez défini. Cecla vous donne une grande flexibilité pour choisir où et combien de temps les elements sont stockés. Pour mettre en cache les différentes versions du même element dans une application, fournissez une valeur de clé cache unique en utilisant le format suivant :

$this->element(’helpbox’, array(), array(

"cache" => array(’config’ => ’short’, ’key’ => ’unique value’) )

);

Vous pouvez tirer profit des elements en utilisant requestAction(). La fonction requestAction() récupère les variables de vues à partir d’une action d’un controller et les retourne en tableau. Cela permet à vos elements de fonctionner dans un style MVC pur. Créez une action du controller qui prépare les vari- ables de la vue pour vos elements, ensuite appelez requestAction() depuis l’intérieur du deuxième paramètre de element() pour alimenter en variables de vues l’element depuis votre controller.

Pour ce faire, ajoutez quelque chose comme ce qui suit dans votre controller, en reprenant l’exemple du Post :

class PostsController extends AppController { // ...

public function index() {

$posts = $this->paginate();

if ($this->request->is(’requested’)) {

return $posts; } else {

$this->set(’posts’, $posts); }

} }

Et ensuite dans l’element, nous pouvons accéder au model des posts paginés. Pour obtenir les cinq derniers posts dans une liste ordonnée, nous ferions ce qui suit :

<h2>Derniers Posts</h2>

<?php $posts = $this->requestAction(’posts/index/sort:created/direction:asc/limit:5’); ?>

<ol>

<?php foreach ($posts as $post): ?>

<li><?php echo $post[’Post’][’title’]; ?></li>

<?php endforeach; ?>

</ol>

Mise en cache des Elements

Vous pouvez tirer profit de la mise en cache de vue de CakePHP si vous fournissez un paramètre cache. Si défini à true, cela va mettre en cache l’element dans la configuration ‘default’ de Cache. Sinon, vous pouvez

définir quelle configuration de cache doit être utilisée. RegardezLa mise en cachepour plus d’informations

sur la façon de configurerCache. Un exemple simple de mise en cache d’un element serait par exemple :

echo $this->element(’helpbox’, array(), array(’cache’ => true));

Si vous rendez le même element plus d’une fois dans une vue et que vous avez activer la mise en cache, assurez-vous de définir le paramètre ‘key’ avec un nom différent à chaque fois. Cela évitera que chaque appel successif n’écrase le résultat de la mise en cache du précédent appel de element(). Par exemple :

echo $this->element( ’helpbox’,

array(’var’ => $var),

array(’cache’ => array(’key’ => ’first_use’, ’config’ => ’view_long’) );

echo $this->element( ’helpbox’,

array(’var’ => $differenVar),

array(’cache’ => array(’key’ => ’second_use’, ’config’ => ’view_long’) );

Ce qui est au-dessus va s’enquérir que les deux résultats d’element sont mis en cache séparément. Si vous voulez que tous les elements mis en cache utilisent la même configuration du cache, vous pouvez sauveg-

arder quelques répétitions, en configurantView::$elementCacheà la configuration de Cache que vous

souhaitez utiliser. CakePHP va utiliser cette configuration, quand aucune n’est donnée.

Requêter les Elements à partir d’un Plugin 2.0

Pour charger un element d’un plugin, utilisez l’option plugin (enlevé de l’option data dans 1.x) :

echo $this->element(’helpbox’, array(), array(’plugin’ => ’Contacts’));

2.1

Si vous utilisez un plugin et souhaitez utiliser les elements à partir de l’intérieur d’un plugin, utilisez juste lasyntaxe de pluginhabituelle. Si la vue est rendue pour un controller/action d’un plugin, le nom du plugin va automatiquement être préfixé pour tous les elements utilisés, à moins qu’un autre nom de plugin ne soit présent. Si l’element n’existe pas dans le plugin, il ira voir dans le dossier principal APP. :

echo $this->element(’Contacts.helpbox’);

Si votre vue fait parti d’un plugin, vous pouvez ne pas mettre le nom du plugin. Par exemple, si vous êtes dans le ContactsController du plugin Contacts :

echo $this->element(’helpbox’); // et

echo $this->element(’Contacts.helpbox’);

CakePHP Cookbook Documentation, Version 2.x

Sont équivalents et résulteront au même element rendu. Modifié dans la version 2.1 : L’option

$options[plugin]a été déprécié et le support pour Plugin.element a été ajouté.