【问题标题】:Form Validation for Custom Objects in Customer Portal客户门户中自定义对象的表单验证
【发布时间】:2014-05-07 10:54:53
【问题描述】:

我对 CP 文档的深入研究越多,我就越意识到我的假设有多少是错误的。目前,在寻求有效理解系统的过程中,我希望构建一个仅包含自定义对象(非事件/非答案/非联系)的表单,然后尝试在客户门户上使用它。

为了简单起见,我要做的只是有一个 2 字段表单(两个文本框)和一个提交按钮作为前端。以下是我正在尝试做的事情:

  • 使用<rn:widget .... />形式的输入文本框,这样我就可以 利用requiredvalidate_on_blur等属性。我不是 确定这些属性是否也可以用于自定义对象,但是 我们稍后再讨论。
  • 使用已定义的表单验证方法,用于 标准对象(如果可能的话),这样我就不必 重新发明轮子。
  • 验证成功后,将表单数据发布到我的自定义 控制器,我可以从中保存这些数据。

我很快意识到我根本无法为自定义对象使用标准的input/FormInput(生成文本框)小部件。我还发现我也不能使用标准的input/TextInput 小部件。经过一番研发,我终于找到了解决方案,从头开始创建一个小部件并在其视图中添加适当的 HTML。

到目前为止一切顺利。我的第一步得到了照顾。我能够使用

<rn:widget path="/custom/nl/custom_input" name="Packagename$Objectname.c$Fieldname" required = "true" />

在表单的视图页面中。

下一步,表单验证,是让我无限困惑的地方。我无法理解文档中给出的代码,因此决定在此处讨论它。

我遇到了this,不幸的是它并没有太大帮助。我还遇到了另一个线程(似乎找不到 URL),其中 OP 使用了一个自定义小部件,该小部件扩展了 input/TextInput 小部件,并想知道如何将验证应用于该文本框。给出的答案是覆盖input/TextInputonValidate 函数,如果错误则返回false,如果成功则返回事件对象。

那么我是否可以假设我可以采用类似的方法?由于我使用的是新的小部件,是否有类似的方法可以覆盖并返回 true 或 false?如果是,该函数的名称是什么?非常感谢任何帮助。

【问题讨论】:

    标签: javascript oracle validation crm rightnow-crm


    【解决方案1】:

    您使用的是 CP2 还是 CP3 以及 RightNow 的哪个版本?我会假设这里是 CP2。

    你的问题几乎是两部分:1)我可以使用哪个小部件,以及 2)我如何扩展验证?

    既然听起来您只想使用requiredvalidate_on_blur 标准小部件属性,那么我认为您的第一种方法更好。您应该能够使用开箱即用的功能实现您所描述的目标。

    使用标准小部件

    尝试使用点符号再次使用标准小部件来访问该字段;类似于 ROQL 中的方法:

    <rn:widget path="input/FormInput" name="Packagename.Objectname.Fieldname" required = "true" />
    

    自定义对象没有自定义字段,因为对象本身是自定义的。因此,没有 c$ 前缀来访问自定义对象上的字段。该表示法仅适用于标准对象上的自定义字段。

    另外,值得注意的是,FormInput 小部件只是其他输入小部件的包装器,包括 TextInput

    创建小部件验证

    如果您想使用您的自定义小部件,那么您需要覆盖您提到的logic.js 文件中的适当方法。根据您创建自定义小部件的方式,onValidate 或任何您的验证方法可能实际上还不是该文件中的方法;你必须创建它。在这种情况下,您需要为文本字段设置事件侦听器,然后对事件执行操作。如果你想使用模糊,它会像下面这样(这基本上是标准输入小部件所做的)

    RightNow.Widget.MyWidget = function(data, instanceID) {
        //Setup widget data
        this._inputField = document.getElementById("rn_" + this.instanceID + "_" + this.data.js.name);
        YAHOO.util.Event.addListener(this._inputField, "blur", this._blurValidate, null, this);
    }
    
    RightNow.Widget.TextInput.prototype = {
         _blurValidate: function()
         {
             //validate your field data
         }
    }
    

    CP3 方法有点不同,特别是因为有强大的自定义小部件继承。因此,如果您使用的是 CP3,但仍想使用自定义小部件路线,请回来查看。

    此外,所有标准小部件代码都应通过 WebDAV 中的 src 文件夹公开给您。如果您可以通过您的个人资料访问 WebDAV(因为您正在开发 CP),那么您可以查看标准小部件的工作原理并将相同的原则应用于您的代码。

    【讨论】:

    • +1 获取详细说明。我的CP版本是3.1。明天回去工作时,我会发布更新后的代码(我确实在白天取得了一些进展)。
    • 好的,您应该仍然可以在您的 CP3 实现中使用标准小部件。仍然遵循我提到的点符号。如果这对你有用,那么你应该做好准备。
    【解决方案2】:

    我是通过一系列试错法弄明白的。我所做的是在其logic.js 文件中使用Rightnow.Field 扩展我的自定义输入。

    Custom.Widgets.nl.custom_input = RightNow.Field.extend({
        overrides: {            
            constructor: function() {               
                this.parent();
    
                /* Call a custom function on form submit */
                this.parentForm().on("submit", this.onValidate, this);
            }
        },
    

    以下函数取自SiteInfologic.js 文件(CP 文档中提供的自定义对象示例代码),并包含在我输入的logic.js 文件中以完成验证过程。

    • onValidate
    • _displayError
    • _toggleErrorIndicator

    这使整个过程自动化,并且验证得到了照顾。好吧,至少对于文本框...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-05
      • 1970-01-01
      相关资源
      最近更新 更多