Mẫu Magento 2: Sử dụng `$ block` hoặc` $ this`?


27

Trong Magento 2, $thisbiến không còn tham chiếu đến đối tượng khối của mẫu. Nó đề cập đến một lớp mẫu

 Magento\Framework\View\TemplateEngine\Php

Tuy nhiên, lớp mẫu này có một __callphương thức thông qua

#File: vendor/magento/framework/View/TemplateEngine/Php.php
public function __call($method, $args)
{
    return call_user_func_array([$this->_currentBlock, $method], $args);
}

Mà đảm bảo bất kỳ cuộc gọi phương thức nào làm cho nó thông qua khối thực tế. Điều này cũng giải thích tại sao bạn không thể gọi các phương thức được bảo vệ từ các phtmlmẫu.

Ngoài ra, mặc dù vậy, mọi mẫu (tôi nghĩ?) Đều có một biến có tên là $blockpopated, cũng đề cập đến đối tượng khối cha. Bạn có thể thấy điều này được sử dụng trong mẫu danh sách của Magento

#File: vendor/magento/module-catalog/view/frontend/templates/product/list.phtml
//...
$_productCollection = $block->getLoadedProductCollection();

trong đó $blockbiến được sử dụng, nhưng không bao giờ được xác định rõ ràng.

Khác với sự khác biệt được đề cập ở trên, có sự khác biệt nào giữa việc sử dụng một kỹ thuật này so với kỹ thuật kia không? tức là làm cả hai $block$this->currentBlockđề cập đến cùng một đối tượng?

Câu trả lời:


32

Trong một tệp mẫu, $block$this->_currentBlocklà điều tương tự.

Hãy xem renderphương pháp trong Php.phpcông cụ mẫu.
Trước khi bao gồm tệp mẫu, điều này xảy ra: $this->_currentBlock = $block;sau đó tệp mẫu được bao gồm bằng cách sử dụng đơn giản include $fileName;.
Điều này có nghĩa là bên trong một mẫu bạn vẫn ở trong Phpcông cụ mẫu. Đó là lý do tại sao $thishoạt động, và đó là lý do tại sao $blockđược xác định.

[EDIT]
Tôi mới phát hiện ra rằng việc sử dụng các $thismẫu bên trong không được khuyến khích.
Trình thám thính php với các tiêu chuẩn EcgM2 hiển thị cảnh báo khi sử dụng các $thismẫu bên trong.
Thay thế $thisbằng $blocklàm cho cảnh báo đi.


Vì vậy, đối tượng mặc định trong tệp .phtml $ block hoặc $ this.
Manish Goswami

Bạn có ý nghĩa gì theo mặc định?
Marius

Biến mặc định được sử dụng trong mẫu để truy cập lớp kết xuất của mẫu là gì? Có sự khác biệt nào giữa hai chức năng này để truy cập không?
Manish Goswami

Nó nói trong câu trả lời ny. Cả hai đều hoạt động nhưng nên sử dụng$block
Marius

5

Theo như tôi đã thấy cả hai đều gần giống nhau trong PHP TemplateEngineInterface, nhưng hãy nhớ rằng trong Magento2 bạn có thể tạo các công cụ mẫu tùy chỉnh. Không giống như Magento1 mà bạn vừa có tệp phtml.

Nếu bạn thấy TemplateEngineInterfacebạn không thể thấy bất kỳ tham chiếu nào đến bất kỳ phương thức nào gọi currentBlock, vì vậy tôi nghĩ $this->currentBlockcách tiếp cận này là cụ thể cho mẫu PHP.

Nhưng để độc lập với công cụ mẫu, $blocknên là cách tiếp cận chính xác.

Ý tôi là, từ quan điểm lý thuyết, bạn có thể tạo một công cụ dựa trên PHP khác không thể dựa vào các tệp phtml, nhưng có thể dựa trên một số cấu trúc PHP khác.

Tôi giả sử $blocklà cách "đúng" cho chế độ "phtml" vì nó được truyền rõ ràng dưới dạng biến ngữ cảnh.

$block$this->currentBlockgiống nhau từ quan điểm kỹ thuật, nhưng nếu chúng được sử dụng rõ ràng $blocktôi nghĩ chúng ta nên sử dụng nó, từ quan điểm kiểu dáng mã.


Nhưng cũng không phải là một phần $ của giao diện. Tôi muốn nói rằng sẽ an toàn khi cho rằng việc triển khai này được sử dụng khi bạn ở trong tệp phtml. Các triển khai khác sẽ không sử dụng tệp phtml.
Fabian Schmengler

Bạn nói đúng, tôi đã không rõ ràng trong câu trả lời của mình để giải thích ý của tôi. Tôi đã sửa đổi bài viết của tôi với nhiều chi tiết hơn.
Phoenix128_RiccardoT
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.