2013-07-29 17 views
1

我有一個表格,我顯示一些項目,可以由用戶選擇。 有超過1000個項目,所以我正在使用分頁。如何在Laravel的分頁請求中保留已檢查的項目?

當用戶轉到下一頁時,什麼是最好的方式來堅持選中的項目?

將所有這些項目存儲在隱藏字段不會是一個選項,因爲他們對很多項目。

編輯 筆者認爲: @foreach($articles['uncommitted'] as $article)

<tr> 
     <td><input type="checkbox" name="articles[]"></td> 

     <td>{{{$article->articlename}}}</td> 
     <td>{{{$article->category->catname}}}</td> 
     <td>{{{strftime('%d.%m.%Y %H:%M', strtotime($article->created_at))}} 
     <td>{{{$article->rrp}}}</td>>created_at))}}}</td> 
    </tr> 
@endforeach 
{{$links}} 

這種形式將進行分頁。

+0

將它們存儲在數據庫中 –

+0

我將明確使用該會話。對於每個請求,我都會_flash_所選項目的ID。請參閱:http://laravel.com/docs/session#flash-data –

回答

0

據我理解你所面臨的兩個問題:堅持跨越分頁要求檢查的項目,並檢索選中的項回到視圖。

要堅持檢查項目跨分頁請求,我會flash檢查項目進入會議。控制器方法看起來如下所示。

public function fill_form() 
{ 
    $items = Item::paginate(25); 

    // Retrieve checked items in session. 
    $checked_items = [] 
    if (Session::has('checked_items')) 
     $checked_items = Session::get('checked_items'); 

    // Persist new checked items. 
    $checked_items = array_merge($checked_items, Input::get('item')); 
    Session::flash('checked_items', $checked_items); 

    return View::make('form') 
     ->with('items', $items); 
} 

正如你可以看到分頁請求中的檢查項目將在本屆會議。

現在爲了將檢查的項目顯示回視圖,我會發送檢查的項目在會話中通過old input查看。也就是說,返回值會改變如下。

public function fill_form() 
{ 
    # code intentionally omitted # 

    return View::make('form') 
     ->with('items', $items) 
     ->withInput($checked_items); 
} 

然後在您的意見中檢查的項目將堅持他們的檢查值。顯然,你應該use Laravel to generate your checkboxes


如何獲取所有項目(選中或不選)提交?

也許,如果您使用複選框渲染項目,您將需要知道哪些複選框已選中,哪些選項未進行分頁。一個簡單的解決方案將增加額外的輸入隱藏字段用默認值的每個複選框,它會看起來如下:

{{ Form::hidden('item1', 'off') }} 
{{ Form::checkbox('item1', 'on') }} 

{{ Form::hidden('item2', 'off') }} 
{{ Form::checkbox('item2', 'on') }} 

{{ Form::hidden('item3', 'off') }} 
{{ Form::checkbox('item3', 'on') }} 

提交表格後,分頁時,託運物品,你會收到預期的值,對於那些沒有檢查的人,你會收到隱藏的價值。

注意1,重要的是把隱藏輸入每個複選框之前注意2,每個隱藏的輸入應該與複選框具有相同的名稱。

+0

這是我的解決方案的一部分,但我怎麼知道用戶點擊了一個複選框? 如果用戶選擇了他所有的首選項目,表單將被髮送。 – Marco

+0

@MarcoMartens要做到這一點,您應該在每個複選框之前使用額外的隱藏字段**,並使用默認值指示哪些項目未被檢查。我會在我的回答中更詳細地解釋它。 –

+0

如此聰明和容易。非常感謝。 只有一個問題:這是好的做法嗎?還是有更清潔的解決方案? 如果沒有更好的解決方案,我會用這種方式。 – Marco

0

除非我誤解你的問題,我想你要找的是什麼緩存:http://four.laravel.com/docs/cache

下面是從文檔的摘錄:


數據庫緩存

當使用數據庫緩存驅動程序,您將需要設置一個表來包含緩存項目。下面是表的例子架構聲明:

Schema::create('cache', function($table) 
{ 
    $table->string('key')->unique(); 
    $table->text('value'); 
    $table->integer('expiration'); 
}); 

如果你想存儲跨請求表單數據,那麼你會希望使用Session - 摘自文檔(http://four.laravel.com/docs/session):

數據庫會話

當使用數據庫會話驅動程序,您需要設置一個表包含會話項目。下面是表的例子架構聲明:

Schema::create('sessions', function($table) 
{ 
    $table->string('id')->unique(); 
    $table->text('payload'); 
    $table->integer('last_activity'); 
}); 
+0

我想你誤解了我。 我有一個表單,用戶可以選擇項目。這些項目將存儲在這些項目的列表中。 所以表單使用複選框。用戶選擇一些項目,並且如果他繼續下一頁,由於重新加載,所選項目被禁用。 我正在尋找一種方法來暫時保存這些項目。 一種方法是在一頁上顯示所有項目,但這不是一個好習慣。 – Marco

+0

在這種情況下,我會建議使用Session:http://four.laravel.com/docs/session您甚至可以使用數據庫會話驅動程序。我已經更新了我的答案。 – rtimoshenko

+0

當然,但我怎樣才能獲得複選框的值?用戶在選擇了他所有的首選項後提交表單。 – Marco

相關問題