2010-09-15 4 views
0

Я реализовал маршрутизацию REST в cakePHP, чтобы правильно маршрутизировать запросы стиля REST к соответствующим методам моего контроллера.Редактор строк cakePHP + extjs и REST

Это то, что я добавил к моему routes.php

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

это правильно маршрутизирует запросы REST к указательным/добавлять/редактировать/удалять методы внутри моего контроллера.

В моей сетке EXTJS Я использую редактор строк с резервным хранилищем для достижения поведения CRUD.

Вот код для моей сетки

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 

запросов My GET/POST будут должным образом направлены на мой индекс/добавить методы внутри моего контроллера, и я могу легко извлечь Счетчики, что я передаю его в запрос.

Моя проблема связана с запросом PUT. Запрос PUT успешно перенаправляется на мой метод редактирования внутри контроллера.

Это то, что запрос выглядит в поджигатель

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



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


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

Внутри моего метода редактирования Я не получаю мой массив, который я прошел через запрос PUT. Когда я дам $ this-> params внутри моего метода редактирования, это то, что находится в массиве.

([id] => 20 
[named] => Array 
    (
    ) 

[pass] => Array 
    (
     [0] => 20 
    ) 

[controller] => object_fields 
[action] => edit 
[[method]] => PUT 
[plugin] => 
[url] => Array 
    (
     [ext] => html 
     [url] => object_fields/20 
    ) 

[form] => Array 
    (
    ) 

[isAjax] => 1 
) 

Как правильно получить свой массив через запрос PUT внутри моего метода редактирования?

UPDATE:

Я могу получить свой массив, используя следующий код внутри метода редактирования

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); 

} 

Вопрос теперь почему CakePHP не делать это автоматически?

ответ

0

это в вашем 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

Обратите внимание, что вы можете столкнуться с этой проблемой с запросами PUT, хотя: http://cakephp.lighthouseapp.com/projects/42648/tickets/855-irrevocably -reading-phpinput-в-requesthelpercomponentstartup # тикет-855-1 – deceze

Смежные вопросы