2013-07-19 2 views
2

내가 이런 기본 템플릿 데 말에 블록을 확장 Symfony2 컨트롤러 렌더링 :나뭇 가지 : 부모 템플릿

// Default/index.html.twig 
{% block javascripts %} 
    <script>//some script</script> 
{% endblock %} 

<div> 
    {{ render(controller(MyControllerBundle:Default:header)) }} 
</div> 
{{ text }} 
<div> 
    {{ render(controller(MyControllerBundle:Default:footer)) }} 
</div> 

을 그리고 이것은 컨트롤러가 이러한 템플릿 가진 렌더링 :

// Default/header.html.twig 
Header content 
{% block javascripts %} 
    <script>//some additional scripts from the header</script> 
{% endblock %} 

// Default/footer.html.twig 
Footer content 
{% block javascripts %} 
    <script>//some additional scripts from the footer</script> 
{% endblock %} 

부모 테의 렌더링 된 하위 컨트롤러에서 javascripts 블록을 사용할 수 있습니까? 밥 접시? 한 곳에서 모든 자바 스크립트를 누적하고 싶습니다.

템플릿이 다른 컨트롤러로 렌더링되는 블록으로 이루어져 있기 때문에 아래에서 위로 확장하여 렌더링하는 것은 옵션이 아닙니다.

어떻게 든 가능합니까? 아니면 이것에 대한 더 나은 접근법이 있습니까?

+0

은 당신이 정말로 그들을 렌더링하기 위해 컨트롤러를 필요합니까 : 나중에 선 아래로 assetic 재 작성의를 사용할 수있는 방법 -

또한,에 한 곳에서 스크립트를 유지 최고의 수 있습니다? –

+0

포함 된 템플릿에는 비즈니스 로직이 있고, 기본 템플릿을 확장 할 수 없다고 생각하기 때문에 최상의 접근 방식이라고 생각합니다. 다른 아이디어가 있습니까? – acme

답변

0

정확히 @Pazi가 의견에서 말한 것 : 컨트롤러가 필요합니까? 컨트롤러를 사용하지 않고 템플릿 만 포함하면 매우 간단 해 보입니다.

include 태그를 사용하여 하위 템플릿을 포함 할 수 있습니다.

{% include 'MyControllerBundle:Default:header.html.twig' %} 

렌더링 된 하위 컨트롤러에서 javascript 블록을 재사용하려면 javascripts 블록을 포함하는 기본 템플릿을 만들 수 있습니다. 그런 다음 머리말과 꼬리말에 기본 템플릿 파일을 확장합니다. 또는 기본 템플릿을 포함시키는 것만으로도 효과가 있습니다.

+0

컨트롤러에는 부모 템플릿에서 사용할 수없는 비즈니스 로직이 있으므로 여기에 컨트롤러를 사용하는 것 외에 다른 방법은 없다고 생각합니다. – acme

+0

아 ...이 경우 단순히 머리글 및 바닥 글 템플릿을 포함하는 것은 옵션이 아닙니다. 그러나 나머지 대답은 여전히 ​​도움이 될 수 있습니까? 그게 너를 위해 일 했니? – UrGuardian4ngel

2

디자인면에서는 모든 것이 가능하지만 좋은 생각은 아닙니다.

render 태그는 크기 조정에 유용하며 요청을 분리하는 데 사용됩니다. 각 render 호출은 하위 요청으로 간주되며 캐시 전략을 적용 할 수 있습니다. 나는 이것을 documentation about HTTP caching과 특히 Edge Side Includes (or ESI)에 대해 이야기하는 부분을 읽는 것이 좋습니다.

render 태그를 사용할 때는 여러 페이지에 포함시키고 결국 캐시하려는 모듈로 생각하십시오.

캐싱을 위해 하위 요청이 분리되어 있기 때문에 마스터 요청과 상호 작용하면 안됩니다. 렌더 태그를 포함하는 위치에 따라 마스터 요청이 달라져 예기치 않은 결과가 발생할 수 있습니다.

우선, 모든 다른 페이지 extends의 레이아웃 템플릿을 만듭니다. 레이아웃 템플릿은 모든 기본 블록 (javascript, css, footer, header, <head>, <body>)을 선언합니다. 원하는 경우 더 많은 템플릿에서 추상화 할 수 있습니다.

꼬리말이나 헤더의 로직을 Twig 함수 (또는 필터)로 분할하고 Twig에서 로직을 처리하지만 (너무 복잡하거나 다른 방법이 있다는 것을 의미하는 너무 스파게티 인 경우) 빛을 유지하십시오.

페이지 당 여러 개의 Javascript 또는 CSS 파일을 사용하지 마십시오.일부 페이지에 나타나는 CSS 나 자바 스크립트가 있지만 전부는 아니더라도 파일을 하나의 파일로 병합하는 것이 좋습니다 (클라이언트 측 DNS 호출이 적어 캐시 된 후 페이지를로드하는 것이 더 빠름) . 파일 종류가 administrator.js 인 경우이를 별도의 파일로 포함 할 수 있지만 대부분의 요청은 관리자가 제공하는 경우 다른 모든 파일과 함께 포함 할 수 있습니다.

애셋 (js 또는 css)을 하나의 파일로 결합 할 수 있는지 잘 모르는 경우 Symfony documentation에 자세한 정보가 표시됩니다.

나는 그런 시스템을 구현하지 말 것을 강력히 권고하기 때문에 귀하의 "어떻게"질문에 대답하지 않았지만 정보에 입각 한 결정을 내리기 위해 좋은 지침을 공유하고 있다고 생각합니다.

+0

토마스, 렌더링 기능의 배경을 설명해 주셔서 대단히 감사드립니다. 다른 접근법이 더 좋을 것입니다. 문제는 PHP를 템플릿 엔진으로 사용하여 기존의 Twig로 변환하려는 기존 코드가 있다는 것입니다. 오래된 PHP 템플릿은 기본적으로 나뭇 가지 렌더링 메서드와 동일한 기능을하는 사용자 지정 함수를 사용합니다. – acme

1

확장 할 때/나뭇 가지에 다른 콘텐츠를 렌더링하면 부모 블록 호출 할 수 있습니다 : http://twig.sensiolabs.org/doc/functions/parent.html

이 그것을하고 머리글/바닥 글 내부

{% block javascripts %} 
    {{ parent() }} 
    {# other scripts #} 
{% endblock javascripts %} 

내가 제안 정의 된대로 기본을 떠날 수 있다는 뜻을 꼬리말의 다른 블록 이름을 가지고 있기 때문에 헤더 외부에 스크립트를 포함 할 수 있습니다. http://symfony.com/doc/current/cookbook/assetic/asset_management.html#including-javascript-files

관련 문제