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

を使用して、もう少し複雑なソリューションが1つあり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 = '~#\\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 に答える
0

date('d-m-Y')クラスのプロパティとして受け入れる必要があります。これは許可されていません。プレースホルダーをクラスのプロパティとして受け入れられるものに変更するか、クラスを変更するか、おそらくそのフィールドに固有のメソッドを追加する必要があるようです。

あなたが使用している技術では、あなたが望むものを達成することはできないと思います.

于 2012-10-18T12:29:32.397 に答える