Я вытащил свои струны из MySQL
база данных. Пример строки:
'
{something}Lorem ipsum{/something} dolor sit amet, consectetur adipiscing elit.
Scrupulum, inquam, abeunti;
{blablabla}Illa tamen simplicia{blablabla}, vestra versuta.
Non semper, inquam; Sed mehercule pergrata mihi oratio tua.
Stoici scilicet. Scrupulum, inquam, abeunti;
'
В php я присваиваю строку переменной Smarty следующим образом:
$smarty->assign('homePageText', $string);
Теперь я хочу сделать что-то подобное в шаблоне:
{$homePageText}
{something}
<a href="http://www.domain.com/" class="foo">{$}</a>
{/something}
{blablabla}
<b class="bar"><i>{$}</i></b>
{/blablabla}
{/$homePageText}
Таким образом, строка изменится на это:
'
<a href="http://www.domain.com/" class="foo">Lorem ipsum</a> dolor sit amet, consectetur adipiscing elit.
Scrupulum, inquam, abeunti;
<b class="bar"><i>Illa tamen simplicia</i></b>, vestra versuta.
Non semper, inquam; Sed mehercule pergrata mihi oratio tua.
Stoici scilicet. Scrupulum, inquam, abeunti;
'
Чтобы вы могли размещать теги вокруг частей переменной в шаблоне Smarty. Есть ли такая функция в Smarty 3.0? Или как я могу встроить это в Smarty в PHP 5.4? Я хочу как можно меньше php-кода в моих шаблонах. Так же {something}<tag>{$}</tag>{/something}
часть не должна быть в файлах php, так как на странице будет несколько шаблонов
Я использую простую replace
модификатор в похожих настройках. Но я предполагаю, что этот подход не очень элегантный и не гибкий. В любом случае строка в моей базе данных будет выглядеть так:
'%something1%Lorem ipsum%something2% dolor sit amet, consectetur adipiscing elit.
Scrupulum, inquam, abeunti;
%blablabla1%Illa tamen simplicia%blablabla2%, vestra versuta.
Non semper, inquam; Sed mehercule pergrata mihi oratio tua.
Stoici scilicet. Scrupulum, inquam, abeunti;'
И код в шаблоне будет выглядеть так (удалите разрывы строк!):
{$homePageText|replace:'%something1%':'<a href="http://www.domain.com/" class="foo">'
|replace:'%something2%':'</a>'
|replace:'%blablabla1%':'<b class="bar"><i>'
|replace:'%blablabla2%':'</i></b>'
}
Я использую это в сценарии, где переводы происходят из таблицы базы данных, но некоторые HTML-разметки или URL-адреса жестко закодированы в шаблонах.
кстати: вы могли бы использовать regex_replace
вставить открывающий и закрывающий тег за один шаг, но это не улучшает читаемость …
|regex_replace:'/%something1%(.*)%something2%/':'<a href="http://www.domain.com/" class="foo">\\1</a>'
Я добавил плагин для Smarty:
class SmartyPlugins {
public static function addTags($string, $search, $openingTag, $closingTag) {
return str_replace(
'{/' . $search . '}',
$closingTag,
str_replace(
'{' . $search . '}',
$openingTag,
$string
)
);
}
}
//register the plugin
$smarty->registerPlugin('modifier', 'addTags', array('SmartyPlugins', 'addTags'));
Теперь я могу сделать это в шаблоне:
{$var|addTags:'a':'<a href="http://domain.com">':'</a>'} //changes "Test {a}blablabla{/a} something" to "Test <a href="http://domain.com">blablabla</a> something"