web-dev-qa-db-fra.com

Codeigniter - Format de date - Validation de formulaire

J'utilise codeigniter avec PHP. J'utilise le formulaire suivant,

<?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>

ici, #dob est au format dd-mm-yyyy.

mon code de validation est,

array(
  'field' => 'reg[dob]',
  'label' => 'DOB',
  'rules' => 'required'
)

Comment définir la rules pour une validation correcte de la date?

12
KarSho

vous pouvez le faire avec 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}]'); 
7
Abin M Devasia

Vous pouvez utiliser les fonctions de rappel CodeIgniters en créant une fonction callback_date_valid () qui vérifie si la date est valide. 

Et pour vérifier si elle est valide, vous pouvez utiliser la fonction checkdate de PHP

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);
}
18
Winks

J'ai une solution assez propre pour cela. Vous pouvez étendre la bibliothèque de validation de formulaire de codeigniters.

Pour ce faire, mettez un fichier MY_Form_validation.php dans le dossier application/libraries. Ce fichier devrait ressembler à ceci: 

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;
}
}

Pour ajouter le message d'erreur, accédez à votre dossier application/language/et ouvrez le fichier form_validation_lang.php. Ajoutez une entrée au tableau $ lang à la fin du fichier, comme ceci:

$lang['form_validation_valid_date'] = 'The field {field} is not a valid date';

Notez que la clé doit ici être la même que le nom de la fonction (valid_date).

Ensuite, dans votre contrôleur, vous utilisez cette fonction comme toute autre fonction de validation de formulaire, telle que par exemple

$this->form_validation->set_rules('date','Date','trim|required|valid_date');
14
Joha

Je sais que c'est vieux, mais je viens de rencontrer le même problème. J'aime la réponse fournie par Winks, mais a constaté que le code ne fonctionnait pas. Je l'ai modifié pour ceci:

  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;
  }
1
tmsimont

Il n'y a pas de validation de date intégrée dans Codeigniter form_validation Library, mais vous pouvez utiliser son rappel pour appeler une fonction et valider la date en utilisant les capacités propres de PHP.

Avec DateTime, vous pouvez créer le validateur de date et d’heure le plus court pour tous les formats.

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

function a été copié à partir de cette réponse ou php.net

1
Muhammad

La regex réelle pour la validation de la date 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)$/]'));

J'utilise la même expression pour le format jj-mm-aaaa et jj/mm/aaaa

Aucun avertissements et erreurs :-)

0
Rahul Pawar

J'ai écrit ce validateur personnalisé pour ci3 - valide le format d/m/Y H: i - vous pouvez facilement changer cela.

$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;
    }

}
0
Smith

Essayez celui-ci ... Je pense que c'est plus simple.

$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;
        }
}
0
curiosity

J'aime la réponse fournie par tmsimont, mais j'ai constaté que le code ne fonctionnait pas si des valeurs non numériques étaient entrées. Le code modifié est donné ci-dessous:

/**
    * 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;
    }
0
Dayz