【问题标题】:I'm trying to extend the CodeIgniter Form Validation library我正在尝试扩展 CodeIgniter 表单验证库
【发布时间】:2013-02-21 21:31:34
【问题描述】:

这是我的自定义验证功能。它使用来自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');

现在我只想将它移出我的控制器。因此,我正在尝试按照 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 库,因为我不会一直使用它。我的方法还有其他问题吗?

【问题讨论】:

    标签: php codeigniter validation shared-libraries codeigniter-2


    【解决方案1】:

    使用这个:

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

    然后像这样使用它:

    $CI->gmap->GoogleMapAPI();
    

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

    【讨论】:

    • 修复了错误,但现在根本没有验证。我还将这一行更改为:$geocodes = $CI-&gt;gmap-&gt;getGeoCode("{$str}, United States");
    • 你试图在函数的最开始返回FALSE并检查验证是否失败?
    • 我不确定您在问什么,但作为测试,我将return FALSE 移到了条件之外,并且验证消息有效。失败在于$geocodes 永远不会是empty,即使它应该是。我猜$geocodes = $CI-&gt;gmap-&gt;getGeoCode("{$str}, United States"); 有问题
    • 你也可以检查"{$str}, United States"是否是你想要的。
    • 感谢您解决了我的问题。显然,从谷歌返回的结果不是我所期望的。 This is somebody else's validator 表示wq 等地址是有效的。我的代码运行良好。
    【解决方案2】:

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

    【讨论】:

    • 我遇到了与另一个答案中讨论的问题相同的问题。这清除了我所有的错误,但$this-&gt;ci-&gt;gmap-&gt;getGeoCode("{$str}, United States"); 永远不会为空。如果它从不为空,它总是通过验证。这个完全相同的功能放在我的控制器中时可以正常工作。
    • 您是否尝试过var_dump($str)var_dump($geocodes) 来查看它们的值是否设置正确?
    • 是的,$str 是正确的,但 $geocodes 总是返回纬度/经度位置,即使在其中传递了垃圾。我必须找到一种更好的方法来验证地址。奇怪的是,昨天在我的控制器中运行良好。今天,无论我把它放在哪里,它都无法正常工作。
    • 即使United States 被删除并且仅$str=w, getGeoCode("$str") 给我一个纬度/经度位置返回给我。 ?!
    • FYI -> 使用 Google Maps 验证器,我猜 w 是一个有效地址:thialfi.org/work/api/validate.html
    猜你喜欢
    • 2012-02-27
    • 1970-01-01
    • 2015-01-20
    • 2012-05-02
    • 2015-07-19
    • 1970-01-01
    • 1970-01-01
    • 2011-08-04
    • 2012-03-31
    相关资源
    最近更新 更多