Подтвердить что ты не робот

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)?

4b9b3361

Ответ 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.