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?
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