ExtJS/MODx CMP:网格编辑不保存到数据库,组合框不显示

Posted

技术标签:

【中文标题】ExtJS/MODx CMP:网格编辑不保存到数据库,组合框不显示【英文标题】:ExtJS/MODx CMP: grid edits not saving to db, combo box not displaying 【发布时间】:2014-07-04 03:36:59 【问题描述】:

ExtJS 或 MODext 是一个困难的主题,文档很少,所以我来这里寻求帮助。我有 2 个问题,都在同一个代码中。

基本摘要,我有一个带有 2 个选项卡的页面,显示来自 2 个不同自定义表的信息。 2 个选项卡(分别为:客户、预算)显示良好,带有信息的网格几乎完全正确显示。差不多……

首先:我有一个扩展 MODx.combo 的组合,以显示用户名作为值的用户的全名,并引用了 Ext.util 渲染器来显示值。在“预算”选项卡(第 2 个选项卡)上,这可以正常工作,但在“客户”选项卡(第一个选项卡)上,显示不会呈现(双击时组合仍然显示。这是我的代码...

首先是扩展:

GR8.combo.User = function(config) 
    config = config || ;
    Ext.applyIf(config,
    id: 'user'
        ,name: 'user'
        //,hiddenName: 'user'
        ,displayField: 'fullname'
        ,valueField: 'username'
        ,fields: ['fullname','username']
        ,pageSize: 20
        ,url: MODx.config.connectors_url+'security/user.php'
        ,typeAhead: true
        ,editable: true
    );
    GR8.combo.User.superclass.constructor.call(this,config);
;
Ext.extend(GR8.combo.User,MODx.combo.ComboBox);
Ext.reg('gr8-combo-user',GR8.combo.User);

接下来,客户端网格的组合字段代码:


   header: 'Agent'
   ,dataIndex: 'clientAgent'   //equates to modx username
   ,sortable: true
   ,width: 60
   ,editor:  xtype: 'gr8-combo-user' ,renderer: true
   ,renderer: Ext.util.Format.comboRenderer(GR8.combo.User, 'clientAgent')

最后,预算网格的组合字段代码:


   header: 'Agent'
   ,dataIndex: 'budgAgent'
   ,sortable: true
   ,width: 60
   ,editor:  xtype: 'gr8-combo-user' ,renderer: true
   ,renderer: Ext.util.Format.comboRenderer(GR8.combo.User, 'budgAgent')

是我遗漏了什么,还是这里有一个不容易发现的问题?

其次:当我对网格进行更改时,更改不会保存 - 小红色三角形停留在网格字段的左上角。我从 MODx Gallery 组件中找到了一个我认为可以使用的保存按钮:

,formpanel: 'gr8-panel-home'
,buttons: [
    text: _('save')
    ,id: 'gr8-btn-save'
    ,process: 'mgr/gr8/update'
    ,method: 'remote'
    ,keys: [
        key: 's'
        ,alt: true
        ,ctrl: true
    ]
]

这会在页面上放置一个保存按钮(它还复制了搜索输入 :( ),但我想我还需要做一些事情。有人可以告诉我我需要做什么吗?

【问题讨论】:

【参考方案1】:

要在直接从网格更新一行后保存网格,您需要将这两个参数添加到网格定义中:

,save_action: 'path/to/update/from/grid/processor'
,autosave: true

这里是 updatefromgrid 处理器的例子:https://github.com/modxcms/Tagger/blob/master/core/components/tagger/processors/mgr/tag/updatefromgrid.class.php

【讨论】:

这行得通 - 谢谢;您来自 Tagger 的示例非常有用。现在我有一个问题,id 字段没有命名为“id”,而是命名为“budgId”,并且 MODx 认为该表没有 id 字段,因此它会抛出 err_ns 错误并且不会保存。如果您对此有任何想法,我将不胜感激。我已经在 MODx 论坛上发布了这个:[链接]forums.modx.com/thread/92029/…。也许@MarkHamstra 也可能有线索...... 保存已解决,有关我如何重新定义主键的信息,请参见上面的链接。【参考方案2】:

在您的组合框中,您给它一个硬编码的“用户”ID。摆脱它,你应该准备好了。

ExtJS 不处理具有相同 ID 的组件,因此第二次构建组合时,它简直吓坏了,不知道该做什么。有时它在共享一个 ID 时会复制一些东西,有时它会抛出一个错误并且什么都不做。

@TheBoxer 已经解决了您的第二个问题;添加autosavesave_action 应该可以解决这个问题。

【讨论】:

这些都不起作用。关于保存功能,我将与@TheBoxer 一起解决。但是,通过从任一组合框中删除 id,组合框没有显示任何变化。第一个选项卡中组合的初始显示仍然没有在页面加载时显示,而第二个是。 只是为了确认一下,这个建议对组合框没有任何影响。有没有人有其他想法?

以上是关于ExtJS/MODx CMP:网格编辑不保存到数据库,组合框不显示的主要内容,如果未能解决你的问题,请参考以下文章

值不能为空。参数名称:数据源。编辑数据网格并保存到数据库

jQuery EasyUI:确认/保存数据网格内联编辑

在可编辑数据网格 Flex 中禁用自动保存

以新形式编辑选定的数据网格行

AG 网格:禁用编辑行,除非保存已编辑的行

GWT 编辑器和 GXT 网格不发送新创建的代理实体,只有 NULL 值