Shopware后端使用ExtJs增强类别

时间:2016-11-21 09:01:40

标签: extjs models shopware

我坚持开发Shopware的扩展程序。 我想以正确的方式扩展类别的管理。

实现创建的插件(遗留)。此插件会在类别中附加第一个选项卡。

//{block name="backend/category/view/tabs/settings" append}

这样做是为了添加带有下拉列表的字段集。该文件如下所示:

//{block name="backend/category/view/tabs/settings" append}
Ext.define('Shopware.apps.HaendlerbundFoobarCategories.view.category.tabs.settings', {
    override:'Shopware.apps.Category.view.category.tabs.Settings',

    getItems: function() {
        var me = this;
        var items = me.callParent(arguments);
        me.FooBar = me.getFooBarSection();
        items.push(me.FooBar);
        return items;
    },

    getFooBarSection : function()
    {
        var me = this;
        return Ext.create('Ext.form.FieldSet',{
            title: 'FooBar Verlinkung',
            anchor: '100%',
            defaults : me.defaults,
            disabled : false,
            items : me.getDropdowns()
        });
    },

    getDropdowns:function(){
        var me = this;

        return me.templateComboBox = Ext.create('Ext.form.field.ComboBox', {
            xtype:'combobox',
            fieldLabel: 'FooBar Product',
            store: me.fooBarProducts.load(),
            labelWidth: 155,
            valueField: 'id',
            displayField:'title',
            editable: true,
            allowBlank:true,
            name:'fbproduct'
        });
    }
});
//{/block}

我怀疑的主要问题是商店。像这样离开我得到一个JS 错误无法读取属性' load'未定义的。没有 .load()没有错误,但我也无法确定商店是否已加载。

商店文件本身位于 Views / backend / haendlerbund_foobar_categories / store / foo_bar_products

并且文件的内容是:

//{block name="backend/haendlerbund_foobar_categories/store/fooBarProducts"}
Ext.define('Shopware.apps.HaendlerbundFoobarCategories.store.fooBarProducts', {

//...
model: 'Shopware.apps.HaendlerbundFoobarCategories.model.fooBarProducts',
proxy : {
        type : 'ajax',
         /**
         * Configure the url mapping for the different
         * store operations based on
         * @object
         */
        api : {
            read : '{url controller=HaendlerbundFoobarCategories action=getProducts}'
        },
        /**
         * Configure the data reader
         * @object
         */
        reader : {
            type : 'json',
            root: 'data'
        }
    }
});
//{/block}

修改 对于进一步的上下文,这是商店引用的模型的当前状态。

Ext.define('Shopware.apps.HaendlerbundFoobarCategories.model.fooBarProducts', {
    extend: 'Ext.data.Model',

    /**
     * If the name of the field is 'id' extjs assumes automatically that
     * this field is an unique identifier.
     * @integer
     */
    idProperty : 'id',

    fields:[
        { name : 'id',          type: 'int' },
        { name : 'ffid',        type: 'bigint' },
        { name : 'title',       type: 'string' },
        { name : 'description', type: 'string' },
        { name : 'price',       type: 'decimal' },
        { name : 'vat',         type: 'decimal' },
        { name : 'image',       type: 'text' },
        { name : 'active',      type: 'boolean' },
        { name : 'createdAt',   type: 'datetime' },
        { name : 'modfiedAt',   type: 'datetime' }
    ],


    /*associations: [
        {
            relation: 'OneToMany',
            storeClass: 'Shopware.apps.HaendlerbundFoobarCategories.store.fooBarProducts',
            loadOnDemand: true,

            type: 'hasMany',
            model: 'Shopware.apps.HaendlerbundFooBarCategories.model.fooBarProducts',
            name: 'getCategories',
            associationKey: 'categories'
        },
    ]*/
});

商店引用的php控制器也有以下内容:

<?php

class Shopware_Controllers_Backend_HaendlerbundFoobarCategories extends Shopware_Controllers_Backend_Application
{
    protected $model = 'Shopware\CustomModels\Product\FFProduct';
    protected $alias = 'ffproducts';

    protected function getListQuery()
    {
        $builder = parent::getListQuery();
        return $builder;
    }

    protected function getDetailQuery($id)
    {
        $builder = parent::getDetailQuery($id);
        return $builder;
    }

    protected function getAdditionalDetailData(array $data)
    {
        return $data;
    }

    public function getProducts(){
        $builder = $this->getManager()->createQueryBuilder();
        $builder->select('*')
                ->from($model, $alias);

        $data['id']     = 1;
        $data['ffid']   = 1;
        $data['title']  = 'lorem ipsum'; 

        $this->view()->assign([
            'success'   => true,
            'data'      => $data,
            'total'     => 1

        ]);

    }
}

现在应该返回一些虚拟数据。

我未能解决问题。正如我能找到的任何文档要么专注于创建一个更改现有字段的单独组件。我怀疑我在错误的范围内或者有一个命名空间错误或其他什么。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

如果您使用

store: somestore.load()

组合框将load绑定到返回值。加载函数不返回任何内容,因此组合的商店配置设置为undefined

您想要做的可能是

    me.fooBarProducts.load();
    return me.templateComboBox = Ext.create('Ext.form.field.ComboBox', {
        xtype:'combobox',
        fieldLabel: 'FooBar Product',
        store: me.fooBarProducts,
        labelWidth: 155,
        valueField: 'id',
        displayField:'title',
        editable: true,
        allowBlank:true,
        name:'fbproduct'
    });

答案 1 :(得分:1)

您的问题是分配给组合框的商店

这行代码不正确:

store: me.fooBarProducts.load(),

通常商店应该只连接到这样的组合框:

店:&#39; fooBarProducts&#39;

这是一个向你展示的小提琴:

https://fiddle.sencha.com/#view/editor&fiddle/1kqj

Ext.application({
name : 'Fiddle',

launch : function() {
    var yourStore=Ext.create('Ext.data.Store',{
        fields:[{
            name:'text'
        },{
            name:'value'
        }],
        data:[
            {text:'test1',value:'testVal1'},
            {text:'test2',value:'testVal2'},
            {text:'test3',value:'testVal3'}
            ]
    });
    Ext.create({
        xtype:'window',
        width:300,
        height:200,
        items:[{
            xtype:'combo',
            displayField:'text',
            valueField:'value',
            store:yourStore
        },{
            xtype:'combo',
            displayField:'text',
            valueField:'value',
            store:yourStore
        }]
    }).show();
}

});

还可以看一下:http://docs.sencha.com/extjs/6.2.0/classic/Ext.form.field.ComboBox.html

用于组合框示例 这里存储声明: http://docs.sencha.com/extjs/6.2.0/modern/Ext.data.Store.html

要加载商店,您应该从商店加载调用商店加载