2011-11-18 52 views
7

我正在研究一种具有特定功能块的仪表板迷你网站。使用symfony2我有一个专门的路线/ instagram,可以获得一个html片段,显示我们场地中拍摄的所有图像。对动态JavaScript文件使用Twig

我想每10分钟刷新一次这个块,所以我需要运行下面的javascript,在一个setTimeout函数中,为了清晰起见省略。

jQuery('.gallery').load("/instagram", function() { 
    jQuery('.gallery').cycle({ 
     fx: 'fade' 
    }); 
}); 

此代码是 “@ KunstmaanDashboardBundle /资源/公/ JS/instagram.js” 我通过Assetic用于级联和优化运行。

{% javascripts 
    '@KunstmaanDashboardBundle/Resources/public/js/thirdparty/jquery-1.7.min.js' 
    '@KunstmaanDashboardBundle/Resources/public/js/thirdparty/jquery.cycle.lite.js' 
    '@KunstmaanDashboardBundle/Resources/public/js/*' 
    filter='closure' 
%} 
    <script src="{{ asset_url }}"></script> 
{% endjavascripts %} 

这工作,但我不觉得这是一个最佳的方法,因为我有硬编码在load()函数的路线。为了解决这个问题,我需要移动instagram.js内容树枝模板,并将其更改为:

jQuery('.gallery').load("{{ path('KunstmaanDashboardBundle_instagram') }}", function() { 
    jQuery('.gallery').cycle({ 
     fx: 'fade' 
    }); 
}); 

但这种方式我失去从Assetic的内容收益的最优化和分离。我们的自定义代码最需要这种优化。

所以我的问题是,我怎么能结合Assetic的Javascript(和CSS为此事)与枝条解析器,所以我可以在instagram.js文件把上面的代码,并使其工作:)

回答

8

你目前无法使用Assetic处理Twig模板的输出,因为Assetic静态转储资产以进行生产,而Twig模板在运行时处理。

对于这个问题,您可能可以使用FOSJsRoutingBundle公开路由并处理它的客户端,那么您的JavaScript可以使用Assetic进行处理。

+0

这完美的作品。谢谢! – Roderik

0

我已经找到了解决方案感谢这个帖子How to use YUI compressor in Symfony2 routing/controller

$response = $this->renderView('template.html.twig'); 

    $path = $this->container->getParameter('kernel.root_dir'); 
    $ac = new \Assetic\Asset\StringAsset($response , array(new \Assetic\Filter\Yui\JsCompressorFilter($path . '/Resources/java/yuicompressor-2.4.7.jar'))); 

    $compressJS = $ac->dump(); 
    return new Response($compressJS, 200, array('Content-Type' => 'text/javascript'));