Twig: URL-адрес закодирован дважды при передаче его на кнопку «Поделиться в Твиттере»

Я разрабатываю простую страницу с Symfony2, используя Twig в качестве механизма шаблонов.

У меня есть список URL-адресов, и я хотел бы добавить кнопку «Поделиться в Твиттере» для каждого URL-адреса. Что я делаю, так это простой цикл в массиве URL-адресов, и динамически устанавливаю URL-адрес для каждой кнопки Twitter внутри цикла. Похоже, что эта ветка сначала кодирует URL-адрес, а скрипт Twitter кодирует его снова. Таким образом, количество репостов в Твиттере не совпадает. Код (внутри цикла) следующий, в конце страницы есть еще часть кода Twitter:

<a href="https://twitter.com/share" class="twitter-share-button" data-url="{{ s.url }}">Tweet</a>

URL-адрес, который я получаю на отображаемой странице: http%253A%252F%252Fwww.example.com%252F (два прохода кодирования) вместо http%3A%2F%2Fwww.example.com%2F (один проход кодирования, правильно). Похоже, что % снова закодировано в %25.

И это не заставляет Twitter работать, потому что он считает эти два URL-адреса разными.

Я также пытался использовать некоторые фильтры, например. {{ s.url|raw }}, но это не сработало.

Итак, мой вопрос: как этого избежать? Есть ли способ сказать ветке (или твиттеру), чтобы не кодировать URL-адрес?


person Lorenzo Marcon    schedule 25.04.2012    source источник
comment
Какова ценность s.url до обработки Twig? (var_dump из контроллера)   -  person AlterPHP    schedule 02.05.2012
comment
var_dumping из контроллера, это http%3A%2F%2Fwww.example.com%2F   -  person Lorenzo Marcon    schedule 02.05.2012
comment
Я не знаком с Twitter API, но возможно, вы включите JS-файл из Twitter на свои страницы. Может быть, этот скрипт анализирует исходный код и применяет urlencode к каждой кнопке a.twitter-share... Пробовали ли вы передать необработанный URL-адрес из контроллера в Twig без первого прохода?   -  person AlterPHP    schedule 02.05.2012


Ответы (2)


Вы всегда можете отключить автоматическое экранирование в Twig, используя объявление {% autoescape false %} перед кодом, который вы хотите оставить необработанным. Это оставит любые выведенные вами строки неэкранированными, и, таким образом, ваш URL-адрес не будет экранирован дважды. Убедитесь, что вы снова включили автоматическое экранирование с помощью {% endautoescape %}

{% autoescape false %}
    <a href="https://twitter.com/share" class="twitter-share-button" data-url="{{ s.url }}">Tweet</a>
{% endautoescape %}

Полная документация по экранированию Twig HTML

person Patrick    schedule 07.05.2012

Старый пост, но похоже, что теперь вы можете использовать «сырой» фильтр. Это должно сделать:

{{ s.url|raw }}

http://twig.sensiolabs.org/doc/api.html#escaper-extension

person joe    schedule 12.05.2014