Codeigniterでのフォーム検証の拡張

私は 'My_Form_validation.php'という名前のこのクラスファイルを 'application/core'に配置しました。また、 'application/libraries'に配置しようとしました。

私のコントローラーで私は使用しています

$this->form_validation->set_rules('user_postcode', 'Postcode', 'valid_postcode|trim|required|xss_clean');

これはMy_Form_validation.phpにあります。実際には郵便番号を検証するオプションがいくつかあるので、実際のロジックはここで問題になりません。私が助けが必要なのは、それがロードされていないか、呼び出されていない理由を理解することです!

私のCIバージョンは define( 'CI_VERSION'、 '2.0.2');

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

/**
 * Form validation for UK Postcodes
 * 
 * Check that its a valid postcode
 * @author James Mills 
 * @version 1.0
 * @package FriendsSavingMoney
 */

class MY_Form_validation extends CI_Form_validation
{

    function __construct()
    {
        parent::__construct();  
        log_message('debug', '*** Hello from MY_Form_validation ***');
    }

    function valid_postcode($postcode)
    {

        /**
         *
         * UK Postcode validation expression from Wikipedia
         * http://en.wikipedia.org/wiki/Postcodes_in_the_United_Kingdom
         *
         * Note: Remember to strtoupper() your postcode before inserting into database!
         *
         */

        $pattern = "/^(GIR 0AA)|(((A[BL]|B[ABDHLNRSTX]?|C[ABFHMORTVW]|D[ADEGHLNTY]|E[HNX]?|F[KY]|G[LUY]?|H[ADGPRSUX]|I[GMPV]|JE|K[ATWY]|L[ADELNSU]?|M[EKL]?|N[EGNPRW]?|O[LX]|P[AEHLOR]|R[GHM]|S[AEGKLMNOPRSTY]?|T[ADFNQRSW]|UB|W[ADFNRSV]|YO|ZE)[1-9]?[0-9]|((E|N|NW|SE|SW|W)1|EC[1-4]|WC[12])[A-HJKMNPR-Y]|(SW|W)([2-9]|[1-9][0-9])|EC[1-9][0-9]) [0-9][ABD-HJLNP-UW-Z]{2})$/";


        if (preg_match($pattern, strtoupper($postcode)))
    {
            return TRUE;
        } 
        else
        {
            $this->set_message('valid_postcode', 'Please enter a valid postcode');
            return FALSE;
        }
    }
}
8
My_ではないMy_でなければなりません。 My_Form_validation.phpの内容を参照して質問に基づいて後者を使用しているようです
追加された 著者 Ben Swinburne,
2) $ config ['subclass_prefix'] = 'MY _'; 、3)設定ログのスレッシュホールドあなたのデバッグメッセージを出力します(そして、ファイルのアクセス許可で許可されます)
追加された 著者 landons,
全く分からない。私はすべての種類の var_dump() die()呼び出しを使ってショットガンをデバッグする必要があります。
追加された 著者 landons,
メソッドの中にメッセージを設定するのではなく、language/english/form_validation_lang.phpファイルを編集しようとしましたか?同様に: $ lang ['valid_postcode'] = "有効な郵便番号を入力してください";
追加された 著者 Mudshark,
私はこれと同じ問題を抱えている、私はファイルを正しく配置、ファイル名が正しいです。私は自分のコントローラにライブラリをロードします。すべてが正しく設定されています。しかし、私のカスタム検証のメソッドは読み込まれていません。私はこのメッセージ "検証ルールを見つけることができません:is_Fieldunique"を取得します。どうしてこんなことに?
追加された 著者 user1149244,
@ジェームズミルズ:あなたが把握することができる場所、それを修正する方法?
追加された 著者 user1149244,
はい、すべてに...
追加された 著者 James Mills,

3 答え

コアコンポーネントではなくCodeIgniterライブラリを拡張しているので、アプリケーション/ライブラリ application/core ではなく)に配置します。

もちろん、コントローラコード内に Form_validation ライブラリをロードすることを忘れないでください。

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

確認するその他の事項:

  • ファイル名の大文字と小文字の区別( My_Form_validation.php にはなりません)
  • クラス名の大文字と小文字の区別(クラス MY_Form_validation CI_Form_validation を拡張します)

参考資料:

17
追加された
私は MY_Form_validation ファイルとファイル名でさまざまな種類の大文字を試しましたが、どれもうまくいきませんでした。 CIのバージョンに応じて変更がありますか?
追加された 著者 tim peterson,
私はこれを正常に動作させるために無限の悪夢を覚えました。私のファイルとクラスは、両方とも MY_Form_validation の代わりに My_form_validation という名前でした。私は今自分自身を蹴っている
追加された 著者 Roshan Bhumbra,
@ timpeterson:私は同じことをしました。あなたはこれに対する解決策を見つけ出すことができましたか?
追加された 著者 user1149244,

__constructメソッドに$ rulesを追加し、これを親コンストラクタに渡す必要があります

例えば:

function __construct($rules = array())
{
    parent::__construct($rules);
}

Form_validationを見て、同じ変数を提供してください。

11
追加された
ialbescu、FTW。これは意味をなさないだけでなく、それも機能します。私は規則の配列を見過ごすことを見落としたとは思えません。うまくいった。 +1
追加された 著者 Abinadi,

私はこれが古かったことを知っていますが、他の誰かが私のように現代でこれにつまずいた場合には、ここで簡単な例があります。 (現在3.0.6を使用していますが、これは2でも同様に動作します)。

class MY_Form_validation extends CI_Form_validation {//Capitalization matters

  protected $CI;

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

  /**
   * Valid Date
   *
   * Verify that the date value provided can be converted to a valid unix timestamp
   *
   * @param string  $str
   * @return    bool
   */

  public function valid_date($str) {
      $CI = $this->CI =& get_instance();//Get your CodeIgniter instance

      if (($str = strtotime($str)) === FALSE) {//Basic timestamp check
         //Set error message by calling the method through the CI instance.
         //Obviously must be done BEFORE returning any value
          $this->CI->form_validation->set_message('valid_date', '{field} must be a valid date.');
          return FALSE;
      }

      return TRUE;
    }
}
2
追加された
$ CI-> form_validation == $ this fyi。インスタンスを取得する必要はありません。
追加された 著者 Aziz Saleh,