I have a complex form that I cannot use in the form serialization method. There are many fields, as well as a dynamic grid (a grid that dynamically generates when a user selects certain criteria) inside the form.
What I want to do is collect user inputs / selections + add selected records available in the grid, and then finally make a JSON array with this data in order to be able to send server messages.
My guess is, I can use the getCmp ExtJS function to get the whole data, but as you might have guessed, this is a little difficult to maintain. Also, I have no idea to get grid data this way!
PS: The code is a little long, so I cut some parts.
DEFINITIONS OF MODEL AND STORE
Ext.Loader.setConfig({enabled: true}); Ext.Loader.setPath('Ext.ux', '<?php echo js_url(); ?>resources/ux'); Ext.require([ 'Ext.grid.*', 'Ext.data.*', 'Ext.form.*', 'Ext.state.*', 'Ext.util.*', 'Ext.layout.container.Column', 'Ext.selection.CheckboxModel', 'Ext.ux.RowExpander', 'Ext.ux.statusbar.StatusBar' ]); var navigate = function (panel, direction) { var layout = panel.getLayout(); layout[direction](); Ext.getCmp('move-prev').setDisabled(!layout.getPrev()); Ext.getCmp('move-next').setDisabled(!layout.getNext()); }; // Article Model Ext.define('Article', { extend: 'Ext.data.Model', fields: [ {name: 'ARTICLE_ID', type: 'int'}, {name: 'DESCRIPTION', type: 'string'} ] }); // Article Json Store var articles = new Ext.data.JsonStore({ model: 'Article', proxy: { type: 'ajax', url: '<?php echo base_url() ?>create/get_articles', reader: { type: 'json', root: 'artList', idProperty: 'ARTICLE_ID' } } }); winArticle = new Ext.Window({ width: 600, modal: true, title: 'Artikel Seçimi', closeAction: 'hide', bodyPadding: 10, items: new Ext.Panel({ items: [ { xtype: 'fieldset', title: 'Artikel Sorgulama', defaultType: 'textfield', layout: 'anchor', defaults: { anchor: '100%' }, height: '76px', items: [ { xtype: 'fieldcontainer', layout: 'hbox', defaultType: 'textfield', items: [ { xtype: 'combobox', id: 'articleNo', inputWidth: 320, fieldLabel: 'ARTİKEL NO', fieldStyle: 'height: 26px', margin: '10 15 0 0', triggerAction: 'query', pageSize: true }, { xtype: 'button', text: 'SORGULA', width: 100, scale: 'medium', margin: '8 0 0 0' } ] } ] }, { xtype: 'fieldset', title: 'Artikel Bilgileri', height: '140px', layout: 'fit', items: [ { xtype: 'fieldcontainer', layout: 'hbox', defaultType: 'textfield', fieldDefaults: { labelAlign: 'top' }, items: [ { fieldLabel: 'ARTİKEL TANIMI', name: 'artDesc', flex: 3, margins: '0 5 0 0' }, { fieldLabel: 'PAKET İÇERİĞİ', name: 'artgebi', flex: 1 } ] }, { xtype: 'fieldcontainer', layout: 'hbox', defaultType: 'textfield', id: 'artContainer1', fieldDefaults: { labelAlign: 'top' }, items: [ { fieldLabel: 'SUBSYS', name: 'artSubsys', flex: 1, margins: '0 5 0 0' }, { fieldLabel: 'VARIANT', name: 'artVariant', flex: 1, margins: '0 5 0 0' }, { fieldLabel: 'VARIANT TANIMI', name: 'artVariantDesc', flex: 2 } ] } ] }, { xtype: 'fieldset', title: 'Aksiyon Seviyeleri', id: 'article-fieldset', items: [ { xtype: 'button', id: 'btnArticleLevelAdd', text: 'LEVEL EKLE', scale: 'medium', width: 100, style: 'float: right', margin: '0 7 0 0', handler: function() { var getLevels = function() { var count = winArticle.down('fieldset[id=article-fieldset]').items.items.length; return count; } var count = getLevels(); if (count === 3) { Ext.getCmp('btnArticleLevelAdd').disable(); } var container = 'artContainer' + count; //console.log(container); Ext.getCmp('article-fieldset').add([ { xtype: 'fieldcontainer', layout: 'hbox', id: 'artContainer' + count, defaultType: 'textfield', fieldDefaults: { labelAlign: 'top' }, items: [ { name: 'artLevel' + count, allowBlank: false, inputWidth: 216, fieldStyle: 'text-align: right; font-size: 13pt; background-color: #EAFFCC;', margins: '0 5 5 0' }, { name: 'artValue' + count, allowBlank: false, inputWidth: 216, fieldStyle: 'text-align: right; font-size: 13pt; background-color: #EAFFCC;', margins: '0 5 0 0' }, { xtype: 'button', text: 'SİL', width: 40, cls: 'btn-article-remove', handler: function() { if(count <= 3) { Ext.getCmp('btnArticleLevelAdd').enable(); } else { Ext.getCmp('btnArticleLevelAdd').disable(); } winArticle.down('fieldset[id=article-fieldset]').remove(container); } } ] } ]); } }, { xtype: 'fieldcontainer', layout: 'hbox', id: 'article-level-container', defaultType: 'textfield', fieldDefaults: { labelAlign: 'top' }, items: [ { fieldLabel: 'LEVEL', name: 'artLevel', inputWidth: 216, margins: '0 5 5 0', allowBlank: false, fieldStyle: 'text-align: right; font-size: 13pt; background-color: #EAFFCC;' }, { fieldLabel: 'VALUE', name: 'artValue', inputWidth: 216, allowBlank: false, blankText: 'zorunlu alan, boş bırakılamaz', fieldStyle: 'text-align: right; font-size: 13pt; background-color: #EAFFCC;', listeners: { change: function(textfield, newValue, oldValue) { if(oldValue == 'undefined' || newValue == '') { Ext.getCmp('btnArticleSave').disable(); } else { Ext.getCmp('btnArticleSave').enable(); } } } } ] } ] } ] }), buttons: [ { text: 'KAPAT', scale: 'medium', width: 100, cls: 'btn-article-close', listeners: { click: function() { winArticle.close(); } } }, '->', { text: 'EKLE', scale: 'medium', disabled: true, width: 100, margin: '0 9 0 0', cls: 'btn-article-save', id: 'btnArticleSave' } ] });
EXT.ONREADY FUNCTION
Ext.onReady(function () { Ext.QuickTips.init(); Ext.state.Manager.setProvider(new Ext.state.CookieProvider({ expires: new Date(new Date().getTime() + (1000 * 60 * 60 * 24 * 7)) })); var Discounts = Ext.create('Ext.form.Panel', { id: 'discount-types', bodyPadding: 10, width: 760, height: 600, title: 'DNR TANIMLAMA / SCREEN 0', layout: 'card', bodyStyle: 'padding:20px', defaults: { border: false, anchor: '100%' }, style: { 'box-shadow': '0 2px 5px rgba(0, 0, 0, 0.6)', '-webkit-box-shadow': '0 0 8px rgba(0, 0, 0, 0.5)' }, frame: true, buttons: [ { text: 'ÖNCEKİ ADIM', id: 'move-prev', cls: 'np-button', scale: 'medium', iconCls: 'dnr-prev-icon', iconAlign: 'left', handler: function (btn) { navigate(btn.up('panel'), 'prev'); var itemd = Discounts.getLayout().getActiveItem(); Discounts.setTitle('DNR TANIMLAMA ' + ' / ' + itemd.cardTitle); Ext.getCmp('dnr-submit').disable(); Ext.getCmp('dnr-submit').setVisible(false); }, disabled: true }, { text: 'SONRAKİ ADIM', id: 'move-next', scale: 'medium', cls: 'np-button', iconCls: 'dnr-next-icon', iconAlign: 'right', handler: function (btn) { navigate(btn.up('panel'), 'next'); var itemd = Discounts.getLayout().getActiveItem(); Discounts.setTitle('DNR TANIMLAMA ' + ' / ' + itemd.cardTitle); var cardNum = Discounts.items.indexOf(itemd); if (cardNum == 3) { Ext.getCmp('dnr-submit').enable(); Ext.getCmp('dnr-submit').setVisible(true); } }, disabled: true }, '->', { text: '  KAYDET ', id: 'dnr-submit', scale: 'medium', iconCls: 'dnr-submit-icon', iconAlign: 'right', cls: 'dnr-submit', disabled: true, hidden: true, handler: function (btn) { } } ], items: [ { id: 'screen-0', cardTitle: 'SCREEN 0', layout: 'form', items: [ { layout: { type: 'vbox', align: 'center' }, margin: '60 0 0 0', items: [ { xtype: 'combobox', inputWidth: 295, fieldLabel: 'DNR TİPİ', fieldStyle: 'height: 26px', id: 'discount-type', store: discounts, valueField: 'DNR_TYPE_ID', displayField: 'DNR_TYPE_DESC', queryMode: 'remote', forceSelection: true, stateful: true, stateId: 'cmb_disc_type', allowBlank: false, emptyText: 'DNR tipini seçiniz...', triggerAction: 'all', listeners: { select: function (e) { var discType = Ext.getCmp('discount-type').getValue(); var discDetail = Ext.getCmp('discount-detail'); discdetails.removeAll(); if (discType != 0) { discDetail.setDisabled(false); discdetails.proxy.extraParams = { 'dnrtype': discType }; discdetails.load(); } } } }, { xtype: 'combobox', inputWidth: 400, fieldStyle: 'height: 26px', id: 'discount-detail', valueField: 'ID', displayField: 'DNR_TITLE', store: discdetails, forceSelection: true, stateful: true, stateId: 'cmb_disc_detail', margin: '25 0 0 0', disabled: true, allowBlank: false, msgTarget: 'side', emptyText: 'İNDİRİM TİPİNİ SEÇİNİZ...', blankText: 'İndirim tipi boş olamaz!', triggerAction: 'all', listeners: { select: function (e) { var discDetail = Ext.getCmp('discount-detail').getValue(); if (discDetail != 'null') { var value = discdetails.getAt(discdetails.find('ID', discDetail)).get('DNR_DESCRIPTION'); Ext.getCmp('dnr-type-desc-panel').setVisible(true); Ext.getCmp('dnr-type-desc-panel').update(value); } } } }, { xtype: 'textarea', grow: false, name: 'invoiceText', fieldLabel: 'FATURA METNİ', id: 'invoice-text', blankText: 'Fatura metni boş olamaz!', width: 400, height: 60, margin: '30 0 0 0', allowBlank: false, msgTarget: 'side', listeners: { change: function (e) { if (Ext.getCmp('invoice-text').getValue().length === 0) { Ext.getCmp('move-next').disable(); } else { Ext.getCmp('move-next').enable(); } } } }, { xtype: 'panel', id: 'dnr-type-desc-panel', layout: {type: 'hbox', align: 'stretch'}, height: 145, width: 400, cls: 'dnr-desc-panel', margin: '60 0 0 0', html: ' ', hidden: true } ] } ] }, { id: 'screen-1', cardTitle: 'SCREEN 1', layout: 'form', items: [ { layout: 'column', width: 730, height: 90, items: [ { xtype: 'fieldset', title: 'ARTİKEL / HEDEF GRUP / MAL GRUBU SEÇİMİ', cls: 'dnr-fieldset', width: 730, height: 80, margin: '0', items: [ { xtype: 'buttongroup', columns: 5, columnWidth: 140, frame: false, margin: '5 0 0 18', items: [ { text: 'ARTİKEL', scale: 'medium', margin: '0 18px 0 0', width: 120, height: 36, id: 'btn-article', cls: 'btn-grp-choose btn-grp-article', listeners: { click: function () { winArticle.center(); winArticle.show(); } } }, { text: 'PUAR', scale: 'medium', margin: '0 18px 0 0', width: 120, height: 36, cls: 'btn-grp-choose btn-grp-puar', listeners: { click: function() { winPuar.show(); } } }, { text: 'MAL GRUBU', scale: 'medium', margin: '0 18px 0 0', width: 120, height: 36, cls: 'btn-grp-choose btn-grp-choose', listeners: { click: function() { winArticleGroup.show(); } } }, { text: 'HEDEF GRUP', scale: 'medium', margin: '0 18px 0 0', width: 120, height: 36, cls: 'btn-grp-choose btn-grp-target', listeners: { click: function() { winTargetGroup.show(); } } }, { text: 'SUPPLIER', scale: 'medium', width: 120, height: 36, cls: 'btn-grp-choose btn-grp-supplier', listeners: { click: function() { winSupplier.show(); } } } ] } ] } ] }, { xtype: 'gridpanel', id: 'article-grid', selType: 'rowmodel', elStatus: true, plugins: [ { ptype: 'cellediting', clicksToEdit: 1}, { ptype: 'datadrop'} ], columns: [ { text: 'COLUMN A', dataIndex: '' } ] } ] }, renderTo: 'content' }) });