2010-03-24 5 views
4

J'essaie de faire une action discrète pour supprimer des signets dans CakePHP. Bien que cela fonctionne très bien, je pense qu'il doit y avoir une meilleure façon de faire cela. Quelqu'un pourrait-il me diriger dans la bonne direction?CakePHP et jQuery - Actions discrètes

function delete($id = null) { 
    $ok = $this->Bookmark->delete($id); 

    if($this->RequestHandler->isAjax()) { 
    $this->autoRender = false; 
    $this->autoLayout = false; 
    $response = array('status' => 0, 'message' => 'Could not delete bookmark'); 

    if($ok) { 
     $response = array('status' => 1, 'message' => 'Bookmark deleted'); 
    } 

    $this->header('Content-Type: application/json'); 
    echo json_encode($response); 
    exit(); 
    } 
    // Request isn't AJAX, redirect. 
    $this->redirect(array('action' => 'index')); 
} 
+1

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. –

+0

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

+1

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. –

Répondre

3

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/.

+0

Super, merci. Je suppose que la réponse dépend du projet, et vous et Rob avez raison. Merci pour l'aide les gars. – fortysixandtwo