Chúng tôi có bị buộc phải viết lại một mẫu trong Magento2 khi viết lại một khối không?


8

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?


Không có thời gian để trả lời ngay bây giờ nhưng tôi khuyên bạn nên xem câu hỏi này và câu trả lời có thể giúp bạn hiểu khái niệm: magento.stackexchange.com/q/112749/2380
Raphael tại Digital Pianism

1
hấp dẫn. Mẫu vẫn có thể được tải từ mô-đun ban đầu nếu nó không có tiền tố 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
David Verholen

@RaphaelatDigitalPianism Cảm ơn. Chủ đề bạn liên kết là về plugin. Kịch bản của tôi là khác nhau.
mstojanov

Vâng, đó là những gì tôi đã tìm thấy một khi tôi hiểu vấn đề của bạn là gì. Chắc chắn âm thanh không đúng với tôi
Raphael tại Digital Pianism

Tôi đã tạo ra một vấn đề trên GitHub để giải quyết vấn đề này: github.com/magento/magento2/issues/4564 đang chờ câu trả lời từ nhóm nhà phát triển và sẽ thực hiện PR nếu nó kết thúc là một lỗi.
Raphael tại Pianism kỹ thuật số

Câu trả lời:


4

Vì có các cuộc thảo luận xung quanh giải pháp được đề xuất trong yêu cầu kéo ( https://github.com/magento/magento2/pull/1895 ), trong khi đó, bạn chỉ cần "ghim" mẫu gốc khi thay đổi tên lớp khối gốc:

<referenceBlock name="catalog.topnav" class="***" template="Magento_Theme::html/topmenu.phtml"/>

Đây là một gợi ý tốt, mặc dù đối với một số khối nhất định, nó sẽ không thực tế nhất vì nó được sử dụng trong rất nhiều bố cục ( Catalog\Block\Product\View). Tôi nghĩ đề xuất của OP vẫn là giải pháp tốt nhất cho trường hợp đó.
Erfan

3

bạn chỉ cần thêm một mã trong tệp này

app/design/frontend/chop/misty/Magento_Theme/layout/default.xml

với:

<referenceBlock name="catalog.topnav" class="Company_name\Override\Block\Html\Topmenu" template="Magento_Theme::html/topmenu.phtml"/>

và thêm mã dưới đây vào tên tệp mô-đun ghi đè của bạn:

app/code/Aims/Override/etc/di.xml

mã:

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/ObjectManager/etc/config.xsd">
    <preference for="Magento\Theme\Block\Html\Topmenu" type="Company_name\Override\Block\Html\Topmenu" />
    <preference for="Magento\Paypal\Model\Config" type="Company_name\Override\Model\Paypal\Config" />
</config>

Thêm Topmenu.phptệp trong Tệp: app/code/Company_name/Override/Block/Html/Topmenu.php bạn có thể thêm bất kỳ chức năng nào bạn muốn ghi đè.

Cảm ơ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.