我有一个表单(用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;
}
}
这并没有包含在循环中,因此我非常担心我无法一次将多个规则应用于特定字段。
答案 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"