0

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 エラーCannot read property 'load' of undefined が表示されます。.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

        ]);

    }
}

今のところ、ダミー データが返されるはずです。

問題を解決できません。私が見つけることができたドキュメントは、既存のフィールドを変更する別のコンポーネントの作成に焦点を当てていました。スコープが間違っているか、名前空間エラーか何かがあると思われます。

どんな助けでも大歓迎です。

4

2 に答える 2

1

あなたの問題は、コンボボックスに割り当てるストアです

このコード行は正しくありません:

store: me.fooBarProducts.load(),

通常、ストアは次のようなコンボボックスにのみ接続する必要があります。

store:「fooBarProducts」

ここにあなたに示すフィドルがあります:

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

ストアをロードするには、ストア ロードをコンボ宣言から呼び出す必要があります。

于 2016-11-21T09:37:19.343 に答える
1

使用する場合

store: somestore.load()

コンボボックスは、によって返される値にバインドされloadます。load 関数は何も返さないため、コンボの store config は に設定されてい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'
    });
于 2016-11-21T09:31:51.553 に答える