【问题标题】:Laravel pre-filling multiple forms if validation failed如果验证失败,Laravel 会预先填写多个表单
【发布时间】:2013-12-21 04:37:40
【问题描述】:

Laravel 最酷的功能之一是,如果发生验证错误,Laravel 会预先填写表单字段。但是,如果一个页面包含more than one form,并且表单字段有same name,Laravel 会预先填写所有forms fields

例如:

我有一个页面,我有两个表单来创建新用户或其他什么。

<h1>Create user1</h2>    
    {{ Form::open(array('url' => 'foo/bar')) }}
        {{ Form::text('name', null) }}
        {{ Form::email('email', null) }}
    {{ Form::close() }}

</h1>Create user2</h1>    
    {{ Form::open(array('url' => 'foo/bar')) }}
        {{ Form::text('name', null) }}
        {{ Form::email('email', null) }}
    {{ Form::close() }}

控制器

class UsersController extends BaseController
{
  public function store()
  {
     $rules = [
        'name'   => 'required',
        'email'  => 'required'
    ];

     $validation = Validator::make(Input::all(), $rules);

     if ($validation->fails()) {

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

由于我没有填写邮件,Laravel 会抛出验证错误并预先填写如下表格:

如何告诉 Laravel 不要填写第二个表单?

【问题讨论】:

  • 您的界面在用户体验方面很糟糕。如果用户填写了两个表单但只点击了最后一个“添加”按钮怎么办?
  • @neoascetic ,他们不会像在实际应用中那样知道形式是不同的。
  • @neoascetic,在实际应用中,我必须使用动态信息创建表单。(基于我从表中获得的总结果)。如果我有 10 个结果,我必须创建 10 个表单,使用单个控制器功能来处理所有表单是有意义的。
  • 你的结果会是某种模型吗?在这种情况下最好使用Form::model
  • 不是模型,但我需要用户交互。所以表格是必需的。

标签: laravel laravel-4


【解决方案1】:

没有 Laravel 方法可以做到这一点,但您可以使用 HTML 基本表单数组来使其工作。您需要了解您必须识别表单和字段,以便 Laravel 准确知道数据来自何处以及将其发送回何处。如果你所有的字段都同名,它怎么可能知道?

这是一个概念证明,可直接从您的 routes.php 文件中发挥作用。

正如我所做的一切并在发布答案之前在这里测试过,我使用了Route::get()Route::post(),不必为了测试我不会使用的东西而创建控制器和视图。在开发时,您必须将此逻辑放在控制器和视图中,我认为它们已经在其中。

要按原样进行测试,您只需将浏览器指向以下路线:

http://yourserver/form

当你按下按钮时,它会自动发布路线:

http://yourserver/post

我基本上是给所有表单一个数字,并给按钮一个数字,我们将在 Laravel 中使用来获取表单数据并验证它。

Route::get('form', function() 
{
      return Form::open(array('url' => URL::to('post'))).
             Form::text('form[1][name]', null).
             Form::email('form[1][email]', null).
             '<button type="submit" name="button" value="1">submit</button>'.
           Form::close().

            Form::open(array('url' => URL::to('post'))).
              Form::text('form[2][name]', null).
              Form::email('form[2][email]', null).
              '<button type="submit" name="button" value="2">submit</button>'.
           Form::close();           
});

我们在这里获取数据,选择表单并将其全部传递给验证器:

Route::post('post', function() 
{
    $input = Input::all();

    $rules = [
            'name'   => 'required',
            'email'  => 'required'
    ];

    $validation = Validator::make($input['form'][$input['button']], $rules);

    return Redirect::back()->withInput();
});

这就是您在 Blade 视图中使用它的方式,现在使用 3 个表单而不是 2 个表单,您可以拥有任意数量的表单:

<h1>Create user1</h2>    
    {{ Form::open(array('url' => URL::to('post'))) }}
        {{ Form::text('form[1][name]', null) }}
        {{ Form::email('form[1][email]', null) }}
        <button type="submit" name="button" value="1">submit</button>
    {{ Form::close() }}

</h1>Create user2</h1>    
    {{ Form::open(array('url' => URL::to('post'))) }}
        {{ Form::text('form[2][name]', null) }}
        {{ Form::email('form[2][email]', null) }}
        <button type="submit" name="button" value="2">submit</button>
    {{ Form::close() }}

</h1>Create user3</h1>    
    {{ Form::open(array('url' => URL::to('post'))) }}
        {{ Form::text('form[3][name]', null) }}
        {{ Form::email('form[3][email]', null) }}
        <button type="submit" name="button" value="3">submit</button>
    {{ Form::close() }}

您甚至可以使用循环在刀片中创建 100 个表单:

@for ($i=1; $i <= 100; $i++)
    User {{$i}}
    {{ Form::open(array('url' => URL::to('post'))) }}
        {{ Form::text("form[$i][name]", null) }}
        {{ Form::email("form[$i][email]", null) }}
        <button type="submit" name="button" value="{{$i}}">submit</button>
    {{ Form::close() }}
@endfor

【讨论】:

  • 为什么是Route::get
  • 刚刚编辑以阐明 Route::get() 和 Route::post()。
  • @AntonioCarlosRibeiro,感谢您的精彩回答。我的页面可能有 2 个表单,或者可能有 10 个表单取决于数据库。现在,是否可以使用相同的逻辑。
  • @AntonioCarlosRibeiro 我的意思是,最好将表单生成保留在视图中
  • 这只是为了说明他关于使用数组符号形式元素名称的观点;您不需要将 direct-from-route-closure 代码作为字面解决方案。
【解决方案2】:

在 $request->flash() 中使用旧输入。

https://laravel.com/docs/5.2/requests#old-input

【讨论】:

    猜你喜欢
    • 2016-10-21
    • 2015-11-02
    • 2014-08-17
    • 2019-03-13
    • 2017-04-06
    • 2017-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多