Cách khởi tạo một khối trong magento2


10

Có cách nào đơn giản như trong magento1 không:

 $crumbs = Mage::app()->getLayout->getBlock('breadcrumbs');


4
Một khối và một mô hình là hai điều khác nhau. Đây không phải là một bản sao.
pspahn

Các mô hình và khối của Rajeev K Tom hoàn toàn khác nhau
TheSeeker

Câu trả lời:


20

NGOÀI RA: TRẢ LỜI CÂU TRẢ LỜI CHO MAGENTO 2 ALPHA


Tôi ước rằng nó thật dễ dàng.
Nó phụ thuộc vào nơi bạn muốn khởi tạo nó từ.
Nếu bạn muốn tạo một cá thể từ bên trong một khối khác, hãy làm như thế này:

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

Từ bên trong bộ điều khiển làm điều này:

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

Từ bên trong một mô hình:

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

nhưng ở đây có một cái bẫy
bạn phải tạo một thành viên được bảo vệ trên mô hình được gọi là_blockFactory và thêm một thể hiện của \Magento\Framework\View\Element\BlockFactoryhàm tạo và gán nó cho var thành viên đó.

Một cái gì đó như thế này:

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

Để khởi tạo một khối từ bên trong một trình trợ giúp, nó hoạt động tương tự như đối với mô hình


càng đơn giản càng tốt
Matoeil

@Marius $ toplink = $ this-> getLayout () -> getBlock ('top.links') -> toHtml (); sử dụng trong magento 1 cho magento 2 $ this -> _ view-> getLayout () -> getBlock (Full \ Block \ Class \ Name \ Here ') -> toHtml (); điều này đưa ra một lỗi như thế này Lỗi nghiêm trọng: Gọi hàm thành viên toHtml () trên một đối tượng không phải làm thế nào tôi có thể nhận được toHtml ()?
ND17

nếu bạn ở trong bộ điều khiển, bạn không cần tiêm bất cứ thứ gì cho _view. Nó nên có sẵn theo mặc định, mặc dù tôi nghĩ rằng nó không dùng nữa. Tôi đã viết câu trả lời này 1,5 năm trước
Marius

1
@SachinS. Bạn không nên sử dụng nó nữa. _viewbây giờ không được dùng nữa trong bộ điều khiển và nó sẽ sớm biến mất,
Marius

1
Tôi có thể gọi bằng cách sử dụng đối tượng pagefactory như thế này? $ viewPanelPageFactory = $ this-> resultPageFactory-> create (); $ viewPanel = $ viewPanelPageFactory-> getLayout () -> getBlock ('catalog.leftnav') -> toHtml ();
Sushivam

13

Để khởi tạo một khối bạn phải sử dụng \Magento\Framework\View\LayoutInterface lớp và createBlock()phương thức của nó .

Với một lớp trợ giúp bạn có thể làm điều đó với mã này:

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;

     }

}

Sau đó gọi $helper->getBlock()từ nơi bạn cần.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.