我有一张表格询问用户他们计划停留多长时间。我有两个字段:逗留的数量和这个数字的单位,即5天,1周等等。
我传递了两个变量:value_stay
和unit_stay
。
我希望使用特殊的商业规则验证它们,例如"允许最多停留3个月":
$this->form_validation->set_rules('unit_stay', 'stay unit', 'trim|required');
if(isset($_POST['unit_stay'])) {
if($_POST['unit_stay'] === 'month') {
$this->form_validation->set_rules('value_stay', 'stay value', 'less_than_equal_to[3]');
}
}
$this->form_validation->set_rules('value_stay', 'stay value', 'trim|required|integer|greater_than_equal_to[1]');
我的问题是我对value_stay
进行了冗余检查。 第二个set_rules()
会覆盖条件中的那个。
在CI Form Validation documentation中,不建议使用此类依赖项。
你们有什么特别的技巧可以重构这种特殊的验证吗?特别是如果依赖于value_stay
的{{1}}验证可以缩短为与我所做的相比更紧凑和无冗余的黑客攻击。
答案 0 :(得分:2)
您的回调函数可能类似于: $ this-> form_validation-> set_rules('value_stay','逗留值','trim | required | callback_stayToUnitCheck')
然后在同一个控制器中:
private function stayToUnitCheck($stay)
{
$results = FALSE;
// get the units
// you have to get this additional one from the post variable
if(!empty($_POST['unit_stay']))
{
$unit = $_POST['unit_stay'];
switch ($stay)
{
case 'month':
// do your test on stay and unit
if ($unit <= 3) $result = TRUE;
break;
case 'week':
// more tests
}
return $result;
}
当你掌握它们时,回调非常强大。您甚至可以为回调错误设置不同的消息:
$this->form_validation->set_message('stayToUnitCheck', 'For a stay of months you can only book a maximum of three months at a time.');
您可以在交换机中为每种不同类型的住宿设置,或在案例不匹配时使用默认消息。
希望有所帮助,
保罗。