CI3 - обратный вызов form_validation не работает?

У меня выполняется следующая проверка формы;

$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», оно будет работать нормально.

Установите $autoload['helper'] = array('security'); в свой файл application/config/autoload.php. Это может помочь.

Virb 13.04.2018 14:01

@pradeep: это вызов API. Все остальные элементы формы работают нормально, проходя через это.

Eoghan 13.04.2018 14:05

@Virb: добавил - к сожалению, без разницы.

Eoghan 13.04.2018 14:05

Попробуйте использовать его, как callback_pricing_group[pricing_group], так же, как ваше поле ввода [pricing_group]

Mr. ED 13.04.2018 14:50

Пробовал - все равно не пойдет.

Eoghan 18.04.2018 19:10

@Eoghan, вы покажете, какой метод находится в контроллере, а какой в ​​модели?

B. Desai 21.04.2018 06:52

Проверьте, связано ли это с stackoverflow.com/a/32678317/2874291

Vishal 23.04.2018 12:20

@Vishal, к сожалению, все еще здесь запрещен.

Eoghan 24.04.2018 15:33
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
8
207
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Привет, попробуйте с «обрезкой» перед обратным вызовом и получите параметр с нулевым значением, как показано ниже. Потому что вы не проверили «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;
    }
}

имя поля в параметре не требуется

Alex 13.04.2018 18:56

Нет разницы с включением обрезки | обязательного набора правил и т. д.

Eoghan 18.04.2018 19:10

Я протестировал следующие коды в своем проекте, и он работает нормально. Попробуйте сейчас, я на 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 24.04.2018 15:35

@Eoghan, пожалуйста, проверьте мой обновленный ответ, я уверен, что он сработает для вас. я тестировал в своем проекте. :)

Anfath Hifans 25.04.2018 16:26
Ответ принят как подходящий

Наконец-то выяснил это после того, как связался с командой разработчиков 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 в Контроллер. Следующей проблемой было закрытие функции. Исправили эти два пункта, и во Вселенной все стало правильно.

DanimalReks 01.12.2020 03:16

Другие вопросы по теме