3

这是我的自定义验证功能。它使用来自Google Maps CodeIgniter 库的地理编码来检查位置是否存在。

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

现在我只想将它移出我的控制器。因此,我正在尝试根据此SO 答案CI 文档扩展我的 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');

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

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

消息:未定义的属性:MY_Form_validation::$load

文件名:库/MY_Form_validation.php

行号:12

这是第 12 行:

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

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

4

2 回答 2

5

用这个:

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

然后像这样使用它:

$CI->gmap->GoogleMapAPI();

你必须这样做,因为表单验证不像 CI 模型或控制器类,它只是一个库。

于 2013-03-06T21:31:21.017 回答
3

在您的库中,您可以通过首先加载 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");

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

$this->ci->gmap->GoogleMapAPI();
$this->ci->gmap->getGeoCode("{$str}, United States");
于 2013-03-06T21:55:10.877 回答