Besoin d'aide ?

Régle de validation personnalisé ne fonctionne pas

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

    Bonjour,

    J'ai beau tourner mon problème dans tous les sens je ne trouve pas.

    J'ai un formulaire avec les champs suivants :

    • date_start
    • time_start
    • date_end
    • time_end

    J'ai la validation suivante :

    // Validation des données formulaire
    $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',
    'datesValidate' => new DatesControl($request->input('date_start'), $request->input('time_start'), $request->input('date_end'), $request->input('time_end'))]);

    J'ai créé ma régle personnaliséen faisant :
    php artisan make:rule DatesControl

    Le code de cette page est :

    <?php

    namespace App\Rules;

    use App\Models\Feuilles;
    use Carbon\Carbon;
    use Illuminate\Contracts\Validation\Rule;

    class DatesControl implements Rule
    {
    protected $datetime_start;
    protected $datetime_end;
    protected $errorMsg;
    protected $feuilleLast;

    /
    Create a new rule instance.
    DatesControl constructor.

    @param string $dateStart
    @param string $timeStart
    @param string $dateEnd
    @param string $timeEnd

    @return void
    /
    public function __construct($dateStart, $timeStart, $dateEnd, $timeEnd)
    {
    $this->datetime_start = Carbon::createFromFormat('Y-m-d H:i', $dateStart.' '.$timeStart);
    $this->datetime_end = Carbon::createFromFormat('Y-m-d H:i', $dateEnd.' '.$timeEnd);
    $this->feuilleLast=Feuilles::last();
    }

    /

    Determine if the validation rule passes.

    @param string $attribute
    @param mixed $value
    @return bool
    /
    public function passes($attribute, $value)
    {
    // Si date de début < à la date de fin
    if ($this->datetime_start > $this->datetime_end) {
    $this->errorMsg='La date de début de la feuille ne pas être supérieure à la date de fin de la feuille.';
    return false;
    }
    // Si date de début est inférieure à la date de fin de la dernière feuille
    elseif ($this->datetime_start < $this->feuilleLast->date_end) {
    $this->errorMsg='La date de début de la feuille ne peut pas être antérieure au '.$this->expLast->date_end->format('d/m/Y à H\hi').', date de fin de la dernière feuille.';
    return false;
    }

    // Si aucune erreur rencontrée
    else {
    return true;
    }
    }

    /*
    Get the validation error message.

    @return string
    */
    public function message()
    {
    return $this->errorMsg;
    }
    }

    En faisant des essais pour vérifier que ma régle fonctionne bien, aucun message d'erreur ne met retourné.

    Ma régle est bien instanciée, quand je fais un :

    dd($this->datetime_start, $this->datetime_end, $this->feuilleLast);

    j'ai bien le code suivant de retourné :
    Carbon @1553842800 {#570 ▼
    date: 2019-03-29 08:00:00.0 Europe/Paris (+01:00)
    }

    Carbon @1553497200 {#575 ▼
    date: 2019-03-25 08:00:00.0 Europe/Paris (+01:00)
    }

    Exploitant {#643 ▼

    table: "feuilles"

    fillable: array:5 [▶]

    dates: array:3 [▶]

    +timestamps: true

    connection: "mysql"

    primaryKey: "id"

    keyType: "int"

    +incrementing: true

    with: []

    withCount: []

    perPage: 15

    +exists: true
    +wasRecentlyCreated: false

    attributes: array:8 [▼

    "id" => 1
    "user_id" => 1
    "date_edition" => "2019-03-05 18:30:32"
    "date_start" => "2019-01-01 00:00:00"
    "date_end" => "2019-01-01 00:00:00"
    "version" => 1
    "created_at" => "2019-01-12 00:00:00"
    "updated_at" => null

    ]

    original: array:8 [▶]

    changes: []

    casts: []

    dateFormat: null

    appends: []

    dispatchesEvents: []

    observables: []

    relations: []

    touches: []

    hidden: []

    visible: []

    guarded: array:1 [▶]

    }

    Si je tente de mettre un dd() dans la fonction passes() rien ne met retourné :(

    Quelqu'un aurait une idée ?

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

    Boulette de ma part :

    data: {
    "date_start": $('#date_start').val(),
    "time_start": $('#time_start').val(),
    "date_end": $('#date_end').val(),
    "time_end": $('#time_end').val(),
    "datesValidate" : $('#datesValidate').val(),
    "_token": "{{ csrf_token() }}"
    },

    J'avais zappé d'ajouter "datesValidate" à mon appel ajax de soumission du formulaire...

    Merci.

Vous ne pouvez pas répondre à ce sujet.