Почему шаблон может использовать $ this ключевое слово напрямую? - PullRequest
4 голосов
/ 11 февраля 2012

Я новичок в 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 ?>

. Я знаю, что $this - это собственная личность class, она используется только в классе для ссылки на метод или свойствоВ приведенном выше коде класс не определен, почему он может напрямую использовать $ this ключевое слово?Что означает $this->__('Home')?

Ответы [ 3 ]

5 голосов
/ 11 февраля 2012

Поскольку вы пометили это , вероятно, у вас есть класс, подобный Mage_Catalog_Block_Navigation.По крайней мере, методы намекают на это.Теперь я понятия не имею о Magento, но этот класс простирается от Mage_Core_Block_Template, и в этом классе у вас есть метод fetchView, , который в какой-то момент делает

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 голос
/ 11 февраля 2012

Потому что это шаблон для некоторого класса блоков.Шаблон блока (файл .phtml) включен в метод Mage_Core_Block_Template class fetchView().Вы можете перейти на app/code/core/Mage/Core/Block/Template.php и посмотреть, как это делается.Вот почему $this доступен в .phtml.Вы можете прочитать больше о блоке magento и шаблонах в этой статье Alan Storm .Это немного устарело, но основные объясняются очень хорошо (imho).

1 голос
/ 11 февраля 2012

Объект был определен! Этот шаблон используется как экземпляр блока. Это тот экземпляр, который упоминается в шаблоне. Быстрый способ определить класс, с которым вы сейчас работаете, внутри шаблона - это использовать следующую строку кода в шаблоне:

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

Также вы упомянули метод __. Это подключается к системе локали Magento. Это означает, что вы можете написать:

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

В вашем шаблоне, затем используйте тот же файл шаблона в вашем французском магазине, и вам нужно только предоставить сопоставление текста с английского на французский язык вместо создания нового шаблона.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...