Что вы хотите сделать, это добавить в сетку, используя ExtJS. Магазин, подключенный к вашей сетке (если вы следите за моим ответом на последний вопрос), будет обрабатывать разговор с сервером.
В ExtJS кнопка на панели инструментов для добавления строки в сетку должна иметь обработчик.
var toolbar = Ext.Toolbar({
// config options
handler: function() {
// in your handler you need to create a new record and insert it into your store
// if you followed my answer to your last question, you'll have setup a store with proxy, jsonreader, and jsonwriter.
// get the store component from Ext
var store = Ext.getCmp('idOfYourStore'),
NewRecord = Ext.data.Record.create(['name', 'genre', 'length']); // this array of column names should match the fields you specified for your JsonReader's fields
// now that you have your store component, and your new blank record. you can fill it in and add it to the store
var record = new NewRecord({
name: 'Name of Movie',
genre: 'Genre of Movie',
length: '1:25:22'
});
store.add(record);
store.commitChanges();
}
});
После вызова add (если для автосохранения установлено значение true в вашем магазине), он автоматически вызовет URL-адрес вашего приложения cakephp, которое вы настроили в api вашего прокси в разделе «create». Он отправит данные этой новой записи этому действию.
Итак, если вы настроите прокси-сервер для указания на /movies/create
, то внутри вашего MoviesController вы захотите настроить действие create()
.
Внутри действия create
вы захотите проверить $this->params['form']
на входящие данные из ExtJS.
function create() {
$newData = json_decode($this->params['form'], true); // turn the incomin json into an array
$this->data = array(
'Movie' => array(
'name' => $newData['name'],
'genre' => $newData['genre'],
'length' => $newData['length']
)
);
if ($this->Movie->save($this->data)) {
$data['success'] = true;
} else {
$data['success'] = false;
}
return json_encode($data);
}
После того, как ExtJs отправит сообщение в PHP, он ожидает, что объект json вернется с ключом «success» в корне объекта со значением true или false. Вам нужно это в json, поэтому вы не можете просто использовать $this->set
и отправить его на ваше усмотрение. В этом случае я возвращаю строку json_encoding.
В действительности то, что вы должны сделать, это включить помощника Js
в ваш app_controller
Затем создайте элемент с именем ajaxreturn. /views/elements/ajaxreturn.ctp
будет содержать одну строку.
<?php echo $this->Js->object($data) ?>
Объект отвечает за превращение $data
в объект json. Он используется вместо json_encode, потому что в PHP4 не было поддержки json_encode.
теперь, когда у вас есть этот элемент, в вашем контроллере вы можете переписать его так ...
function create() {
$newData = json_decode($this->params['form'], true); // turn the incomin json into an array
$this->data = array(
'Movie' => array(
'name' => $newData['name'],
'genre' => $newData['genre'],
'length' => $newData['length']
)
);
if ($this->Movie->save($this->data)) {
$data['success'] = true;
} else {
$data['success'] = false;
}
$this->set('data', $data);
$this->layout = 'ajax';
return $this->render(null, null, '/elements/ajaxreturn');
}
Вы хотите вернуть строку json и ТОЛЬКО строку json. Нет макета, нет HTML, ничего, кроме строки, она выдаст ошибку.
Как только вы сделаете это, ваш магазин узнает, был ли вызов успешным, и если это так, он вставит строку в вашу сетку. Если нет, то он будет удалять темп. строка это положить в вашей сетке.