使用操作下拉列表从列表视图更新记录

I'M仍在学习曲线上作为Sugarcrm开发人员。一世'在后端(逻辑挂钩,数据库工作,预定的工作)完成了大量的开发,但仍然在前端学习绳索。我真的可以使用一些帮助了解如何实现这一目标。

我们有一个自定义模块,包括状态下拉列表。我们的一组用户在此模块的列表视图中花费大部分时间。其中一个关键操作是更新此状态字段。一世'已被要求直接从列表视图启用此状态,这将简化其工作流程。

我修改了模块RecordList.php文件以在下拉列表中添加状态选项(请参阅附加图像)。所以,如果他们选择"Mark Complete",应更新状态字段"Complete."ListView中的列应更新以刷新新值。

我如何使它变得如此糖"listening" for this action and makes 适当的更新?

记录本身的更新是否在前端的JavaScript中发生?或者操作是否触发了后端的进程/呼叫,使用PHP代码最终更新字段并保存呢?

感谢您的任何帮助,您可以提供。

父母
  • 我不确定你是以最有效的方式接近这个。

    用户可以使用列表视图上的编辑来逐个更新每行,但是 最简单的是将状态添加到质量更新,这样他们就可以检查左侧的框以获取所有线路 更新为给定值,然后选择要分配的状态。

    看看这些链接是否有帮助:

    将字段添加到大众更新:

    http://support.phone2play.com/Knowledge_Base/Studio_and_Module_Builder/Adding_a_Field_to_Mass_Update/ 

    或者,您可以添加列表视图操作(不行操作)以质量更新到所有选定列表视图记录上所需的值的状态,有效地执行单击大众更新。

    例如,在我的情况下,我添加了一个 行动 to close as spam in

    风俗/modules/Cases/ clients/base/views/recordlist/recordlist.php.

    在里面 行动 array:

     

    array (
            'name' => 'close_as_spam',
            'type'=>'button',
            'label' => 'LBL_CLOSE_AS_SPAM_ACTION',
            'acl_action' => 'edit',
            'events' => array(
              'click' => 'list:closeasspam:fire',
            ),
          ),

    我那么 延长控制器 并定义要执行的代码 当事件火灾时:

    风俗/模块/案例/客户/基础/视图/录制列表/RecordList.js.

    ({
       extendsFrom: 'RecordlistView',

       initialize: function(options){
          ._super('initialize', [options]);
          //define the event for the close as spam action
          .context.on('list:closeasspam:fire', .closeAsSpamClicked, );

       },
       //execute the update
       updateRecords: function(params){
         var self = ,
             url = app.API..buildURL('Cases/MassUpdate');
         app.API..call('update',url,params,{
           success: function(o){
             self.layout.context.reloadData({showAlerts: false});
             var massCollection = self.context.get('mass_collection');
             massCollection.reset();
           },
           error: function(e){
             app.alert.show('error_while_mass_update', {
               level:'error',
               title: app.lang.getAppString('ERR_INTERNAL_ERR_MSG'),
               messages: app.lang.getAppString('ERR_HTTP_500_TEXT')
             });
           },
         });
       },
       //set the values to update
       closeAsSpamClicked : function() {
         var ids = _.map(.context.get('mass_collection').models, function(selected_model){return selected_model.id}),
             params = {
               'massupdate_params':{
                 'uid':ids,
                 'status':'Closed',
                 'resolution':'Closed as Spam',
                 'case_closed_reason_c':'Spam'
               }
             };
         .updateRecords(params);
       },
    })

    请注意,所有这一切都已 如果没有用户必须设置这些本身的用户,可以利用Massupdate来设置状态,分辨率和Case_Reason_c(自定义字段)。

     

    如果你想走下自定义的道路 划痕 events

    在自定义/模块/<yourModule>/ clients/base/views/recordlist/recordlist.php.

    您将添加一个项目 划痕 array.

    您现在需要一个事件处理程序在控制器中的自定义事件

    在自定义/模块/<yourModule>/ clients/base/views/recordlist/recordlist.js.

    并定义事件被解雇时要做什么

    希望这可以帮助,
    Francescas.

  • 谢谢 非常适合你的回复。 

    我知道他们可以使用大众更新,但在这个用例中,它们只在用户完成糖外面的另一个动作时更新一个。

    通过介绍在列表视图中编辑记录"edit"选项确实正常工作。但是,它需要5次点击键以更新一次记录(单击操作箭头,单击“编辑”,单击“下拉”,单击“值”,单击“保存”。如果我能像我希望的那样得到这个工作,那么它只是2次点击(单击操作箭头,单击所需的值)。在一个可能每天完成数百次的过程中,保存额外的点击将节省大量时间。

    我确实设法在划队中添加该项目,我的事件处理程序现在正在触发JavaScript函数。但记录是't更新。到目前为止,这是我的记录列表.JS:

    ({

        extendsFrom:'RecordListView',

        initialize:function(options){
            ._super("initialize",[options]);
            .context.on('list:editcompleterow:fire',.markItineraryComplete,);
        },
       
        markItineraryComplete:function(){
            .model.set("status_c", 'Complete');
            console.log("Save was attempted.");
        } 
    })
  • 弗朗西斯卡可以在这里纠正我,因为她就像糖女王一样,但我认为这个问题是:

    你在打电话给"this.model.set" on a listview. ListView ISNT直接绑定到问题中的记录和扩展,记录数据库字段本身。 ListView仅仅是一个列出的查询结果。  You'重新尝试设置返回查询的值,而不是实际记录本身。 您可以设置行的值,但不会与DB记录有任何连接。  Francesca'S大众更新黑客是为目的提供的。 质量更新连接到问题中的记录并更新数据库中的值。 您只是尝试更改视图上的文本。  

    I'M可以非常部分地偏袒PHP,但如果您想在2次点击中执行此操作,我可能会抓住函数中记录的GUID,通过AJAX调用将其关闭到PHP帮助程序文件,通过SQL查询或豆类 - >保存()仍设置列表视图的值。 ListView上的更改值真的很有价值"fake"但是,给用户该值改变的外观。 PHP帮助程序文件实际上更改了DB值。  

  • 你太崇拜我太多了 泰德莫利,我不是一个女王,只是一个最适合的法庭嘲笑 

    我相信你是正确的 "this.model"不是该行的实际模型。 (疑问时,我使用console.log(此)来查看什么"this" really is.)

    如果我记得正确,则rowaction应该将特定行作为参数传递模型。

    您还需要明确保存模型:

    markItineraryComplete:function(model){
            model.set("status_c", 'Complete');
            model.save();
            console.log("Save was attempted.");
    } 

    我想你也可以使用更短的版本:

    markItineraryComplete:function(model){
            model.save({status_c: 'Complete'});
            console.log("Save was attempted.");
    } 

    您可以为用户添加确认以获得好的措施:

    markItineraryComplete:function(model){
            model.save({status_c: 'Complete'});
            app.alert.show('update_complete', {
              level: 'success',
              messages: 'Record marked as Complete',
              autoClose: true
            });
            console.log("Save was attempted.");
    } 

    Aaron Kerr. Let 我们知道是否有效

    HTH,
    Francescas.

     

回复
  • 你太崇拜我太多了 泰德莫利,我不是一个女王,只是一个最适合的法庭嘲笑 

    我相信你是正确的 "this.model"不是该行的实际模型。 (疑问时,我使用console.log(此)来查看什么"this" really is.)

    如果我记得正确,则rowaction应该将特定行作为参数传递模型。

    您还需要明确保存模型:

    markItineraryComplete:function(model){
            model.set("status_c", 'Complete');
            model.save();
            console.log("Save was attempted.");
    } 

    我想你也可以使用更短的版本:

    markItineraryComplete:function(model){
            model.save({status_c: 'Complete'});
            console.log("Save was attempted.");
    } 

    您可以为用户添加确认以获得好的措施:

    markItineraryComplete:function(model){
            model.save({status_c: 'Complete'});
            app.alert.show('update_complete', {
              level: 'success',
              messages: 'Record marked as Complete',
              autoClose: true
            });
            console.log("Save was attempted.");
    } 

    Aaron Kerr. Let 我们知道是否有效

    HTH,
    Francescas.

     

孩子们
  • 非常感谢回复。我今天早上闲逛,努力调整您提供的示例。大约半小时前,我设法获得以下解决方案:

    markItineraryComplete:function(model){ 
         var self = ,
               url = app.API..buildURL('itin1_Itinerary/'+model.id);
               params = {'status_c':'Complete'};
         app.API..call('update',url,params,{
              success: function(o){
                   model.set("status_c", 'Complete');
                   App.alert.show('message-id', {
                        level: 'success',
                        messages: 'Status Updated',
                        autoClose: true,
                        autoCloseDelay : 2200
                   });
              },
              error: function(e){
                   console.log("API Call Failed");
                   app.alert.show('error_while_row_update', {
                        level:'error',
                        title: app.lang.getAppString('ERR_INTERNAL_ERR_MSG'),
                        messages: app.lang.getAppString('ERR_HTTP_500_TEXT')
                   });
              },
         });
    },

    我基本上是一个API调用,然后如果它成功,我还在更新UI中的模型来反映更改。但是,我刚刚尝试了你提供的第三个例子,它完美地工作。我想我'LL使用您提供的选项,因为它是从代码透视的更清晰,并且在UI中也响应一点'在更新本地模型之前,不等待API呼叫完成。

    再次感谢令人敬畏的帮助!