в magento 2 какие блочные методы доступны в шаблоне? - PullRequest
0 голосов
/ 26 мая 2018

м2 сильно отличается от m1.

Когда я пишу код (программирую общедоступные методы) в шаблоне, они, похоже, не работают.Разрешены ли все методы как защищенные, так и приватные?или добытчики или только публичные добытчики?Я в замешательстве.

Я верю, что это всего лишь публичных получателей верно?

Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 27 мая 2018

Все публичные методы из контекста блока доступны в шаблоне.

Контекст блока - это блок 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.phpthis.

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