我使用自定义验证回调使用codeigniter执行一些表单验证。
$this->form_validation->set_rules('testPost', 'test', 'callback_myTest');
如果返回值为TRUE或FALSE,则回调在模型中运行并按预期工作。然而,文档还说你可以返回一个你选择的字符串。
例如,如果我有一个经过验证的日期,但是在相同的函数中,日期的格式会改变,我将如何返回并在我的控制器中检索这个新的格式化值?
感谢您阅读和了解帮助。
答案 0 :(得分:1)
我不完全确定我得到了你的要求,但这是一次尝试。
您可以在构造函数中定义一个用作回调的函数,并从该函数中使用您的模型。像这样:
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Controllername extends CI_Controller {
private $processedValue;
public function index()
{
$this->form_validation->set_rules('testpost','test','callback');
if ($this->form_validation->run()) {
//validation successful
echo $this->processedValue; //outputs the value returned by the model
} else {
//validation failed
}
}
private function callback($input)
{
$this->load->model('yourmodel');
$return = $this->yourmodel->doStuff($input);
//now you have the user's input in $input
// and the returned value in $return
//do some checks and return true/false
$this->processedValue = $return;
}
}
答案 1 :(得分:1)
public function myTest($data){ // as the callback made by "callback_myTest"
// Do your stuff here
if(condition failed)
{
$this->form_validation->set_message('myTest', "Your string message");
return false;
}
else
{
return true;
}
}
请试试这个。
答案 2 :(得分:0)
我在codeigniter的文件Form_validation中查看了函数_execute。它将var $ _field_data设置为回调gets的结果(如果结果不是boolean)。还有另一个函数“set_value”。将它与您的字段名称参数一起使用,例如set_value('testPost'),看看你是否能得到结果。
答案 3 :(得分:0)
Tank_Auth在控制器中执行此操作的方式就像这样
$this->form_validation->set_rules('login', 'Login', 'trim|required|xss_clean');
if ($this->form_validation->run()) {
// validation ok
$this->form_validation->set_value('login')
}
使用form_validation的set_value方法没有记录,但是我相信这是他们在修剪和清理后获取已处理的登录值的方式。
我真的不喜欢必须设置一个新变量来直接从自定义验证函数存储这个值。
答案 4 :(得分:0)
编辑:对不起,误解了这个问题。也许使用自定义回调。或者使用php $ _POST集合(跳过codeigniter)...道歉没有经过测试,但我希望有人可以在此基础上构建......
例如:
function _is_startdate_first($str)
{
$str= do something to $str;
or
$_POST['myinput'} = do something to $str;
}
=====
这就是我重命名自定义回调的方法:
$this->form_validation->set_message('_is_startdate_first', 'The start date must be first');
.....
另外,这是回调函数:
function _is_startdate_first($str)
{
$startdate = new DateTime($this->input->post('startdate'), new DateTimeZone($this->tank_auth->timezone()));
$enddate = new DateTime($this->input->post('enddate'), new DateTimeZone($this->tank_auth->timezone()));
if ($startdate>$enddate) {
return false;
} else {
return true;
}
}