2013-07-03 365 views
0

我想调整Laravel 4中的Illuminate \ Html \ FormBuilder类,以便根据输入类型自动包含每个输入的CSS类。 <输入类型=“无线电”类=“无线电”/>扩展核心Laravel 4组件类?

我已经建立了我自己的类,它扩展了原:现在

namespace Shady; 

class FormBuilder extends Illuminate\Html\FormBuilder { 

    public function input($type, $name, $value = null, $options = array()) { 
     $options['class'] = isset($options['class']) 
       ? implode(' ', array_unique(array_merge(array($type), explode(' ', $options['class'])))) 
       : $type; 

     parent::input($type, $name, $value, $options); 
    } 
} 

,问题是,我怎么Laravel 4使用它?

我已经看过app/config/app.php,并且只有对HTML Fascade类的引用。我不知道如何或在哪里是会转化为照亮的\ Support \的ServiceProvider \ HtmlServiceProvider类,但该类硬编码的FormBuilder类,ALA

protected function registerFormBuilder() 
{ 
    $this->app['form'] = $this->app->share(function($app) 
    { 
     $form = new FormBuilder($app['html'], $app['url'], $app['session']->getToken()); 

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

我不知道我是否可以欺骗成以某种方式加载我的课程版本?或者,如果没有,我还能如何顺利,整洁地添加此功能?干杯。

+2

当你可以很容易地使用CSS选择器来查找这些类型的输入时,它似乎需要很多额外的工作才能使其工作。它真的*是必要的吗? –

+0

在这种情况下,我是一个白痴,并没有意识到CSS选择器可以做到这一点(这是当你离开开发18个月时会发生什么)。但作为一个原则,我想知道它是如何完成的,所以我也可以为其他事情做到这一点。干杯 – JamShady

+0

在框架中的这个级别,我不认为你会想要重写任何方法。相反,使用'HTML :: macro()'来定义你自己的方法。希望这可以帮助! –

回答

0

无需扩展HTML辅助类。相反,使用CSS选择器来选择元素。

至于使自己的方法,你可以使用HTML::macro()

参见:http://laravel.com/api/source-class-Illuminate.Html.HtmlBuilder.html#32

和:http://laravel.com/api/source-class-Illuminate.Html.HtmlBuilder.html#390

+0

我不觉得创建宏是正确的解决方案,因为它不能解决原始问题,并以非常笨拙的方式解决它。我对每个元素(例如Form :: radio,Form :: whatever)的所有调用都必须改变,以便通过宏进行路由,并且不会促进代码重用。 – JamShady

1

有大约延长Laravel的文档一个新的部分,应该帮助:http://laravel.com/docs/extending

+0

我在该页面上没有看到有关窗体的任何内容。 – iconoclast

+0

@iconoclast这个问题并不是关于表单的。 –

1

我也尝试过争取这个问题,因为我想做的和你完全一样,部分出于扩展核心类的兴趣,但也停止重复mys精灵(DRY)在第二个(选项)数组参数中传递相同的两个类时,每次我都需要一个提交按钮,但无济于事。

相反,我最终选择了制作HTML宏,正如其他人所建议的那样,但以下是其他人可能会碰到的一个实际示例。

例子:

保存下面的代码app/macros.php(该文件默认是不存在,因此创建它):

HTML::macro('submit', function($value = null, $options = array()) 
{ 
    $options = array_merge($options, array('class' => 'btn btn-info')); 
    return Form::input('submit', null, $value, $options); 
}); 

现在,您可以通过添加require app_path().'/macros.php';的底部macros.php的app/start/global.php

现在在你的意见,而不是:

Form::submit('Submit', array('class' => 'btn btn-info')); 

用途:

HTML::submit('Submit'); 

而且它会产生相同的提交按钮,允许相同的参数Laravel默认,但会自动添加btnbtn-info类的按钮,而不需要每次重复自己。希望这可以帮助某人。=)

+0

我宁愿继续使用'Form :: submit(...)',而不必记住使用'HTML ::',所以如果任何人有更好的建议,我全都听。 =) – davidnknight

+0

这可能有所帮助:http://stackoverflow.com/questions/22884764/laravel-extend-form-class – iconoclast