codeigniterをPHP
とともに使用しています。私は次のフォームを使用しています、
<?php
echo form_open('/register/create_new', $form_params);
?>
DOB: <input type="text" id="dob" name="reg[dob]">
<input type="submit" value="Create Account" />
</form>
ここでは、#dob
はdd-mm-yyyy
形式です。
私の検証コードは、
array(
'field' => 'reg[dob]',
'label' => 'DOB',
'rules' => 'required'
)
正しい日付検証のためにrules
を設定するにはどうすればよいですか?
あなたはregex
でそれを行うことができます
$this->form_validation->set_rules('reg[dob]', 'Date of birth', 'regex_match[(0[1-9]|1[0-9]|2[0-9]|3(0|1))-(0[1-9]|1[0-2])-\d{4}]');
日付が有効かどうかを確認するcallback_date_valid()関数を作成することにより、 CodeIgnitersコールバック関数 を利用できます。
そして、それが有効かどうかを確認するには、 PHPのcheckdate関数 を使用できます
array(
'field' => 'reg[dob]',
'label' => 'DOB',
'rules' => 'required|date_valid'
)
function callback_date_valid($date){
$day = (int) substr($date, 0, 2);
$month = (int) substr($date, 3, 2);
$year = (int) substr($date, 6, 4);
return checkdate($month, $day, $year);
}
私はこれに対してかなりクリーンな解決策を持っています。 codeignitersフォーム検証ライブラリを拡張できます。
これを行うには、MY_Form_validation.phpファイルをapplication/librariesフォルダーに配置します。このファイルは次のようになります。
class MY_Form_validation extends CI_Form_validation {
public function __construct($rules = array())
{
parent::__construct($rules);
}
public function valid_date($date)
{
$d = DateTime::createFromFormat('Y-m-d', $date);
return $d && $d->format('Y-m-d') === $date;
}
}
エラーメッセージを追加するには、application/language /フォルダーに移動し、form_validation_lang.phpファイルを開きます。次のように、ファイルの最後の$ lang配列にエントリを追加します。
$lang['form_validation_valid_date'] = 'The field {field} is not a valid date';
ここでのキーは、関数名(valid_date)と同じでなければならないことに注意してください。
次に、コントローラで、これをたとえば「必須」などの他のフォーム検証関数として使用します
$this->form_validation->set_rules('date','Date','trim|required|valid_date');
これは古いのですが、同じ問題が発生しました。 Winksが提供した回答は気に入っていますが、コードが機能しないことがわかりました。私はこれを次のように変更しました:
public function your_form_handler($date)
{
// ....
$this->form_validation->set_rules('date', 'Date', 'required|callback_date_valid');
// ....
}
/**
* Validate dd/mm/yyyy
*/
public function date_valid($date)
{
$parts = explode("/", $date);
if (count($parts) == 3) {
if (checkdate($parts[1], $parts[0], $parts[2]))
{
return TRUE;
}
}
$this->form_validation->set_message('date_valid', 'The Date field must be mm/dd/yyyy');
return false;
}
Codeigniter form_validation
Libraryには組み込みの日付検証はありませんが、そのコールバックを使用して関数を呼び出し、PHP独自の機能を使用して日付を検証できます。
DateTimeを使用すると、すべての形式で最も短い日付と時刻のバリデーターを作成できます。
function validateDate($date, $format = 'Y-m-d H:i:s')
{
$d = DateTime::createFromFormat($format, $date);
return $d && $d->format($format) == $date;
}
var_dump(validateDate('2012-02-28 12:12:12')); # true
var_dump(validateDate('2012-02-30 12:12:12')); # false
var_dump(validateDate('2012-02-28', 'Y-m-d')); # true
var_dump(validateDate('28/02/2012', 'd/m/Y')); # true
var_dump(validateDate('30/02/2012', 'd/m/Y')); # false
var_dump(validateDate('14:50', 'H:i')); # true
var_dump(validateDate('14:77', 'H:i')); # false
var_dump(validateDate(14, 'H')); # true
var_dump(validateDate('14', 'H')); # true
var_dump(validateDate('2012-02-28T12:12:12+02:00', 'Y-m-d\TH:i:sP')); # true
# or
var_dump(validateDate('2012-02-28T12:12:12+02:00', DateTime::ATOM)); # true
var_dump(validateDate('Tue, 28 Feb 2012 12:12:12 +0200', 'D, d M Y H:i:s O')); # true
# or
var_dump(validateDate('Tue, 28 Feb 2012 12:12:12 +0200', DateTime::RSS)); # true
var_dump(validateDate('Tue, 27 Feb 2012 12:12:12 +0200', DateTime::RSS)); # false
Codeigniter日付検証の実際の正規表現:
$this->form_validation->set_rules('reg[dob]','Date of birth',array('regex_match[/^((0[1-9]|[12][0-9]|3[01])[- \/.](0[1-9]|1[012])[- \/.](19|20)\d\d)$/]'));
フォーマットdd-mm-yyyyとdd/mm/yyyyに同じ式を使用しています
警告やエラーはありません:-)
私はci3用にこのカスタムバリデーターを作成しました-d/m/Y H:i形式を検証します-簡単に変更できます。
$this->form_validation->set_rules("start_date", "Start Date", 'trim|callback__check_date_valid');
public function _check_date_valid($date){
$this->form_validation->set_message('_check_date_valid', "Please enter a valid date");
$d = DateTime::createFromFormat('d/m/Y H:i', $date);
if($d && $d->format('d/m/Y H:i') === $date || $date == ''){
return true;
}else{
return false;
}
}
これを試してみてください...もっと簡単だと思います。
$this->form_validation->set_rules('date', 'Date', 'trim|required|callback_checkDateFormat');
function checkDateFormat($date) {
$d = DateTime::createFromFormat('Y-m-d', $date);
if(($d && $d->format('Y-m-d') === $date) === FALSE){
$this->form_validation->set_message('checkDateFormat', ''.$date.' is not a valid date format.');
return FALSE;
}else{
return TRUE;
}
}
私はtmsimontの回答を気に入っていますが、数値以外の値を入力するとコードが機能しないことがわかりました。変更されたコードを以下に示します。
/**
* Validate dd/mm/yyyy
*/
public function date_valid(){
$date=$this->input->post('dob');
$parts = explode("/", $date);
if (count($parts) == 3) {
if (is_numeric($parts[2])) {
if (is_numeric($parts[0])) {
if (is_numeric($parts[1])) {
if (checkdate($parts[1], $parts[0], $parts[2])){
return TRUE;
}
}
}
}
}
$this->form_validation->set_message('date_valid', 'The Date field must be mm/dd/yyyy');
return false;
}