Laravel 4 — Input::old для переключателей

Мне было интересно, могут ли некоторые ребята из Laravel помочь.

У меня есть форма, в которой у меня есть 2 переключателя, когда форма отправляется, она проходит через валидатор, если валидатор не работает, он возвращается в форму, заполняет поля вводом и отображает сообщения об ошибках.

Кажется, я не могу сделать это для переключателей, если один из них нажат при отправке формы и произошла ошибка, он возвращается к форме со всем заполненным, ЗА ИСКЛЮЧЕНИЕМ того переключателя, который был проверен, теперь пуст.

Мои переключатели выглядят следующим образом:

<input type="radio" name="genre" value="M" class="radio" id="male" />
<input type="radio" name="genre" value="F" class="radio" id="female" />
<span class="error">{{ $errors->first('genre') }}</span>

Любая помощь будет принята с благодарностью.


person BigJobbies    schedule 12.06.2013    source источник


Ответы (7)


Вы можете сделать это:

<input type="radio" name="genre" value="M" class="radio" id="male" <?php if(Input::old('genre')== "M") { echo 'checked="checked"'; } ?> >
<input type="radio" name="genre" value="F" class="radio" id="female" <?php if(Input::old('genre')== "F") { echo 'checked="checked"; } ?> >
person JasonMortonNZ    schedule 12.06.2013
comment
Эй, это бы по умолчанию проверило мужской переключатель, не так ли? - person BigJobbies; 12.06.2013
comment
Да, вы могли бы изменить это так, чтобы женщина была по умолчанию. Но если вы хотите, вы можете поместить оператор if в оба поля ввода. - person JasonMortonNZ; 12.06.2013
comment
Вы не хотите, чтобы какой-либо радиовход был выбран по умолчанию? Я обновил свой код, поэтому по умолчанию ввод не проверяется. - person JasonMortonNZ; 12.06.2013

Вы можете попробовать это, используя стандартное HTML-радио Laravel... Флажки Laravel Docs Form и Radio

Используя лезвие,

{{ Form::radio('genre', 'M', (Input::old('genre') == 'M'), array('id'=>'male', 'class'=>'radio')) }}
{{ Form::radio('genre', 'F', (Input::old('genre') == 'F'), array('id'=>'female', 'class'=>'radio')) }}

Или просто пхп,

echo Form::radio('genre', 'M', (Input::old('genre') == 'M'), array('id'=>'male', 'class'=>'radio'));
echo Form::radio('genre', 'F', (Input::old('genre') == 'F'), array('id'=>'female', 'class'=>'radio'));
person Melvin    schedule 12.06.2013
comment
Я вижу это «Метод радио не существует». когда я использую это - person BigJobbies; 12.06.2013
comment
Не похоже, что рассматриваемый код использует шаблоны лезвий или помощники laravel HTML/Form. - person JasonMortonNZ; 12.06.2013
comment
Ой... Просто предлагаю... раз уж он упомянул laravel... Ура - person Melvin; 13.06.2013
comment
@BigJobbies только что отредактировал его.. используйте Form::radio() вместо HTML::radio().. мой плохой.. - person Melvin; 13.06.2013
comment
+1 Здесь нет необходимости в тернарии, просто передайте Input::old('genre') == 'M' в качестве значения параметра. - person Jeff Lambert; 04.06.2014
comment
Как я могу использовать это с Form::model? У меня есть модель User и модель Seller, и мне нужно получить некоторые данные о продавце и использовать их для флажка. - person laviku; 18.10.2014

Ошибка известна: - https://github.com/laravel/laravel/issues/2069 - https://github.com/laravel/framework/issues/1564

У вас есть временное решение во второй ссылке.

person thujohn    schedule 12.06.2013
comment
Это на самом деле не отвечает на заданный вопрос. - person JasonMortonNZ; 12.06.2013
comment
Вы правы, на самом деле это не ответ, но я надеюсь, что это скоро будет исправлено :) - person thujohn; 12.06.2013

Я только что наткнулся на это, и я не хочу повторять такие условия в каждой форме, поэтому я создал функцию в своем классе Helper.

Помощник.php:

class Helper {

    // other functions

    public static function oldRadio($name, $value, $default = false) {
        if(empty($name) || empty($value) || !is_bool($default))
            return '';

        if(null !== Input::old($name)) {
            if(Input::old($name) == $value) {
                return 'checked';
            } else {
                return '';
            }
        } else {
            if($default) {
                return 'checked';
            } else {
                return '';
            }
        }

        // Or, short version:
        return null !== Input::old($name) ? (Input::old($name) == $value ? 'checked' : '') : ($default ? 'checked' : '');
    }
}

Итак, теперь в моих формах я просто использую это так:

<label>Please select whatever you want</label>
<div class="radio-inline"><label><input type="radio" name="whatever" value="1" required {{ Helper::oldRadio('whatever', '1', true) }}> One</label></div>
<div class="radio-inline"><label><input type="radio" name="whatever" value="2" {{ Helper::oldRadio('whatever', '2') }}> Two</label></div>
<div class="radio-inline"><label><input type="radio" name="whatever" value="3" {{ Helper::oldRadio('whatever', '3') }}> Three</label></div>

Каждая опция передает свое имя и значение вспомогательной функции, и ранее выбранная опция напечатает «checked». Кроме того, опция может передать «true» в качестве третьего параметра, чтобы она выбиралась, если не было старого ввода.

person Pedro Moreira    schedule 21.03.2014

Использование с Bootstrap и автоматической проверкой

Добавьте этот код в конец файла: app/start/global.php

//...

Form::macro('radio2', function($group ='group-name', $value_model = 'value-model', $label ='label-radio', $value_radio = 'value-radio', $attrs = array())
{

  $item  = "<div class='radio'>";
  $item .=   "<label>";
  $item .=      Form::radio($group, $value_radio, ($value_model == $value_radio) ? true : false, $attrs);
  $item .=      $label;
  $item .=   "</label>";
  $item .= "</div>";

  return $item;
});

В вашем представлении.php

{{ Form::radio2('status', Input::old('status'), 'Online', '1', array()) }}
{{ Form::radio2('status', Input::old('status'), 'Offline', '0', array()) }}

Конечный результат:

введите здесь описание изображения

person Ricardo Canelas    schedule 18.07.2014

Я попытался просто использовать Input::get() вместо Input::old().... и это сработало!!{{Form::radio('estado','V',(Input::get('estado')=="V"))}}

person roberto    schedule 16.02.2015

Мой подход представляет собой вложенный сокращенный оператор if/else с синтаксисом лезвия. Это решение также учитывает начальное значение, установленное в базе данных.

<div class="form-check form-check-inline">
    <input class="form-check-input" type="radio" name="sex" id="male" value="male"{!! ((old('sex') == 'male') ? ' checked="checked"' : ((empty(old('sex')) && $user->sex == 'male') ? ' checked="checked"' : '')) !!}/>
    <label class="form-check-label" for="male">Männlich</label>
</div>
<div class="form-check form-check-inline">
    <input class="form-check-input" type="radio" name="sex" id="female" value="female"{!! ((old('sex') == 'female') ? ' checked="checked"' : ((empty(old('sex')) && $user->sex == 'female') ? ' checked="checked"' : '')) !!}/>
    <label class="form-check-label" for="female">Weiblich</label>
</div>

Протестировано с Laravel 5.7.

person Kronzeuge    schedule 05.02.2019