2016-11-21 2 views
0

Я застрял в разработке расширения для Shopware. Я хочу правильно управлять администрированием категорий.Расширение бэкэнда в магазине с помощью ExtJs

Для создания этого плагина (устаревшего). Эти плагины добавляют первую вкладку в категорию.

//{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' of undefined. без .load() нет ошибки, но я также не могу определить, загружен ли магазин.

Сам магазин файл в Просмотров/бэкенд/haendlerbund_foobar_categories/магазин/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} 

EDIT: Для дальнейшего контекста, это - текущее состояние модели.

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 

     ]); 

    } 
} 

Он должен возвращать некоторые фиктивные данные сейчас.

Я не могу решить проблему. Поскольку любая документация, которую я смог найти, была либо сосредоточена на создании отдельного компонента изменения существующего поля. Я подозреваю, что я попал в неправильную область действия или имею ошибку с именами или что-то в этом роде.

Любая помощь очень ценится.

ответ

1

Если вы используете

store: somestore.load() 

выпадающий список будет привязан к значению возвращенного по load. Функция загрузки ничего не возвращает, поэтому для конфигурации магазина combo установлено значение 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' 
    }); 
+0

Я проверил ваше предложение. Это не имеет значения. Но вход, который, возможно, магазин не возвращает никаких данных, дал мне идею протестировать. –

+0

Пожалуйста, сделайте 'console.log (me.fooBarProducts)' и проверьте, что вы получаете. – Alexander

+0

Будет, когда я выясню, где поставить это, чтобы увидеть ответ. К настоящему моменту я пытаюсь проверить имена классов и так далее. Я предполагаю, что есть некоторые перепутанные вещи. ни магазин, ни модель не находятся в чистой среде ExtJS, и я на самом деле пытаюсь выяснить, получил ли я хотя бы правильный объем. –

1

Ваша проблема в магазине присваивание COMBOBOX

Эта строка кода не является правильным:

store: me.fooBarProducts.load(),

Обычно магазин должен быть связан только с выпадающим списком:

магазин: 'fooBarProducts'

Heres скрипку, чтобы показать вам:

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

Чтобы загрузить ваш магазин, вы должны вызвать загрузку магазина из комбо-декларации

+0

Благодарим вас за ответ. Это немного помогает понять поведение. Мой опыт работы с ExtJs почти не существует. Я постараюсь совместить свой ответ с тем, который был у @Alexander –