1

検証ルールが別の構成ファイルに配置されている場合、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
        }

どんな助けでも大歓迎です。

乾杯、ヴィーディー

4

5 に答える 5

1

これは、CI でカスタム フォームの検証を実行するときに直面する最も一般的な問題です。コールバック関数が同じコントローラにあるか、コールバック関数のライブラリにあるかにかかわらず、コールバック関数を含むクラスのアクセス可能なオブジェクトを渡す必要があります。したがって、実行すると

$callable_validations = new Form_validation_callback_library();

$this->form_validation->run($callable_validations)
于 2016-02-14T11:07:02.197 に答える
0

これは現在 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
}
于 2015-06-03T01:22:44.490 に答える
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']);

passwords はライブラリで、check_valid_password はメソッドです。

于 2016-02-16T15:56:26.353 に答える
0

I've simply do (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.')
    )

And it works to me...

I'm running on Codeigniter 3.0.4

于 2016-02-19T15:53:15.977 に答える