2014-09-29 59 views
2

除非指定'autocomplete'=>'on',否则我希望默认情况下,我的laravel应用程序中的所有表单都具有'autocomplete'=>'off'..为Laravel应用程序中的所有表单设置全局选项

由于我的应用程序有很多形式,laravel就是这样一个真棒框架,我想知道如果我可以设置窗体类的全局选项始终自动完成关闭,除非我指定相反。

有人知道吗?

回答

2

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

首先,创建一个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']); 
     }); 
    } 
} 

最后,你需要与你的新的服务提供商,以取代'Illuminate\Html\HtmlServiceProvider',app/config/app.php。我已经在本地测试Laravel 4.2上进行了测试,无需修改任何内容即可调用Form::open

+0

不错!我希望有一个较少hackish的解决方案,但仍然真棒:) – raphadko 2014-09-29 21:23:33

+0

我不明白这是如何hackish。您正在扩展内置类并创建自定义服务提供者。这有什么蹊跷? – 2015-11-04 19:32:34

1

我感觉很懒,所以我只是将$attributes['autocomplete'] = 'off';行添加到文件FormBuilder.php。我在open函数的#108行中添加了它。

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

相关问题