Как отправить JavaScript внизу?(в Symfony 2) - PullRequest
5 голосов
/ 30 июня 2011

Я хочу создать представления, которые могут самостоятельно печатать некоторый HTML-код и в то же время отправлять код javascript внизу, не расширяя макет

Идея состоит в том, что у меня есть макет, затем конкретное представление для текущего URL расширяет этот макет, и внутри этого представления я включаю другие представления, которые могут добавлять код в другие блоки, находящиеся вне области потому что они не наследуют от макета или представления, которое наследует от него). Это возможно?

Предположим, это часть моего макета:

{# ::layout.html.twig #}
.
.
{% block javascripts %}
{% endblock %}
</body>
.
.

и это мое мнение:

{# Company:Bundle:about.html.twig #}
{% extends '::layout.html.twig' %}
.
.
{% include 'Company:buttons:google_button.html.twig' %}
.
.

И это представление, которое я хочу включить, например, кнопку Google +1:

{# Company:buttons:google_button.html.twig #}
<gb></gb> {# or whatever #}

{# somehow send '<script>blabla</script>' to the 'javascripts' block #}

Можно ли сделать что-то подобное с веткой и symfony2?

Ответы [ 3 ]

2 голосов
/ 05 марта 2013

просто хотел реализовать пакет, содержащий код из @Crozin, но на packagist.org я нашел уже готовый пакет:

Пакет управления активами

2 голосов
/ 30 июня 2011

Полагаю, вам нужно написать собственное расширение Twig, которое определит две функции, скажем, add_js и print_js.

Расширение Twig:

namespace Me\MyBundle\Twig\Extension;

class MyExtension extends \Twig_Extension {
    private $js = array();

    /**
     * {@inheritdoc}
     */
    public function getFunctions() {
        return array(
            'put_js' => new \Twig_Function_Method($this, 'putJs', array('is_safe' => array('html'))),
            'print_js' => new \Twig_Function_Method($this, 'printJs', array('is_safe' => array('html')))
        );
    }

    public function putJs($js) {
        $this->js[] = $js;
    }

    public function printJs() {
        return implode(PHP_EOL, $this->js);
    }

    /**
     * Returns the name of the extension.
     *
     * @return string The extension name
     */
    public function getName() {
        return 'my';
    }
}

Зависимостьконфигурация впрыска:

<service id="twig.extension.me.my" class="Me\MyBundle\Twig\Extension\MyExtension" public="false">
    <tag name="twig.extension" />
</service>

Конечное использование:

{# ::layout.html.twig #}

   ...
   {{ print_js() }}
</body>

{# Company:buttons:google_button.html.twig #}

{% put_js('<script>...</script>') %}
1 голос
/ 02 ноября 2011

Я только что реализовал точную проблему, с которой вы столкнулись, используя «Использовать»: http://twig.sensiolabs.org/doc/tags/use.html

Потребуется некоторый рефакторинг, поскольку вам нужно будет удалить блок javascript из основного файла базы и снова включить его в файл ветки javascript. Затем внутри вашего представления вы можете получить доступ к блоку javascript, сначала определив:

{% use 'ExampleBundle::javascript.html.twig' with javascript' %}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...