Si vous prévoyez d'utiliser l'action AJAX appelle plus largement, il peut être intéressant d'emprunter la voie « overkill », plutôt que la route « inélégant ». La méthode suivante configure votre application pour gérer les requêtes AJAX assez gracieusement.
En routes.php, ajouter:
Router::parseExtensions('json');
Créer un nouveau répertoire json
dans app/views/layouts/
, et une nouvelle mise en page default.ctp
dans le nouveau répertoire:
<?php
header("Pragma: no-cache");
header("Cache-Control: no-store, no-cache, max-age=0, must-revalidate");
header('Content-Type: text/x-json');
header("X-JSON: ".$content_for_layout);
echo $content_for_layout;
?>
Créer un nouveau répertoire json
dans app/views/bookmarks/
, et une nouvelle vue delete.ctp
dans le nouveau répertoire:
<?php
$response = $ok
? array('status'=>1, 'message'=>__('Bookmark deleted',true))
: array('status'=>0, 'message'=>__('Could not delete bookmark',true));
echo $javascript->object($response); // Converts an array into a JSON object.
?>
Controller:
class BookmarksController extends AppController()
{
var $components = array('RequestHandler');
function beforeFilter()
{
parent::beforeFilter();
$this->RequestHandler->setContent('json', 'text/x-json');
}
function delete($id)
{
$ok = $this->Bookmark->del($id);
$this->set(compact($ok));
if (! $this->RequestHandler->isAjax())
$this->redirect(array('action'=>'index'),303,true);
}
}
Sur les pages à partir desquelles l'AJAX est appelée, vous souhaitez modifier les requêtes AJAX /bookmarks/delete/1234
-/bookmarks/delete/1234.json
.
Cette option vous permet également de gérer les appels non-AJAX au /bookmarks/delete/1234
avec une vue app/views/bookmarks/delete.ctp
.
Toutes les autres actions que vous souhaitez gérer via AJAX et JSON, vous devez ajouter des vues dans le répertoire app/views/bookmarks/json/
.
Je suppose qu'il s'agit d'une méthode de contrôleur? Si oui, qu'est-ce que vous n'aimez pas? Les bits '$ response' me semblent un peu" maladroits "et je pourrais juste aller avec des codes de réponse seulement, mais je ne vois certainement rien d'incroyablement inélégant dans cela. –
Salut! Tout d'abord je ne suis pas sûr si c'est la meilleure pratique pour gérer la réponse dans le contrôleur ou une vue. Je pense que l'écho dans un contrôleur est inélégant, et d'utiliser une vue pour cela est exagéré. Des pensées? – fortysixandtwo
Oui. :-) Dans mes propres affaires, je choisis inélégant (votre mot, pas le mien) sur l'overkill. Je déteste le fouillis du système de fichiers. Si la réponse est simple et laconique (comme la vôtre), je ne vois aucune raison de créer un fichier de fichier de vue pour cela. Le vôtre est également une réponse du système qui, je pense, est tout à fait valide dans un contrôleur. –