首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JForm -多个验证规则?

JForm -多个验证规则?
EN

Stack Overflow用户
提问于 2014-04-23 22:14:16
回答 3查看 1.3K关注 0票数 1

我有一个表单(用XML定义),它与Joomla的JForm一起使用来处理。我想知道的是,是否可以同时针对多个规则进行验证。

通常,我已经了解到Joomla的JForm只接受一个验证规则,该规则在表单的XML中定义:

Joomla的JForm内部结构似乎也表明我做不到,以下是我唯一能找到的处理验证的地方:

代码语言:javascript
复制
    // Get the field validation rule.
    if ($type = (string) $element['validate'])
    {
        // Load the JFormRule object for the field.
        $rule = $this->loadRuleType($type);

        // If the object could not be loaded return an error message.
        if ($rule === false)
        {
            throw new UnexpectedValueException(sprintf('%s::validateField() rule `%s` missing.', get_class($this), $type));
        }

        // Run the field validation rule test.
        $valid = $rule->test($element, $value, $group, $input, $this);

        // Check for an error in the validation test.
        if ($valid instanceof Exception)
        {
            return $valid;
        }
    }

这不是一个循环,所以我非常担心不能将多个规则同时应用到一个特定的字段。

EN

回答 3

Stack Overflow用户

发布于 2014-04-24 09:11:34

您是在寻找服务器端验证还是客户端验证?Sean的回答似乎涵盖了服务器端,所以我想我应该补充一些关于客户端技术的见解。

您可以通过两种方式启用客户端验证。第一个也是最简单的方法是将以下内容添加到表单域定义中,这将确保所有必需的域都已填写完毕。

代码语言:javascript
复制
required="true"

第二种方法是在表单字段定义中添加一个类,让Joomla core知道您想要验证字段以及如何验证。Joomla提供了4个内置到核心的验证:验证用户名、验证密码、验证数字和验证电子邮件。

这些验证本身对您没有多大帮助,但创建和引用自定义客户端验证的能力会对您有帮助。对于我的示例,我们将确保在允许表单提交之前选中一个复选框。因此,在表单域定义中,我将添加:

代码语言:javascript
复制
class="validate-checked"

在呈现表单的页面上,确保使用以下命令加载JS库以进行验证:

代码语言:javascript
复制
JHtml::_('behavior.formvalidation');

此外,将类form-validate添加到表单HTML元素中。

添加这个javascript来处理实际的验证,这里我有一个复选框输入类型,它的ID是我正在验证的tos。在setHandler方法中,第一个参数是我在表单字段定义类语句validate-checked中输入的自定义名称:

代码语言:javascript
复制
<script>
window.addEvent('domready', function(){
    document.formvalidator.setHandler('checked', function(value) {
            var tos = document.getElementById('tos');
    if (tos.checked) {
        return true;
    } else {
        return false;
    }
    });
});
</script>

现在,捕获提交事件,并在提交表单之前验证通过的所有核心和自定义验证。

代码语言:javascript
复制
Joomla.submitbutton = function(task) {
    if (task == 'user.cancel' || document.formvalidator.isValid(document.id(".myFormId"))) {
        Joomla.submitform(task, document.getElementById('myformId'));
}

您可以根据需要创建任意数量的自定义客户端验证脚本。在setHandler方法中,您可以与DOM交互,并使用传入的值参数来确定字段是否应该传递,只需担心返回true或false来指示结果,剩下的工作将由Joomla处理。因此,您可以创建一个复杂的验证,也可以创建许多较小的简明验证来满足您的需求。

希望这能帮上忙。

票数 3
EN

Stack Overflow用户

发布于 2014-04-25 02:12:42

这是一个常见的请求。有几种可能性。您可以编写具有更复杂验证的自己的JFormRule。另一种方法是,您可以通过编程方式向字段中添加一个属性,以运行额外的验证,就像Sean所提倡的那样。

票数 2
EN

Stack Overflow用户

发布于 2014-04-23 22:26:07

此答案假设不可能在一个字段上本机添加多个规则。

假设不可能在本地将多个规则应用于一个字段,则可以通过简单地为找到的每个验证规则调用validation方法来扩展JForm::validateField()以启用此类功能。

代码语言:javascript
复制
// Extending class JForm

protected function validateField(SimpleXMLElement $element, $group = null, $value = null, JRegistry $input = null) {

    if($type = (string) $element['validate'])
    {
        $multiple_types = explode('|', $type);

        if(is_array($multiple_types) && $multiple_types[0] !== $type)
        {

            foreach($multiple_types as $single_type)
            {
                $result = parent::validateField($element, $group, $value, $input);

                // Validation failed, return the result and stop validating.
                if($result !== true) 
                {
                    return $result;
                }
            }

            return true;
        } 
        else 
        {
            return parent::validateField($element, $group, $value, $input);
        }
    }
}

在这个例子中,验证规则的结构如下:

代码语言:javascript
复制
validate="rule1|rule2"
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23247051

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档