замена текста в шаблонизаторе smarty

160
21 августа 2018, 12:10

Есть массив, где key="слова заменяемые на" item="другие слова" У меня получалось вывести только последнию итерацию, поэтому я добавил условие, что в первой итерации берется исходная строка, а следующие итерации уже работают с измененной, чтобы поменять другие совпадение. Но так не работает

<h2 class="js-replace-words">
                {assign var=arrReplace value=['Салфетки влажные'=>'штуки','что-то'=>'еще']}
                {foreach from=$arrReplace key=o item=n}
                   {if $smarty.foreach.arrReplace.first}
                      {assign var=str value=$prodnameTruncate[0]}
                   {else}
                      {assign var=str value=$str}
                   {/if}
                   {assign var=newstr value=$str|replace:$o:$n}
                {/foreach}
                {$newstr}
            </h2>

На js код который должен полуится в итоге, выглядит так:

for (var i=0; i < arrReplace.length; i++){
    var str = $('h2').text();
    var newstr = str.split(array[i].o).join(array[i].n);
    $('h2').text(newstr);
};
Answer 1

там 2 ошибки. логическая: {assign var=str value=$str} и синтаксическая: не добавил "name" для foreach. Вот так выглядит рабочий код:

{foreach from=$arrReplace key=o item=n name=arrReplace}
               {if $smarty.foreach.arrReplace.first}
                  {assign var=str value=$prodnameTruncate[0]}
               {else}
                  {assign var=str value=$newstr}
               {/if}
               {assign var=newstr value=$str|replace:$o:$n}
            {/foreach}
Answer 2

функция str_replace в пхп может принимать не только строки в качестве параметров замены, но и массивы.

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

В дополнение к ответу @Eugen Gedroyc замечу, что переход на smarty3 позволит вам писать код куда более наглядно и понятно, и приведенный код будет выглядеть так:

{$arrReplace = ['Салфетки влажные'=>'штуки','что-то'=>'еще']}
{foreach $arrReplace as $o => $n}
   {if $n@first}
      {$str = $prodnameTruncate[0]}
   {else}
      {$str = $newstr}
   {/if}
   {$newstr = $str|replace:$o:$n}
{/foreach}
{$newstr}

в целом, если перед циклом установить начальное значение переменной, то проверки номера итераций тоже не нужны

{$arrReplace = ['Салфетки влажные'=>'штуки','что-то'=>'еще']}
{$str = $prodnameTruncate[0]}   
{foreach $arrReplace as $o => $n}
   {$str = $str|replace:$o:$n}
{/foreach}
{$str}

ну и в заключение, просто передав массивы замены в функцию все можно свести к

{$arrReplace = ['Салфетки влажные'=>'штуки','что-то'=>'еще']}
{$keys = $arrReplace|array_keys} 
{$values = $arrReplace|array_values}
{$prodnameTruncate[0]|replace:$keys:$values}
READ ALSO
Поиск по всему массиву

Поиск по всему массиву

Есть массив вида:

180
Как проверить, существует ли каталог на Яндекс.Диске

Как проверить, существует ли каталог на Яндекс.Диске

Нормально подключился к приложению через yandex-php-library, могу создавать каталоги, файлы и тд

197
Не собирается библиотека на boost::python в c++

Не собирается библиотека на boost::python в c++

Visual StudioВ настройках example добавил в каталоги библиотек vc++ python/include, python/libs, корень boost_{version}, boost/stage/lib, где скомпилированные boost_ dll-ки, при этом...

214
Как сделать так, чтобы числа выводились в прямом порядке, тоже с использованием рекурсии?

Как сделать так, чтобы числа выводились в прямом порядке, тоже с использованием рекурсии?

При помощи этого кода числа выводятся в обратном порядке, что изменить в коде, чтобы они выводились в прямом порядке?

188