2013-07-03 5 views
0

Laravel 4의 Illuminate \ Html \ FormBuilder 클래스를 조정하여 각 입력에 CSS 클래스를 자동으로 포함시키고 싶습니다. 예를 들어 입력 유형에 해당합니다. < 입력 타입 I 원본을 확장 내 자신의 클래스를 생성 한/>코어 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 클래스에 대한 참조 만 있습니다. 나는 확실하지 않다 방법 또는 그

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']); 
    }); 
} 

람를 분명히 \ 지원에 \ ServiceProvider \ HtmlServiceProvider 클래스,하지만 클래스 하드 코딩 FormBuilder 클래스를 변환 어디 나도으로 속일 수 있는지 궁금하네요 클래스의 내 버전을 어떻게 든로드하고 있습니까? 그렇지 않다면이 기능을 부드럽고 깔끔하게 추가하려면 어떻게해야합니까? 건배.

+2

이러한 유형의 입력을 찾기 위해 CSS 선택기를 쉽게 사용할 수있게되었을 때이 기능을 사용하는 것은 많은 추가 작업처럼 보입니다. 정말 필요한 것일까? –

+0

이 경우, 나는 바보이며 CSS 선택자가 그 일을 할 수 있음을 깨닫지 못했습니다 (18 개월 동안 개발 단계에서 벗어날 때 일어나는 일입니다). 그러나 원리로서 나는 그것이 다른 일을 위해 그것을 할 수 있도록 어떻게 그것이 이루어 졌는지 알고 싶습니다. 건배 – JamShady

+0

프레임 워크의 해당 수준에서는 어떤 방법을 재정의하고 싶지 않습니다. 대신'HTML :: macro()'를 사용하여 자신 만의 메소드를 정의하십시오. 희망이 도움이! –

답변

0

HTML 도우미 클래스를 확장 할 필요가 없습니다. 대신 CSS 선택기를 사용하여 요소를 선택하십시오. 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 :: 기타)은 매크로를 통해 경로를 변경해야하며 코드 재사용을 촉진하지 않습니다. – JamShady

1

도움이 Laravel 확장에 대한 문서에서 새로운 섹션이있다 : http://laravel.com/docs/extending

자신의 방법을 만들기위한, 당신은 HTML::macro()

참조를 사용할 수 있습니다

+0

양식에 대한 해당 페이지에 아무것도 표시되지 않습니다. – iconoclast

+0

@iconoclast 질문은 형식에 관한 것이 아닙니다. –

1

나는 또한 당신과 똑같이하고 싶었고, 코어 클래스를 확장하는 것에 관심이 있었지만, elf (DRY)가 제출 버튼을 원할 때마다 두 번째 (options) 배열 매개 변수에서 동일한 두 클래스를 전달하지 못하게했지만 아무 소용이 없습니다.

대신 위에 제안 된 다른 매크로 매크로를 만들기 위해 마지막으로 선택했지만 여기에 나와있는 다른 사람들을위한 실제 예가 있습니다.

예 :

저장 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

나는'HTML :: ::'을 사용하는 것을 잊지 않고,'Form :: submit (...)'을 계속 사용하는 편이 낫다. 그래서 누군가에게 더 좋은 제안이 있다면 나는 모두 귀를 기울인다. =) – davidnknight

+0

도움이 될 수 있습니다. http://stackoverflow.com/questions/22884764/laravel-extend-form-class – iconoclast