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_Theme
dan Magento_Search
.
Dari apa yang saya mengerti saya harus mulai dengan etc/di.xml
file 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.php
file 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 etc
dan Block
di 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/generation
dan 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>
sumber
ul
untuk mengonfirmasi bahwa saya telah berhasil menimpa kelas Topmenu.Jawaban:
Timpa blok:
Buat modul Anda sendiri di bawah
app/code
folder.Kita dapat menggunakan
preference
untuk mengganti kelas di Magento 2.app / code / Vendor / Module / etc / di.xml
app / kode / Vendor / Modul / Blok / Html / Topmenu.php
Solusi sementara:
Saat ini, tampaknya langkah-langkah di atas tidak dapat menimpa blok sepenuhnya. Kita perlu membuat tema khusus baru. Dan kemudian, buat
default.xml
file:app / design / frontend / Vendor / Theme / Magento_Theme / layout / default.xml
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
2) Tetapkan template melalui Xml:
Sebagai contoh:
app / code / Vendor / Module / view / frontend / layout / checkout_cart_index.xml
Ingatlah untuk membuat
registration.php
danmodule.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/frontend
berisi:--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
sumber
Untuk mengganti katalog produk ListProduct block.
1) Buat file di.xml di Folder
Vendor/Module/etc
2) Buat file Block ListProduct.php di Folder
Vendor/Module/Block/Rewrite/Product
Untuk mengganti model produk katalog.
1) Tambahkan preferensi dalam di.xml sebelumnya
2) Buat file Model Product.php di Folder
Vendor/Module/Model/Rewrite/Catalog
Untuk Pengontrol Overriding
1) Tambahkan preferensi dalam di.xml
2) Buat file View.php Controller di
Vendor/Module/Controller/Rewrite/Product
Anda dapat mengganti blok, model, dan pengontrol lainnya menggunakan pendekatan yang sama.
sumber
Untuk mengganti kelas Anda harus membuat modul di mana Anda dapat menambahkan
etc/di.xml
danBlock/Html/Topmenu.php
file (kode di atas diposting oleh Anda)di mana Namespace adalah nama vendor Anda dan Module adalah nama modul Anda. Sebagai contoh: Magento adalah Namespace dan Tema adalah nama Modul.
Untuk info lebih lanjut tentang cara membuat modul, http://devdocs.magento.com/guides/v2.1/extension-dev-guide/build/module-file-structure.html#module-file-structure
sumber
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 ..
sumber