我正在尝试为网站新闻模块制作一个简单的模板系统。这是我的代码。
$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)。我怎样才能做到这一点 ??
模板来自不同的表格,新闻来自不同的表格。和日期格式将在模板中定义。
答案 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);