1

私は現在 Magento で作業しており、変数のスコープに問題があります。ウィッシュ リストに何かを表示している 2 つのファイルがあります。これらの 2 つのファイル間で変数を渡す必要がありますが、これは正常に実行できます。問題は、2 つのファイルがループで実行され、それらの値を変更できないことです。使用している基本的なコードは次のとおりです: ファイル 1:

global $var1;
//$var1 = '';
if($condition == true){
  $var1 = 'string';
}

他のファイルは $var1 を正しくエコーアウトし、'string' を与えます。その後、ファイルは再びループされ、プロセスが繰り返されます。私が抱えている問題は、その 2 行目のコメントを外して変数をリセットすると、常に空の文字列のままになることです。if ステートメントは確実にトリガーされますが、変数は設定されません。グローバルにアクセス可能な変数がphpでどのように機能するかを誤解していますか?

4

2 に答える 2

3

これを Magento の方法で行いたい場合は、情報をオブジェクトに接続する必要があります

詳細がわからない場合は確信が持てませんが、あなたの$var1価値がウィッシュリスト、ウィッシュリストのアイテム、またはそれらに関連する何か (顧客や製品など) に論理的に関連付けられる可能性は十分にあります。

そうは言っても、 Magento レイアウト テンプレート ファイル間で情報をやり取りする方法はいくつかあります(基本的にやりたいこと)。あなたが何をしたいのか正確にはわからないので、特定のコードを提供することはできませんが、いくつかのオプションを提供できます。

  • ブロック クラス: すべての .phtml ファイルには$thisオブジェクトがあります。これは、テンプレート ファイルがオブジェクトのコンテキストでレンダリングされることを意味します。オブジェクトはブロック クラスのインスタンスです。レイアウト XML ファイルは、この特定のブロックに使用されるブロック クラスを定義します。詳細については、レイアウトの概要をご覧ください。

    の情報が$var1これらのブロックでの表示目的のみに使用される場合は、その情報をブロック オブジェクト自体の 1 つに格納できます。ブロックは階層構造になっている (そしてループを使用する) ため、情報を格納するために親ブロックを使用することを検討できます。を使用して親ブロックを取得できます$this->getParentBlock()。オブジェクトが見つかった場合は、呼び出し$block->setYourVariableName('value')て値を保存し、$block->getYourVariableName()再度読み取ることができます。$block->getChild('block_name')または を使用して子ブロックにアクセスすることもできます$block->getChildData('your_variable_name')API ドキュメントでさらに便利なメソッドを見つけてください。

  • モデル シングルトン: これを行う別の方法は、シングルトン モデルです。シングルトンは、特定のクラスのインスタンスが 1 つだけ存在することを保証します。このようにして、常に同じオブジェクトにアクセスしてデータを共有できます。その小さな情報ビットを格納するためだけに新しいモデル クラスを作成する必要があるため、おそらくこれは完璧なソリューションではないでしょう。

    一方で、別のモデルを構築することが理にかなっている十分なユースケースがあります。繰り返しますが、あなたが何をしているのかわかりませんが、モデルを作成するのはまったく問題ないかもしれません。モデルをブロックの一部として保存するか、シングルトンを使用してモデルにアクセスするかを決定できます。シングルトンを使用する場合は、Alan Storm によるこの記事の「Magento のシングルトン パターン」セクションを参照してください。

  • レジストリ: これは一種の最後の手段として使用します。レジストリは、中心的かつグローバルな「この情報を保存/取得する」オブジェクトです。使い方は簡単ですが、ベスト プラクティスを取り入れたい場合は、可能な限りこれを避ける必要があります。(ちょっとしたトリビア: Magento のシングルトン実装は実際にはレジストリを使用しますが、詳細は隠されています。)

    レジストリに大量の小さな情報ビットを詰め込みたくないので、これを行う前に他のオプションを検討してください。使用したい場合は、再度Alans の記事を参照してください。

于 2012-11-17T05:24:46.377 に答える