• Aucun résultat trouvé

Controller::constructClasses()

Cette méthode charge en mémoire les models nécessaires au controller. Cette procédure de chargement est nor- malement effectuée par CakePHP, mais cette méthode est à garder sous le coude quand vous avez besoin d’ac- céder à certains controllers dans une autre perspective. Si vous avez besoin de CakePHP dans un script utilisable en ligne de commande ou d’autres utilisations externes,constructClasses()peut devenir pratique. Controller::referer(mixed $default = null, boolean $local = false)

Retourne l’URL référente de la requête courante. Le paramètre $default peut être utilisé pour fournir une URL par défaut à utiliser si HTTP_REFERER ne peut pas être lu par les headers. Donc, au lieu de faire ceci : class UtilisateursController extends AppController {

public function delete($id) {

// le code de suppression va ici, et ensuite... if ($this->referer() != '/') {

return $this->redirect($this->referer()); }

return $this->redirect(array('action' => 'index')); }

}

vous pouvez faire ceci :

class UtilisateursController extends AppController { public function delete($id) {

// le code de suppression va ici, et ensuite...

return $this->redirect($this->referer(array('action' => 'index'))); }

}

Si $default n’est pas défini, la fonction se met par défaut sur à la racine (root) de votre domaine - “/”. Le paramètre $local, si il est défini à true, restreint les URLs se référant au serveur local.

Controller::disableCache()

Utilisée pour indiquer au navigateur de l’utilisateur de ne pas mettre en cache le résultat de la requête courante. Ceci est différent du système de cache de vue couvert dans le chapitre suivant.

Les en-têtes HTTP envoyés à cet effet sont : Expires: Mon, 26 Jul 1997 05:00:00 GMT Last-Modified: [current datetime] GMT

Cache-Control: no-store, no-cache, must-revalidate Cache-Control: post-check=0, pre-check=0

Pragma: no-cache

Controller::postConditions(array $data, mixed $op, string $bool, boolean $exclusive)

Utilisez cette méthode pour transformer des données de formulaire, transmises par POST (depuis les inputs du Helper Form), en des conditions de recherche pour un model. Cette fonction offre un raccourci appréciable pour la construction de la logique de recherche. Par exemple, un administrateur aimerait pouvoir chercher des commandes dans le but de connaître les produits devant être emballés. Vous pouvez utiliser les Helpers Form et Html pour construire un formulaire rapide basé sur le model Commande. Ensuite une action du controller peut utiliser les données postées par ce formulaire pour construire automatiquement les conditions de la recherche : public function index() {

$conditions = $this->postConditions($this->request->data);

$commandes = $this->Commande->find('all', compact('conditions'));

$this->set('commandes', $orders); }

Si $this->data[‘Commande’][‘destination’] vaut « Boulangerie du village », postConditions convertit cette condition en un tableau compatible avec la méthode Model->find(). Soit dans notre cas, array("Commande.destination" => "Boulangerie du village").

Si vous voulez utiliser un opérateur SQL différent entre chaque terme, remplacez-le en utilisant le second para- mètre : /* Contenu de $this->request->data array( 'Commande' => array( 'nb_items' => '4', 'referrer' => 'Ye Olde' )

) */

// Récupérons maintenant les commandes qui ont au moins 4 items et contenant 'Ye Olde'

$conditions = $this->postConditions(

$this->request->data, array(

'referrer' => 'LIKE'

) );

$commandes = $this->Commande->find('all', compact('conditions'));

Le troisième paramètre vous permet de dire à CakePHP quel opérateur booléen SQL utiliser entre les conditions de recherche. Les chaînes comme “AND”, “OR” et “XOR” sont des valeurs possibles.

Enfin, si le dernier paramètre est défini à vrai et que $op est un tableau, les champs non-inclus dans $op ne seront pas inclus dans les conditions retournées.

Controller::paginate()

Cette méthode est utilisée pour paginer les résultats retournés par vos models. Vous pouvez définir les tailles de la page, les conditions à utiliser pour la recherche de ces données et bien plus encore. Consultez la section paginationpour plus de détails sur l’utilisation de la pagination.

Controller::requestAction(string $url, array $options)

Cette fonction appelle l’action d’un controller depuis tout endroit du code et retourne les données asso- ciées à cette action. L”$url passée est une adresse relative à votre application CakePHP (/nomducontro- leur/nomaction/parametres). Pour passer des données supplémentaires au controller destinataire, ajoutez le ta- bleau $options.

Note : Vous pouvez utiliserrequestAction()pour récupérer l’intégralité de l’affichage d’une vue en pas- sant la valeur “return” dans les options : requestAction($url, array('return')). Il est important de noter que faire un requestAction en utilisant “return” à partir d’une méthode d’un controller peut entraîner des problèmes de fonctionnement dans les script et tags CSS.

Avertissement : Si elle est utilisée sans cache, la méthoderequestAction()peut engendrer des faibles performances. Il est rarement approprié de l’utiliser dans un controller ou un model.

requestAction()est plutôt utilisée en conjonction avec des éléments (mis en cache) - comme moyen de

récupérer les données pour un élément avant de l’afficher. Prenons l’exemple de la mise en place d’un élément « derniers commentaires » dans le layout. Nous devons d’abord créer une méthode de controller qui retourne les données :

// Controller/CommentsController.php

class CommentsController extends AppController { public function latest() {

if (empty($this->request->params['requested'])) { throw new ForbiddenException();

}

return $this->Comment->find(

'all',

array('order' => 'Comment.created DESC', 'limit' => 10) );

} }

Vous devriez toujours inclure des vérifications pour vous assurer que vos méthodes de requestAction sont en fait originaires derequestAction(). Ne pas le faire va autoriser les méthodesrequestAction()à être directement accessible d’une URL, ce qui n’est généralement pas souhaité.

Si nous créons un élément simple pour appeler cette fonction : // View/Elements/latest_comments.ctp

$comments = $this->requestAction('/comments/latest');

foreach ($comments as $comment) { echo $comment['Comment']['title']; }

On peut ensuite placer cet élément n’importe où pour obtenir la sortie en utilisant : echo $this->element('latest_comments');

Ecrit de cette manière, dès que l’élément est affiché, une requête sera faite au controller pour obtenir les données, les données seront traitées, et retournées. Cependant, compte tenu de l’avertissement ci-dessus il vaut mieux utiliser des éléments mis en cache pour anticiper des traitements inutiles. En modifiant l’appel à l’élément pour qu’il ressemble à ceci :

echo $this->element('latest_comments', array(), array('cache' => true));

L’appel àrequestAction()ne sera pas effectué tant que le fichier de vue de l’élément en cache existe et est valide.

De plus,requestAction()prend désormais des URLs basées sur des tableau dans le style de cake : echo $this->requestAction(

array('controller' => 'articles', 'action' => 'featured'), array('return')

);

Cela permet à l’appel derequestAction()d’éviter l’utilisation de Router : :url ce qui peut améliorer la performance. Les urls basées sur des tableaux sont les mêmes que celles utilisées parHtmlHelper::link() avec une seule différence. Si vous utilisez des paramètres nommés ou passés dans vos urls, vous devez les mettre dans un second tableau et les inclure dans la clé correcte. La raison de cela est querequestAction()fu- sionne seulement le tableau des arguments nommés avec les membres du tableau de Controller::params et ne place pas les arguments nommés dans la clé “named”. Des parties supplémentaires dans le tableau $optionvont aussi être disponibles dans le tableau Controller : :params de l’action requêtée :

echo $this->requestAction('/articles/featured/limit:3'); echo $this->requestAction('/articles/view/5');

En array dans requestAction serait ainsi : echo $this->requestAction(

array('controller' => 'articles', 'action' => 'featured'), array('named' => array('limit' => 3))

);

echo $this->requestAction(

array('controller' => 'articles', 'action' => 'view'), array('pass' => array(5))

);

Note : Contrairement aux autres places où les URLs en tableau sont analogues aux URLs en chaîne de caractère, requestAction les traite différemment.

Quand vous utilisez une url en tableau en conjonction avec requestAction(), vous devez spécifier tous les paramètres dont vous aurez besoin dans l’action requêtée. Ceci inclut les paramètres comme $this->request->data. En plus de passer tous les paramètres requis, les paramètres nommés et passés doivent être faits dans le second tableau comme vu ci-dessus.

Controller::loadModel(string $modelClass, mixed $id)

La fonctionloadModel()devient pratique quand vous avez besoin d’utiliser un model qui n’est pas le model du controller par défaut ou un de ses models associés :

$this->loadModel('Article');

$recentArticles = $this->Article->find(

'all',

array('limit' => 5, 'order' => 'Article.created DESC') );

$this->loadModel('User', 2);

$user = $this->User->read();