Расширение проверки формы в Codeigniter - PullRequest
8 голосов
/ 06 февраля 2012

Я поместил этот файл класса с именем «My_Form_validation.php» в «application / core», и я также попытался поместить его в «application / library».

В моем контроллере я использую

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

Это то, что в My_Form_validation.php - фактическая логика здесь не обсуждается, потому что у меня есть несколько вариантов для проверки почтового индекса.Мне нужна помощь, чтобы понять, почему он не загружается и не вызывается!

Моя версия CI - определение ('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 <james@koodoocreative.co.uk>
 * @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;
        }
    }
}

Ответы [ 3 ]

17 голосов
/ 07 февраля 2012

Поскольку вы расширяете библиотеку CodeIgniter, а не основной компонент, вы хотите поместить ее в application/libraries (не application/core).

И, конечно же, не забудьте загрузитьForm_validation библиотека в коде вашего контроллера.

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

Другие вещи, которые нужно проверить:

  • Чувствительность к регистру имени файла (MY_Form_validation.php загружается, а My_Form_validation.php нет)
  • Чувствительность к регистру имени класса (класс MY_Form_validation расширяет CI_Form_validation)

Справочный материал:

11 голосов
/ 21 декабря 2012

Вы должны добавить $ rules к своему методу __construct, а также передать его родительскому конструктору

, например:

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

Посмотрите на Form_validation и предоставьте те же переменные.

2 голосов
/ 11 июня 2016

Я знаю, что это старо, но на тот случай, если кто-то еще наткнется на это в наши дни, как я, вот быстрый пример. (В настоящее время используется 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;
    }
}
...