Besoin d'aide ?

Validate - Concaténation date + heure

  • Avatar de PLJerem
    Membre depuis :
    10/01/2019
    Messages :
    20

    Bonjours,

    J'ai un formulaire qui permet qui comprend 4 inputs :

    • date : date_start
    • time : time_start
    • date : date_end
    • time : time_end

    Mes utilisateurs devant choisir les horaires dans une list d'options je n'ai pas la possibilité d'utiliser un input de type "datetime-local ".

    Lors de la soumission de mon formulaire je fais actuellement une vérification que le format des champs est bien respecté :

    request->validate([
    'date_start' => 'bail|date_format:"Y-m-d"|required',
    'time_start' => 'bail|date_format:"H:i"|required',
    'date_end' => 'bail|date_format:"Y-m-d"|required',
    'time_end' => 'bail|date_format:"H:i"|required']);

    Existe-t-il une solution que dans la validation du formulaire je puisse vérifier que :

    date_start.time_start < date_end.time_end

    J'ai aussi la nécessité de vérifier que le datetime de départ "date_start.time_start" est supérieur à une date stocké dans une variable.

  • Avatar de bestmomo
    Membre depuis :
    07/04/2013
    Messages :
    2450

    Bonjour,

    Je pense qu'il faut faire une règle sur mesure dans ce cas.

    Ou peut-être ajouter des champs calculés avant la validation.

  • Avatar de PLJerem
    Membre depuis :
    10/01/2019
    Messages :
    20

    Bonjour Bestmomo,

    Je suis en train de tenter de faire ma régle mais pour le moment ce n'est pas du tout un grand succés.

    Juste pour voir si je suis sur la bonne piste :

    J'ai créé ma régle en faisant :

    php artisan make:rule DatetimesValidation

    Dans mon Controller :

    $request->validate([
    'date_start' => 'bail|date_format:"Y-m-d"|required',
    'time_start' => 'bail|date_format:"H:i"|required',
    'date_end' => 'bail|date_format:"Y-m-d"|required',
    'time_end' => 'bail|date_format:"H:i"|required',
    'dates_valide' => new DatetimesValidation($request->date_start, $request->time_start, $request->date_end, $request->time_end)]);

    La régle que j'ai commencé à créer :

    <?php

    namespace App\Rules;

    use Illuminate\Contracts\Validation\Rule;

    class DatetimesValidation implements Rule
    {
    protected $date_start;
    protected $time_start;
    protected $date_end;
    protected $time_end;

    /
    Create a new rule instance.

    @return void
    /
    public function __construct($date_start, $time_start, $date_end, $time_end)
    {
    $this->date_start=$date_start;
    $this->time_start=$time_start;
    $this->date_end=$date_end;
    $this->time_end=$time_end;
    }

    /

    Determine if the validation rule passes.

    @param string $attribute
    @param mixed $value
    @return bool
    /
    public function passes($attribute, $value)
    {
    $dateStart = Carbon::createFromFormat('Y-m-d H:i', $this->date_start.' '.$this->time_start);
    $dateEnd = Carbon::createFromFormat('Y-m-d H:i', $this->date_end.' '.$this->time_end);

    if ($dateEnd > $dateStart) {
    $value=true;
    }
    else {
    $value=false;
    }
    }

    /*
    Get the validation error message.

    @return string
    */
    public function message()
    {
    return 'The validation error message.';
    }
    }

    Je suis sur la bonne piste ou complétement fausse route ?

  • Avatar de bestmomo
    Membre depuis :
    07/04/2013
    Messages :
    2450

    Salut,

    Ta fonction passes doit renvoyer une valeur true ou false. Là tu ne renvoies rien...

  • Avatar de itanea
    Membre depuis :
    15/02/2019
    Messages :
    13

    Salut Jérémy,

    Comme te l'a dit Bestmomo, il te faut rajouter du return dans ta fonction 'passes'.
    C'est ce qu'indique d'ailleurs la doc signalée par BestMomo :

    Once the rule has been created, we are ready to define its behavior. A rule object contains two methods: passes and message. The passes method receives the attribute value and name, and should return true or false depending on whether the attribute value is valid or not. The message method should return the validation error message that should be used when validation fails

    Il faut donc que ta fonction 'passes' ressemble à quelque chose comme ça :

    if ($dateEnd > $dateStart) {

    return true;

    }

    else {

    return false;

    }

    En espérant t'avoir aidé.

    A plus.

  • Avatar de PLJerem
    Membre depuis :
    10/01/2019
    Messages :
    20

    C'est parfait ! Merci ! Tout fonctionne :)

    Au début rien ne fonctionnait. La régle n'était jamais appelée, j'avais zappé de créer un input en hiddent pour appeler la régle dans la validation.

  • Avatar de itanea
    Membre depuis :
    15/02/2019
    Messages :
    13

    Parfait alors !
    Bonne continuation Jérémy :D !

Vous ne pouvez pas répondre à ce sujet.