2012-02-11 16 views
4

私はPHPで初心者です。今日私はMagento top.phtmlで次のコードを参照してください。私は$this知っ

<?php $_menu = $this->renderCategoriesMenuHtml(0,'level-top') ?> 
<?php if($_menu): ?> 
<div class="nav-container"> 
    <ul id="nav"> 
     <!--NEW HOME LINK --> 
     <li class="home"><a href="<?php echo $this->getUrl('') ?>"><?php echo $this->__('Home') ?></a>"</li> 
     <!--NEW HOME LINK --> 
     <?php echo $_menu ?> 
    </ul> 
</div> 
<?php endif ?> 

はそれが$これを使用することができますなぜ、何のクラスが定義されていないがあり、それだけで上記のコードで、メソッドやプロパティを参照するためにクラスで使われている、classの自己であります直接キーワード? $this->__('Home')は何の略ですか?

+1

__( 'Home')は、ページをさまざまな言語に簡単に変換するために使用されるテキスト 'ホーム'のローカライズ方法です。 –

+1

Magentoの翻訳システムへの入力ポイントについてはhttp://svn.magentocommerce.com/source/branches/1.6/app/code/core/Mage/Core/Block/Abstract.php、function __()を参照してください。その他のリソースについては、magento.comのAlan Stormのナレッジベースの記事を参照してください。準備ができたら、Magento Uから入手できる無料のFundamentalsビデオ(全開示:私はビデオのものです)をお楽しみください。幸運を祈り、質問を続けてください! – benmarks

答えて

5

とタグ付けされているので、おそらくMage_Catalog_Block_Navigationのようなクラスがあります。少なくとも、その方法はそれを示唆しています。今、私は、Magentoのについての手掛かりを持っていませんが、このクラスはMage_Core_Block_Templateから延びており、そのクラスにあなたが持っているfetchView方法、which at some point does

include $includeFilePath; 

あなたは、メソッド内includeコード、あなたが含ま中$thisへのアクセス権を持っていないときそのインスタンスのスコープ内で評価されるため、ファイルコードは以下のようになります。

ファイルが含まれる場合、そのファイルに含まれるコードには、インクルードする行の可変範囲が継承されます。呼び出し元ファイル内のその行で使用可能な変数は、その時点から呼び出されたファイル内で使用可能になります。ただし、インクルードされたファイルで定義されているすべての関数とクラスはグローバルスコープを持ちます。

一般例: "$thisがクラスのselfではない" という

class Template 
… 
    public function render($templateFile) 
    { 
     include $templateFile; 
    } 
    public function ___($stringToTranslate) 
    { 
     // translates $stringToTranslate somehow 
    } 
} 

注部分的に正しいのみです。 selfもキーワードとPHPですが、selfは実際にクラスを参照していますが、$thisはクラスのインスタンスを参照しています。

+1

テンプレートは 'Mage_Core_Block_Template'を拡張するブロックからインクルードされています。それにはヘルパーは存在しません。 – clockworkgeek

+0

@clockworkgeekありがとう。しかし、私はMagentoの部分に気をつけません。私が上に示したテンプレートの例はMagentoとの関連では全く意味がありません。それをより明確にするための答えが更新されました。 – Gordon

1

オブジェクトが定義されています!このテンプレートは、ブロックのインスタンスとして使用されます。これはテンプレートで参照されるインスタンスです。あなたが現在テンプレート内で扱っているクラスを識別するための簡単な方法は、テンプレートに次のコード行を使用することです。また、

<?php echo get_class($this); ?> 

、あなたが__方法に言及します。これはMagentoのロケールシステムにつながります。これは、あなたが書くことができることを意味します

<?php echo $this->__('Hello') ?> 

テンプレートでは、その後、あなたのフランス語の店舗で同じテンプレートファイルを使用してのみ、まったく新しいテンプレートを作成するのではなく、フランス語の言語に英語からテキストマッピングを提供しなければなりません。

1

一部のブロッククラスのテンプレートです。ブロックテンプレート(.phtmlファイル)は、Mage_Core_Block_TemplateクラスfetchView()メソッドに含まれています。あなたはapp/code/core/Mage/Core/Block/Template.phpに行って、それがどのように行われるか見ることができます。だから$this.phtmlで利用可能です。 this Alan Storm's articleで、マゼンタのブロックとテンプレートについて詳しく読むことができます。少し古いですが、基本はとてもうまく説明されています(イホ)。

関連する問題