繁体   English   中英

为Laravel应用程序中的所有表单设置全局选项

[英]Setting a global option for all forms in a Laravel application

我希望laravel应用程序中的所有表单默认情况下都具有'autocomplete'=>'off',除非我指定'autocomplete'=>'on'。

由于我的应用程序具有多种形式,而laravel是一个如此出色的框架,我想知道是否可以将表单类的全局选项设置为始终自动完成,除非我指定相反的方式。

有人知道吗?

是的,这是可能的。 基本思想是您需要扩展两个类:内置的Illuminate\\Html\\FormBuilderIlluminate\\Html\\HtmlServiceProvider类,并用您创建的类替换app/config/app.phpHtmlServiceProvider

首先,创建一个MyForm类,该类将覆盖FormBuilder所需的功能:

use Illuminate\Html\FormBuilder;

class MyForm extends FormBuilder
{
    /**
     * Open up a new HTML form.
     *
     * @param  array   $options
     * @return string
     */
    public function open(array $options = array())
    {
        // If you haven't specified an autocomplete option, default it to 'off'
        if(!isset($options['autocomplete'])) {
            $options['autocomplete'] = 'off';
        }

        return parent::open($options);
    }
}

接下来,您将需要创建一个从Illuminate\\Html\\HtmlServiceProvider扩展的服务提供者,并覆盖registerFormBuilder方法:

use Illuminate\Html\HtmlServiceProvider;
use MyForm;

class FormServiceProvider extends HtmlServiceProvider
{
    public function registerFormBuilder()
    {
        $app = $this->app;
        // Taken From: Illuminate\Html\HtmlServiceProvider
        $app->bindShared('form', function($app) {
            // Replace FormBuilder with MyForm
            $form = new MyForm($app['html'], $app['url'], $app['session.store']->getToken());

            return $form->setSessionStore($app['session.store']);
        });
    }
}

最后,您需要用新的服务提供商替换app/config/app.php 'Illuminate\\Html\\HtmlServiceProvider', 我已经在本地测试Laravel 4.2安装上对此进行了测试,并且无需修改Form::open调用中的任何内容即可工作

我感到很懒,所以我只添加了$attributes['autocomplete'] = 'off'; 到文件FormBuilder.php 我在打开功能的#108行中添加了它。

这是hacky解决方案的一个很好的例子。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM