作成したメール テンプレートがあり、[NAME]、[EMAIL]、[PHONE] などを使用して、送信時にそれらを置き換えられるようにしたいと考えています。これらは簡単ですが、[PRODUCT:12] や [ARTICLE:23] などの他のより複雑なタグもあり、最初の部分を「タイプ」として読み取り、2 番目の部分を値として処理します。
ある種の preg_match と preg_replace が必要になると思いますが、私はこれらの機能が苦手なので、ここで本当に途方に暮れています。
助言がありますか?
- -編集 - -
ただ明確にします。問題は、括弧で囲まれた var:value の 2 つの部分にあります。リンクを作成できるように、それが製品であることを確認し、製品を返す id=12 を検索できるようにする必要があります。
---編集2---
public function parse_message_tags($matches){
$keys = explode(':', $matches[1]);
$key = $keys[0];
$id = (array_key_exists(1, $keys)) ? $keys[1] : -1;
switch ($key) {
case 'NAME':
return $this->session->member->name();
break;
case 'FIRST_NAME':
return $this->session->member->first_name;
break;
case 'EMAIL':
return $this->session->member->email;
break;
case 'PRODUCT':
$product = Product::find_by_id($id);
return '<a href="/products/'.$product->seo_name.'">'.$product->name.'</a>';
break;
case 'ARTICLE':
$product = Article::find_by_id($id);
return '<a href="/blog/'.$article->seo_title.'">'.$article->name.'</a>';
break;
}
}
public function parse_message($input)
{
$pattern = '/\[(NAME|FIRST_NAME|EMAIL|PHONE|PRODUCT:\d+|ARTICLE:\d+)\]/';
return preg_replace_callback($pattern, create_function('$matches', 'return self::parse_message_tags;'), $input);
}
結果:
致命的なエラー: アクティブなクラス スコープがない場合、self:: にアクセスできません
また
致命的なエラー: オブジェクト コンテキストでない場合に $this を使用する
私は create_function() がスコープ/コンテキストからあなたを連れ出すと推測しています。ここでは明らかにクラス メソッドを使用しているため、単純に「parse_message_tags」を呼び出すことはできません。