CodeIgniter 3 — Проверка вызываемой формы с помощью файла конфигурации не работает

Я не могу получить функция проверки вызываемой формы CodeIgniter 3, чтобы работать, когда правила проверки размещены в отдельном конфигурационном файле.

Я получаю следующее сообщение об ошибке:

Обнаружена ошибка PHP
Серьезность: Уведомление
Сообщение: неопределенное свойство: CI_Config :: $ form_validation_callback_library

Файл конфигурации с правилами проверки формы выглядит следующим образом (config / fvalidation.php):

$config['client_details'] = array(
array(
'field' => 'client_abn',
'label' => 'Client ABN',
'rules' => array('trim', 'required', array('abn_callable', array($this->form_validation_callback_library, 'abn_check'))),
'errors' => array('abn_callable' => 'Invalid ABN has been entered %s.')
)

);

Класс проверки формы, который пытается быть вызван, имеет вид (т.е. $ this-> form_validation_callback_library):

class Form_validation_callback_library
{

public function abn_check()
{

$this->load->library('abn_validator');

$abn = $this->input->post_get('abn', TRUE);

if (!$this->abn_validator->isValidAbn($abn)) {
return FALSE;
}

return TRUE;

}


}

Контроллер это:

        $this->config->load('fvalidation');
$validation_rules = $this->config->item('client_details');
$this->form_validation->set_rules($validation_rules);

if ($this->form_validation->run() == FALSE) {
// show form
} else {
// process form data
}

Любая помощь будет принята с благодарностью.

Ура,
VeeDee

1

Решение

Я бы использовал пример обратного вызова codeigniter ниже callback

http://www.codeigniter.com/user_guide/libraries/form_validation.html#callbacks-your-own-validation-methods

<?php

class Example extends CI_Controller {

public function index() {
$this->load->library('form_validation');

$this->form_validation->set_rules('client_abn', 'ABN Number', 'required|callback_checkabn');

if ($this->form_validation->run() == FALSE) {

$this->load->view('something');

} else {

// Redirect to success page i.e login or dashboard or what ever

redirect('/'); // Currently would redirect to home '/'

}
}

public function checkabn() {

$this->load->library('abn_validator');

$abn = $this->input->post('abn');

if (!$this->abn_validator->isValidAbn($abn)) {
$this->form_validation->set_message('checkabn', 'Invalid ABN has been entered %s.');
return FALSE;
} else {
return TRUE;
}

}

}

И на ваш взгляд в форме или выше добавить

<?php echo validation_errors('<div class="error">', '</div>'); ?>

<form action="<?php echo base_url('example');?>" method="post">
<input type="text" name="client_abn" placeholder="" value="" />
</form>
1

Другие решения

Это наиболее распространенная проблема, с которой мы сталкиваемся, когда запускаем пользовательскую проверку формы в CI. Независимо от того, находится ли функция обратного вызова в том же контроллере или в библиотеке функции обратного вызова, нам нужно передать доступный объект класса, содержащий функцию обратного вызова.
Поэтому, когда вы запускаете

$callable_validations = new Form_validation_callback_library();

$this->form_validation->run($callable_validations)
1

Похоже, что это невозможно в настоящее время на CodeIgniter 3.

Я создал грубый обходной путь .. поэтому, пожалуйста, продолжайте улучшать его, потому что он не выглядит красиво 🙂

Обновите файл конфигурации следующим образом (/config/fvalidation.php):

$config['client_details'] =  = array(
array(
'field' => 'client_abn',
'label' => 'Client ABN',
'rules' => array('trim', 'required', array('abn_callable', array("library:form_validation_callback_library", 'abn_check'))),
'errors' => array('abn_callable' => 'Invalid %s has been entered .')
)
);

Обратите внимание на следующую строку в файле конфигурации выше, так как мы будем использовать их в качестве флагов в коде контроллера:

array('abn_callable', array("library:form_validation_callback_library", 'abn_check'))

Библиотека почти такая же, за исключением того, что мы загружаем экземпляр (/libraries/Form_validation_callback_library.php):

class Form_validation_callback_library
{
private $_CI;

function Form_validation_callback_library() {
$this->_CI =& get_instance();

log_message('info', "Form_validation_callback_library Library Initialized");
}

public function abn_check($abn)
{

$this->_CI->load->library('abn_validator');


if (!$this->_CI->abn_validator->isValidAbn($abn)) {
return FALSE;
}

return TRUE;
}

}

В контроллер загружаем библиотеку (/controllers/Foo.php):

// load the config file and store
$this->config->load('fvalidation', TRUE);
$rule_dataset = $this->config->item('client_details', 'fvalidation');

// search and load the 'callable' library
foreach ($rule_dataset as $i => $rules) {
if (isset($rules['rules'])) {
foreach ($rules['rules'] as $k => $rule) {
if (is_array($rule) && preg_match("/_callable/",$rule[0]) && isset($rule[1][0])) {
list ($load_type, $load_name) = explode(":", $rule[1][0]);
// load the library
$this->load->$load_type($load_name);
$rule_dataset[$i]['rules'][$k][1][0] = $this->$load_name;

}
}
}
}

// set the rules
$this->form_validation->set_rules($rule_dataset);

// load the form
if ($this->form_validation->run() == FALSE) {
// show form
} else {
// process form data
}
0

Я сделал что-то похожее на Vidura, но расширил библиотеку проверки формы, добавив MY_Form_validation.php со следующим кодом

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class GS_Form_validation extends CI_Form_validation {

public function set_rules($field, $label = '', $rules = array(), $errors = array())
{
if (is_array($rules))
{
foreach ($rules as &$rule)
{
if (is_array($rule))
{
if (is_array($rule[1]) and is_string($rule[1][0]))
{
// handles rule like ['password_check', ['library:passwords', 'check_valid_password']]
// You would set_message like $this->form_validation->set_message('password_check', 'Incorrect password');
// The advantage of defining the rule like this is you can override the callback functions error message
list ($load_type, $load_name) = explode(":", $rule[1][0]);
$CI =& get_instance();
$CI->load->$load_type($load_name);
$rule[1][0] = $CI->$load_name;
}
else if (is_string($rule[0]))
{
// handles rule like ['library:password', 'check_valid_password']
// You would set_message like $this->form_validation->set_message('check_valid_password', 'Incorrect password');
list ($load_type, $load_name) = explode(":", $rule[0]);
$CI =& get_instance();
$CI->load->$load_type($load_name);
$rule[0] = $rule[1];
$rule[1] = [$CI->$load_name, $rule[1]];
}
}
}
}

return parent::set_rules($field, $label, $rules, $errors);
}
}

Затем вы можете определить обратные вызовы для библиотечных функций, таких как:

$this->form_validation->set_rules(['library:passwords', 'check_valid_password']);

Где пароли — это библиотека, а check_valid_password — метод.

0

Я просто делаю (config / form_validation.php):

$CI =& get_instance();
$CI->load->model('form_validation_callback_library');

$config['client_details'] = array(
array(
'field' => 'client_abn',
'label' => 'Client ABN',
'rules' => array('trim', 'required', array('abn_callable', array($CI->form_validation_callback_library, 'abn_check'))),
'errors' => array('abn_callable' => 'Invalid ABN has been entered %s.')
)

И это работает для меня …

Я бегу на Codeigniter 3.0.4

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector