2012-02-11 59 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)。