0

我正在尝试为网站新闻模块制作一个简单的模板系统。这是我的代码。

$temp = "#title#, <br>#date(d-m-Y)#<br> #story#";
$data = array(title=>"this is a title", date=>1350498600, story=>"some news story.");

我在 stackoverflow 上找到了这个简单的类,并试图将它用于我的目的。

class EmailTemplate
{
     private $_template = '';

    public function __construct($template)
    {
        $this->_template = $template;
    }

    public function __set($key,$value)
    {
        $this->_template = str_replace("#" . $key . "#",$value,$this->_template);
    }

    public function __toString()
    {
        return $this->_template;
    }
} 

我像这样使用它:

    $Template = new EmailTemplate($temp);
    $Template->title = $data['title'];
    $Template->date = $data['date'];
    $Template->story = $data['story'];
    echo $Template;

一切都适用于标题和故事,但说到日期我有问题,因为我想格式化模板中定义的日期,即日期(dmY)。我怎样才能做到这一点 ??

模板来自不同的表格,新闻来自不同的表格。日期格式将在模板中定义。

4

3 回答 3

2
$Template->date = date('d-m-Y', strtotime($data['date']));
于 2012-10-18T12:24:19.220 回答
0

你需要接受date('d-m-Y')作为类的属性。这是不允许的,您似乎需要将占位符更改为可接受的类属性或更改类,也许添加特定于该字段的方法。

我相信你不能用你正在使用的技术完成你想要的。

于 2012-10-18T12:29:32.397 回答
0

我有一个使用preg_replace_callback.

首先你需要存储类,比方说:

class TemplateStorage {
    // Okay, you should have getter&setter for element, but this is just an example
    public $variables = array(); // Common variables like title
    public $functions = array(); // Function mappings like 'date' => 'wrapper_date'

    public function HandleMatch($match); // Will be shown later
}

然后你应该有某种包装器,你可以将它集成到TemplateStorage,扩展类,做任何你想做的事情(如果你需要将它与用户时区设置集成,这可能会派上用场):

function WapperDate($dateFormat){
   // Set timezone, do whatever you want, add %... or use date straight forward
   return date( $dateFormat);
}

然后 RegEx 允许您调用您需要的内容(匹配 之间的所有内容#,忽略空格):

$regEx = '~#\\s*(.+?)\\s*#~';

好的,现在我们可以关心HandleMatch(我们知道 的结构$match):

public function HandleMatch($match)
{
    $content = match[1];

    // Let's check whether it contains (. No? May be variable
    $pos = strpos( $content, '(');
    if( $pos === false){
       if( isset( $this->variables[ $content])){
           return $this->variables[ $content];
       }
    }

    // Allow "short calling" #date# = #date()# if no variable is set
    $argument = '';
    $function = $content;

    if( $pos !== false){
        // Last char must be )
        if( substr( $content, -1) != ')'){
            throw new Exception('Invalid format: ' . $content);
        }

        // Split into pieces
        $argument = substr( $content, $pos+1, -1);
        $function = substr( $content, $pos);
    }

    if( !isset($this->functions[$function])){
       throw new Exception( 'Unknown requested TemplateProperty: ' . $function);
    }

    // Call requested item
    return $this->functions[$function]($argument);
}

现在把它们放在一起:

$storage = new TemplateStorage();
$storage->variables['title'] = 'Lorem ipsum sit dolor';
$storage->functions['date'] = 'WrapperDate';
preg_replace_callback( $regEx, array( $storage, 'HandleMatch'), $text);
于 2012-10-18T12:34:29.683 回答