Использование Twig для динамических файлов Javascript - PullRequest
7 голосов
/ 18 ноября 2011

Я работаю над своего рода мини-сайтом, в котором есть блоки с определенной функциональностью. Используя symfony2, у меня есть специальный маршрут / инстаграм, который получает HTML-фрагмент, который показывает все снимки, сделанные на нашем месте.

Я хочу обновлять этот блок каждые 10 минут, поэтому мне нужно запустить следующий javascript в функции с setTimeout, опущенной для ясности.

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

Этот код находится в "@ KunstmaanDashboardBundle / Resources / public / 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 в шаблон Twig и изменить его на:

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

Но в этом случае я теряю оптимизацию и преимущества от контента, предоставляемые Assetic. И наш пользовательский код больше всего нуждается в этой оптимизации.

Итак, мой вопрос: как я могу объединить Assetic Javascript (и css в этом отношении) с парсером Twig, чтобы я мог поместить приведенный выше код в файл instagram.js и заставить его работать:)

Ответы [ 2 ]

8 голосов
/ 18 ноября 2011

В настоящее время вы не можете обработать вывод шаблонов Twig с помощью Assetic, поскольку Assetic статически создает дампы ресурсов для производства, тогда как шаблоны Twig обрабатываются во время выполнения.

Для этой проблемы вы можете использовать FOSJsRoutingBundle , чтобы выставить маршрут и обработать его на стороне клиента, тогда ваш JavaScript может быть обработан с помощью Assetic.

0 голосов
/ 11 апреля 2013

Я нашел решение благодаря этому посту Как использовать YUI-компрессор в Symfony2 маршрутизация / контроллер :

    $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'));
...