2014-09-30 4 views
0

Я получаю свои строки из базы данных MySQL. Пример строки:Поместите теги вокруг части строки в Smarty

' 
{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, поскольку на странице будет несколько шаблонов.

+0

это очень непонятно, что вы хотите добиться от этого дие Stion. Пожалуйста, объясните это подробно. Также '$ smarty-> assign ('homePageText');' неверно, потому что вы не устанавливаете здесь никакого значения. –

+0

Вы можете использовать собственные ресурсы шаблонов (http://www.smarty.net/docs/en/resources.custom.tpl) в сочетании с наследованием шаблонов (http://www.smarty.net/inheritance) – sofl

ответ

0

Я добавил плагин для 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" 
1

В подобных настройках я использую простой модификатор 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-адреса жестко закодированы в шаблонах.

BTW: Вы можете использовать regex_replace, чтобы вставить открывающий и закрывающий тег в один шаг, но это не реально улучшить читаемость ...

|regex_replace:'/%something1%(.*)%something2%/':'<a href="http://www.domain.com/" class="foo">\\1</a>' 
+0

Спасибо :) еще не пробовал, но он хорошо выглядит – Jonan

+0

Я получаю 'Синтаксическая ошибка - Неожиданная '|" ' – Jonan

+0

К сожалению, вам нужно снять разрывы строк, я добавил для лучшей удобочитаемости. Сожалею; не проверил его. – DerVO

Смежные вопросы