Getting 'old' value of a select input laravel

Viewed 7223

I'm working on validating my registration form.

If the input is a regular input, i can populate the previous value if it fails like so

<input type="tel" name="phone" value="{{old('phone')}}">

How do I populate the value on a select option?

<div class="input--select">
                        <label>Age Range <span>*</span></label>
                        <select name="age_range" class="age-range" value="{{old('age_range')}}" required>
                          <option selected disabled>Select your age range</option>
                          <option value="18-25">18-25</option>
                          <option value="26-35">26-35</option>
                          <option value="36-45">36-45</option>
                          <option value="46-55">46-55</option>
                          <option value="56-65">56-65</option>
                          <option value="66-75">66-75</option>
                          <option value="75+">75+</option>
                        </select>
                        @if ($errors->has('age_range')) <span class="error-message">Age range option is required.</span> @endif
                      </div>
3 Answers

I suggest putting all you ages in an array and pass that array to view:

$ages = ['18-25','25-50','50-75','75+']; // More dynamic and you can extend in anytime

Now changes in html :

                <div class="input--select">
                    <label>Age Range <span>*</span></label>
                    <select name="age_range" class="age-range" value="{{old('age_range')}}" required>

                        // 1. first change which is creating your problem
                        <option {{ old('age_range') ? "" : "selected" }} disabled>Select your age range</option>

                       // 2. This is just optimization for short code

                        @foreach($ages as $age)
                          <option {{old('age_range') ==$age" ? $selected : ""}} value="{{$age}}">{{$age}}</option>
                       @endforeach
                    </select>


                    @if ($errors->has('age_range')) <span class="error-message">Age range option is required.</span> @endif
                  </div>

So in point 1 you are always applying the selected with first option.

Suppose your old value was 46-55

your html looks like :

<select name="age_range" class="age-range" value="{{old('age_range')}}" required>
                      <option selected disabled>Select your age range</option>
                      <option value="18-25">18-25</option>
                      <option value="26-35">26-35</option>
                      <option value="36-45">36-45</option>
                      <option selected value="46-55">46-55</option>
                      <option value="56-65">56-65</option>
                      <option value="66-75">66-75</option>
                      <option value="75+">75+</option>
                    </select>

if you take a look at above html there are 2 selected options. Html always picks the first one this is what creating the problem.

Point 1. will check if there is a old value available it will not apply the selected to the first placeholder option.

{!! Form::select('name', $varableyouwanttodisplay, old('name'), 
      ['id'=>'id', 'class' => 'form-control select2', 'data- 
      placeholder' => 'select','required', 'style' => 'width:100%']) !!}

try like above code.

@php $selected = old('experience') ?: 66; @endphp

and than

{{ Form::select('experience', $experience, $selected, ['class' => 'form-control']) }}

This works in a case when a blade template loads for the first time and doesn't have 'old' value and you need predefined selected option(I.e. 66) for that case.

Related