What is the best practice to show old value when editing a form in Laravel?
LaravelValidationLaravel BladeLaravel Problem Overview
I am writing the logic for an edit form and have some complications when displaying data in the inputs.
When I initially show the form, I show the records values like:
value="{{$dog->title}}"
Then when the form does not pass the validation I need to show the old input, so that user does not loose what he has already input. So I need to have a way to display old data like:
value="{{old('title')}}"
Because I need to input old data in case it exists, I ended up with this code:
value="{{$dog->title or old('title')}}"
And in controller I check if Request has old input, I assign the $dog var a null value.
I wanted to ask if that is considered an OK practice or is there a better and 'correct' way to do it?
Laravel Solutions
Solution 1 - Laravel
Function old have default parameter if no old data found in session.
function old($key = null, $default = null)
You can replace expression in template with
value="{{old('title', $dog->title)}}"
Solution 2 - Laravel
I know this has already been answered but I thought I would leave a little snippet here for others in the future.
Setting old value on input as @ikurcubic posted can be used the same way on radio button or select:
<input type="text" name="name" value="{{ old('name', $DB->default-value) }}" />
Select option:
<option value="Jeff" {{ old('name', $DB->default-value) == 'Jeff' ? 'selected' : '' }}>Jeff</option>
Radio Button:
<input type="radio" name="gender" value="M" {{ old('name', $DB->default-value)== "M" ? 'checked' : '' }} />
Another way of doing it; write a small if statement to determine which value should be evaluated:
@php
if(old('name') !== null){
$option = old('name');
}
else{ $option = $database->value; }
@endphp
<select name="name">
<option value="Bob" {{ $option == 'Bob' ? 'selected' : '' }}>Bob</option>
<option value="Jeff" {{ $option == 'Jeff' ? 'selected' : '' }}>Jeff</option>
</select>
<input type="radio" name="gender" value="M" {{ $option == "M" ? 'checked' : '' }} />
<input type="radio" name="gender" value="F" {{ $option == "F" ? 'checked' : '' }} />
Setting old value of input with an array name e.g name="name[]":
<input type="text" name="name[]" value="{{ old('name.0) }}" />
This will give you the old value of the input with an index of 0.
I have tested this and it works.
Solution 3 - Laravel
Another way to do that is get the data from the dog
class, like this:
value="{{old('title') ?? $dog->title }}"
Why? Because old()
is for validation; when you fail validation, the input will remain available in the field. In the case where validation hasn't fired yet, value
will be filled with $dog->title
.
Solution 4 - Laravel
I solved that issue in my application if you want to get old previous inserted value in input you should try this one I did like this.
function SaveData(Request $request)
{
$sValidationRules = [
'firstname' => 'required',
'lastname' => 'required',
'email' => 'required',
'phone' => 'required',
];
$validator = Validator::make($request->all(), $sValidationRules);
if ($validator->fails()) // on validator found any error
{
// pass validator object in withErrors method & also withInput it should be null by default
return redirect('Your Route Hare')->withErrors($validator)->withInput();
}
Employee::create($request->all());
return redirect(' your route hare ');
}
& after then get old data in input field value like this using {{ Request::old('firstname') }} Happy Coding. :)
<input type="text" name="firstname" id="firstname" value="{{ Request::old('firstname') }}" class="form-control" placeholder="First Name">
Solution 5 - Laravel
Old Data: input type text | phone | number | ...
<input type="text" name="my_text" value="{{old('my_text')}}">
Old Data: input type checkbox | radio
<input type="checkbox" {{ old('my_checkbox') == 'on' ? 'checked' : '' }} name="my_checkbox">
Solution 6 - Laravel
There is nothing wrong with the way you are doing things as Laravel gives multiple ways to handle the situation you're describing.
What I would suggest is using the Laravel Collective Form and HTML packages to build your form. This package will automatically handle binding old request values to your form if validation fails