1

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

该表格将被分页。

4

2 回答 2

1

据我了解,您面临两个问题:在分页请求中保留已检查的项目,并将已检查的项目检索回视图。

为了在分页请求中保留已检查的项目,我会将已检查的项目刷新到 Session 中。控制器方法如下所示。

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

如您所见,选中的项目将在分页请求中的会话中可用。

现在,为了将选中的项目显示回视图,我将通过旧输入将会话中的选中项目发送到视图。也就是说,返回值将更改如下。

public function fill_form()
{
    # code intentionally omitted #

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

然后在您的视图中,选中的项目将保留它们的选中值。显然,你应该使用 Laravel 来生成你的 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,每个隐藏的输入应该与复选框具有相同的名称。

于 2013-07-31T05:21:21.793 回答
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');
});
于 2013-07-29T16:24:19.583 回答