私は2つのモデルを持っています:本はAuthorに属します。サーバーからExtJに行き来する途中で、本のデータと一緒に送信された著者データを調査してみましょう。サーバーは次のネストされたデータをExtJに送信します。
{
success : true,
data: {
id: '23',
name: 'JavaScript - The definitive guide'
author: { // <<-- nested author data
id: '45',
name: 'David Flanagan',
}
}
}
ExtJの側では、データは次のモデルによって処理されます。
Ext.define('My.models.Book', {
extend: 'Ext.data.Model',
idProperty: 'id',
fields: [
'id',,
'name',
{name: 'author_id', mapping: 'Author.id'}, // <<-- flat author data
],
proxy: {
type: 'ajax',
api: {
read: 'My/Books/index',
create: 'My/Books/create',
update: 'My/Books/update',
destroy: 'My/Books/delete'
},
reader: {
type: 'json',
root: 'data',
},
writer: {
type: 'json',
root: 'data',
},
},
associatinons: [{
type: 'belongsTo',
model: 'My.models.Author',
associationKey: 'Author',
}]
});
モデルのフィールドへのマッピングのおかげで(Author.id
)author_id
著者のデータを、本のデータを編集するために設計された次のフォームにロードできます。Book
{name: 'author_id', mapping: 'Author.id'}
Ext.define('My.views.books.Form', {
extend: 'Ext.form.Panel',
initComponent: function () {
var me = this;
me.items = [{
xtype: 'container',
layout:'anchor',
defaults:{
anchor: '95%'
},
items:[{
xtype: 'textfield',
fieldLabel: 'Book title',
name: 'name'
},{
xtype: 'combo',
fieldLabel: 'Author',
name: 'author_id', // <<-- flat author data
store: ...
}]
}];
me.buttons = [{
text: 'Save',
scope: me,
handler: me.onSave
}];
me.callParent(arguments);
},
...
});
もちろん、著者専用のモデルもありますが、本と著者のデータを一度に1つのフォームにロードする必要がある場合、上記のような他の可能性は(今のところ)わかりません(もちろん見せてください)。 、より良い解決策がある場合)。
問題が発生しました。コンボから他の作成者を選択し、フォームを保存します。書籍のレコードが汚れると(author_id
現在はBook
モデルフィールドとして表示され'My/Books/update'
ます)、次のデータがサーバーに送信されたURLへのリクエストが発生します(これは大丈夫です、私は書籍を編集しています)。
{
data: {
id: '23',
name: 'JavaScript - The definitive guide',
author_id: '78' // <<-- flat author data
}
}
サーバーに返されるデータは、ExtJに送信されたものと同じ構造ではなく、次のような何らかの変換を行う必要があります。
$data['Author']['id'] = @$data['author_id'];
unset($data['author_id']);
私が尋ねているのは、ExtJsフォームでデータを処理して、サーバーから取得したのと同じ構造でサーバーに戻るようにすることは可能ですか?どうやって?
この質問は、ここ、ここ、ここですでに何らかの形で議論されていますが、どちらの議論も明確に答えていません。
助けてくれてありがとう!:)