Czy istnieje prosty sposób jak w Magento1:
$crumbs = Mage::app()->getLayout->getBlock('breadcrumbs');
Czy istnieje prosty sposób jak w Magento1:
$crumbs = Mage::app()->getLayout->getBlock('breadcrumbs');
Odpowiedzi:
NIEAKTUALIZOWANE: ODPOWIEDŹ ODNOSI SIĘ DO MAGENTO 2 ALPHA
Chciałbym, żeby to było takie proste.
To zależy od tego, skąd chcesz go utworzyć.
Jeśli chcesz utworzyć instancję z innego bloku, zrób to tak:
$this->getLayout()->createBlock('Full\Block\Class\Name\Here');
Z poziomu kontrolera wykonaj następujące czynności:
$this->_view->getLayout()->createBlock('Full\Block\Class\Name\Here');
Z wnętrza modelu:
$this->_blockFactory->createBlock('Full\Block\Class\Name\Here');
ale tutaj jest haczyk.
musisz utworzyć chroniony element członkowski w modelu o nazwie _blockFactory
i wstrzyknąć wystąpienie \Magento\Framework\View\Element\BlockFactory
w konstruktorze i przypisać go do tego elementu var.
Coś takiego:
protected $_blockFactory;
public function __construct(
...,
\Magento\Framework\View\Element\BlockFactory $blockFactory,
....
){
....
$this->_blockFactory = $blockFactory;
....
}
W przypadku tworzenia bloku z poziomu pomocnika działa tak samo, jak w przypadku modelu
_view
. Powinien być domyślnie dostępny, choć myślę, że teraz jest przestarzały. Napisałem tę odpowiedź 1,5 roku temu
_view
jest teraz przestarzałe w kontrolerach i wkrótce zniknie,
Aby utworzyć instancję bloku, musisz użyć
\Magento\Framework\View\LayoutInterface
klasy i jej createBlock()
metody.
Z klasą pomocnika możesz to zrobić za pomocą tego kodu:
namespace Vendor\Module\Helper;
class Data extends \Magento\Framework\App\Helper\AbstractHelper
{
/**
* Layout
*
* @var \Magento\Framework\View\LayoutInterface
*/
protected $_layout;
/**
*
*/
public function __construct(
\Magento\Framework\App\Helper\Context $context,
\Magento\Framework\View\LayoutInterface $layout
) {
$this->_layout = $layout;
parent::__construct($context);
}
/**
* Create new block
*/
public function getBlock() {
$block = $this->_layout
->createBlock('Magento\Framework\View\Element\Template')
->setTemplate('Vendor_Module::helper/block.phtml');
return $block;
}
}
Następnie zadzwoń $helper->getBlock()
z miejsca, w którym potrzebujesz.