JForm - 多个验证规则?

时间:2014-04-23 14:14:16

标签: php validation joomla

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

通常,我已经明白Joomla的JForm只接受一个验证规则,在表格的XML中定义:

                  

Joomla的JForm内部似乎也暗示我不能,以下区域是唯一可以找到处理验证的区域:

    // 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;
        }
    }

这并没有包含在循环中,因此我非常担心我无法一次将多个规则应用于特定字段。

3 个答案:

答案 0 :(得分:3)

您在寻找服务器端还是客户端验证? Sean的答案似乎涵盖了服务器端,所以我想我会对客户端技术有所了解。

您可以通过两种方式启用客户端验证。第一个也是最简单的方法是在表单字段定义中添加以下内容,这将确保填写任何必填字段以继续。

required="true"

第二种方法是在表单字段定义中添加一个类,让Joomla核心知道您要验证字段以及如何验证。 Joomla在核心内置了4个验证:validate-username,validate-password,validate-numeric和validate-email。

这些本身并没有帮助你,但是创建和引用自定义客户端验证的能力确实如此。对于我的示例,我们确保在允许表单提交之前标记复选框。因此,在表单字段定义中,我将添加:

class="validate-checked"

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

JHtml::_('behavior.formvalidation');

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

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

<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>

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

Joomla.submitbutton = function(task) {
    if (task == 'user.cancel' || document.formvalidator.isValid(document.id(".myFormId"))) {
        Joomla.submitform(task, document.getElementById('myformId'));
}

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

希望有帮助...

答案 1 :(得分:2)

这是一个常见的请求。有几种可能性。您可以使用更复杂的验证编写自己的JFormRule。另一个是你可以以编程方式将属性添加到运行额外验证类型的字段,就像Sean所倡导的那样。

答案 2 :(得分:0)

此答案假定无法在一个字段上原生添加多个规则。


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

// 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);
        }
    }
}

通过该示例,验证规则可以构造为:

validate="rule1|rule2"