0

.phtmlMagento のアーキテクチャに従いながら、テンプレート内に一時変数を作成する最良の方法は何ですか?

ファイル:/template/catalog/product/view.phtml

<?php
$myVar = $_product->getAttributeText('color');

if ( empty($myVar) ) {
    // does not exist
} else {
    // show the attribute
}
?>

この式以外では $myVar は必要ありません。

注: 変数の作成を回避するこのコードを記述する別の方法を探しているわけではありません。議論のために、一時変数の作成が必要なシナリオを想定します。

どうあるべき$myVarですか?

  1. $myVar
  2. $namespaced_myVar
  3. $_myVar
  4. Magento のレジストリ パターンhttp://alanstorm.com/magento_registry_singleton_tutorial
  5. 何か他の...

純粋な答えよりも「現実世界」の解決策を探しています。これをどのように書きますか?

答え

Ben の回答と、Alan/Vinai の会話https://twitter.com/VinaiKopp/status/225318270591442945からのこのビットを組み合わせると、次のように書きます。

基本的なロジック以上のものが必要な場合は、新しいメソッドでクラスを拡張します。

それ以外の場合は、次のようにローカル スコープに新しい変数を作成します。

$mynamespace_myVar = 'xyz';

これは私がそれについて好きなことです:

  • Magentoではなく、これを作成した$mynamespace_ことを思い出します
  • また、別の開発者が私の変数を上書きする可能性が非常に低くなります

これは私が好きではないものです:

  • これは純粋ではなく、破損する可能性がありますが、おそらくサイト全体で 5 回未満しか必要ないため、適切に保護されています。
  • var がこのテンプレートに対してローカルであることを示すために使用$_しないことは、「Magento の方法」ではありませんが、コードが読みやすくなります。

したがって、私のテンプレートは主に次のようなコードになります。

$gravdept_someNiceData = true;
4

1 に答える 1

3

いくつかの歴史: https://stackoverflow.com/a/3955757/833795

Re 1、2、および 3: これらの選択肢を区別するには、すべてローカル変数であるため、「純粋な答え」の領域に入る必要があります。

目的のスコープはテンプレートのレンダリングに対してローカルであると述べられているため、レジストリ パターンの使用は推奨されません。

あなたの例に基づいて、Magento での適切な構成は次のようになります。

<?php if ($_product->getColor()): ?>
    <h2> I HAZ COLOR </h2>
<?php else: ?>
    <h2> I NO HAZ COLOR </h2>
<?php endif ?>

戻り値の最も単純なテスト以外のものがある場合は、このロジックをブロック クラスのメソッドとして (書き換えを使用して) 追加することが適切です。実際には、言及したビュー ロジックはこのコンテキストに対してのみローカルである必要があります。

于 2012-09-19T17:46:54.633 に答える