1

管理者が管理パネルのユーザー インターフェイスを使用して電子メール テンプレートを変更できる OpenCart 拡張機能を作成しています。

カスタム メール テンプレートに変数を追加するオプションをユーザーに提供したいと思います。たとえば、彼は次のように入力できます。

こんにちは$order['customer_firstname']、ご注文は処理されました。

この時点で $order は未​​定義になり、ユーザーは送信するメッセージの定義を単に伝えているだけです。これはデータベースに保存され、電子メールの送信時に呼び出されます。

問題は、" $order['customer_firstname']" をリテラル文字列にして、必要に応じて変数に変換するにはどうすればよいかということです。

ありがとうピーター

4

7 に答える 7

7

あなたの質問を正しく理解できれば、次のようなことができます。

顧客には、テンプレートを入力するためのテキストエリアなどがあります

親愛なる%NAME%、なんとか%SOMETHING%

その後、あなたが持つことができます

$values = array('%SOMETHING%' => $order['something'], '%NAME%' => $order['name']);
$str = str_replace(array_keys($values), array_values($values), $str);
于 2012-11-08T15:13:07.603 に答える
2

ユーザーは約40個の変数を使用します。「%VARIABLE%」ごとにそれを行うように設定する方法はありますか?

はい、コールバック関数を使用して、変数ごとに簡単に行うことができます。

これにより、選択した関数を使用して各一致を処理し、目的の置換を返すことができます。

$processed = preg_replace_callback("/%(\S+)%/", function($matches) {
        $name = $matches[1]; // between the % signs
        $replacement = get_replacement_if_valid($name);
        return $replacement;
    },
    $text_to_replace_in
);

ここから、ドット表記など、好きなことを行うことができます。

function get_replacement_if_valid($name) {
    list($var, $key) = explode(".", $name);
    if ($var === "order") {
        $order = init_oder(); // symbolic
        if(array_key_exists($key, $order)) {
            return $order[$key];
        }
     }
     return "<invalid key: $name>";
}

この単純な実装により、置換などの%order.name%置換を処理できます$order['name']

于 2012-11-08T15:23:19.650 に答える
1

PHP構文を保持したい場合は、それらをフィルタリングするために正規表現が適切です。

$text = preg_replace(
            "/   [$] (\w+)  \[ '? (\w+) \'? \]   /exi",
            "$$1['$2']",    # basically a constrained eval
            $text
        );

$orderが定義されているのと同じスコープで実行する必要があることに注意してください。それ以外の場合(そしてできれば)、preg_replace_callback柔軟性を最大にするために代わりに使用します。

この方法で別の構文を許可することもできます。たとえば{order[customer]}%order.customer%またははPHP構文よりも一般的で、おそらく使いやすいです。

于 2012-11-08T15:18:56.567 に答える
1

独自の単純なテンプレート エンジンを定義できます。

function template($text, $context) {
    $tags = preg_match_all('~%([a-zA-Z0-9]+)\.([a-zA-Z0-9]+)%~', $text, $matches);

    for($i = 0; $i < count($matches[0]); $i++) {
        $subject = $matches[0][$i];
        $ctx = $matches[1][$i];
        $key = $matches[3][$i];
        $value = $context[$ctx][$key];

        $text = str_replace($subject, $value, $text);
    }

    return $text;
}

これにより、次のように文字列を変換できます。

$text = 'Hello %order.name%. You have %order.percent%% discount. Pay a total ammount of %payment.ammount% using %payment.type%.';

$templated = template($text, array(
    'order' => array(
        'name' => 'Alex',
        'percent' => 20
    ),

    'payment' => array(
        'type' => 'VISA',
        'ammount' => '$299.9'
    )
));
echo $templated;

これに:

Hello Alex. You have 20% discount. Pay a total ammount of $299.9 using VISA.

これにより、任意の数の変数を定義できます。

于 2012-11-08T15:21:15.157 に答える
1

変数を対応する値に変換するために、二重引用符 "があることHello $order['customer_firstname']を確認してください。"

  echo "Hello $order['customer_firstname']"; 

編集:コメントによると、Prashの回答のバリエーションであり、

str_replace('%CUSTOMERNAME%', $order['customer_name'], $str);     
于 2012-11-08T15:14:16.650 に答える
0

あなたが探しているものは次のとおりです。

eval("echo \"" . $input . "\";");

ただし、ユーザーが必要なコードを実行できるようになるため、そうしないでください。

はるかに優れた方法は、ユーザーが%user_firstname%. 次に、友人を使用str_replaceしてこれらのタグを実際の値と交換できますが、悪意のあるコードをスキャンすることはできます。

これが Markdown などの人気の理由です。ホワイトリストはブラックリストよりも簡単であるため、HTML/JS/PHP/SQL インジェクションなど、侵入しようとする可能性のあるものを簡単にスキャンできるようにしながら、コンテンツの表示をユーザーが制御できるようにします。

于 2012-11-08T15:20:16.470 に答える
-1

おそらく、次のようなテンプレートを作成できます。

$tpl = "Hello {$order['customer_firstname']}, your order has been processed.".

$ orderとその特定のキーがnullでない場合は、echo $tpl直接使用して、'customer_firstname'キーの内容をテキストで表示できます。ここで重要なのは中括弧です。

于 2012-11-08T15:23:18.153 に答える