验证失败后,Laravel 4 将输入重定向回页面
Posted
技术标签:
【中文标题】验证失败后,Laravel 4 将输入重定向回页面【英文标题】:Laravel 4 redirecting inputs back to page after validation fail 【发布时间】:2014-03-09 00:33:12 【问题描述】:我有 4 个字段将由用户动态创建。
<div class="controls" id="exchange-fields">
<p>
<div id='exchange_div'>
<div class="input-append" id='currency_div1'>
Form::select('currency_id[]', $currencies, null, array('name'=>'currency_id', 'id'=>'currency_id', 'value'=>'Input::old("currency_id")[0]' ))
</div>
<div class="input-prepend" id='actual_div1'>
<span class="add-on">Actual</span>
Form::text('exchange_rate[]', null, array('class'=>'input-medium rate', 'maxlength'=>10, 'id'=>'exchange_rate', 'value'=>'Input::old("exchange_rate")[0]' ))
</div>
<div class="input-append" id='markup_div1'>
Form::text('exchange_rate_markup[]', null, array('class'=>'input-mini yellow rate', 'maxlength'=>4, 'id'=>'exchange_rate_markup', 'value'=>'Input::old("exchange_rate_markup")[0]' )) <span class="add-on">%</span>
</div>
<div class="input-prepend" id='rate_div1'>
<span class="add-on">Marked-up</span>
Form::text('after_markup_rate[]', null, array('class'=>'input-medium yellow', 'maxlength'=>10, 'id'=>'after_markup_rate', 'value'=>'Input::old("after_markup_rate")[0]' ))
</div>
</div>
</div>
<div class="controls">
<input class="btn btn-primary" type="button" id="addScnt" value="Add">
</div>
我使用 javascript 动态填充这些字段。
var scntDiv = $('#exchange-fields');
var i = $('#exchange-fields p').size() + 1;
$('#addScnt').click(function()
$(scntDiv).append('<p>');
$("#exchange_div").clone().attr("id",'exchange_div_'+ i).appendTo(scntDiv);
//Append the remove button
$($('#exchange_div_'+ i)).append('<input class="btn btn-primary" name="remove" type="button" id="remScnt" value="Remove">');
i++;
);
在我将这些值发布到我的控制器并且验证失败之前,这一切正常。 如何使用在我的视图文件中动态填充的旧输入重新填充这些字段?
我使用 return Redirect::back()->withInput()->withErrors($e->getErrors());验证后重定向无法重新填充这些字段。但是因为这 4 个字段只接受字符串值并且返回的输入在数组中,所以在验证失败后我无法重新填充这 4 个字段。
有什么好的方法可以解决这个问题?
提前致谢。
【问题讨论】:
你试过用Input::old("exchange_rate_markup.0")
代替Input::old("exchange_rate_markup")[0]
吗?
效果不佳
【参考方案1】:
不要在 html 中设置输入字段的值。当验证失败时,Laravel 会自动执行此操作。
Form::text
中的第二个参数是值。将此设置为 null 将允许 Laravel 自动填充它。
【讨论】:
亲爱的布拉德利,我想你误解了我的问题。这适用于在 html 上静态创建字段时。我现在的 qns 用于那些动态创建的字段(由 Javascript 创建),当验证失败时如何自动填充回来。无论如何,我已经解决了这个问题。谢谢 啊,我明白了,抱歉误会了。 @Eain 很想知道你是如何解决这个问题的,我正在为同样的问题寻找解决方案【参考方案2】:@a7omiton 而不是返回所有输入。我使用 Input::except(array) 返回其余不是数组的字段。
在重定向回来时,我使用了一个额外的 with() 来返回字段数组,例如最初加载页面时呈现视图的方式。
// If validation fails, ignore those exchange rate fields
//because they are in array not string
$input = Input::except([
'currency_id',
'exchange_rate',
'exchange_rate_markup',
'after_markup_rate'
]);
// return normally as separate array and it will store in session
return Redirect::back()
->withInput($input)
->withErrors($e->getErrors())
->with('exchange_rate', Input::get('exchange_rate'))
->with('currency_id', Input::get('currency_id'))
->with('exchange_rate_markup', Input::get('exchange_rate_markup'))
->with('after_markup_rate', Input::get('after_markup_rate'));
【讨论】:
如何在我刚刚重定向回的视图中访问exchange_rate
?【参考方案3】:
laravel 将自动填充表单字段。 只需将第二个参数与 Input::old('column_name') 放在一起。
Form::text('name', Input::old('name'), array('class' => 'span4','placeholder' => 'name'))
【讨论】:
【参考方案4】:虽然这是一篇旧帖子,但这将帮助一些人在这里寻找解决方案。
您可以通过在您的 laravel 视图中添加此代码,在重定向后获取视图中的所有输入变量,
print_r(app('request')->old());
您可以将此值分配给您的 javascript 变量,并动态填充字段。
【讨论】:
以上是关于验证失败后,Laravel 4 将输入重定向回页面的主要内容,如果未能解决你的问题,请参考以下文章