Codeigniter передает 2 аргумента в обратный вызов - PullRequest
23 голосов
/ 28 января 2011

После публикации формы с двумя полями с именами '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');

Для запроса в БД нужны оба поля.

Функция 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)?

Ответы [ 6 ]

44 голосов
/ 28 января 2011

Вы можете использовать $ 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;
}
32 голосов
/ 19 марта 2012

Просто сделайте это правильно (по крайней мере, для 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
}
8 голосов
/ 03 февраля 2011

Кажется, это также работает.

$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;
    }
}
2 голосов
/ 28 января 2011

Если я правильно понимаю form_validation, каждое правило (set_rules) относится к одному полю формы, и ваш обратный вызов будет проверять только одно поле. В вашем случае может показаться, что «id» находится вне области видимости. Вместо этого можно передать массив в функцию set_rules и выполнить обратный вызов. Я еще не пробовал это. http://codeigniter.com/user_guide/libraries/form_validation.html#validationrulesasarray

1 голос
/ 17 мая 2013

Просто примечание об использовании параметров обратного вызова, как предлагается в других ответах. Если вы используете app/config/form_validation.php для создания правил проверки, синтаксис $this->input->post('parameter') не будет работать, поскольку этот объект недоступен в загрузчике CI в тот момент выполнения, где он читает содержимое этого файла. Вы должны были бы сделать звонок в своей процедуре обратного вызова, например :

public function _validate_user_signup($username, $password) {
  $var = $this->input->post('password');

В этом случае второй параметр, передаваемый методу, не будет содержать пароль, но $ var будет после вызова.

Надеюсь, это понятно. Matt

0 голосов
/ 15 июля 2016

Лучше использовать библиотеку проверки формы для получения проверяемых данных.

Не всегда ваши данные будут в $ _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.

...