2014-05-06 115 views
4

阅读symfony documentation about templating我发现提到关于能够输出CSS文件的树枝。创建CSS使用树枝

这是怎么用的?是否有可能生成动态CSS的方式,我生成的HTML?

例如,当我想要显示一些html模板时,我创建控制器动作,并在其中呈现.html.twig文件,可能会传递一些参数。

我可以渲染.css.twig的方式吗?这个文件存储在哪里,我怎么可能将它包含到另一个html模板。

我想将所有样式保存在单独的文件中,但其中一些样式在某些条件下会更改。例如,现在我根据控制器中的计算设置一些div的高度,并将结果高度作为参数传递给模板。但我不觉得这是非常MVC,在控制器(甚至模型)中有表示逻辑的一部分。

+0

对我来说,改变HTML类等或模板而不是改变(假设内联)CSS(事实上,这不是Twig的目的)可能更有意义。但是,当然,您可以在另一个模板中包含模板,它位于您链接到的文档中。你这样做了什么问题? –

回答

7

当然有可能。你会做大部分事情完全一样,如果你会做的HTML模板。

  1. 创建文件,如:

    /* src/Acme/MyBundle/Resources/views/somefile.css.twig */ 
    
    .someclasss { 
        background-color: {{ backgroundColor }}; 
    } 
    
  2. 创建控制器动作

    // src/Acme/MyBundle/Controller/MyStyleController.php 
    
    // ... 
    public function styleAction() 
    { 
        // Fetch it from service or whatever strategy you have 
        $backgroundColor = '#ff0000'; 
    
        return $this->render(
         'AcmeMyBundle::somefile.css.twig', 
         ['backgroundColor' => $backgroundColor], 
         ['Content-Type' => 'text/css'] 
        ); 
    } 
    
    // ... 
    
  3. 该动作

    # src/Acme/MyBundle/Resources/config/routing.yml 
    
        css_route: 
         path: /some/path 
         defaults: { _controller AcmeMyBundle:MyStyleController:style } 
         methods: [GET] 
    
  4. ,使用T创建路线在布局

    {# src/AcmeMyBundle/Resources/views/mypage.html.twig #} 
    
        {# ... #} 
        <link href="{{ path('css_route') }}" rel="stylesheet"> 
        {# ... #} 
    

帽子CSS现在,无论这是不是一个好主意,应该是一个单独的问题。当然有些情况下这种方法是完全有效的,但有些情况下可以避免这种情况。请记住,像这样提供CSS文件比提供静态CSS文件要贵很多。此外,由于它是一个CSS文件,并且位于响应的HEAD部分,所以它会减慢页面加载时间,因为它必须在渲染正文本身之前获取CSS文件。

如果你决定这样做,一定要检查缓存的可能性,你必须尽快做到这一点。

+0

非常好。此外,他还可以返回'css.twig'的呈现视图,而不是'return new Response'。 – Javad

3

其实

public function styleAction() 
{ 
    // Fetch it from service or whatever strategy you have 
    $backgroundColor = '#ff0000'; 

    return $this->render(
     'AcmeMyBundle::somefile.css.twig', 
     ['backgroundColor' => $backgroundColor], 
     ['Content-Type' => 'text/css'] 
    ); 
} 

应该更喜欢这个

/** 
    * @Route("/css/style", name="style") 
    * @param Request $request 
    * @return Response 
    */ 
    public function styleAction(Request $request) 
    { 
     $firstColor = 'rgba(130, 30, 30, 0.9)'; 

     /** @var Response $response */ 
     $response = $this->render(':css:style.css.twig', [ 
      'firstColor' => $firstColor, 
     ]); 

     $response->headers->set('Content-Type', 'text/css'); 

     return $response; 
    } 

请注意,我有注解,因为我使用的Symfony 3.但我的代码示例中最重要的事情是,为响应我设置Content-Type转换为“text/css”。