วิธีการแทนที่บล็อกใน v2.1


14

ฉันพยายามที่จะแทนที่บล็อก Topmenu ใน Magento 2.1 แต่ไม่สามารถหาคำแนะนำได้ ทุกสิ่งที่ฉันพบในที่นี้และที่อื่น ๆ ดูเหมือนว่าจะใช้เฉพาะกับเวอร์ชัน 2.0 ซึ่งดูเหมือนว่าจะใช้โครงสร้างโฟลเดอร์ที่แตกต่างกันหรือมีตัวอย่างโค้ดบางส่วนเท่านั้นซึ่งคาดว่าฉันจะรู้บริบทที่เหมาะสมของพวกเขาแล้ว

app/design/frontend/Vendor/theme_nameโครงสร้างโฟลเดอร์ของฉันปัจจุบันสำหรับธีมที่กำหนดเองคือ ภายในนี้ฉันมีการลงทะเบียนธีมและไฟล์แต่งเพลงเช่นเดียวกับโฟลเดอร์สำหรับโมดูลต่างๆเช่นและMagento_ThemeMagento_Search

จากสิ่งที่ฉันเข้าใจฉันต้องเริ่มต้นด้วยetc/di.xmlไฟล์เช่นด้านล่างแก้ไขจากที่นี่ :

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
  <preference for="Magento\Theme\Block\Html\Topmenu" type="[Namespace]\[Module]\Block\Html\Topmenu" />
</config>

ฉันยังเข้าใจว่าขั้นตอนต่อไปคือการเพิ่มBlock/Html/Topmenu.phpไฟล์เช่นด้านล่าง (แก้ไขอีกครั้งจากแหล่งที่มาด้านบน):

namespace [Namespace]\[Module]\Block\Html;

class Topmenu extends \Magento\Theme\Block\Html\Topmenu
{

  protected function _addSubMenu($child, $childLevel, $childrenWrapClass, $limit)
  {

  }

}

อย่างไรก็ตามมันไม่ชัดเจนสำหรับฉันสิ่งที่ฉันควรใช้สำหรับ[Namespace]และ[Module]หรือที่จะวางไฟล์เหล่านี้ ฉันได้ลองใช้ผู้ขายและชื่อชุดรูปแบบและการวางetcและBlockโฟลเดอร์ในapp/design/frontend/Vendor/theme_nameรวมถึงการapp/design/frontend/Vendor/theme_name/Magento_Themeแก้ไขการตั้งค่าเนมสเปซVendor\theme_name\Magento_Theme\Block\Htmlแต่ไม่มีผลใด ๆ

หากใครสามารถช่วยอธิบายสิ่งที่ฉันต้องทำเพื่อแทนที่บล็อก Topmenu (และโดยการอนุมานบล็อกอื่น ๆ ) ในเวอร์ชัน 2.1 ฉันจะได้รับการชื่นชมมาก

ภาคผนวก

ฉันได้ลองคำตอบของKhoa TruongDinh แล้วแต่มันก็ไม่มีผลอะไร ฉันใช้ไฟล์ต่อไปนี้:

app/code/Vendor/MagentoTheme/Block/Html/Topmenu.php

<?php

namespace Vendor\MagentoTheme\Block\Html;

class Topmenu extends \Magento\Theme\Block\Html\Topmenu
{

  protected function _addSubMenu($child, $childLevel, $childrenWrapClass, $limit)
  {

    $html = '';

    if (!$child->hasChildren())
    {
      return $html;
    }

    $colStops = null;

    if ($childLevel == 0 && $limit)
    {
      $colStops = $this->_columnBrake($child->getChildren(), $limit);
    }

    // Added "test" class to test
    $html .= '<ul class="level' . $childLevel . ' test submenu">';
    $html .= $this->_getHtml($child, $childrenWrapClass, $limit, $colStops);
    $html .= '</ul>';

    return $html;

  }

}

app/code/Vendor/MagentoTheme/composer.json

{
    "name": "vendor/magento-theme",
    "description": "",
    "require": {
        "php": "~5.5.0|~5.6.0|~7.0.0",
        "magento/framework": "100.0.*"
    },
    "type": "magento2-module",
    "version": "100.0.1",
    "license": [
        "OSL-3.0",
        "AFL-3.0"
    ],
    "autoload": {
        "files": [ "registration.php" ],
        "psr-4": {
            "Vendor\\MagentoTheme\\": ""
        }
    }
}

app/code/Vendor/MagentoTheme/etc/di.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
  <preference for="Magento\Theme\Block\Html\Topmenu" type="Vendor\MagentoTheme\Block\Html\Topmenu" />
</config>

app/code/Vendor/MagentoTheme/etc/module.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
    <module name="Vendor_MagentoTheme" setup_version="1.0.0"></module>
</config>

app/code/Vendor/MagentoTheme/registration.php

<?php

\Magento\Framework\Component\ComponentRegistrar::register(
  \Magento\Framework\Component\ComponentRegistrar::MODULE,
  'Vendor_MagentoTheme',
  __DIR__
);

ผมเคยเอาออกแล้วเนื้อหาของpub/static/frontend, var/generationและvar/view_preprocessedและล้างแคชวีโอไอพี เมนูย่อยไม่มีคลาส "ทดสอบ" ที่ต้องการเพิ่ม:

<ul class="level0 submenu ui-menu ui-widget ui-widget-content ui-corner-all" role="menu" aria-expanded="false" style="display: none; top: 52.6719px; left: 487.5px;" aria-hidden="true">...</ul>

คุณพยายามสร้างหมวดหมู่ย่อยหลายหมวดหมู่หรือไม่?
Khoa TruongDinh

ฉันไม่แน่ใจว่าคุณหมายถึงอะไร ในขณะนี้ฉันแค่พยายามเพิ่มคลาส "ทดสอบ" ลงในเมนูย่อยulเพื่อยืนยันว่าฉันได้สำเร็จในชั้นเรียน Topmenu แล้ว
MichaelRushton

คุณจะทำสิ่งนี้ได้อย่างไร คำแนะนำของฉันสามารถช่วยคุณได้อย่างไร
Khoa TruongDinh

ฉันทำตามคำแนะนำของคุณให้ดีที่สุด แต่ฉันก็เข้าใจไม่ได้ โมดูล Topmenu ที่กำหนดเองของฉันถูกละเว้นและพฤติกรรมเริ่มต้นกำลังถูกใช้
MichaelRushton

ฉันจะตรวจสอบอีกครั้งและให้ทางออกฉัน
Khoa TruongDinh

คำตอบ:


20

บล็อกแทนที่:

สร้างโมดูลของคุณเองภายใต้app/codeโฟลเดอร์
เราสามารถใช้preferenceแทนที่คลาสใน Magento 2

app / รหัส / ผู้ขาย / โมดูล / etc / di.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
  <preference for="Magento\Theme\Block\Html\Topmenu" type="Vendor\Module\Block\Html\Topmenu" />
</config>

app / รหัส / ผู้ขาย / โมดูล / บล็อก / html / Topmenu.php

<?php

namespace Vendor\Module\Block\Html;

class Topmenu extends \Magento\Theme\Block\Html\Topmenu
{

    protected function _addSubMenu($child, $childLevel, $childrenWrapClass, $limit)
    {

    }

}

วิธีแก้ปัญหาชั่วคราว:
ปัจจุบันดูเหมือนว่าขั้นตอนข้างต้นไม่สามารถแทนที่บล็อกได้อย่างสมบูรณ์ เราจำเป็นต้องสร้างธีมที่กำหนดเองใหม่ จากนั้นสร้างdefault.xmlไฟล์:

app / ออกแบบ / ส่วนหน้า / ผู้ขาย / ธีม / Magento_Theme / รูปแบบ / default.xml

<?xml version="1.0"?>

<page layout="3columns" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
    <update handle="default_head_blocks"/>
    <referenceBlock name="catalog.topnav" class="Vendor\Module\Block\Html\Topmenu" template="Magento_Theme::html/topmenu.phtml"/>
</page>

อาจเป็นข้อผิดพลาดของ Magento: เราถูกบังคับให้เขียนแม่แบบใน Magento2 เมื่อทำการเขียนบล็อกใหม่หรือไม่?

[แก้ไข]

1) เราสามารถตั้งค่าเทมเพลต:

app / รหัส / ผู้ขาย / โมดูล / บล็อก / html / Topmenu.php

public function setTemplate($template)
{
    return parent::setTemplate('Vendor_Module::custom-menu.phtml');
}

2) ตั้งค่าเทมเพลตผ่าน Xml:

ตัวอย่างเช่น:

app / รหัส / ผู้ขาย / โมดูล / view / ส่วนหน้า / รูปแบบ / checkout_cart_index.xml

<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="1column" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
    <body>
        <referenceBlock name="checkout.cart">
            <action method="setTemplate">
                <argument name="template" xsi:type="string">Magento_Checkout::cart.phtml</argument>
            </action>
        </referenceBlock>
    </body>
</page>

โปรดจำไว้ว่าการสร้างและregistration.phpmodule.xml

เราสร้างโมดูลใหม่เพราะเราเอาชนะคลาสของวีโอไอพี เมื่อเราต้องการที่จะแทนที่ระดับใด ๆ เราต้องสร้างโมดูลใหม่

ธีมที่กำหนดเองภายใต้app/design/frontendประกอบด้วย: -
เล
ย์
เอา
ต์ - เทมเพลต --js - แม่แบบ HTML (เทมเพลตที่น่าพิศวง)
--less, css
--etc ...

อ่านเพิ่มเติมที่นี่และที่นี่

แบบมาตรฐานและแบบแผนการตั้งชื่ออัตโนมัติ:

สำหรับ[Namespace]และ[Module]เราควรอ่านเพิ่มเติมได้ที่นี่:

http://www.php-fig.org/psr/psr-0/
http://www.php-fig.org/psr/psr-4/
http://alanstorm.com/magento_2_autoloader_and_class_generation


ขอบคุณ แต่ฉันไม่สามารถทำงานนี้ได้ ฉันได้แก้ไขความพยายามในคำถามของฉันเพื่อให้คุณสามารถดูว่าฉันผิดพลาดอย่างหลีกเลี่ยงไม่ได้
MichaelRushton

แม่แบบคืออะไร
MichaelRushton

ฉันปรับปรุงคำตอบของฉัน ดูเหมือนว่ามีข้อผิดพลาดของวีโอไอพี เราจำเป็นต้องสร้างธีมที่กำหนดเองใหม่ จากนั้นสร้างเค้าโครงเพื่อตั้งค่าคลาสอีกครั้ง
Khoa TruongDinh

ใช่มันใช้ได้ผล ขอบคุณมาก. วันหนึ่งเสียไปกับข้อผิดพลาด ...
MichaelRushton

ฉันต้องแทนที่ไฟล์บล็อกใน custom_account_create.xml ที่อยู่ในไฟล์ theme.xml ที่กำหนดเองของฉันอยู่ใน Magento_Customer folder.which default.xml ฉันต้องเปลี่ยน magento_theme หรือ magento_customer ?? ฉันไม่สามารถแทนที่ block.i โดยใช้ Magento2.1 ได้ ดีกว่าที่จะย้าย Magento 2.1.3 ??
vijay b

3

สำหรับแทนที่แคตตาล็อกผลิตภัณฑ์ ListProduct block

1)สร้างไฟล์di.xmlในโฟลเดอร์Vendor/Module/etc

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <preference for="Magento\Catalog\Model\Product" type="Vendor\Module\Model\Rewrite\Catalog\Product" />
</config>

2)สร้างไฟล์ListProduct.php Block ในโฟลเดอร์Vendor/Module/Block/Rewrite/Product

<?php
namespace Vendor\Module\Block\Rewrite\Product;

class ListProduct extends \Magento\Catalog\Block\Product\ListProduct
{
    public function _getProductCollection()
    {
        // Do your code here
    }
}

สำหรับแทนที่รุ่นผลิตภัณฑ์แค็ตตาล็อก

1)เพิ่มการตั้งค่าใน di.xml ก่อน

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <preference for="Magento\Catalog\Model\Product" type="Vendor\Module\Model\Rewrite\Catalog\Product" />
</config> 

2)สร้างไฟล์Product.php Model ในโฟลเดอร์Vendor/Module/Model/Rewrite/Catalog

<?php
namespace Vendor\Module\Model\Rewrite\Catalog;

class Product extends \Magento\Catalog\Model\Product
{
    public function isSalable()
    {
        // Do your code here

        return parent::isSalable();
    }

}

สำหรับตัวควบคุมที่เอาชนะ

1)เพิ่มการตั้งค่าในdi.xml

2)สร้างไฟล์View.php Controller ที่Vendor/Module/Controller/Rewrite/Product

class View extends \Magento\Catalog\Controller\Product\View
{
    public function execute()
    {
        // Do your stuff here
        return parent::execute();
    }
}

คุณสามารถลบล้างบล็อกรุ่นและคอนโทรลเลอร์อื่น ๆ ได้โดยใช้วิธีการเดียวกันนี้


ดูเหมือนว่าแทนที่ของคลาส \ Magento \ Catalog \ Block \ Product \ ListProduct ไม่ทำงาน (ใน Magento 2.2 อาจจะ?) อ้างอิงลิงค์ - github.com/magento/magento2/issues/13152
Aniruddha A Deshpande

0

ในการแทนที่ชั้นเรียนคุณต้องสร้างโมดูลที่คุณสามารถเพิ่มetc/di.xmlและBlock/Html/Topmenu.phpไฟล์ได้ (โค้ดด้านบนโพสต์โดยคุณ)

โดยที่Namespaceเป็นชื่อผู้จำหน่ายของคุณและModuleคือชื่อโมดูลของคุณ ตัวอย่างเช่น: วีโอไอพีคือ Namespace และธีมคือชื่อโมดูล

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีสร้างโมดูลhttp://devdocs.magento.com/guides/v2.1/extension-dev-guide/build/module-file-structure.html#module-file-structure


0

เนื่องจากข้อผิดพลาดนี้: https://github.com/magento/magento2/issues/3724คุณไม่สามารถตั้งค่าบล็อกคลาสได้

1) (ดีกว่า) สิ่งที่ใช้แทนได้คือใช้ปลั๊กอินสำหรับคลาสนั้นและเปลี่ยนสิ่งที่คุณต้องการ http://devdocs.magento.com/guides/v2.0/extension-dev-guide/plugins.html

2) หรือถ้าคุณต้องการทำแบบที่ต้องการจริงๆแล้วคุณต้องคัดลอกเทมเพลตจากคอร์ไปยังโมดูล / ธีมของคุณและอัปเดตด้วย xml เพื่อที่จะใช้เทมเพลตนั้นแทนมันจะเริ่มทำงานได้อย่างน่าอัศจรรย์ ..

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.