V2.1'de bloklar nasıl geçersiz kılınır


14

Magento 2.1 Topmenu blok geçersiz kılmaya çalışıyorum ama bunu yapmak için herhangi bir kılavuz bulamıyorum. Burada ve başka yerlerde bulduğum her şey ya sadece farklı bir klasör yapısı kullanıyor gibi görünen 2.0 sürümü için geçerli gibi görünüyor ya da sadece uygun bağlamı (bilmiyorum) zaten bilmemi beklediğim kısmi kod örnekleri vardır.

Özel tema için geçerli klasör yapım app/design/frontend/Vendor/theme_name. Bu kayıt, tema ve besteci dosyaları yanı sıra çeşitli modüller için klasörleri var, örneğin Magento_Themeve Magento_Search.

Ben bir ile başlamak gerekir anladığım etc/di.xmldüzenlenebilir aşağıda gibi dosyada, burada :

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

Ayrıca bir sonraki adım Block/Html/Topmenu.phpaşağıdaki gibi bir dosya eklemek olduğunu anlamak (yine yukarıdaki kaynaktan düzenlenmiş):

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

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

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

  }

}

Ancak, ne için kullanmam gerektiği [Namespace]ve [Module]bu dosyaları nereye yerleştireceğim açık değil . Ben satıcı ve tema adı kullanarak ve etcve Blockklasörleri app/design/frontend/Vendor/theme_nameyerleştirerek yanı sıra app/design/frontend/Vendor/theme_name/Magento_Theme, ad alanlarını değiştirerek yerleştirmeyi denedim Vendor\theme_name\Magento_Theme\Block\Html, ama hiçbir etkisi yoktur.

Herkes 2.1 sürümünde Topmenu bloğunu geçersiz kılmak (ve başka bir blok çıkarım) tam olarak ne yapmam gerektiğini açıklamak yardımcı olabilir, ben çok takdir edilecektir.

ek

Ben teşebbüs ettik Khoa TruongDinh cevabını ancak etkileyecek hiçbir etti. Aşağıdaki dosyaları kullandım:

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

Sonra içeriğini kaldırdık pub/static/frontend, var/generationve var/view_preprocessed, ve Magento önbellek kızardı. Alt menüde amaçlanan "test" sınıfı eklenmemiştir:

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

Çoklu alt kategoriler oluşturmaya çalıştınız mı?
Khoa TruongDinh

Neyi kastettiğinden emin değilim. Şu anda ulTopmenu sınıfını başarıyla geçersiz kıldığımı doğrulamak için alt menüye bir "test" sınıfı eklemeye çalışıyorum .
MichaelRushton

Bunu nasıl yapabilirsiniz? Rehberim size yardımcı olabilir mi?
Khoa TruongDinh

Talimatlarını anladığım kadar iyi takip ettim ama işe yaramadı. Özel Topmenu modülüm yok sayıldı ve varsayılan davranış kullanılıyor.
MichaelRushton

Hafta sonu tekrar kontrol edip size çözümümü sunacağım.
Khoa TruongDinh

Yanıtlar:


20

Bloğu geçersiz kıl:

app/codeKlasör altında kendi modülünüzü oluşturun . Magento 2'deki sınıfı geçersiz kılmak için
kullanabiliriz preference.

Uygulamanın / kod / Satıcı / Modül / 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>

Uygulamanın / kod / Satıcı / Modül / 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)
    {

    }

}

Geçici çözüm:
Şu anda, yukarıdaki adımların bloğu tamamen geçersiz kılamayacağı görülüyor. Yeni özel tema oluşturmamız gerekiyor. Ve sonra default.xmldosyayı oluşturun :

Uygulamanın / tasarım / kullanıcı arayüzü / Vendor / Oyun / Magento_Theme / düzeni / 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>

Bu bir Magento hatası olabilir: Bir bloğu yeniden yazarken Magento2'de bir şablonu yeniden yazmak zorunda mıyız?

[DÜZENLE]

1) şablonu ayarlayabilirsiniz:

Uygulamanın / kod / Satıcı / Modül / Blok / Html / Topmenu.php

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

2) Şablonu Xml ile ayarlayın:

Örneğin:

Uygulamanın / kod / Satıcı / Modül / görünüm / kullanıcı arayüzü / düzeni / 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>

Oluşturmayı unutmayın registration.phpve module.xml.

Yeni modülü yaratıyoruz çünkü Magento sınıfını geçersiz kılıyoruz. Herhangi bir sınıfı geçersiz kılmak istediğimizde, yeni modül oluşturmamız gerekir .

Altındaki özel tema şunlarıapp/design/frontend içerir:
--layout
--templates
--js
--html şablonları (Nakavt şablonları)
--less, css
--etc ...

Burada ve burada daha fazla bilgi edinin .

Otomatik yükleme standardı ve adlandırma kuralı:

İçin [Namespace]ve [Module]biz burada daha fazla okumalısınız:

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


Teşekkürler, ama işe yaramadı. Kaçınılmaz olarak nerede yanlış gittiğimi görebilmeniz için sorumu girişimimde düzenledim.
MichaelRushton

Şablon nedir?
MichaelRushton

Cevabımı güncelledim. Görünüşe göre bir Magento böceği var. Yeni özel tema oluşturmamız gerekiyor. Ardından, sınıfı yeniden ayarlamak için mizanpaj oluşturun.
Khoa TruongDinh

Evet, işe yaradı. Çok teşekkür ederim. Bir gün bir böcek üzerinde boşa ...
MichaelRushton

Özel tema.xml dosyasında Magento_Customer klasöründe bulunan custom_account_create.xml'deki blok dosyasını geçersiz kılmak zorundayım. default.xml magento_theme veya magento_customer'ı değiştirmek zorunda mıyım? Magento 2.1.3 taşımak daha iyi ??
vijay b

3

Geçersiz kılmak için katalog ürün ListProduct bloğu.

1) Klasörde di.xml dosyası oluşturunVendor/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) Klasörde ListProduct.php Block dosyası oluşturunVendor/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
    }
}

Katalog ürün modelini geçersiz kılmak için.

1) Daha önce di.xml olarak tercih ekleyin

<?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) Klasörde Product.php Model dosyası oluşturunVendor/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();
    }

}

Geçersiz Kılma Denetleyicisi için

1) di.xml'de tercih ekleyin

2) adresinde View.php Denetleyici dosyası oluşturunVendor/Module/Controller/Rewrite/Product

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

Aynı yaklaşımı kullanarak diğer blok, model ve denetleyicileri geçersiz kılabilirsiniz.


\ Magento \ Catalogue \ Block \ Product \ List sınıfının geçersiz kılınması gibi görünüyor (Magento 2.2'de olabilir mi?), Bkz. Bağlantı - github.com/magento/magento2/issues/13152
Aniruddha A Deshpande


0

Bu hata nedeniyle: https://github.com/magento/magento2/issues/3724 sadece sınıfları tercih edemezsiniz.

1) (Tercih edilir) Bunun yerine, bu sınıf için bir Eklenti kullanmak ve ihtiyacınız olanı değiştirmek. http://devdocs.magento.com/guides/v2.0/extension-dev-guide/plugins.html

2) Ya da gerçekten tercih yolunu yapmak istiyorsanız, o zaman şablonu çekirdekten modülünüze / temanıza kopyalamanız ve bunun yerine bu şablonu kullanan xml ile güncellemeniz gerekir, o zaman sihirli çalışmaya başlayacaktır ..

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.