ExtJS组合框通过PHP在页面加载时从远程存储动态设置初始值

时间:2014-01-07 17:12:00

标签: php extjs combobox

我当前的问题涉及在员工详细信息页面中显示与员工部门相关的ExtJS组合框中的初始值。

该页面通过PHP检索员工信息,因此所有对员工的引用都是通过PHP echo完成的(该站点使用CodeIgniter,这可能会使一些人感到困惑;它只是简化了一些输入,但工作方式与正常相同) PHP),即

var formPanel = Ext.create('Ext.form.Panel', {
    title: 'User Details',
    width: 300,
    renderTo: Ext.get('details'),
    store: userStore,
    defaultType: 'textfield',
    items:
    [
        {
            fieldLabel:'User Name',
            name: 'UserName',
            allowBlank: false,
            value: '<?php echo $Employee->UserName; ?>'
        },
        //More details in similar format etc.
    ]
});

部门有一个部门,通过组合框处理,列出所有部门;没有什么花哨的(我相信),它只是列出了所有部门:

    Ext.define('DeptModel', {
        extend: 'Ext.data.Model',
        fields: [
            {name:'Id', type: 'int'},
            {name:'Name', type: 'string'}
        ]
    });

    var deptStore = Ext.create('Ext.data.Store', {
        model:'DeptModel',
        autoload: true,
        proxy: {
            // load using HTTP
            type: 'ajax',
            url: '<?= $site_url ?>Settings/JSON/Departments',
            reader: {
                type: 'json',
                model: 'DeptModel'
            }
        }
    });

上面的formPanel引用了comboBox中的deptModel / deptStore:

{
    fieldLabel:'Department',
    xtype:'combo',
    name:'Department',
    forceSelection: true,
    typeAhead: true,
    allowBlank: false,
    emptyText: 'Choose a Department',
    store: deptStore,
    displayField: 'Name',
    valueField: 'Id'
}

上面的组合框正确呈现并提供所有部门。然而,试图用值初始化组合框并没有奏效,从组合框中没有变化到创建停止页面渲染的错误。我看过以下内容:

value: 5   // or any integer
value: '5' // or any string
value: <?php echo $Employee->DepartmentId ?> // or any PHP reference like those that work for the textfields e.g. the User Name above - DepartmentId has been checked to be an integer
value: '<?php echo $Employee->DepartmentId ?>' // stringifying the PHP reference
value: 'Accounts'

我还看了很多关于渲染后加载商店的帖子,设置商店加载的值,设置渲染值,在formPanel代码之前设置值;坦率地说,没有人工作过,而且大多数人都把价值设定在列表中的第一个,而不是处理我的特定问题。

理想情况下,我想简单说明

value: <?php echo $Employee->DepartmentId ?>

在页面加载时,当员工的详细信息显示在表单中时,让组合框显示相关部门(即“帐户”)。

我哪里错了?为什么value: {value}在实践中没有做任何事情?任何人都可以提供关于将组合框插入到formPanel中的正确形式的简单解释,如果当前实现在某种程度上不正确,那么允许在页面加载时拾取所述组合框中的初始值吗?

2 个答案:

答案 0 :(得分:1)

<强> JsonStore:

var articleMain = new Ext.data.JsonStore({
model: 'ArticleMainGroup',
autoLoad: true,
proxy: {
    type: 'ajax',
    url: '<?php echo base_url() ?>dashboard/create',
    extraParams: {
        type: 'article_group_main'
    },
    reader: {
        type: 'json',
        root: 'articleMainGroup',
        idProperty: 'ART_GROUP_ID'
    }
}
});

数据模型:

Ext.define('ArticleMainGroup', {
extend: 'Ext.data.Model',
fields: [
    {name: 'ART_GROUP_ID', type: 'int'},
    {name: 'WHG', type: 'int'},
    {name: 'WHG_BEZ', type: 'string'}
]
});

<强>控制器:

    public function create()
{
    $type = $this->input->get('type', TRUE);

    // this parameter comes from ExtJS Extraparam
    switch ($type)
    {
        case 'dnr_type':
            $data = $this->dnr->get_dnr_type();
            exit(json_encode($data));
        case 'dnr_definition':
            $para = $this->input->get('dnrtype', TRUE);
            $data = $this->dnr->get_dnr_definition($para);
            exit(json_encode($data));
        case 'article_group_main':
            $data = $this->dnr->get_article_group_main();
            exit(json_encode($data));

<强>型号:

    public function get_article_group_main()
    {
        $sql = $this->db->query('SELECT ART_GROUP_ID, WHG, CONCAT_WS(" - ", WHG, WHG_BEZ) AS WHG_BEZ FROM MD_ARTICLE_GROUP GROUP BY WHG_BEZ ORDER BY WHG');
        return array('articleMainGroup' => $sql->result_array());
    }

以下是您的要求:

{
  fieldLabel:'Department',
  xtype:'combo',
  name:'Department',
  forceSelection: true,
  typeAhead: true,
  allowBlank: false,
  emptyText: 'Choose a Department',
  store: deptStore,
  displayField: 'Name',
  valueField: 'Id',
  id: 'cmb-department'
}

// Add a listener to the combobox before store load
var combo = Ext.getCmp('cmb-department');
var cmbStore = combo.store;
cmbStore.on('load', function() {
   // setValue(777) // here, 777 is unique value that available in the store
   combo.setValue(<?php echo $Employee->DepartmentId ?>)
})

答案 1 :(得分:0)

我会尽力帮助你,但你应该纠正一些错误。例如,您创建了如下数据模型:

    Ext.define('DeptModel', {
    extend: 'Ext.data.Model',
    proxy: {
        type: 'ajax',
        reader: 'json'
    },
    fields: [
        {name:'Id', type: 'int'},
        {name:'Name', type: 'string'}
    ]
});

但是,数据模型应该是:

Ext.define('DeptModel', {
    extend: 'Ext.data.Model',
    fields: [
        {name: 'Id', type: 'int'},
        ...
    ]
});

因此,您应该在商店配置中定义代理属性,而不是数据模型!原因是商店与服务器端交互,数据模型只是对数据建模。

var deptStore = new Ext.data.JsonStore({
    model: 'DeptModel',
    proxy: {
        type: 'ajax',
        url: '<?php echo base_url() ?>Settings/JSON/Departments',
        reader: {
            type: 'json',
            root: 'deptList',
            idProperty: 'DEP_ID'
        }
    }
});

在这里,我定义了一个简单的商店。您必须注意rootidProperty属性。你应该给出一个Json对象的名称,如下所示:

// return value from model
$sql = $this->db->query('SELECT DEP_ID, ......');
return array('deptList' => $sql->result_array());

// return value from controller
$data = $this->db->get_dept_list($arg);
echo json_encode('$data');

此外,idProperty很重要,它应该是唯一值,以消除价值冲突。

以下是我的应用的示例屏幕截图。如您所见,当用户从DNR TİPİ中选择一个值时,app会自动填充ÌNDİRİM TİPİNİ SEÇİNİZ组合框!

enter image description here

在屏幕截图中,discDetail等于deptList