Php JForm-多个验证规则?

Php JForm-多个验证规则?,php,validation,joomla,Php,Validation,Joomla,我有一个表单(用XML定义),它与Joomla的JForm一起使用来处理。我想知道的是,是否有可能同时验证多个规则 通常,我已经了解到Joomla的JForm只接受一条验证规则,在表单的XML中定义: Joomla的JForm内部似乎也表明我不能,以下是我唯一能找到的验证领域: // Get the field validation rule. if ($type = (string) $element['validate']) { // Load the

我有一个表单(用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;
        }
    }

这不是一个循环,所以我很担心我不能对一个特定字段同时应用多个规则。

这个答案假设不可能在一个字段上本地添加多个规则


假设无法将多个规则本机应用于一个字段,则可以扩展
JForm::validateField()
来启用此功能,只需为找到的每个验证规则调用validate方法即可

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

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


假设无法将多个规则本机应用于一个字段,则可以扩展
JForm::validateField()
来启用此功能,只需为找到的每个验证规则调用validate方法即可

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

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

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

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

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

class="validate-checked"
在呈现表单的页面上,确保使用以下方法加载JS库以进行验证:

JHtml::_('behavior.formvalidation');
此外,将类form validate添加到表单HTML元素中

添加这个javascript来处理实际的验证,这里我有一个复选框输入类型,ID为我正在验证的tos。在setHandler方法中,第一个参数是我在form field definition class语句中输入的自定义名称,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>
您可以创建任意数量的自定义客户端验证脚本。在setHandler方法中,您可以与DOM交互,并使用传入的value参数来确定字段是否应该通过,只需担心返回true或false来指示结果,Joomla将处理其余的结果。因此,您可以创建一个复杂的验证,也可以创建多个较小的简明验证,以满足您的需要


希望对您有所帮助……

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

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

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

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

class="validate-checked"
在呈现表单的页面上,确保使用以下方法加载JS库以进行验证:

JHtml::_('behavior.formvalidation');
此外,将类form validate添加到表单HTML元素中

添加这个javascript来处理实际的验证,这里我有一个复选框输入类型,ID为我正在验证的tos。在setHandler方法中,第一个参数是我在form field definition class语句中输入的自定义名称,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>
您可以创建任意数量的自定义客户端验证脚本。在setHandler方法中,您可以与DOM交互,并使用传入的value参数来确定字段是否应该通过,只需担心返回true或false来指示结果,Joomla将处理其余的结果。因此,您可以创建一个复杂的验证,也可以创建多个较小的简明验证,以满足您的需要


希望对您有所帮助……

这是一个常见的请求。有一些可能性。您可以使用更复杂的验证编写自己的JFormRule。另一个是,您可以通过编程向运行附加验证的字段添加一个属性,就像Sean所提倡的那样

这是一个常见的请求。有一些可能性。您可以使用更复杂的验证编写自己的JFormRule。另一个是,您可以通过编程向运行附加验证的字段添加一个属性,就像Sean所提倡的那样

Joomla中客户端验证的问题是,您永远不知道模板设计器是否已完全删除javascript。如果您正在为一个特定的站点进行自定义,您知道javascript将可用,这是可以的,但是您需要知道,如果模板中发生了更改,则可能无法进行验证。@Elin I woul