Показать сообщение отдельно
  #1 (permalink)  
Старый 17.05.2012, 13:07
Новичок на форуме
Отправить личное сообщение для Alex Danilov Посмотреть профиль Найти все сообщения от Alex Danilov
 
Регистрация: 17.05.2012
Сообщений: 7

Как правильно спроектировать приложение?
Добрый день, коллеги!

Я проектирую простое приложение на основе Layout Browser
http://dev.sencha.com/deploy/ext-4.1...t-browser.html

В системе есть сущности: категории, товары, заказы.
Общий код для создания лайаута находится в отдельном файле и при клике на ветку дерева загружает класс
var m = Ext.create('Catalog.modules.имя_класса');
m.getIndexPanel()


Каждый модуль имеет такую структуру:
Ext.define('Catalog.modules.category', {

    getStore: function() {
        var me = this;

        if (me.store === undefined) {
            Ext.define('category', {
                extend: 'Ext.data.Model',
                fields: ['id', 'name', 'code']
            });
            me.store = Ext.create('Ext.data.Store', {
                model: 'category',
                proxy: {
                    type: 'rest',
                    url : '/catalog/products/',
                    reader: {
                        type: 'json',
                        root: 'items'
                    }
                },
                autoLoad: true,
                autoSync: true
            });
        }

        return me.store;
    },

    getIndexPanel: function() {
        var me = this;
        me.getStore();

        var rowEditing = Ext.create('Ext.ux.grid.plugin.RowEditing', {
            clicksToMoveEditor: 1,
            autoCancel: false
        });

        me.grid = Ext.create('Ext.grid.Panel', {
            title: 'Категории',
            store: me.store,
            height: 700,
            forceFit: true,
            columns: [
                {
                    text: 'Название категории',
                    dataIndex: 'name',
                    sortable : true,
                    editor: {
                        allowBlank: false
                    }
                },
                {
                    text: 'Код',
                    dataIndex: 'code',
                    editor: {
                        allowBlank: false
                    }
                }
            ],
            viewConfig: {
                stripeRows: true
            },
            tbar: [
            {
                text: 'Добавить',
                iconCls: 'add-item',
                handler: function() {
                    if (rowEditing.editing) return false;

                    var item = Ext.create('category', {

                    });
                    me.store.insert(0, item);
                    rowEditing.startEdit(0, 0);
                }
            }, {
                itemId: 'remove',
                text: 'Удалить',
                iconCls: 'remove-item',
                handler: function() {
                    var sm = me.getSelectionModel();
                    rowEditing.cancelEdit();
                    Ext.Msg.show({
                         title: 'Удалить запись?',
                         msg: 'Вы действительно хотите удалить выделенные записи?',
                         buttons: Ext.Msg.YESNO,
                         icon: Ext.Msg.QUESTION,
                         fn: function (btn){
                            if (btn === 'yes') {
                                me.store.remove(sm.getSelection());
                                me.store.sync();
                                if (me.store.getCount() > 0) {
                                    sm.select(0);
                                }
                            }
                         }
                    });
                }
            },{
                text: 'Обновить',
                iconCls: 'refresh',
                handler: function() {
                    me.store.load();
                }
            }],
            plugins: [
                rowEditing
            ]
        });

        return me.grid;
    }
});


Модуль товаров:
Ext.define('TourOffice.modules.products', {

    getStore: function() {
        var me = this;

        if (me.store === undefined) {
            Ext.define('product', {
                extend: 'Ext.data.Model',
                fields: ['id', 'category_id', 'name']
            });
            me.store = Ext.create('Ext.data.Store', {
                model: 'product',
                proxy: {
                    type: 'rest',
                    url : '/catalog/products/',
                    reader: {
                        type: 'json',
                        root: 'items'
                    }
                },
                autoLoad: true,
                autoSync: true
            });

            var categories = Ext.create('Catalog.modules.categories');
            me.categoriesStore = categories.getStore();
        }

        return me.store;
    },

    getIndexPanel: function() {
        var me = this;
        me.getStore();

        var rowEditing = Ext.create('Ext.ux.grid.plugin.RowEditing', {
            clicksToMoveEditor: 1,
            autoCancel: false
        });

        // create reusable renderer for categories
        Ext.util.Format.comboRenderer = function(combo){
            return function(value){
                var record = combo.findRecord(combo.valueField, value);
                return record ? record.get(combo.displayField) : combo.valueNotFoundText;
            }
        }
        var categoriesCombo = new Ext.form.ComboBox({
            typeAhead: true,
            triggerAction: 'all',
            lazyRender:true,
            mode: 'local',
            store: me.categoriesStore,
            valueField: 'id',
            displayField: 'name'
        });

        me.grid = Ext.create('Ext.grid.Panel', this, {
            title: 'Товары',
            store: me.store,
            height: 700,
            forceFit: true,
            columns: [
                {
                    text: 'Название товара',
                    dataIndex: 'name',
                    sortable : true,
                    editor: {
                        allowBlank: false
                    }
                },{
                    text: 'Категория',
                    dataIndex: 'category_id',
                    editor: {
                        editor: currenciesCombo,
                        renderer: Ext.util.Format.comboRenderer(categoriesCombo), // pass combo instance to reusable renderer
                        allowBlank: false
                    }
                }
            ],
            viewConfig: {
                stripeRows: true
            },
            tbar: [
            {
                text: 'Добавить',
                iconCls: 'add-item',
                handler: function() {
                    if (rowEditing.editing) return false;
                    
                    var item = Ext.create('product', {
                       
                    });
                    me.store.insert(0, item);
                    rowEditing.startEdit(0, 0);
                }
            }, {
                itemId: 'remove',
                text: 'Удалить',
                iconCls: 'remove-item',
                handler: function() {
                    var sm = me.getSelectionModel();
                    rowEditing.cancelEdit();
                    Ext.Msg.show({
                         title: 'Удалить запись?',
                         msg: 'Вы действительно хотите удалить выделенные записи?',
                         buttons: Ext.Msg.YESNO,
                         icon: Ext.Msg.QUESTION,
                         fn: function (btn){
                            if (btn === 'yes') {
                                me.store.remove(sm.getSelection());
                                me.store.sync();
                                if (me.store.getCount() > 0) {
                                    sm.select(0);
                                }
                            }
                         }
                    });
                }
            },{
                text: 'Обновить',
                iconCls: 'refresh',
                handler: function() {
                    me.store.load();
                }
            }],
            plugins: [
                rowEditing
            ]
        });

        return me.grid;
    }
});


Вопрос - правильно ли я планирую структуру модулей?
В товарах есть создание класса категории categoriesStore для того, чтобы в комбобокс в листинге товаров подставилась категория, а не ID.

Прошу подсказать, есть ли недочеты или ошибки, как правильно построить такую структуру?
Ответить с цитированием