I wrote a tutorial here about the CI date. At that post I used the HTML <select> for the input of date. Sometime our client can want to use text box for the date input. We need the validation for this date. I have found this code from here. It is for CI 1.7.* and PHP 5.2.*. So I change some code for the CI 2.0.* and PHP 5.3.*.

To use, copy the class below into your application/libraries folder named MY_Form_validation.php, then in your controller use it like any other rule.

Form

This validation rule validates an input text box only right now.

<input type="text" name="date" value="<?php echo set_value('date'); ?>" size="10" />

Controller Usage

UK

$this->form_validation->set_rules('date', 'date', 'trim|required|valid_date[d/m/y,/]');

US

$this->form_validation->set_rules('date', 'date', 'trim|required|valid_date[m/d/y,/]');

Database

$this->form_validation->set_rules('date', 'date', 'trim|required|valid_date[y-m-d,-]');

Code

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

class MY_Form_validation extends CI_Form_validation {

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

	/**
	* @desc Validates a date format
	* @params format,delimiter
	* e.g. d/m/y,/ or y-m-d,-
	*/
	function valid_date($str, $params)
	{
		// setup
		$CI =&get_instance();
		$params = explode(',', $params);
		$delimiter = $params[1];
		$date_parts = explode($delimiter, $params[0]);

		// get the index (0, 1 or 2) for each part
		$di = $this->valid_date_part_index($date_parts, 'd');
		$mi = $this->valid_date_part_index($date_parts, 'm');
		$yi = $this->valid_date_part_index($date_parts, 'y');

		// regex setup
		$dre = 		"(0?1|0?2|0?3|0?4|0?5|0?6|0?7|0?8|0?9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31)";
		$mre = "(0?1|0?2|0?3|0?4|0?5|0?6|0?7|0?8|0?9|10|11|12)";
		$yre = "([0-9]{4})";
		$red = ''.$delimiter; // escape delimiter for regex
		$rex = "/^[0]{$red}[1]{$red}[2]/";

		// do replacements at correct positions
		$rex = str_replace("[{$di}]", $dre, $rex);
		$rex = str_replace("[{$mi}]", $mre, $rex);
		$rex = str_replace("[{$yi}]", $yre, $rex);

		if (preg_match($rex, $str, $matches))
		{
			// skip 0 as it contains full match, check the date is logically valid
			if (checkdate($matches[$mi + 1], $matches[$di + 1], $matches[$yi + 1]))
			{
				return true;
			}
			else
			{
				// match but logically invalid
				$CI->form_validation->set_message('valid_date', "The date is invalid.");
				return false;
			}
		}

		// no match
		$CI->form_validation->set_message('valid_date', "The date format is invalid. Use {$params[0]}");
		return false;
	}

	function valid_date_part_index($parts, $search)
	{
		for ($i = 0; $i <= count($parts); $i++)
		{
			if ($parts[$i] == $search)
			{
				return $i;
			}
		}
	}
}
?>

`

Related Posts:

Comments (4)
  1. [...] the WebInOne blog there’s a post about doing some date validation in CodeIgniter 2 forms using the “set_validation” method. I wrote a tutorial here about the CI date. [...]

  2. [...] the WebInOne blog there’s a post about doing some date validation in CodeIgniter 2 forms using the “set_validation” method. I wrote a tutorial here about the CI date. [...]

  3. [...] = {"data_track_clickback":true}; On the WebInOne blog there's a post about doing some date validation in CodeIgniter 2 forms using the "set_validation" method. I wrote a tutorial here about the CI date. At that post [...]

  4. [...] der WebInOne Blog gibt es einen Beitrag über das Tun einiger Datum Validierung in CodeIgniter 2 Formulare mit dem “set_validation”-Methode. Ich schrieb ein Tutorial hier über die [...]

Leave a Reply

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

© 2012WebInOne. All Rights Reserved.