Bagaimana instantiate blok di magento2

10

Apakah ada cara sederhana seperti di magento1:

 $crumbs = Mage::app()->getLayout->getBlock('breadcrumbs');
Matoeil
sumber
mungkin duplikat bagaimana cara memulai model di magento2?
Rajeev K Tomy
4
Blok dan model adalah dua hal yang berbeda. Ini bukan duplikat.
pspahn
Model dan balok Rajeev K Tom benar-benar berbeda
theSeeker

Jawaban:

20

LUAR BIASA: JAWABAN MENGUBAH KE MAGENTO 2 ALPHA


Saya berharap semudah itu.
Itu tergantung dari mana Anda ingin instantiate.
Jika Anda ingin membuat instance dari dalam blok lain lakukan seperti ini:

$this->getLayout()->createBlock('Full\Block\Class\Name\Here');

Dari dalam controller lakukan ini:

 $this->_view->getLayout()->createBlock('Full\Block\Class\Name\Here');

Dari dalam model:

 $this->_blockFactory->createBlock('Full\Block\Class\Name\Here');

tapi di sini ada tangkapan.
Anda harus membuat anggota yang dilindungi pada model yang dipanggil _blockFactorydan menyuntikkan instance dari \Magento\Framework\View\Element\BlockFactorydalam konstruktor dan menugaskannya ke anggota itu var.

Sesuatu seperti ini:

protected $_blockFactory;
public function __construct(
   ...,
   \Magento\Framework\View\Element\BlockFactory $blockFactory,
   ....
){
    ....
    $this->_blockFactory = $blockFactory;
    ....
}

Untuk instantiasi blok dari dalam helper, ia bekerja sama seperti untuk model

Marius
sumber
semakin sederhana semakin baik
Matoeil
@Marius $ toplink = $ this-> getLayout () -> getBlock ('top.links') -> toHtml (); gunakan di magento 1 untuk magento 2 $ this -> _ view-> getLayout () -> getBlock (Full \ Block \ Class \ Name \ Here ') -> toHtml (); ini memberikan kesalahan seperti kesalahan fatal ini: Memanggil ke fungsi anggota toHtml () pada non-objek bagaimana saya bisa mendapatkan toHtml ()?
ND17
jika Anda berada di controller, Anda tidak perlu menyuntikkan apa pun _view. Itu harus tersedia secara default, meskipun saya pikir itu sudah usang sekarang. Saya menulis jawaban ini 1,5 tahun yang lalu
Marius
1
@SachinS. Anda seharusnya tidak menggunakannya lagi. _viewsudah ditinggalkan sekarang di controller dan akan segera pergi,
Marius
1
Bisakah saya menelepon menggunakan objek pembuatan halaman seperti ini? $ viewPanelPageFactory = $ this-> resultPageFactory-> create (); $ viewPanel = $ viewPanelPageFactory-> getLayout () -> getBlock ('catalog.leftnav') -> toHtml ();
Sushivam
13

Untuk membuat instance sebuah blok, Anda harus menggunakan \Magento\Framework\View\LayoutInterfacekelas dan createBlock()metodenya.

Dengan kelas pembantu Anda bisa melakukannya dengan kode ini:

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;

     }

}

Kemudian telepon $helper->getBlock()dari tempat yang Anda butuhkan.

LucScu
sumber