Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php CodeIgniter调用自定义表单验证类中的回调_Php_Codeigniter - Fatal编程技术网

Php CodeIgniter调用自定义表单验证类中的回调

Php CodeIgniter调用自定义表单验证类中的回调,php,codeigniter,Php,Codeigniter,基本上,我想在表单验证的扩展类中使用回调验证方法 正常情况下 我使用公共回调方法生成MY\u Form\u validation类 在我的控制器中加载为: public function __construct() { parent::__construct(); $this->load->helper(array('form', 'url')); $this->load->library('form_validation'); } $this

基本上,我想在
表单验证的扩展类中使用回调验证方法

正常情况下

我使用公共回调方法生成
MY\u Form\u validation

在我的控制器中加载为:

public function __construct()
{
    parent::__construct();
    $this->load->helper(array('form', 'url'));
    $this->load->library('form_validation'); 
}
$this->form_validation->validate();
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();
在该控制器中用作:

public function __construct()
{
    parent::__construct();
    $this->load->helper(array('form', 'url'));
    $this->load->library('form_validation'); 
}
$this->form_validation->validate();
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();
我在自定义表单类中使用它:

$this->CI->form_validation->set_rules('field', 'field', 'check_callback');
注意,它没有被称为
callback\uu
,也就是说,我不知道为什么它在自己的类中调用时只在没有
callback\u
前缀的情况下工作

NOK案例

我使用公共回调方法创建了
MY_Custom_form_validation

在我的控制器中加载为:

public function __construct()
{
    parent::__construct();
    $this->load->helper(array('form', 'url'));
    $this->load->library('form_validation'); 
}
$this->form_validation->validate();
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相同,但这次我得到以下错误:

Unable to access an error message corresponding to your field name field.(check_callback)
为什么会这样?它们只是在文件名和加载方式上有所不同!我错过什么了吗

或者应该只有一个扩展的
MY_Form_validation
将包含整个项目的整个验证?除了
MY\u Form\u验证
,CI真的阻止了这个自定义类吗


MY\u Form\u 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;
        }
    }
<?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
,请注意OK的情况NOT OK的情况

<?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');
        }
    }

我以前也遇到过同样的问题,在CI中,您不能只使用任何自定义验证名称,它应该是我的表单验证。勾选此项,

我不确定我是否理解您的意思,您是否希望有2个自定义表单验证?第一个是“我的表单验证”,第二个是“我的自定义表单验证”?不,我不想让
我的表单验证
而是让
我的自定义表单验证
,因为我计划创建许多
我的表单名称表单验证
类。向我们展示我的自定义表单的定义_validation@DFriend,好了,你根本不知道原因。我以前也很难调试它。谢谢你帮助一个兄弟。原因可以追溯到PHP中很少或没有支持类自动加载的时候。当添加到核心类名称中时,“MY_”前缀是一种确保在尝试实例化子类(例如
MY_Form_validation.php
)之前可以找到并实例化父(核心)类(例如CI_Form_validation)的文件的方法。如果您不尝试扩展核心库类,则不需要使用
MY_u
前缀。如果您在CI中实现自动加载功能,则可以轻松地
extend
任何您想要的类-核心或自定义。在我看来,方法2和3是为自己实现一个的最佳方法。然后可以得到一个定义,如
Class Custom\u form\u validation扩展了MY\u form\u validation{…
以您期望的方式工作。