Neste post irei mostrar como validar campos de formulários com valores que contenham uma data e hora no framework Laravel, por exemplo, “04/03/2012 13:00:00″.
O PHP leva em conta sua definição da variável date.timezone do arquivo php.ini ou então o valor da definição do método date_default_timezone_set() para as funções de data do sistema, no caso do Brasil ficaria assim:
date_default_timezone_set('America/Sao_Paulo');
Primeiro devemos adicionar um método a classe “Validator” do Laravel em nome_do_seu_projeto/laravel/validator.php (recomendo adicionar após o método validate_required).
EDIT: O método usando o strtotime() do PHP parece não funcionar em alguns casos para nosso formato de data/hora, estou usando o método a seguir para validação:
// nao alterar o nome do metodo pois senao nao
// sera encontrado pelo validator do laravel.
protected function validate_datetime($attribute, $value)
{
// separa data e hora
$pieces = explode(' ', $value);
if ( count($pieces) == 2 ) {
$date_piece = $pieces[0];
$time_piece = $pieces[1];
// lista os dados de data e hora
list($day, $month, $year) = explode('/', $date_piece);
list($hour, $minute) = explode(':', $time_piece);
// data eh valida?
$date_is_valid = checkdate($month, $day, $year);
// hora eh valida?
$time_is_valid = false;
if ( ($hour > -1 && $hour < 24) && ($minute > -1 && $minute < 60) ) {
$time_is_valid = true;
}
// data e hora sao validos?
if ( $date_is_valid && $time_is_valid ) return true;
}
return false;
}
// ### NAO RECOMENDADO ###
protected function validate_datetime($attribute, $value)
{
if ( ! strtotime($value) ) return false;
return true;
}
Desta forma podemos dentro do model do Laravel adicionar a validação da seguinte maneira.
$rules = array(
'start_at' => array('required', 'datetime'),
'end_at' => array('required', 'datetime'),
);
// mensagens personalizadas para os erros (opcional)
$messages = array(
'start_at_required' => 'O campo "Data início" é obrigatório.',
'start_at_datetime' => 'A data informada em "Data início" é inválida.',
'end_at_required' => 'O campo "Data fim" é obrigatório.',
'end_at_datetime' => 'A data informada em "Data fim" é inválida.',
);
$validator = Validator::make( Input::get(), $rules, $messages );
if ( $validator->valid() ) {
// salvar dados da model!
}
Ainda é possível criar outros métodos de validação por exemplo para validar um CPF, telefone, etc.
Até mais!!