зняты сцяжок з «Input :: стары ()»

Я ствараю сцяжок ў мэтах:

Form::checkbox('test', 'true', Input::old('test', true));

Пасля таго, як зняць сцяжок, запоўніўшы форму і перанакіроўваецца назад:

return Redirect::back()->withInput()->withErrors($validation);

Сцяжок ўсё яшчэ правяраецца - відаць, таму што «тэст» не існуе ў «Уваход :: стары» так што вяртаючыся назад да значэння па змаўчанні.

Любыя прапановы аб тым, як лепш дасягнуць гэтага?

<�Моцны> Edit:

Я прыдумаў некалькі Hacky спосаб атрымаць вынікі, я хачу:

$isChecked = true;//The default state
// Check if the form has been returned "withInput"
if(Input::old())
{
    $isChecked = Input::old('test', false);//If the field has old data available use that, otherwise it is unchecked
}
echo Form::checkbox('test', 'true', $isChecked);

Я пішу гэта ў функцыю для паўторнага выкарыстання, але гэта здаецца трохі хваравітым таму любыя каментары/прапановы было б выдатна

Edit 2 Sorry if not clear - to clarify:

  1. Форма загружаецца з галачкай
  2. Я зніміце сцяжок і адправіць форму
  3. форма не правярае, так што я вярнуўся ў форму
  4. Сцяжок зноў праверыў сябе - я б чакаць, што гэта будзе адменена, згодна з дасланым карыстальнікам дадзеных

Я мяркую, што гэта адбываецца таму, што калі сцяжок не ўсталяваны элемент не ўваходзіць у пост дадзеных

5

8 адказы

У мяне была тая ж праблема. Аказваецца, гэта было таму, што я ішоў інструкцыі аб тым, як апублікаваць неправераную сцяжок, у якім гаварылася:

echo Form::hidden('name', 0);
echo Form::checkbox('name', 1);

Праблема ў тым, што на праверкі формы церпяць няўдачу, калі сцяжок быў усталяваны, Laravel будзе засяліць як «схаваны» і полі «сцяжок» са старым значэннем, таму вашыя скрытыя поля будуць заўсёды падачы 1 замест 0. Простае рашэння проста пісаць HTML для схаванага поля замест выкарыстання формы памочніка:

echo '<input type="hidden" name="name" value="0">';
echo Form::checkbox('name', 1);
10
дададзена
Кругі, што інструкцыі ?
дададзена аўтар Jason McCreary, крыніца
Tnx, гэта ўсталяваў яе для мяне. Выкарыстоўваючы (стары ( 'актыўны', $ слайд-> актыўны ?? 1) == 1)? праўда, хлусня, якім асноўным кажа: калі oldInput> Slide> 1 == 1, то дакладна, у адваротным выпадку хлусня. "??" можа быць выкарыстаны ў якасці скарачэння для IsSet, каб даць альтэрнатыўнае значэнне, калі што-то не даступна.
дададзена аўтар Maarten Kuijper, крыніца
Пра гэта гаворыцца ў каментары тут: flynsarmy.com/2015/02/…
дададзена аўтар ErnestV, крыніца

Гэта павінна дастаткова

echo Form::checkbox('test', 'true', Input::old('test', true));

Калі Input :: стары() не існуе, то ён вяртае ісціну, ваша значэнне па змаўчанні.

5
дададзена
@GuyIncognito Гэта працуе, таму што Laravel ў форме будаўнік правярае сесію, і калі ёсць якія-небудзь старыя дадзеныя формы. <�Код> калі (Исеть ($ this-> сесія) && $ this-> oldInputIsEmpty() && is_null ($ this-> стары ($ імя!))) Вяртаюць хлусня; FormBuilder.php лініі 639 ў Laravel версія 4.2.x-DEV
дададзена аўтар Dustin Graham, крыніца
Дзякуй за адказ, але вы праверылі гэта? Калі я зніміце сцяжок і націсніце кнопку, то затым правяраецца, калі форма перазагружаецца - я beieve таму Input :: стары ( «тэст») не існуе
дададзена аўтар Guy Incognito, крыніца

Сцяжок і сесійных неадпаведнасць было памылкай, якая была выпраўленая ў Laravel 4. Наступны код павінен захаваць сцяжок на перанакіраванні:

echo Form::checkbox('payment_method', 'credit');

Для згрупаваных сцяжкоў, выкарыстоўваць нешта накшталт гэтага:

echo Form::checkbox('payment_method[]', 'credit');

Гэта павінна працаваць.

** Відавочна, што вы хочаце, каб замяніць PAYMENT_METHOD і крэдыт сваімі атрыбутамі.

2
дададзена

Гэта было крыху заблытаным для мяне таксама. Але гэта тое, што я зрабіў.

У маім кантролеры,

Session::flash('test', Input::get('test') ? 'true' : 'false');

І на думку

<?php $test = Session::get('test'); ?>
<input type="checkbox" id="test" name="test" value="true" <?php echo is_null($test) ? 'checked' : ($test == 'true' ? 'checked' : ''); ?> />

Такім чынам, у значнай ступені з дапамогай дадатковых дадзеных сеансу флэш абыйсці.

1
дададзена

Чаму б не зрабіць нешта накшталт гэтага:

<?php $last_turnaround = (array) Input::old('turnaround'); ?>

{{ Form::checkbox( 'turnaround', 'normal', in_array('normal', $last_turnaround), array('id' => 'turnaround_normal', 'class' => 'turnaround')) }}

0
дададзена

Маё рашэнне той жа праблемы:

1) Зніміце сцяжок з праверкі. Лагічна, гэта не мае ніякага значэння.

2) У маёй функцыі абнаўлення кантролера, я дадаў, калі заяву, у якім выкарыстоўваецца IsSet каб вызначыць, ці было паслана значэнне або няма (калі не паслалі, ён не быў устаноўлены, і таму ілжыва).

if ($validation->passes())
{
    $xxx = $this->xxx->find($id);
    $xxx->update($input);
    if (!isset($input['checkbox_attribute'])) {
        $xxx->checkbox_attribute = false;
    }
    $xxx->save();
    return Redirect::to('xxx.show');
}
0
дададзена

У мяне была тая ж праблема. Я ў канчатковым выніку з стварэннем гэтай дапаможнай функцыі:

function is_checked(string $name, $value, $default) : string
{
    $current_defaults = Input::old() ? old($name, 0) : $default;
    return ($value == $current_defaults) ? 'checked' : '';
}

<input type="checkbox" name="is_acrive" value="1" 
       {{ is_checked('is_active', 1, $user->is_active) }}>

Шматразовая версія сцяжка:

function is_checked_multiple(string $name, $value, $defaults) : string
{
    $current_defaults = Input::old() ? old($name, []) : (array)$defaults;
    return in_array($value, $current_defaults) ? 'checked' : '';
}

@foreach ($plans as $plan)
    <input type="checkbox" name="plans[]" value="{{ $plan->id }}" 
           {{ is_checked_multiple('plans', $plan->id, $user->plans->pluck('id') }}>
@endforeach
0
дададзена
Я спрабую сваю першую функцыю, і я атрымліваю памылку Class «Input» не знойдзены
дададзена аўтар Fred K, крыніца
<�Код> Увод з'яўляецца састарэлым. выкарыстоўваць Запыт або запыт() замест гэтага.
дададзена аўтар Kazuya Gosho, крыніца

У мяне такая ж праблема ..

Я выправіў гэта так

Form::checkbox('test', 'true', Input::old() ? Input::old('test', false) : true);

спадзяюся, што дапамагае ..

0
дададзена