【问题标题】:Orbeon: Make all non-read-only fields required (globally)Orbeon:将所有非只读字段设为必填(全局)
【发布时间】:2018-09-13 17:06:21
【问题描述】:

我有一个带有许多输入控件 (400+) 的大表单。对于其中许多,我添加了规则,因此它们是只读的,除非某个其他字段设置为“否”。

例子:

Do you agree with XXX? yes [ ]  no [ ]
Reason: __________________  <--(textfield that is read-only unless "no" is selected)

现在我希望所有非只读字段都是必需的。如何在不向每个输入控件添加(条件)必需规则的情况下做到这一点?因为这样做需要很长时间,而且对我来说,将我们可以全局制定的规则应用于每个元素似乎是一种不好的做法......

我考虑过使用脚本并执行以下操作:

<xf:action ev:event="xforms-value-changed" type="javascript">
    ORBEON.jQuery('input, textarea, select').each(function() {
        if (ORBEON.jQuery(this).is(':disabled')) {
            // what now??? is there something like "ORBEON.jQuery(this).makeRequired();" ?
        } 
    });
</xf:action>

【问题讨论】:

    标签: orbeon xforms


    【解决方案1】:

    您不想在 JavaScript 中执行此操作,但可以在 XForms 中执行此操作。假设您正在使用表单生成器创建表单,您可以通过编辑表单源并在&lt;xf:model&gt; 中添加以下内容来完成此操作。有了这个,我认为很明显,如果所有节点都不是只读的,则它们都是必需的。

    <xf:bind ref="instance('fr-form-instance')//*" required="not(xxf:readonly())"/>
    

    您还可以通过“覆盖”“保存”过程来重置所有只读字段的值,如下所示。请注意,这里的所有内容都是标准的,只添加了xf:setvalue(ref = "//*[xxf:readonly()]")

    <property as="xs:string"  name="oxf.fr.detail.process.save-final.*.*">
        require-uploads
        then validate-all
        then xf:setvalue(ref = "//*[xxf:readonly()]")
        then save
        then new-to-edit
        then success-message("save-success")
        recover error-message("database-error")
    </property>
    

    【讨论】:

    • 嗯,它实际上使所有字段都成为必需字段,甚至是只读字段……但无论如何,我不认为使用 XForms 可以完成这样的事情。现在,我只是对整个 xml 源代码进行了一些正则表达式搜索替换,以便为所有字段添加 required="true"。但是为什么我不应该在 JavaScript 中这样做呢?如果我需要更复杂的检查/操作,比如在用户提交表单时清除所有只读字段怎么办(这实际上是我想做的事情)。
    • 在 JavaScript 中做事可能有效,但更脆弱,在两个层面上:首先,JavaScript 在不同浏览器(现有和未来)上的行为可能不同,其次,恶意用户可以绕过您的 JavaScript,而他们不可能绕过您在 XForms 中定义的规则,因为它也在服务器上为您强制执行。
    • 关于提交时要清除的字段,您是在谈论只读字段还是隐藏字段?后者更常见,我们为此提出了增强#2760 的请求。这会满足您的要求,还是您正在寻找不同的东西?
    • 我说的是只读字段,而不是隐藏字段。想法是:有许多字段会根据之前的“是-否”答案切换其只读状态,我只想保存非只读字段。但我也不希望所有只读字段在变为只读后立即被清除(因为用户可能会意外更改状态)。相反,我想在保存表单时清除它们。我刚刚发现有一个属性xf:relevant,我想我可以通过添加一个使只读字段不是xf:relevant 的规则来解决这个问题,因此它们不会被存储..可能会回到那个:)跨度>
    • 知道了,然后您可以覆盖“保存”过程以重置只读字段的值。我已经更新了上面的答案,以包含您可以用于此目的的属性。你会告诉我这是否适合你。我添加了一个注释,这对于发布#2760 的只读字段也有意义。
    猜你喜欢
    • 1970-01-01
    • 2018-06-12
    • 2019-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-14
    • 1970-01-01
    相关资源
    最近更新 更多