Замена разделителей на PHP-переменные - PullRequest
1 голос
/ 05 сентября 2011

Я пишу почтовый класс, который извлекает содержимое, хранящееся в базе данных, и загружает его в шаблон перед отправкой в ​​виде электронного письма в формате HTML. Однако, поскольку каждое электронное письмо содержит переменные PHP и динамическое содержимое, я решил использовать разделители. Так что вместо контента, выглядящего так:

Hello $username, welcome to the site.

Это будет выглядеть так:

Hello {{username}}, welcome to the site.

Пока я использую эти методы:

function load($name,$content)
{
    // preps the template for HTML
}

function content($template_id)
{
    $template = $this->db->get_where('email_templates',array('id'=>$template_id));
    return $template->content;
}

function new_email($email,$name,$user_type)
{
    $msg = $this->load($name,$this->content(1));
    $this->send($email,'Thanks for your application',$msg,1);
}

Проблема, с которой я столкнулся, заключается в том, как преобразовать {{variable}} в переменную $, чтобы она анализировалась - я не хочу, чтобы ее просто загружали как $ username в шаблон электронной почты. Это просто случай использования регулярных выражений и экранирования строки для ее анализа? Что-то вроде:

$content = str_replace("{{","'.$",$template->content);
$content = str_replace("}}",".'",$template->content);

Или это недостатки? Кто-нибудь знает, что лучше всего делать?

Ответы [ 4 ]

3 голосов
/ 05 сентября 2011

Я бы не стал создавать свою собственную систему шаблонов, потому что там уже есть.

Наиболее популярным является, вероятно, Smarty , но есть еще один, который имеет тот же формат, что и вы, например, усы .

Обновление:

Проблема с вашим кодом заключается в том, что вы заменяете {{ на .$ и сохраняете его в переменной $content, затем заменяете }} на . и перезаписываете эту замененную переменную $content.

Возможное рабочее решение может быть:

if (preg_match_all("/{{(.*?)}}/", $template, $m)) {
  foreach ($m[1] as $i => $varname) {
    $template = str_replace($m[0][$i], sprintf('$%s', $varname), $template);
  }
}

Но тогда вам также нужно как-то eval ваш код.

2 голосов
/ 05 сентября 2011

Таким образом, после преобразования {{variable}} в $variable в шаблоне вашей электронной почты, вы будете использовать eval, чтобы заменить его фактическим содержимым этой переменной?

Почему бы просто не заменить {{variable}} содержимым $variable сразу?

Возможно, есть функция, которая принимает текст шаблона и массив placeholder => "text to replace it with". Тогда это так же просто, как создать точные строки заполнителей, добавив {{ и }} вокруг ключа этого массива и выполнив str_replace.

foreach ($replacements as $placeholder => $value) {
    $placeholder = "{{" . $placeholder . "}}" ;
    $text = str_replace($placeholder, $value, $text) ;
}

Соедините это с (классом) константами для заполнителей, и у вас будет очень надежная и типографская система шаблонов. Он не будет таким элегантным или простым в использовании, как полноценное шаблонное решение, и он может потребовать дополнительной работы от того, кто пишет код, который его использует, но они не допустят ошибок во время разработки из-за неправильно названных переменных.

0 голосов
/ 05 сентября 2011

Если вы собираетесь сделать это самостоятельно, вероятно, лучше просто явным образом указать str_replace. Если вы попытаетесь преобразовать фигурные скобки в $, вам потребуется eval (), которая является потенциальной дырой в безопасности.

Это мой подход с str_replace - его становится сложно поддерживать, когда вы добавляете больше переменных, но на самом деле это тоже не намного проще.

$content = str_replace(
             array('{{username}}','{{var2}}'),
             array($username,$var2),
             $template->content
           );
0 голосов
/ 05 сентября 2011

использовать preg_replace_callback, см .: http://codepad.org/EvzwTqzJ

<?php

$myTemplateStr = "Hello {{username}} , this is {{subject}} ,and other string {{example}}";
$tagRegex = "|{{(.*?)}}|is";
$result = preg_replace_callback($tagRegex,"myReplaceFunc",$myTemplateStr);
echo $result ;

/* output :     

Hello $username , this is $subject ,and other string {{example}}

*/



function myReplaceFunc($matches)
{
  $validTags = array('username','subject','name');
  $theFull = $matches[0];
  $theTag = $matches[1];
  if(in_array($theTag,$validTags) == true)
    return '$'.$theTag;
  return $theFull ;
}

?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...