2011-09-05 5 views
1

나는 HTML 전자 메일로 보내기 전에 데이터베이스에 저장된 컨텐트를 가져 와서 템플릿에로드하는 메일 클래스를 작성하고 있습니다. 그러나 각 전자 메일에는 PHP 변수와 동적 컨텐트가 포함되어 있으므로 구분 기호를 사용하기로 결정했습니다. 그래서 내용처럼 보이는 대신 :구분 기호를 PHP 변수로 바꾸기

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); 
} 

나는 데의 문제점 : 지금까지

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

나는이 방법을 사용하고 있습니다 :

Hello $username, welcome to the site. 

그것은처럼 보일거야 {{variable}}을 $ 변수로 변환하여 구문 분석하는 방법입니다. 전자 메일 템플리트에서 $ username으로로드하는 것을 원하지 않습니다. 정규 표현식을 사용하고 문자열을 이스케이프 처리하여 파싱 할 수 있습니까? 다음과 같음 :

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

또는이 결함이 있습니까? 아무도 최선의 일이 무엇인지 압니까?

+0

정규 표현식을 사용하십시오. 나중에 어떤 종류의 논리 (루프 또는 조건이있는 경우)를 구현하려는 생각이 든다면, 바로 거기에서 멈추게하십시오. 기존 구현을 사용하십시오. 경량 템플릿 엔진이 존재하며 231 개의 클래스 중 하나가 원하는 이중 중괄호 구문을 지원합니다. – mario

답변

3

거기에 기존 템플릿 시스템이 있기 때문에 나는 자체 템플릿 시스템을 만들지 않을 것입니다.

가장 인기있는 것은 아마도 Smarty이지만 아마도 사용자가 만든 형식과 동일한 형식 인 mustache이 있습니다.

업데이트 :

코드의 문제는 당신이 .${{를 교체하고 저장하는 것을 $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해야합니다 :

가능한 작업 솔루션이 될 수 있습니다.

+0

Smarty에 대해 알고 있습니다.하지만이 단일 클래스로만 기능을 구현하고 싶습니다. 전체 템플릿 엔진을 설치하고 구성하는 것은 약간 번거로운 것 같습니다. – hohner

+0

다릅니다. * 빠른 * 템플릿 시스템으로 수많은 기능을 사용할 수 있습니다. –

+3

나뭇 가지, http://twig.sensiolabs.org/ – Aknosis

0

사용 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 ; 
} 

?> 
0

당신이 그것을 스스로 할하려는 경우 그냥 않는 str_replace에 명시 적으로 아마 가장 좋습니다. 중괄호를 $로 변환하려고하면 잠재적 인 보안 구멍 인 eval()이 필요합니다.

이것은 str_replace에 대한 나의 접근 방법입니다. 더 많은 변수를 추가 할 때 유지 보수가 어려워 지지만 실제로는 훨씬 간단하지 않습니다.

$content = str_replace(
      array('{{username}}','{{var2}}'), 
      array($username,$var2), 
      $template->content 
      ); 
2

있도록 이메일 템플릿에 $variable{{variable}}를 변환 한 후, 당신은 그 변수의 실제 내용으로 대체 얻을 eval를 사용할 것인가?

$variable의 내용으로 바로 바꾸지 않는 이유는 무엇입니까?

아마도 템플릿 텍스트와 배열 placeholder => "text to replace it with"을 사용하는 함수가있을 것입니다.그런 다음 배열의 키 주위에 {{}}을 추가하고 str_replace을 수행하여 자리 표시 자의 정확한 문자열을 만드는 것만 큼 간단합니다.

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

자리 표시 자에 대한 (클래스) 상수이 커플 당신은 매우 견고하고 오타 - repelant 템플릿 시스템을 가지고있다. 이 템플릿은 완전한 템플릿 솔루션과 같이 우아하고 사용하기 쉽지는 않으며 사용하는 코드를 작성한 사람은 누구나 추가 작업이 필요할 수 있지만 잘못 명명 된 변수로 인해 개발 중에 실수를하지는 않습니다.

관련 문제