Les Helpers (Assistants) sont des classes comme les components, pour la couche de présentation de votre application. Ils contiennent la logique de présentation qui est partagée entre plusieurs vues, elements ou layouts. Ce chapitre vous montrera comment créer vos propres helpers et soulignera les tâches basiques que les helpers du cœur de CakePHP peuvent vous aider à accomplir.
CakePHP dispose d’un certain nombre de helpers qui aident à la création des vues. Ils aident à la création de balises bien-formatées (y compris les formulaires), aident à la mise en forme du texte, les durées et les nombres, et peuvent même accélérer la fonctionnalité AJAX. Pour plus d’informations sur les helpers inclus dans CakePHP, regardez le chapitre pour chaque helper:
Vous activez les helpers dans CakePHP, en faisant « prendre conscience » à un
controller qu’ils existent. Chaque controller a une propriété
$helpers
, qui liste les helpers disponibles dans la
vue. Pour activer un helper dans votre vue, ajoutez son nom au tableau
$helpers
du controller:
class BakeriesController extends AppController {
public $helpers = array('Form', 'Html', 'Js', 'Time');
}
L’ajout des helpers depuis les plugins utilise la syntaxe de plugin utilisée partout ailleurs dans CakePHP:
class BakeriesController extends AppController {
public $helpers = array('Blog.Comment');
}
Vous pouvez aussi ajouter les helpers depuis une action, dans ce cas, ils seront uniquement accessibles pour cette action et dans aucune autre action du controller. Ceci économise de la puissance de calcul pour les autres actions qui n’utilisent pas le helper, tout en permettant de conserver le controller mieux organisé:
class BakeriesController extends AppController {
public function bake() {
$this->helpers[] = 'Time';
}
public function mix() {
// Le Helper Time n'est pas chargé ici et n'est par conséquent
// pas disponible
}
}
Si vous avez besoin d’activer un helper pour tous les controllers, ajoutez
son nom dans le tableau $helpers
du fichier
/app/Controller/AppController.php
(à créer si pas présent). N’oubliez pas
d’inclure les helpers par défaut Html et Form:
class AppController extends Controller {
public $helpers = array('Form', 'Html', 'Js', 'Time');
}
Vous pouvez passer des options dans les helpers. Ces options peuvent être utilisées pour définir les valeurs d’attributs ou modifier le comportement du helper:
class AwesomeHelper extends AppHelper {
public function __construct(View $view, $settings = array()) {
parent::__construct($view, $settings);
debug($options);
}
}
class AwesomeController extends AppController {
public $helpers = array('Awesome' => array('option1' => 'valeur1'));
}
Depuis 2.3 les options sont fusionnées avec la propriété Helper::$settings
du helper.
Une configuration courante est d’utiliser l’option className
, qui vous
permet de créer des alias de helper dans vos vues. Cette fonctionnalité est
utile quand vous voulez remplacer $this->Html
ou tout autre Helper de
référence avec une mise en oeuvre personnalisée:
// app/Controller/PostsController.php
class PostsController extends AppController {
public $helpers = array(
'Html' => array(
'className' => 'MyHtml'
)
);
}
// app/View/Helper/MyHtmlHelper.php
App::uses('HtmlHelper', 'View/Helper');
class MyHtmlHelper extends HtmlHelper {
// Ajouter votre code pour écraser le HtmlHelper du coeur
}
Ce qui est au-dessus fera un alias de MyHtmlHelper
vers $this->Html
dans vos vues.
Note
Faire un alias d’un helper remplace cette instance partout où le helper est utilisé, y compris dans les autres Helpers.
L’utilisation des configurations du helper vous permet de configurer de manière déclarative vos helpers et de garder la logique de configuration de vos actions des controllers. Si vous avez des options de configuration qui ne peuvent pas être inclues comme des parties de déclaration de classe, vous pouvez les définir dans le callback beforeRender de votre controller:
class PostsController extends AppController {
public function beforeRender() {
parent::beforeRender();
$this->helpers['CustomStuff'] = $this->_getCustomStuffSettings();
}
}
Une fois que vous avez configuré les helpers que vous souhaitiez utiliser, dans
votre controller, chaque helper est exposé en propriété publique dans la vue.
Par exemple, si vous utilisiez HtmlHelper
, vous serez capable
d’y accéder en faisant ce qui suit:
echo $this->Html->css('styles');
Ce qui est au-dessus appelera la méthode css
du HtmlHelper. Vous pouvez
accéder à n’importe quel helper chargé en utilisant $this->{$helperName}
.
Il peut venir un temps où vous aurez besoin de charger dynamiquement un helper
à partir d’une vue. Vous pouvez utiliser la vue du
HelperCollection
pour le faire:
$mediaHelper = $this->Helpers->load('Media', $mediaSettings);
Le HelperCollection est une collection et supporte l’API collection utilisée partout ailleurs dans CakePHP.
Les Helpers disposent de plusieurs callbacks qui vous permettent d’augmenter le processus de rendu de vue. Allez voir la documentation de API de Helper et Collections pour plus d’informations.
Si un helper du coeur (ou l’un présenté sur GitHub ou dans la Boulangerie) ne correspond pas à vos besoins, les helpers sont faciles à créer.
Mettons que nous voulions créer un helper, qui pourra être utilisé pour
produire un lien CSS, façonné spécialement selon vos besoins, à différents
endroits de votre application. Afin de trouver une place à votre logique dans
la structure de helper existante dans CakePHP, vous devrez créer une nouvelle
classe dans /app/View/Helper
. Appelons notre helper LienHelper. Le
fichier de la classe PHP ressemblera à quelque chose comme ceci:
/* /app/View/Helper/LienHelper.php */
App::uses('AppHelper', 'View/Helper');
class LienHelper extends AppHelper {
public function lancerEdition($titre, $url) {
// La logique pour créer le lien spécialement formaté se place
ici...
}
}
Note
Les Helpers doivent étendre soit AppHelper
soit Helper
ou
implémenter tous les callbacks dans l”API de Helper.
Vous souhaitez peut-être utiliser quelques fonctionnalités déjà existantes dans
un autre helper. Pour faire cela, vous pouvez spécifier les helpers que
vous souhaitez utiliser avec un tableau $helpers
, formaté comme vous le
feriez dans un controller:
/* /app/View/Helper/LienHelper.php (Utilisant d'autres helpers) */
App::uses('AppHelper', 'View/Helper');
class LienHelper extends AppHelper {
public $helpers = array('Html');
public function lancerEdition($titre, $url) {
// Utilisation du helper HTML pour sortir une donnée formatée
$link = $this->Html->link($titre, $url, array('class' => 'edit'));
return '<div class="editOuter">' . $link . '</div>';
}
}
Une fois que vous avez créez votre helper et l’avez placé dans
/app/View/Helper/
, vous serez capable de l’inclure dans vos controllers
en utilisant la variable spéciale $helpers
:
class PostsController extends AppController {
public $helpers = array('Lien');
}
Une fois que votre controller est au courant de cette nouvelle classe, vous pouvez l’utiliser dans vos vues en accédant à un objet nommé d’après le helper:
<!-- fait un lien en utilisant le nouveau helper -->
<?php echo $this->Lien->lancerEdition('Changer cette recette', '/recipes/edit/5'); ?>
Tous les helpers étendent une classe spéciale, AppHelper (comme les models
étendent AppModel et les controllers étendent AppController). Pour créer une
fonctionnalité disponible pour tous les helpers, créez
/app/View/Helper/AppHelper.php
:
App::uses('Helper', 'View');
class AppHelper extends Helper {
public function customMethod () {
}
}
La classe de base pour les Helpers. Elle fournit un nombre de méthodes utiles et des fonctionnalités pour le chargement d’autres helpers.
Décide du nom de fichier du webroot de l’application. Si un thème est actif et que le fichier existe dans le webroot du thème courant, le chemin du fichier du thème sera retourné.
Génère une URL échappée de HTML, qui délégue à Router::url()
.
Récupère la valeur pour un nom d’input donné.
Génère une valeur id en CamelCase pour le champ sélectionné courant. Ecraser cette méthode dans votre AppHelper vous permettra de changer la façon dont CakePHP génère les attributs ID.
Est appelé avant que tout fichier de vue soit rendu. Cela inclut les elements, les vues, les vues parentes et les layouts.
Est appelé après que tout fichier de vue est rendu. Cela inclut les
elements, les vues, les vues parentes et les layouts. Un callback
peut modifier et retourner $content
pour changer la manière dont
le contenu rendu est affiché dans le navigateur.
La méthode beforeRender est appelé après la méthode beforeRender du controller, mais avant les rendus du controller de la vue et du layout Reçoit le fichier à rendre en argument.
Est appelé après que la vue est rendu, mais avant que le rendu du layout ait commencé.
Est appelé avant que le rendu du layout commence. Reçoit le nom du fichier layout en argument.
Est appelé après que le rendu du layout est fini. Reçoit le nom du fichier layout en argument.