Cara mengganti blok di v2.1

14

Saya mencoba untuk menimpa blok Topmenu di Magento 2.1 tetapi tidak dapat menemukan panduan untuk melakukannya. Semua yang saya temukan di sini dan di tempat lain tampaknya hanya berlaku untuk versi 2.0 yang tampaknya menggunakan struktur folder yang berbeda atau hanya memiliki contoh kode parsial yang mengharapkan saya sudah mengetahui konteks yang tepat (yang saya tidak tahu).

Struktur folder saya saat ini untuk tema khusus adalah app/design/frontend/Vendor/theme_name. Dalam hal ini saya memiliki file pendaftaran, tema, dan komposer serta folder untuk berbagai modul, misalnya Magento_Themedan Magento_Search.

Dari apa yang saya mengerti saya harus mulai dengan etc/di.xmlfile seperti di bawah ini, diedit dari sini :

<?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>

Saya juga mengerti bahwa langkah selanjutnya adalah menambahkan Block/Html/Topmenu.phpfile seperti di bawah ini (sekali lagi diedit dari sumber di atas):

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

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

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

  }

}

Namun, tidak jelas bagi saya untuk apa saya harus menggunakan [Namespace]dan [Module], atau di mana menempatkan file-file ini. Saya sudah mencoba menggunakan vendor dan nama tema, dan menempatkan folder etcdan Blockdi app/design/frontend/Vendor/theme_name, serta menempatkan mereka app/design/frontend/Vendor/theme_name/Magento_Theme, mengubah ruang nama Vendor\theme_name\Magento_Theme\Block\Html, tetapi tidak ada efek.

Kalau ada yang bisa membantu menjelaskan dengan tepat apa yang harus saya lakukan untuk mengganti blok Topmenu (dan dengan kesimpulan blok lain) di versi 2.1 saya akan sangat dihargai.

Tambahan

Saya sudah mencoba jawaban Khoa TruongDinh tetapi tidak berpengaruh. Saya telah menggunakan file-file berikut:

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__
);

Aku sudah kemudian dihapus isi pub/static/frontend, var/generationdan var/view_preprocessed, dan memerah cache Magento. Submenu tidak menambahkan kelas "tes" yang dimaksud:

<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>
MichaelRushton
sumber
Anda mencoba membuat multi sub kategori?
Khoa TruongDinh
Saya tidak yakin apa yang Anda maksud. Saat ini saya hanya mencoba menambahkan kelas "test" ke submenu uluntuk mengonfirmasi bahwa saya telah berhasil menimpa kelas Topmenu.
MichaelRushton
Bagaimana Anda bisa melakukan ini? Pemandu saya dapat membantu Anda?
Khoa TruongDinh
Saya mengikuti instruksi Anda sebaik yang saya mengerti tetapi tidak berhasil. Modul Topmenu khusus saya diabaikan dan perilaku default sedang digunakan.
MichaelRushton
Di akhir pekan, saya akan mengecek lagi dan memberi Anda solusi.
Khoa TruongDinh

Jawaban:

20

Timpa blok:

Buat modul Anda sendiri di bawah app/codefolder.
Kita dapat menggunakan preferenceuntuk mengganti kelas di Magento 2.

app / code / Vendor / Module / 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 / kode / Vendor / Modul / Blok / Html / Topmenu.php

<?php

namespace Vendor\Module\Block\Html;

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

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

    }

}

Solusi sementara:
Saat ini, tampaknya langkah-langkah di atas tidak dapat menimpa blok sepenuhnya. Kita perlu membuat tema khusus baru. Dan kemudian, buat default.xmlfile:

app / design / frontend / Vendor / Theme / Magento_Theme / layout / 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>

Ini mungkin bug Magento: Apakah kita dipaksa untuk menulis ulang templat di Magento2 saat menulis ulang blokir?

[EDIT]

1) Kita dapat mengatur templat:

app / kode / Vendor / Modul / Blok / Html / Topmenu.php

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

2) Tetapkan template melalui Xml:

Sebagai contoh:

app / code / Vendor / Module / view / frontend / layout / 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>

Ingatlah untuk membuat registration.phpdan module.xml.

Kami membuat modul baru karena kami menimpa kelas Magento. Ketika kita ingin mengganti kelas apa pun, kita harus membuat modul baru .

Tema khusus di bawah ini app/design/frontendberisi:
--layout
--templates
--js
--html templates (Templat Knockout)
--less, css
--etc ...

Baca lebih lanjut di sini dan di sini .

Standar pemberian nama dan konvensi penamaan otomatis:

Untuk [Namespace]dan [Module], kita harus membaca lebih lanjut di sini:

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

Khoa TruongDinh
sumber
Terima kasih, tetapi saya tidak bisa menyelesaikannya. Saya telah mengedit upaya saya menjadi pertanyaan saya sehingga Anda dapat melihat di mana kesalahan saya pasti terjadi.
MichaelRushton
Apa templatnya?
MichaelRushton
Saya memperbarui jawaban saya. Tampaknya ada bug Magento. Kita perlu membuat tema khusus baru. Dan kemudian, buat tata letak untuk mengatur kelas lagi.
Khoa TruongDinh
Ya, itu berhasil. Terima kasih banyak. Sehari terbuang untuk bug ...
MichaelRushton
saya harus mengganti file blok di custom_account_create.xml yang terletak di file theme.xml kustom saya di folder Magento_Customer.yang default.xml saya harus mengubah magento_theme atau magento_customer ?? saya tidak dapat menimpa block.i saya menggunakan Magento2.1 adalah lebih baik untuk memindahkan Magento 2.1.3 ??
vijay b
3

Untuk mengganti katalog produk ListProduct block.

1) Buat file di.xml di FolderVendor/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) Buat file Block ListProduct.php di FolderVendor/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
    }
}

Untuk mengganti model produk katalog.

1) Tambahkan preferensi dalam di.xml sebelumnya

<?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) Buat file Model Product.php di FolderVendor/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();
    }

}

Untuk Pengontrol Overriding

1) Tambahkan preferensi dalam di.xml

2) Buat file View.php Controller diVendor/Module/Controller/Rewrite/Product

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

Anda dapat mengganti blok, model, dan pengontrol lainnya menggunakan pendekatan yang sama.

Pangeran Patel
sumber
Sepertinya menimpa kelas \ Magento \ Katalog \ Blok \ Produk \ ListProduk tidak berfungsi (di Magento 2.2 Mungkin?), Rujuk
Aniruddha A Deshpande
0

Karena bug ini: https://github.com/magento/magento2/issues/3724 Anda tidak bisa hanya memilih blokir kelas.

1) (Lebih disukai) Yang berfungsi sebagai gantinya adalah menggunakan Plugin untuk kelas itu dan mengubah apa yang Anda butuhkan. http://devdocs.magento.com/guides/v2.0/extension-dev-guide/plugins.html

2) Atau jika Anda benar-benar ingin melakukan cara preferensi maka Anda juga perlu menyalin templat dari inti ke modul / tema Anda dan memperbarui dengan xml sehingga menggunakan templat itu, maka secara ajaib akan mulai bekerja ..

OZZIE
sumber