我有一个表单(用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;
}
}这不是一个循环,所以我非常担心不能将多个规则同时应用到一个特定的字段。
发布于 2014-04-24 09:11:34
您是在寻找服务器端验证还是客户端验证?Sean的回答似乎涵盖了服务器端,所以我想我应该补充一些关于客户端技术的见解。
您可以通过两种方式启用客户端验证。第一个也是最简单的方法是将以下内容添加到表单域定义中,这将确保所有必需的域都已填写完毕。
required="true"第二种方法是在表单字段定义中添加一个类,让Joomla core知道您想要验证字段以及如何验证。Joomla提供了4个内置到核心的验证:验证用户名、验证密码、验证数字和验证电子邮件。
这些验证本身对您没有多大帮助,但创建和引用自定义客户端验证的能力会对您有帮助。对于我的示例,我们将确保在允许表单提交之前选中一个复选框。因此,在表单域定义中,我将添加:
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>现在,捕获提交事件,并在提交表单之前验证通过的所有核心和自定义验证。
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处理。因此,您可以创建一个复杂的验证,也可以创建许多较小的简明验证来满足您的需求。
希望这能帮上忙。
发布于 2014-04-25 02:12:42
这是一个常见的请求。有几种可能性。您可以编写具有更复杂验证的自己的JFormRule。另一种方法是,您可以通过编程方式向字段中添加一个属性,以运行额外的验证,就像Sean所提倡的那样。
发布于 2014-04-23 22:26:07
此答案假设不可能在一个字段上本机添加多个规则。
假设不可能在本地将多个规则应用于一个字段,则可以通过简单地为找到的每个验证规则调用validation方法来扩展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"https://stackoverflow.com/questions/23247051
复制相似问题