2016-10-09 8 views
0

단일 컨트롤러 동작으로 렌더링되는 단일 Twig 파일에서만 사용되는 CSS 규칙과 JavaScript 함수가 있습니다. 나는이 같은 사람들 CSS 규칙과 자바 스크립트 기능을 위해 별도의 파일을 사용하고 구조화 :symfony 3에서 자동으로 액션 전용 JS/CSS를 포함합니다.

Bundle File Structure

나는 front.html.twigrequest.html.twig 렌더링의 frontActionrequestAction이 포함이 번들에 하나의 컨트롤러 Jd34TestController 있습니다. Twig 파일에는 두 개의 일반적인 Twig 파일 인 app/Resources/views/base.html.twig이 있습니다. 나는 Jd34Test/front.html.twig이 렌더링 될 때 Jd34Test/front.jsJd34Test/front.css을 자동으로 (마술처럼) 포함하고 요청 동작과 다른 동작을 위해 동일한 방법을 찾고 있습니다. 이 css/js 파일 중 하나라도 존재하지 않는다면 예외를 포함 시키거나 예외를 발생시키지 않아야합니다.

이 작업을 자동화하는 가장 좋은 방법은 무엇입니까? 내가 Twig_Extension 함수와 매크로를 사용해 보았지만, $this->requestStack->getCurrentRequest()->get('_controller')의 반환 값을 기반으로 css/js 경로를 추측하는 것은 너무 위험합니다.

답변

0

거대한 웹 앱에서 작동하며 기본적으로 JS와 CSS 파일을 필요로하는 나뭇 가지 파일에만 포함시키는 것과 동일한 구조를 사용합니다. 때로는 특정 JS 플러그인이 특정 페이지에서만 필요하고 다른 페이지에서는 필요하지 않은 경우가 있습니다. 이러한 플러그인을 필요로하는 페이지에만 삽입하는 것이 좋습니다. 이것이 내가하는 일입니다.

크기와 기능 및 페이지 측면에서 앱은 다음과 같습니다. 하나의 base.html.twig 파일과 base.html.twig 파일을 확장하는 여러 개의 layout.html.twig 파일을 가질 수 있습니다. 이렇게하면 base.html.twig에는 모든 layout.html.twig 파일에 필요한 CSS 및 js 파일 만 있습니다. 그런 다음 각 layout.html.twig 파일에는 확장 할 모든 파일에 필요한 JS 및 CSS 파일이 포함됩니다. 특정 layout.html.twig 파일을 확장하는 세 개의 페이지가 있다고 가정하면, 모두 layout.html.twig 파일의 JS 및 CSS를 가지며 각 페이지는 추가 JS 및 CSS를 추가 할 수 있습니다.

base.html.twig는 다음과 같이 보일 것입니다 : 여기

내가 그것을 어떻게

<!DOCTYPE html> 
<!--[if IE 8]> <html lang="en" class="ie8 no-js"> <![endif]--> 
<!--[if IE 9]> <html lang="en" class="ie9 no-js"> <![endif]--> 
<!--[if !IE]><!--> 
<html lang="en" class="no-js"> 
<!--<![endif]--> 
<!-- BEGIN HEAD --> 
<head> 
    <meta charset="utf-8"> 
    {% block mainPageTitle %} 
     <title>Snappic | Photobooth Software</title> 
    {% endblock %} 
    <meta http-equiv="X-UA-Compatible" content="IE=edge"> 
    <meta content="width=device-width, initial-scale=1" name="viewport"> 
    <meta content="" name="description"> 
    <meta content="" name="author"> 

    <!-- BEGIN GLOBAL MANDATORY STYLES --> 
    {% stylesheets 
    "bundles/snappicadmin/css/layout/components-md.css" 
    "bundles/snappicadmin/plugins/bootstrap/css/bootstrap.css" 
    "bundles/snappicadmin/plugins/web-icons/web-icons.min.css" 
    "bundles/snappicadmin/css/layout/layout.css"%} 

    <link rel="stylesheet" href="{{ asset_url }}" /> 

    {% endstylesheets %} 

    <!-- END GLOBAL MANDATORY STYLES --> 

    <!-- BEGIN PAGE SPECIFIC STYLES --> 

    {% block pageCSS %} 
    {% endblock %} 

    <!-- END PAGE STYLES --> 


    <link rel="icon" href="{{ asset('bundles/snappicadmin/images/icon/plain_logo-32x32.png') }}" sizes="32x32" /> 

</head> 
<!-- END HEAD --> 
<!-- BEGIN BODY --> 

<body class="page-md"> 

    <!-- GENERAL LAYOUT CONTENT HERE e.g Main menu --> 


    {% block content %} 
    {% endblock %} 

<!-- BEGIN JAVASCRIPTS --> 
<!-- BEGIN CORE PLUGINS --> 
<!--[if lt IE 9]> 
{% javascripts 
"@SnappicAdminBundle/Resources/public/plugins/respond.min.js" 
"@SnappicAdminBundle/Resources/public/plugins/excanvas.min.js"%} 
<script src="{{ asset_url }}"></script> 
{% endjavascripts %} 
<![endif]--> 

{% javascripts 
"@SnappicAdminBundle/Resources/public/plugins/fullcalendar/lib/moment.min.js" 
"@SnappicAdminBundle/Resources/public/plugins/jquery.browser.min.js" 
"@SnappicAdminBundle/Resources/public/js/utilities/utilities.js" 
"@SnappicAdminBundle/Resources/public/plugins/jquery.min.js"%} 

<script src="{{ asset_url }}"></script> 

{% endjavascripts %} 


{% block pagescript %} 
{% endblock %} 


<script> 

    jQuery(document).ready(function() { 
     App.init(); 
     Layout.init(); 

     initSlideOut(); 
    }); 
</script> 
<!-- END JAVASCRIPT --> 
</body> 
<!-- END BODY --> 
</html> 

을 주목 {% block pageCSS %}, 페이지 특정 CSS 가서 JS에 대한 같은 곳이있다 {% block pagescript %}. 여기

같이 base.html.twig를 확장 페이지가 어떻게 보일지이다 : 여기서 핵심은 사용하는 것입니다

{% extends "@SnappicAdmin/Layout/base.html.twig" %} 

{% block mainPageTitle %}<title>Snappic - Dashboard</title>{% endblock %} 

{% block pageCSS %} 
    {% stylesheets 
    "bundles/snappicadmin/css/layout/plugins.min.css" 
    "@SnappicAdminBundle/Resources/public/css/dashboard/dashboard.css"%} 

    <link rel="stylesheet" href="{{ asset_url }}" /> 

    {% endstylesheets %} 
{% endblock %} 

{% block content %} 
    <!-- BEGIN PAGE CONTENT INNER --> 
     This is where your page content goes 
    <!-- END PAGE CONTENT INNER --> 
{% endblock %} 

{% block pagescript %} 
    {% javascripts 
    "bundles/snappicadmin/plugins/fullcalendar/lib/moment.min.js" 
    "@SnappicAdminBundle/Resources/public/js/dashboard/dashboard.js" 
    %} 

    <script src="{{ asset_url }}"></script> 

    {% endjavascripts %} 

{% endblock %} 

[템플릿 상속 (나뭇 가지 상속)] [1] 정의 블록에 의해. 더 나은 렌더링은 말할 것도없고 코드를 훨씬 더 쉽게 관리 할 수 ​​있습니다.

나는 이것이 컨트롤러를 통해 파일을 주입하는 것보다 훨씬 쉽고 깨끗하다고 ​​믿습니다.

추신. 너무 많은 파일을 포함하는 것에 대해 유감스럽게 생각합니다. 가능한 한 명확하게하고 싶었습니다. 명확하지 않은 것이 있으면 큰 소리로 말하십시오.

행복한 깨끗한 코딩!