У меня выполняется следующая проверка формы;
$this->form_validation->set_rules('pricing_group', 'Pricing Group', 'callback_pricing_group');
с функцией обратного вызова:
public function pricing_group($pricing_group) {
if ($pricing_group > 0) {
return true;
} else {
$this->form_validation->set_message('pricing_group', 'Invalid Price Group Specified.');
return false;
}
}
Это возвращается с ошибкой:
"pricing_group":"Unable to access an error message corresponding to your field name Pricing Group.(pricing_group)"
Я также попытался разместить функцию set_message до проверки истинности / ложности. Обратите внимание, что логика прямо сейчас (просто проверка, больше ли она нуля) не похожа на предполагаемую финальную логику - это просто базовый пример, который я привожу, чтобы попытаться выяснить, в чем проблема.
Может ли кто-нибудь заметить, совершаю ли я здесь какую-то глупую ошибку? Единственная разница между этим и тем, что я использовал функцию обратного вызова раньше, заключается в том, что эта проверка формы происходит в модели (поскольку она будет проверять это значение по базе данных), а не внутри контроллера. Если я удалю правило callback_pricing_group и заменю его чем-то вроде «numeric», оно будет работать нормально.
@pradeep: это вызов API. Все остальные элементы формы работают нормально, проходя через это.
@Virb: добавил - к сожалению, без разницы.
Попробуйте использовать его, как callback_pricing_group[pricing_group], так же, как ваше поле ввода [pricing_group]
Пробовал - все равно не пойдет.
@Eoghan, вы покажете, какой метод находится в контроллере, а какой в модели?
Проверьте, связано ли это с stackoverflow.com/a/32678317/2874291
@Vishal, к сожалению, все еще здесь запрещен.






Привет, попробуйте с «обрезкой» перед обратным вызовом и получите параметр с нулевым значением, как показано ниже. Потому что вы не проверили «required», так что это может быть причиной для возврата null из обратного вызова. Также передайте имя поля как параметр в функции обратного вызова
$this->form_validation->set_rules('pricing_group', 'Pricing Group', 'trim|callback_pricing_group[pricing_group]');
public function pricing_group($pricing_group=0) {
if ($pricing_group > 0) {
return true;
} else {
$this->form_validation->set_message('pricing_group', 'Invalid Price Group Specified.');
return false;
}
}
имя поля в параметре не требуется
Нет разницы с включением обрезки | обязательного набора правил и т. д.
Я протестировал следующие коды в своем проекте, и он работает нормально. Попробуйте сейчас, я на 100% уверен, что это сработает.
Убедитесь, что subclass_prefix находится в application/config/config.php. Должно
$config['subclass_prefix'] = 'MY_';
для работы после настраиваемой функции проверки.
Если вы уже изменили значение subclass_prefix. пример ABC_, тогда вашему файлу проверки должен понравиться этот ABC_Form_validation.php в application/libraries
Ваш Контроллер
class Your_Controller extends CI_Controller{
function Your_Function(){
$this->load->library('form_validation');
if ($this->input->post()){
if ($this->form_validation->run('pricing_group_validation') == TRUE){
// success
_e($this->input->post());
}else{
_e($this->form_validation->error_array());
}
}
}
}
приложение / config / form_validation.php
$config = array(
'pricing_group_validation' => array(
array(
'field' => 'pricing_group',
'label' => 'Pricing Group',
'rules' => 'trim|pricing_group'
)
)
);
приложение / библиотеки / MY_Form_validation.php
class MY_Form_validation extends CI_Form_validation{
function __construct($config = array()){
parent::__construct($config);
$this->CI =& get_instance();
$this->_config_rules = $config;
}
public function pricing_group($pricing_group){
if ($pricing_group > 0) {
return true;
} else {
$this->CI->form_validation->set_message('pricing_group', 'Invalid Price Group Specified.');
return false;
}
}
}
Пробовал это. К сожалению, без разницы.
@Eoghan, пожалуйста, проверьте мой обновленный ответ, я уверен, что он сработает для вас. я тестировал в своем проекте. :)
Наконец-то выяснил это после того, как связался с командой разработчиков CI Dev через Github. Документация немного неясна, поэтому я опубликовал решение ниже.
Во-первых, проверка в модели изначально не работает, и это, к сожалению, факт. Если вы не хотите расширять основные библиотеки, этого не произойдет.
Вместо этого функции form_validation должны вызываться из контроллера, а сами функции проверки могут находиться внутри модели. Итак, используя мой вопрос в качестве примера, это будет выглядеть следующим образом:
Контроллер:
$this->form_validation->set_rules('pricing_group', 'Pricing Group', array('valid_pricing_group', array($this->pricing_group_model, 'valid_pricing_group')));
Обратите внимание на вложенный массив, охватывающий функцию обратного вызова valid_pricing_group. Неспособность вложить этот массив и включение имени поля вызовет вышеупомянутую проблему «сообщение об ошибке не найдено».
Модель ценообразования:
public function valid_pricing_group($pricing_group) {
if ($this->get_pricing_group($pricing_group) === false) {
$this->form_validation->set_message('valid_pricing_group', 'Pricing group does not exist.');
return false;
}
return true;
}
Опять же, соглашения об именах важны. Обратите внимание, что имена полей, используемые в массивах, совпадают с сообщением об ошибке и именем функции.
После этого мы можем запустить проверку, но, опять же, должен будет поступать от контроллера.
Контроллер:
if ($this->form_validation->run() === false) {
var_dump($this->form_validation->error_array());
} else {
// continue
}
Это самый «чистый» подход, доступный без расширения каких-либо основных библиотек или обхода проблемы. Это требует некоторого дублирования кода между контроллерами в случае наличия отдельного api / веб-контроллера, но в качестве одного небольшого преимущества вы можете использовать ожидаемые JSON имена полей для вашего API, используя при этом `` удобные '' имена полей для вывода на ваш веб-контроллер.
Надеюсь, это поможет кому-то в будущем.
Это помогло. Моя проблема заключалась в проверке модели. Я переместил функцию CB в Контроллер. Следующей проблемой было закрытие функции. Исправили эти два пункта, и во Вселенной все стало правильно.
Установите
$autoload['helper'] = array('security');в свой файлapplication/config/autoload.php. Это может помочь.