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

ファイル名:libraries / MY_Form_validation.php

行番号:12

これは12行目です。

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

ライブラリ内からライブラリにアクセスできませんか?これを修正する適切な方法は何ですか?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 に答える