2013-06-02 55 views
5

我創建一個視圖複選框:未選中的複選框用「輸入::舊的()」

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

取消勾選框,提交表單和之後被重定向:

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

複選框仍然被選中 - 大概是因爲'test'"Input::old"中不存在,所以它會恢復爲默認值。

關於如何最好地實現這一點的任何建議?

編輯:

我拿出得到的結果有點哈克的方式我想:

$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); 

我會寫這爲重複使用的功能,但它似乎有點痛苦,所以任何的意見/建議將是巨大的

編輯2 很抱歉,如果不明確 - 澄清:

  1. 形式加載複選框選中
  2. 我取消選中該複選框,並提交形式
  3. 形式不驗證,所以我回到了形式
  4. 複選框已重新檢查本身 - 我希望它不被選中,按用戶提交的數據

我想這是因爲,如果一個複選框未選中在後數據不含有元素

回答

5

這應該是足夠

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

如果輸入::老()不存在,它將返回true,則默認。

+5

感謝您的答覆,但你有沒有測試過這個? 如果我取消選中該複選框並提交,則檢查當表單重載 - 我beieve因爲輸入::老(「測試」)不存在 –

+0

@GuyIncognito這工作,因爲Laravel的表單生成器檢查會話,如果有是任何舊的表單數據。 'if(isset($ this-> session)&&!$ this-> oldInputIsEmpty()&& is_null($ this-> old($ name)))return false;'FormBuilder.php line 639 in laravel version 4.2.x- dev –

0

爲什麼不能做這樣的事情:

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

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

1

這是一個有點混亂,對我來說太。但這就是我所做的。

在我的控制器,

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' : ''); ?> /> 

所以,漂亮的使用附加的會話閃存數據多少得到解決。

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'); 
} 
2

複選框和會話不匹配的是,已經Laravel 4被糾正的錯誤下面的代碼應該保留的複選框上的重定向:

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

對於分組複選框,使用這樣的:

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

這也應該工作。

**顯然,你會想用自己的屬性,以取代PAYMENT_METHOD和信貸。

9

我有同樣的問題。原來是因爲我跟着就如何發佈一個未選中的複選框,裏面說的指令:

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); 
+0

關注*說明*? –

+0

這是在評論這裏提到:https://www.flynsarmy.com/2015/02/creating-a-basic-todo-application-in-laravel-5-part-3/ – ErnestV

+0

TNX,這個固定的我。使用(舊('active',$ slide-> active?1)== 1)? true:false,基本上說:如果oldInput> Slide> 1 == 1,則爲true,否則爲false。 「??」可以用作isset的簡寫,當某些東西不可用時給出一個替代值。 –

0

我有同樣的問題..

I fi固定的像這樣

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

希望幫助..

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'not found' –

+0

'Input'已被棄用。改用'Request'或'request()'。 –