Все публичные методы из контекста блока доступны в шаблоне.
Контекст блока - это блок class
, назначенный шаблону в XML макета.Это эквивалентно блоку type
в Magento 1. По умолчанию это \Magento\Framework\View\Element\Template
, что эквивалентно Mage_Core_Block_Template
в Magento 1.
Этот контекст блока назначается шаблону как переменная $block
во время рендеринга.Это отличается от Magento 1, где $this
относится к контексту блока в шаблоне.В Magento 2 $this
относится к шаблонизатору, отвечающему за рендеринг шаблона.Вы можете увидеть все это в методе render
движка шаблонов , где параметр $dictionary
(содержащий $block
среди прочих) извлечен непосредственно перед включениемфайл phtml.Это позволяет использовать в шаблоне все извлеченные переменные, в частности $block
.
Пример использования блока
Допустим, вы создали собственный класс блока в своем модуле как app/code/MyNamespace/MyModule/Block/MyBlock.php
this.
<?php
namespace MyNamespace\MyModule\Block;
use Magento\Framework\View\Element\Template;
class MyBlock extends Template
{
public const FOO = 'foo';
private const BAR = 'bar';
public function isFoo(string $str): bool
{
return $str === self::FOO;
}
private function isBar(string $str): bool
{
return $str === self::BAR;
}
}
Вы бы включили этот блок, скажем, на каждую страницу продукта, создав файл в app/code/MyNamespace/MyModule/view/frontend/layout/catalog_product_view.xml
следующим образом.
<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<body>
<referenceContainer name="content">
<block class="MyNamespace\MyModule\Block\MyBlock" name="myblock" template="MyNamespace_MyModule::mytemplate.phtml" />
</referenceContainer>
</body>
</page>
Это добавит MyBlock
на content
-контейнер на каждой странице продукта.Контейнеры будут автоматически визуализировать свои дочерние блоки, поэтому они похожи на тип блока core/text_list
в Magento 1.
Затем в шаблоне, настроенном в XML макета, app/code/MyNamespace/MyModule/view/frontend/templates/mytemplate.phtml
, вы можете использовать открытые методы исвойства, включая isFoo
, но не частные или защищенные, такие как isBar
.Комментарии в начале файла шаблона проясняют, что такое $this
и $block
.
<?php
/** @var $this \Magento\Framework\View\TemplateEngine\Php */
/** @var $block \MyNamespace\MyModule\Block\MyBlock */
$thing1 = 'foo';
$thing2 = 'bar';
?>
<div class="my-thing">
<?php if ($block->isFoo($thing1)): ?>
<!-- isFoo works since it's a public method -->
<?php endif; ?>
<?php if ($block->isBar($thing2)): ?>
<!-- isBar doesn't work since it's a private method -->
<?php endif; ?>
<!-- You can access public properties and constants from the $block object, too -->
<span><?php echo $block::FOO; ?></span>
</div>