首页 文章

我正在尝试扩展CodeIgniter表单验证库

提问于
浏览
3

这是我的自定义验证功能 . 它使用a Google Maps CodeIgniter library中的地理编码来检查某个位置是否存在 .

public function address_check($str)
{
    $this->load->library('GMap');
    $this->gmap->GoogleMapAPI();

    // this method checks the cache and returns the cached response if available
    $geocodes = $this->gmap->getGeoCode("{$str}, United States");

    $this->form_validation->set_message('address_check', 'The %s field contains an invalid address');

    if (empty($geocodes))
    {
        return FALSE;
    }
    else
    {
        return TRUE;
    }
}

如果我将上面的函数与上面的规则一起放在我的控制器中,它可以很好地工作 .

$this->load->library('form_validation');
$this->form_validation->set_rules('location', 'Location', 'callback_address_check');

现在我只想将它从我的Controller中移出 . 所以我正在尝试按照SO answerthe CI documentation扩展我的CodeIgniter表单验证库 .

我在这里创建了一个文件: /codeigniter/application/libraries/MY_Form_validation.php

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class MY_Form_validation extends CI_Form_validation {

    public function __construct()
    {
        parent::__construct();
    }

    public function address_check($str)
    {
        $this->load->library('GMap');
        $this->gmap->GoogleMapAPI();

        // this method checks the cache and returns the cached response if available
        $geocodes = $this->gmap->getGeoCode("{$str}, United States");

        $this->form_validation->set_message('address_check', 'The %s field contains an invalid address');

        if (empty($geocodes))
        {
            return FALSE;
        }
        else
        {
            return TRUE;
        }
    }

}

从我的控制器内部,我正在设置这样的规则......

$this->load->library('form_validation');
$this->form_validation->set_rules('location', 'Location', 'address_check');

我发现并解决自己的第一个问题是没有发生任何事情,因为that SO answer错误地指定文件名为 My_Form_validation.php ,它应该是 MY_Form_validation.php

现在正在调用该函数,新问题是我收到以下错误:

消息:未定义属性:MY_Form_validation :: $ load文件名:libraries / MY_Form_validation.php行号:12

这是第12行:

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

我无法从库中访问库?解决这个问题的正确方法是什么?我不想自动加载GMap库,因为我不会一直使用它 . 我的方法中还有其他问题吗?

2 回答

  • 3

    用这个:

    $CI =& get_instance();
    $CI->load->library('GMap');
    

    然后使用它像:

    $CI->gmap->GoogleMapAPI();
    

    你必须这样做,因为表单验证不像CI模型或Controller类,它只是库 .

  • 5

    在您的库中,您可以通过首先加载CI类来扩展其他模型,库,配置,帮助程序等 . 例如,在构造函数中,您可以通过以下方式完成此操作:

    public function __construct()
    {
        parent::__construct();
    
        $this->ci =& get_instance();
    }
    

    加载CI类后,可以加载任何其他可能需要加载的类 .

    例子:

    $this->ci->load->library("session");
    $this->ci->load->model("my_model");
    $this->ci->load->helper("file");
    

    或者在你的情况下:

    $this->ci->load->library("GMap");
    

    然后,您可以在整个 class 中以类似的方式调用类中的函数:

    $this->ci->gmap->GoogleMapAPI();
    $this->ci->gmap->getGeoCode("{$str}, United States");
    

相关问题