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

Вы можете напрямую использовать $ this-> input-> post:

 function check_url() { $url = $this->input->post('url'); $id = $this->input->post('id'); // do some database things you need to do eg if ($url_check = $this->user_model->check_url($url, $id) { return TRUE; } $this->form_validation->set_message('Url check is invalid'); return FALSE; } 

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

Это, похоже, тоже работает.

 $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; } } 

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

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

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

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

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

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

Не всегда ваши данные будут в $ _GET или $ _POST (см. https://www.codeigniter.com/userguide3/libraries/form_validation.html#validating-an-array-other-than-post ).

Лучший способ доступа к данным в обратном вызове проверки – это:

 $this->form_validation->validation_data 

«validation_data» является общедоступным в classе CI_Form_validation.

  • Mockito: проверка с помощью общих параметров
  • Как написать сценарий bash, который принимает необязательные входные аргументы?
  • Могу ли я передать аргумент VBScript (файл vbs, запущенный cscript)?
  • Почему бы не вывести параметр шаблона из конструктора?
  • Как получить параметр URL в Express?
  • Как передать параметры другому процессу в c #
  • Когда используется ключевое слово C # ref всегда хорошая идея?
  • C #: как - одно приложение экземпляра, которое принимает новые параметры?
  • Какая перегрузка будет выбрана для null в Java?
  • Значение, переданное с request.setAttribute (), недоступно request.getParameter ()
  • Interesting Posts

    Как проверить, является ли double целым числом

    Сложный селектор CSS для родителя активного дочернего

    Как получить HMODULE для текущего исполняемого кода?

    Моя материнская плата имеет 24-контактный разъем питания, но мой блок питания имеет только 20-контактный разъем. Будет ли он работать без адаптера?

    Расширяет JFrame и создает его внутри программы

    Как перезапустить неудавшиеся сценарии с помощью Cucumber?

    Преобразование массива байтов в изображение в wpf

    Подавлять типы нулевых значений от испускания XmlSerializer

    Учитывая массив чисел, возвращаем массив продуктов всех других чисел (без деления)

    Как получить HTML5-видео для работы с использованием IE10

    чертеж / screen.css не предварительно скомпилирован

    AppCompat 23.3 Поддержка векторов больше не работает?

    Как я могу справиться с NA в остатках в регрессии в R?

    Как удалить папку с файлами с помощью Java

    Как решить ошибку приложения lsass.exe, показанную при загрузке Windows XP?

    Давайте будем гением компьютера.