如何在Laravel的分页请求中保留已检查的项目?

时间:2013-07-29 16:18:24

标签: php forms pagination laravel

我有一个表单,其中显示了一些可由用户选择的项目。 有超过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}}

此表单将被分页。

2 个答案:

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