2012-02-11 61 views
4

我是PHP的新手;今天我在Magento top.phtml中看到一些代碼。

<?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 ?> 

我知道$thisclass的自我,它只是在課堂上用來指方法或屬性,在上面的代碼,沒有階級已經被定義,爲什麼它可以使用這個$關鍵字直接? $this->__('Home')代表什麼?

+1

__('Home')可能是一種用於文本'Home'的本地化方法,用於將頁面輕鬆轉換爲各種語言。 – 2012-02-11 09:56:09

+1

請參閱http://svn.magentocommerce.com/source/branches/1.6/app/code/core/Mage/Core/Block/Abstract.php,函數__()爲您的入口點進入Magento的翻譯系統。有關其他資源,請參閱magento.com上的Alan Storm知識庫文章,當您準備好時,您可以享受Magento U提供的免費Fundamentals視頻(完全披露:我是視頻中的視頻)。祝你好運,並不斷提問! – benmarks 2012-02-11 14:16:10

回答

5

既然你標記了這個你可能有一個類如Mage_Catalog_Block_Navigation。至少,這些方法暗示了這一點。現在,我不知道Magento的線索,但這個類從Mage_Core_Block_Template延伸,並在該類你有fetchView方法,which at some point does

include $includeFilePath; 

當你的方法裏面include代碼,你必須在包括訪問$this文件代碼,因爲它在該實例的範圍內進行評估:

當包含文件時,其包含的代碼繼承包含所在行的變量範圍。從調用文件的那一行可用的任何變量將在被調用的文件中可用,從這一點開始。但是,包含文件中定義的所有函數和類都具有全局範圍。

普通的例子:

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

注意, 「$this不是類的self」 只是部分正確。 self也是關鍵字和php,但self實際上是指類,$this是指類的實例。

+1

模板包含在擴展'Mage_Core_Block_Template'的塊中。它的繼承鏈中沒有幫手。 – clockworkgeek 2012-02-11 12:32:45

+0

@clockworkgeek謝謝。但tbh,我不在乎Magento的一部分。上面給出的示例模板與Magento完全不同。更新的答案使其更加清晰。 – Gordon 2012-02-11 12:52:27

1

該對象已被定義!此模板用作塊的實例。它就是模板中提到的那個實例。一個快速的方法來識別您當前處理的模板裏面的類是使用下面的一行代碼模板:

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

另外,你提到的__方法。這鉤入Magento的語言環境系統。這意味着,你可以寫:

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

在您的模板,然後使用相同的模板文件在你的法國商店只提供從英文文本映射到法語,而不是創建一個全新的模板。

1

因爲它是某些塊類的模板。塊模板(.phtml文件)包含在Mage_Core_Block_TemplatefetchView()方法中。你可以去app/code/core/Mage/Core/Block/Template.php看看它是如何完成的。這就是爲什麼$this可用於.phtml。您可以在this Alan Storm's article中閱讀有關magento塊和模板的更多信息。它有點過時,但基本解釋得很好(imho)。