如何处理在使用刀片模板引擎构建表单时可能未设置的变量


How to tackle variables that may not be set when using blade template engine to build forms

好吧,这是一个很长的标题,但很抱歉,他只能描述它而不会得到错误的答案。

所以,这个场景。。。。

我正在创建一个网站,它在标题中有一个搜索表单,因此在每个页面上都有。为了方便用户,我希望它在使用时保留以前的变量,为了方便起见,我将表单构建到了默认布局中,以避免重新创建它的许多实例。

default.blade.php(这是表单,去掉了不必要的标记)

{{ Form::open(array('url' => '/search')) }}
{{ Form::select('model', Photo::getAvailableModels(true), $model) }}
{{ Form::select('colour', Photo::getAvailableColours(true), $colour) }}
{{ Form::submit('Go') }}
{{ Form::close() }}

$模型&颜色是我在帖子中捕捉到的变量。问题是,在用户没有发帖的任何页面上,我都会收到来自Blade的未设置变量错误,所以我不得不在整个网站的几乎每个路由或控制器中预先设置这些错误,以防止出现错误。

本质上,只要用户在发帖,这个系统就可以正常工作,如果有人使用直接链接访问网站,那基本上是无用的。

显然,我不能将搜索表单设置为以前搜索的结果,但从可用性的角度来看,这将是一种糟糕的做法。

我是不是错过了什么,当然必须有一个简单的解决方案。谢谢你的帮助。

为您高度使用的变量创建一个视图编辑器:

View::composer(['store.index', 'products.*'], function($view)
{
    $model = Input::get('model') ?: 'modelX';
    $colour = Input::get('colour') ?: 'colourY';
    $view->with('model', $model);
    $view->with('colour', $colour);
});

每当有人点击其中一个变量时,Laravel就会自动将这些变量发送到你的视图中。

你可以把它放在你的路由文件、过滤器文件中,或者像我一样,创建一个app/composers.php并通过添加加载

require app_path().'/composers.php';

到您的应用程序/start/global.php。

您可以使用PHP isset():检查变量是否设置

{{ Form::open(array('url' => '/search')) }}
@if (isset($model) && isset($colour))
    {{ Form::select('model', Photo::getAvailableModels(true), $model) }}
    {{ Form::select('colour', Photo::getAvailableColours(true), $colour) }}
@else
    {{ Form::select('model', Photo::getAvailableModels(true)) }}
    {{ Form::select('colour', Photo::getAvailableColours(true)) }}
@endif
{{ Form::submit('Go') }}
{{ Form::close() }}

或者,如果您的表单字段是可选的,并且您需要单独检查:

{{ Form::open(array('url' => '/search')) }}
@if (isset($model))
    {{ Form::select('model', Photo::getAvailableModels(true), $model) }}
@else
    {{ Form::select('model', Photo::getAvailableModels(true)) }}
@endif
@if (isset($colour))
    {{ Form::select('colour', Photo::getAvailableColours(true), $colour) }}
@else
    {{ Form::select('colour', Photo::getAvailableColours(true)) }}
@endif
{{ Form::submit('Go') }}
{{ Form::close() }}