Codeigniter передает 2 аргумента для обратного вызова
После публикации формы с двумя полями с именем 'id' и 'url' у меня есть следующий код:
$this->load->library('form_validation');
$this->form_validation->set_rules('id', 'id', 'trim|xss_clean');
$this->form_validation->set_rules('url', 'url|id', 'trim|xss_clean|callback_url_check');
Для запроса db нужны оба поля.
Вызывается функция url_check ($ str, $id), но в этом случае "id" всегда имеет значение 0.
Если я просто сделаю:
$this->form_validation->set_rules('url', 'url', 'trim|xss_clean|callback_url_check');
И вызовите url_check($str)
все, что должно работать.
Вопрос в том, как передать два значения в url_check($str, $id)
?
Ответы
Ответ 1
Вы можете напрямую использовать $this- > input- > post:
function check_url() {
$url = $this->input->post('url');
$id = $this->input->post('id');
// do some database things you need to do e.g.
if ($url_check = $this->user_model->check_url($url, $id) {
return TRUE;
}
$this->form_validation->set_message('Url check is invalid');
return FALSE;
}
Ответ 2
Просто сделайте это правильно (по крайней мере, для CI 2.1+), как описано в документах:
$this->form_validation->set_rules('uri', 'URI', 'callback_check_uri['.$this->input->post('id').']');
// Later:
function check_uri($field, $id){
// your callback code here
}
Ответ 3
Это тоже работает.
$id = 1;
$this->form_validation->set_rules('username', 'Human Username', 'callback_username_check['.$id.']');
function username_check($str, $id) {
echo $id;
if ($str == 'test') {
$this->form_validation->set_message('username_check', 'The %s field can not be the word "test"');
return FALSE;
}
else {
return TRUE;
}
}
Ответ 4
Если я правильно понимаю form_validation, каждое правило (set_rules) относится к одному полю формы, и ваш обратный вызов будет проверять только одно поле. В вашем случае кажется, что "id" выходит за рамки. Вместо этого можно передать массив функции set_rules и выполнить обратный вызов. Я еще не пробовал. http://codeigniter.com/user_guide/libraries/form_validation.html#validationrulesasarray
Ответ 5
Просто обратите внимание на использование параметров обратного вызова, как это предлагается в других ответах. Если вы используете app/config/form_validation.php
для создания правил проверки, синтаксис $this->input->post('parameter')
не будет работать, поскольку этот объект недоступен в загрузчике CI в момент выполнения, где он считывает содержимое этого файла. Вам нужно будет выполнить вызов в вашей процедуре обратного вызова, например.
public function _validate_user_signup($username, $password) {
$var = $this->input->post('password');
В этом случае второй параметр, переданный методу, не будет содержать пароль, но после вызова будет $var.
Я надеюсь, что это ясно.
Matt
Ответ 6
Лучше использовать библиотеку проверки формы, чтобы получить данные, которые проверяются.
Не всегда ваши данные будут в $_GET или $_POST (см. https://www.codeigniter.com/userguide3/libraries/form_validation.html#validating-an-array-other-than-post).
Лучший способ получить доступ к вашим данным в обратном вызове проверки:
$this->form_validation->validation_data
"validation_data" является общедоступным в классе CI_Form_validation.