我有一个表单,其中显示了一些可由用户选择的项目。 有超过1000个项目,所以我使用分页。
当用户转到下一页时,保留已检查项目的最佳方法是什么?
将所有这些项目存储在隐藏字段中并不是一个选项,因为它们属于很多项目。
修改
我的看法:
@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 :(得分:1)
据我了解,您面临两个问题:将已检查的项目保持在分页请求中,并将检查的项目检索回视图。
要将已检查的项目保留在分页请求中,我会将已检查的项目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 ,每个隐藏的输入都应该与复选框的名称相同。
答案 1 :(得分: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');
});