2013-07-03 244 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