Подскажите: как использовать replace в Twig?

Главные вкладки

Аватар пользователя VasyOK VasyOK 1 сентября 2022 в 13:49

Подскажите, как заменить переменную в twig шаблоне.

Допустим мне нужно в переменной заменить подчерки на дефисы. Этот код работает:
<div class="{{style_name|replace( { '_' : '-' } ) }}">

Теперь мне нужно заменить
/files/styles/style_name/public/images/2022/08/image.jpg
на
/files/images/2022/08/image.jpg

Пробую так:

{% set replaces = {
    '{style_name}'  : '',
    '/styles/'   : '',
    '/public': '',
} %}

{% set url_orig = url|replace( replaces ) %}

Получается
/filesstyle_name/images/2022/08/image.jpg

Т.е. переменную папки стиля не заменяет Sad

Лучший ответ

Аватар пользователя madt madt 1 сентября 2022 в 17:50
2

Если название стиля в переменной, то может так:

{% set style_name = "style_1" %}
{% set url = "/files/styles/style_1/public/images/2022/08/image.jpg" %}
{% set replaces = {
    '/styles/'   : '',
    '/public': '',
} %}
{% set replaces = replaces|merge({(style_name): ''}) %}

{{ url }}

{% set url_orig = url|replace( replaces ) %}

{{ url_orig }}

https://twigfiddle.com/lh8a08

Или так:

{% set style_name = "style_1" %}
{% set url = "/files/styles/style_1/public/images/2022/08/image.jpg" %}
{% set replaces = {
    (style_name): '',
    '/styles/': '',
    '/public': '',
} %}

{{ url }}

{% set url_orig = url|replace( replaces ) %}

{{ url_orig }}

https://twigfiddle.com/ab2pd1

Комментарии

Аватар пользователя VasyOK VasyOK 1 сентября 2022 в 15:17

Не получиться просто. Потом скажу почему.
Вопрос по использованию переменных в операторе replace. В принципе я могу конструкции типа '/styles/large', '/styles/small' использовать. Но хочу через переменную.

Аватар пользователя marassa marassa 1 сентября 2022 в 17:31

Насколько я понял style_name - это не литерал, а имя переменной, которая определена где-то снаружи/ранее. С литералами все работает, и даже слеши искейпить не обязательно. Засада именно с использованием значения переменной в качестве ключа/индекса массива.

Аватар пользователя madt madt 1 сентября 2022 в 17:50
2

Если название стиля в переменной, то может так:

{% set style_name = "style_1" %}
{% set url = "/files/styles/style_1/public/images/2022/08/image.jpg" %}
{% set replaces = {
    '/styles/'   : '',
    '/public': '',
} %}
{% set replaces = replaces|merge({(style_name): ''}) %}

{{ url }}

{% set url_orig = url|replace( replaces ) %}

{{ url_orig }}

https://twigfiddle.com/lh8a08

Или так:

{% set style_name = "style_1" %}
{% set url = "/files/styles/style_1/public/images/2022/08/image.jpg" %}
{% set replaces = {
    (style_name): '',
    '/styles/': '',
    '/public': '',
} %}

{{ url }}

{% set url_orig = url|replace( replaces ) %}

{{ url_orig }}

https://twigfiddle.com/ab2pd1

Аватар пользователя VasyOK VasyOK 1 сентября 2022 в 20:25

Большое спасибо!
Т.е. переменную надо было записывать в скобках:

{% set replaces = {    
    (style_name): '',
} %}

Это я и хотел узнать.

Для чего это надо? Для доработки модуля insert. D8+ версия умеет делать ссылку только на изображение с каким-то стилем.

Аватар пользователя VasyOK VasyOK 1 сентября 2022 в 23:11

На старом сайте insert вставлял небольшой кусок кода в зависимости от стиля изображения.
Воссоздаю эту магию на новом сайте.

Аватар пользователя ivnish ivnish 2 сентября 2022 в 7:19

Вся прелесть переезда с семерки на девятку, что можно наконец-то исправить многие архитектурные косяки. А не воссоздавать их Crazy

Аватар пользователя VasyOK VasyOK 2 сентября 2022 в 12:38

На будущее. А есть решение, чтоб в CKEditor если вставляешь картинку больше определенной ширины, формировалась ссылка типа (?):

<a href="/...image.jpg">
 <img src="/...styles/puplic/cropped/image.jpg"
</a>