2015-07-27 6 views
5

Ich habe eine Form, die eine Frist und der Benutzer enthält, den Termin in vier Eingabefelder wie folgt festgelegt:Laravel 5: Wie validate Datetime Eingabe von 4 Eingabefeldern?

<div class="form-group col-lg-3"> 
    {!! Form::label('year', 'Year', ['class' => 'control-label']) !!} 
    {!! Form::selectYear('year',$year, $year +1, null , ['class' => 'form-control']) !!} 
</div> 
<div class="form-group col-lg-3"> 
    {!! Form::label('month', 'Month', ['class' => 'control-label']) !!} 
    {!! Form::selectRange('month', 1, 12 , null , ['class' => 'form-control']) !!} 
</div> 
<div class=" form-group col-lg-3"> 
    {!! Form::label('day', 'Day', ['class' => 'control-label']) !!} 
    {!! Form::selectRange('day', 1, 31 , null , ['class' => 'form-control']) !!} 
</div> 
<div class=" form-group col-lg-3"> 
    {!! Form::label('hour', 'Hour', ['class' => 'control-label']) !!} 
    {!! Form::selectRange('hour', 6, 23 , null , ['class' => 'form-control']) !!} 
</div> 

In einem formRequest, ich bin diese vier Felder in eine Frist zu kompilieren. Also meine formRequest ist wie folgt:

public function rules() 
    { 
     $this->prepInput(); 
     return [ 

     ]; 
    } 
    public function prepInput(){ 
     $input=$this->all(); 
     ... 
     $input['deadline']=$this->prepDeadline($input['hour'], $input['month'], $input['day'], $input['year']); 
     ... 
     $this->replace($input); 
    } 


    public function prepDeadline($hour,$month,$day, $year){ 

      $time = jDateTime::mktime($hour, 0, 0, $month, $day, $year); 
      return $deadline = strftime("%Y-%m-%d %H:%M:%S", $time);   
    } 

Die Frist ist eine Jalali Datetime und ich muss überprüfen, ob der Benutzer ein gültiges Datum gewählt haben oder nicht (beispielsweise 1394.12.31 ist kein gültiges Datum). Das Paket hat eine checkdate Methode, die genau wie php checkdate funktioniert. Wo und wie kann ich das Datum in diesem Formular bestätigen und den Benutzer benachrichtigen, um ein gültiges Datum auszuwählen? In der Tat muss diese Validierung stattfinden, bevor die Frist an prepInput übergeben wird.

Antwort

-1

Um dieses Problem zu lösen ich eine Middleware benötigt, um das Datum zu bestätigen, und ich fand die Lösung auf Laracasts Die Details dort zu finden sind.

+0

Link-only-Antworten werden nicht als gute Praxis betrachtet, Sie sollten ein Beispiel in der Antwort selbst geben. – Petah

4

Laravel der Validator hat eine date_format Regel, so dass, wenn die Regeln in Form Anforderung einstellen, sollten Sie in der Lage sein, einfach so etwas wie hinzufügen:

public function rules() 
{ 
    $this->prepInput(); 
    return [ 
     'deadline' => 'date_format:Y-m-d H:i:s' 
    ]; 
} 

Dann Ihre Ansicht:

@if ($errors->has('deadline')) 
    {{ $errors->first('deadline') }} 
@endif 

Sie können auch Ihre prepInput-Methode vereinfachen, indem Sie einfach Jahr/Monat/Tag/Stunde zu einer Zeichenfolge verketten, um die Frist zu erstellen. Es wird im Wesentlichen dasselbe sein.

+0

Vielen Dank für Ihre Antwort. Ich habe es versucht und es wird nicht funktionieren, weil es nicht prüft, ob ein ungültiges Datum vom Benutzer zur Verfügung gestellt wird und das ungültige Datum in ein gültiges Datum umgewandelt wird und die Validierung wird übergeben! –

+1

Haben Sie versucht, nur eine Zeichenfolge zu erstellen und diese zu validieren, anstatt strftime zu verwenden? Es könnte die jDateTime-Klasse sein, die es in ein gültiges Datum konvertiert? Ich hatte einen schnellen Test und ein einfaches verkettetes Datum, das die Formulareingabe verwendet, wird die Validierung fehlschlagen, wenn es tatsächlich ungültig ist! – benJ

+0

ja, die jDateTime hat ein kleines Problem und die Checkdate-Methode hat nicht funktioniert. Ich habe das Problem gelöst, aber das Hauptproblem blieb bestehen. Ich habe meine Frage in Laracasts gestellt und sie haben mir geholfen. –