【问题标题】:Laravel 4 Form Model Binding with Dynamic Form Not Properly Filling InLaravel 4 表单模型绑定与动态表单未正确填写
【发布时间】:2014-04-29 03:11:08
【问题描述】:

我无法正确加载动态表单。我有一个表单,用户可以单击一个按钮并将输入字段添加到他们的心脏内容中。我已经能够对信息进行 json_encode 和存储,但是当我尝试编辑表单时,Laravel 只会创建并填写默认输入,而忽略用户创建的输入字段和数据。如何获取 Laravel 的表单模型绑定以显示附加字段和信息?还是我只是错误地形成了模型绑定?用户可以按下“Add Another Fence”,表单的另一个副本将添加到底部。因此,在这种情况下(我没有包括整个表单,因为它很长),他们可以按下“添加另一个栅栏”按钮,然后另一个输入为“gateNumber”类,新创建的 id 为“gateNumber_2”会出现在底部。如果有人知道如何获取动态数据以绑定和显示或指出我哪里出错了,我们将不胜感激!非常感谢!

这是我的编辑路线:

/*Edit Orders (GET)*/
Route::get('orders/{orders}/edit', array(
    'as'    => 'order-edit',
    'uses'  => 'OrderController@getEdit'
));
/*Edit Order (POST)*/
    Route::post('/orders/{orders}/edit', array(
    'as'    => 'order-edit-post',
        'uses'  => 'OrderController@postEdit',
    ));

查看(或者至少一个sn-p,表格很长):

@extends('layout.main')
@section('content')
{{ Form::model($order, array('route'=>array('order-edit-post', $order->id), 'name', '=', 'orderForm', 'id', '=', 'orderForm')) }}
 <fieldset id="customerInfo">
     {{ Form::label('order_name', 'Order Name:')}}
     {{ Form::text('order_name') }}
        @if($errors->has('order_name'))
    {{ $errors->first('order_name') }}
    @endif
<legend><strong>Gate Information</strong></legend>
    {{ Form::select('gateNumber_1',
        array(
            'select'    => 'Gates Needed',
            '0'         => '0',
            '1'         => '1',
            '2'         => '2',
            '3'         => '3',
    ), null,
    array('class'       => 'gateNumber')) }}
<div>
    <input type="button" id="btnAddFence" value="Add Another Fence" />
    <input type="button" id="btnDelFence" value="Remove Fence" />
</div>  

和订单控制器:

public function getEdit($id){
        $order = Order::where('id', '=', $id);

        if($order->count()) {
            $order = $order->first();
            $order->order_serialized = json_decode($order->order_serialized);

            foreach($order->order_serialized as $key => $value){
                $order->$key = $value;
            }
            return View::make('orders.edit')
                    ->with('order', $order);
        }   else {
            return App::abort(404);
        }
    }

    public function postEdit($id){
        $validator = Validator::make(Input::all(),
            array(
                'order_name'            =>'required',
                'phone'                 =>'required|min:10|numeric',
                'email'                 =>'required',
                'st_address'            =>'required',
                'post_date'             =>'required',
            )           
        );

        if($validator->fails()){
            return Redirect::route('order-edit', $id)
                    ->withErrors($validator)
                    ->withInput()
                    ->with('global', 'You done messed up.');
        }   else {
            /*Edit Order*/
            $order                      = Order::find($id);

            $order->order_name          = Input::get('order_name');
            $order->phone               = Input::get('phone');
            $order->email               = Input::get('email');
            $order->st_address          = Input::get('st_address');
            $order->post_date           = Input::get('post_date');
            $order->order_serialized    = json_encode(Input::except('_token', 'submit'));

            if($order->save()){
                return Redirect::route('home')
                        ->with('global', 'Your order has been edited.');
            }
        }

        return Redirect::route('home')
                ->with('global', 'Your order could not be edited.');

    }

【问题讨论】:

  • 您的 gateNumber_2 是通过 javascript 添加的,还是您发出新请求来创建它们?相关部分,您的新选择的创建缺失...
  • 它是由 Javascript 创建的,我知道它可以工作,所以我认为这与弄清楚如何让 Laravel 完全绑定表单无关,但我会提出来。
  • 该死,它不会让我编辑问题,但这里是代码:`$(document).ready(function(){ $('#btnAddFence').click(function () { var num = $('.inputFence').length; var newElem = $('.inputFence:last').clone(); $('.inputFence:last').after(newElem); $( '#btnDelFence').removeAttr('disabled'); var parts = $('.fenceHeight:last').attr('name').split(""); $('.fenceHeight:last' ).attr('name',parts.join(""));parts = $('.footage:last').attr('name').split("");parts [1]++; $('.footage:last').attr('name', parts.join("")); var newElem = $('.inputFence:last').clone( );
  • 我通过每个输入的 $('.footage:last').attr... 行重复部分 = ...。简而言之,它为每个输入按类抓取每个输入,在“_”处划分 id,在 id 末尾的数字上加一,重新连接两部分,将它们添加到底部新创建的 div 中。

标签: php mysql forms laravel-4 model-binding


【解决方案1】:

Laravel 在您使用时将数据绑定到您的表单:

{{ Form::model($order, ...) }}

{{ Form::text('order_name') }}

但是在您的 javascript 中,您并没有使用后者来创建这些新字段。

无论如何,这是您无法通过 Javascript 完成的事情,您必须在 PHP (Laravel) 中执行它。但是您可以通过 ajax 从您的数据库中收集这些信息。

【讨论】:

  • 太棒了,感谢您为我指明了正确的方向,非常感谢!
猜你喜欢
  • 2016-02-23
  • 2013-07-13
  • 2014-12-02
  • 2013-05-28
  • 1970-01-01
  • 2015-02-05
  • 1970-01-01
  • 1970-01-01
  • 2013-11-02
相关资源
最近更新 更多