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?
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}]');
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);
}
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');
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;
}
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
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 :-)
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;
}
}
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;
}
}
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;
}