Câu hỏi này là về việc tuân theo các thực hành tốt nhất của Magento2.
Tôi đã phải viết lại phương thức \ Magento \ Theme \ Block \ Html \ Topmenu :: _ addSubMothy () để thêm một số hàm bao quanh các phần tử. Bây giờ, vì đó là một phương pháp được bảo vệ, nên tôi hiểu rằng tôi phải sử dụng tính năng ưu tiên:
<preference for="Magento\Theme\Block\Html\Topmenu" type="MyCompany\Theme\Block\Html\Topmenu" />
và thêm một lớp với các bài viết của tôi:
<?php
namespace MyCompany\Theme\Block\Html;
class Topmenu extends \Magento\Theme\Block\Html\Topmenu
{
protected function _addSubMenu($child, $childLevel, $childrenWrapClass, $limit)
{
// my stuff
}
}
Mặc dù lớp mặc định đã được viết lại, nhưng trên trang tiếp theo tải lại tôi đã gặp lỗi sau:
main.CRITICS: Tệp mẫu không hợp lệ: 'html / topmenu.phtml' trong mô-đun: 'MyCompany_Theme' tên của khối: 'catalog.topnav' [] []
Magento đang cố gắng tìm html / topmenu.phtml trong phần mở rộng của tôi chứ không phải dưới Magento_Theme. Tôi hiểu rằng đây là hành vi đúng, nhưng tôi đã suy nghĩ về các khía cạnh thực tế của việc này. Điều này có nghĩa là bất cứ khi nào chúng ta viết lại một khối, chúng ta cũng cần phải viết lại mẫu của nó, ngay cả khi chúng ta không nhất thiết phải chạm vào bất cứ thứ gì liên quan đến HTML?
Một cách để làm điều này là viết lại phương thức _toHtml (), như thế này:
protected function _toHtml()
{
$this->setModuleName($this->extractModuleName('Magento\Theme\Block\Html\Topmenu'));
return parent::_toHtml();
}
Bây giờ, Magento đang xem xét mô-đun Magento_Theme cho tệp mẫu một lần nữa. Nhưng, điều này có vẻ như một hack đối với tôi.
Vì vậy, câu hỏi của tôi là: một khuyến nghị trong tình huống này là gì? Chúng ta có nên luôn sao chép mẫu có liên quan khi viết lại lớp khối hay cách giải quyết không? Có một cách tiếp cận tốt hơn cho điều này?
Magento_Theme::
, nhưng chúng không github.com/magento/magento2/blob/develop/app/code/Magento/Theme/ . Bây giờ tôi thực sự tự hỏi liệu đây có phải là về mục đích