php简单的str_replace模板日期格式

时间:2012-10-18 12:16:29

标签: php templates date format str-replace

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

$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;

一切都适用于标题和故事但是因为它到目前为止我有问题,因为我想格式化模板中定义的日期,即日期(d-m-Y)。我怎样才能做到这一点 ??

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

3 个答案:

答案 0 :(得分:2)

$Template->date = date('d-m-Y', strtotime($data['date']));

答案 1 :(得分:0)

您需要接受date('d-m-Y')作为班级的财产。这是不允许的,看起来您需要将占位符更改为可接受的类作为类的属性或更改类,可能添加特定于该字段的方法。

我相信你用你正在使用的技术无法达到你想要的效果。

答案 2 :(得分: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);