2010-09-15 4 views
0

J'ai implémenté le routage REST dans cakePHP pour router correctement les requêtes de style REST vers les méthodes appropriées de mon contrôleur.cakePHP + éditeur de lignes extjs et REST

C'est ce que j'ai ajouté à mon routes.php

Router::mapResources(array('object_fields')); 

Ce correctement achemine les requêtes REST à mon index/ajouter/modifier/supprimer des méthodes à l'intérieur de mon contrôleur.

Dans ma grille EXTJS, j'utilise l'éditeur de lignes avec un magasin reposant pour obtenir un comportement CRUD.

Voici le code pour ma grille

myapp.object_field_grid = Ext.extend(Ext.grid.GridPanel, { 
    closable: true, 
    stripeRows: true, 

    frame: true, 
    viewConfig: { 
     forceFit: true 
    }, 
    editor: new Ext.ux.grid.RowEditor({ 
    saveText: 'Update', 

    }), 

    onAdd : function(btn, ev){ 
    var u = new this.store.recordType({ 
     name : '', 
     type: '', 
    }); 

    this.editor.stopEditing(); 
      this.store.insert(0, u); 
      this.editor.startEditing(0); 


    }, 

    onDelete : function(){ 
    }, 

    initComponent: function() { 

    var proxy = new Ext.data.HttpProxy({ 
    url: 'object_fields/', 


    }); 

    var reader = new Ext.data.JsonReader({ 

    totalProperty: 'totalCount', 
    successProperty: 'success', 
    idProperty: 'id', 
    root: 'data', 
    messageProperty: 'message' 
    }, [ 
     {name: 'id'}, 
     {name: 'name', allowBlank: false}, 
     {name: 'type', allowBlank: false}, 
    ]); 


    var writer = new Ext.data.JsonWriter({ 
     encode: false, 

    }); 

    var store = new Ext.data.Store({ 
    baseParams: {id: this.object_id}, 
    id: 'object_fields', 
     restful: true,  
     proxy: proxy, 
     reader: reader, 
     writer: writer, 
     }); 

    store.load(); 

    var object_field_columns = [ 
    // {header: "id", width: 250, sortable: true, dataIndex: 'id', editor: new  Ext.form.TextField({})},       
     {header: "name", width: 250, sortable: true, dataIndex: 'name', editor: new  Ext.form.TextField({})}, 
     {header: "type", width: 250, sortable: true, dataIndex: 'type', editor: new Ext.form.ComboBox({editable: false, store:['STRING', 'NUMBER']})}, 
    ]; 


    var config = { 
    columns: object_field_columns, 
      store: store, 
      plugins: [this.editor], 
      //autoHeight: true, 
      height: 200, 
      tbar: [{ 
       text: 'Add', 
       iconCls: 'silk-add', 
       handler: this.onAdd, 
       scope: this, 
      }, '-', { 
       text: 'Delete', 
       iconCls: 'silk-delete', 
       handler: this.onDelete, 
       scope: this, 
      }, '-'], 
    } 





    Ext.apply(this, Ext.apply(this.initialConfig, config)); 


    myapp.object_field_grid.superclass.initComponent.apply(this, arguments); 


    }, 
    onRender: function() { 
     this.store.load(); 
     myapp.object_field_grid.superclass.onRender.apply(this, arguments); 
    } 
}); 

Ext.reg('object_field_grid', myapp.object_field_grid); // register xtype 

Mes demandes GET/POST sont correctement acheminés à mon index/ajouter des méthodes à l'intérieur de mon contrôleur et je suis en mesure de récupérer facilement les paramaters que je passe dans la demande.

Mon problème est avec la demande de mise à jour de la demande PUT. La requête PUT est acheminée avec succès vers ma méthode d'édition dans le contrôleur.

C'est ce que la demande ressemble à Firebug

http://server.local/object_fields/20 
JSON 



data 
Object { name="test7777777777", more...} 


id 
"18" 
Source 
{"id":"18","data":{"name":"test7777777777","id":"20"}} 

Dans ma méthode d'édition Je ne reçois pas mon tableau que je suis passé à travers la demande de PUT. Lorsque je jette $ this-> params dans ma méthode d'édition, c'est ce qui est dans le tableau. Comment puis-je recevoir correctement ma matrice via la requête PUT dans ma méthode d'édition?

MISE À JOUR:

Je suis en mesure de récupérer mon tableau en utilisant le code suivant dans la méthode d'édition

function edit($id){ 
    $this->autoRender = false; 
    echo 'edit'; 

    $raw = ''; 
     $httpContent = fopen('php://input', 'r'); 
     while ($kb = fread($httpContent, 1024)) { 
      $raw .= $kb; 
     } 
     fclose($httpContent); 
     $params = array(); 
     parse_str($raw, $params); 

    print_r($params); 

} 

La question est maintenant pourquoi ne CakePHP pas ça automaticly?

Répondre

0

mettre ceci dans votre app_controller.php:

public function beforeFilter() { 

    if (
     isset($this->RequestHandler) && 
     $this->RequestHandler->requestedWith('json') && 
     (
      $this->RequestHandler->isPost() || 
      $this->RequestHandler->isPut() 
     ) 
    ) { 

     $jsonData = json_decode(utf8_encode(trim(file_get_contents('php://input'))), true); 

     if (is_array($jsonData)) { 

      $this->data = $jsonData; 
      unset($jsonData); 

     } 

    } 


} 
+0

Notez que vous pouvez rencontrer ce problème avec les demandes de PUT si: http://cakephp.lighthouseapp.com/projects/42648/tickets/855-irrevocably -reading-phpinput-dans-requesthelpercomponentstartup # ticket-855-1 – deceze