В основном я хочу использовать метод проверки обратного вызова внутри расширенного класса Form_validation
.
OK CASE
Я делаю класс MY_Form_validation
общедоступным методом обратного вызова.
Загружен в контроллер:
public function __construct() { parent::__construct(); $this->load->helper(array('form', 'url')); $this->load->library('form_validation'); }
используется в этом контроллере как:
$this->form_validation->validate();
Я использую его так, как это делается в классе пользовательских форм:
$this->CI->form_validation->set_rules('field', 'field', 'check_callback');
Обратите внимание, что он не называется callback_<name of method>
который я не знаю ни почему, он работает только с префиксом callback_
при вызове внутри его собственного класса.
NOK CASE
Я делаю класс MY_Custom_form_validation
с общедоступным методом обратного вызова.
Загружен в контроллер:
public function __construct() { parent::__construct(); $this->load->helper(array('form', 'url')); $this->load->library('form_validation'); $this->load->library('my_custom_form_validation'); } $this->my_custom_form_validation->validate();
Те же настройки, что и OK CASE при использовании в set_rules
но на этот раз я получаю следующую ошибку :
Unable to access an error message corresponding to your field name field.(check_callback)
Почему это происходит? Они различались только по имени файла и способу загрузки! Я что-то пропустил?
Или должен быть только один расширенный MY_Form_validation
который будет содержать всю проверку для всего проекта? CI действительно предотвращает этот пользовательский класс в стороне от MY_Form_validation
?
MY_Form_validation.php
<?php class MY_Form_validation extends CI_Form_validation { protected $CI; public function __construct($rules = array()) { parent::__construct($rules); $this->CI =& get_instance(); } public function validate() { $this->CI->form_validation->set_rules('value', 'value', 'trim|required|integer|check_value['.$this->CI->input->post('unit').']'); $this->CI->form_validation->set_rules('unit', 'unit', 'trim|required'); } public function check_value($value, $unit) { if($value >= 100) { return TRUE; } else { $this->CI->form_validation->set_message('check_value', 'The %s must be greater than or equal 100.'); return FALSE; } }
MY_Custom_form_validation.php
<?php class MY_Custom_form_validation extends CI_Form_validation { protected $CI; public function __construct($rules = array()) { parent::__construct($rules); $this->CI =& get_instance(); } public function validate() { $this->CI->form_validation->set_rules('value', 'value', 'trim|required|integer|check_value['.$this->CI->input->post('unit').']'); $this->CI->form_validation->set_rules('unit', 'unit', 'trim|required'); } public function check_value($value, $unit) { if($value >= 100) { return TRUE; } else { $this->CI->form_validation->set_message('check_value', 'The %s must be greater than or equal 100.'); return FALSE; } }
Form.php
, обратите внимание на ОК CASE и НЕ ОК.
<?php class Form extends CI_Controller { public function __construct() { parent::__construct(); $this->load->helper(array('form', 'url')); // OK CASE $this->load->library('form_validation'); // NOK CASE $this->load->library('my_custom_form_validation'); $this->load->model('prf_model'); } public function submit() { $data['username'] = 'my_username'; $data['title'] = 'Submit a PRF'; $data['last_order_submission'] = ($this->prf_model->get_last_prf_order_submission()+1); // OK CASE $this->form_validation->validate(); // NOK CASE $this->my_custom_form_validation->validate(); if(!$this->form_validation->run()) { $this->load->view('templates/header', $data); $this->load->view('pages/form', $data); $this->load->view('templates/footer', $data); } else { $this->_save_to_database($_POST); redirect('form/success'); } }