0

Velocity (1.7) を使用して PHP コードを生成しています。

厳密な例外を使用して Velocity をセットアップしました。これは少し役立ちます。

p.setProperty(RuntimeConstants.RUNTIME_REFERENCES_STRICT_ESCAPE, "true");

しかし、テンプレートの次の行で問題が発生しています。

\$result['${attribute.Name}'] = \$this->${attribute.Name};

出力は次のとおりです。

$result['${attribute.Name}'] = $this->color;

ただし、次のようにする必要があります。

$result['color'] = $this->color;

編集:

問題を解決する方法を見つけました:

#set($d = "$")
${d}result['${attribute.Name}'] = \$this->${attribute.Name};

しかし、Velocity の潜在的なバグを解決するためだけに追加の変数を導入するソリューションは好きではありません。

4

1 に答える 1

0

Velocity 1.7 では\、エスケープ文字ではなくなりました。をレンダリングすると、Velocity 構文文字で\$result['${attribute.Name}']はないため、変数によって参照されるオブジェクトへの配列アクセスとして認識されますが、その変数の背後に配列がないため、出力全体が逐語的に出力されます。これが Velocity の仕組みです。有効な Velocity 構文として認識されているものの、評価できないものや結果が になるものはすべて出力に出力されます。\$result['${attribute.Name}']$resultnull

Velocity と PHP という 2 つの類似した構文を混在させているため、一方を他方から区切る方法が必要です。エスケープは正しい方法ですが、そうで\$はありません。$符号を取得するには、変数を使用する必要があります。

推奨される方法は$escapetool.dエスケープ ツールを使用することですが、これにはツールの構成が必要であり、${d}.

または、解析されていないコンテンツエスケープ構文を使用できます。

#[[$result[']]#${attribute.Name}#[['] = $this->]]#$attribute.Name
于 2013-07-30T11:29:15.177 に答える