v2.1でブロックをオーバーライドする方法


14

Magento 2.1のTopmenuブロックをオーバーライドしようとしていますが、そのためのガイドが見つかりません。私がここや他の場所で見つけたものはすべて、異なるフォルダ構造を使用しているように見えるバージョン2.0にのみ適用されるようです。

カスタムテーマの現在のフォルダー構造はapp/design/frontend/Vendor/theme_nameです。この中に、登録、テーマ、および作曲家のファイルと、さまざまなモジュールのフォルダー(例:Magento_Themeおよび)がありMagento_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]、あるいはどここれらのファイルを配置します。私は、ベンダーとテーマ名を使用してみました、と置いてきたetcBlockのフォルダをapp/design/frontend/Vendor/theme_name、同様にそれらを置くことapp/design/frontend/Vendor/theme_name/Magento_Theme、に名前空間を修正Vendor\theme_name\Magento_Theme\Block\Htmlしますが、効果がありませんどちらも。

バージョン2.1でTopmenuブロックをオーバーライドするために(および他のブロックを推論するために)私が何をする必要があるかを正確に説明できる人がいれば幸いです。

補遺

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/frontendvar/generationvar/view_preprocessed、とMagentoのキャッシュをフラッシュしました。サブメニューには、意図した「テスト」クラスが追加されていません。

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

複数のサブカテゴリを作成しようとしましたか?
コアトゥオンディン16

どういう意味かわかりません。現時点では、サブメニューulに「テスト」クラスを追加して、Topmenuクラスを正常にオーバーライドしたことを確認しようとしています。
マイケルラッシュトン

どうすればこれができますか?私のガイドはあなたを助けることができますか?
コアトルオンディン16

私が理解した限りではあなたの指示に従いましたが、うまくいきませんでした。カスタムTopmenuモジュールは無視され、デフォルトの動作が使用されています。
マイケルラッシュトン

週末に、もう一度確認し、解決策を提供します。
コアTruongDinh 16

回答:


20

オーバーライドブロック:

app/codeフォルダーの下に独自のモジュールを作成します。Magento 2でクラスをオーバーライド
するために使用できますpreference

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 / code / Vendor / Module / Block / 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 / 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>

Magentoのバグの可能性があります。ブロックを書き換えるときに、Magento2でテンプレートを書き換える必要がありますか?

[編集]

1)テンプレートを設定できます:

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

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

2)Xmlを介してテンプレートを設定します。

例えば:

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>

とを作成することregistration.phpを忘れないでくださいmodule.xml

Magentoのクラスをオーバーライドしているため、新しいモジュールを作成します。クラスをオーバーライドするには、新しいモジュールを作成する必要があります

カスタムテーマには以下app/design/frontendが含まれます:--
layout
--templates
--js
--html templates(Knockout templates)--
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

テンプレートは何ですか?
マイケルラッシュトン

回答を更新しました。Magentoのバグがあるようです。新しいカスタムテーマを作成する必要があります。そして、レイアウトを作成してクラスを再度設定します。
コアTruongDinh 16

はい、うまくいきました。どうもありがとうございました。バグで1日が無駄に
...-MichaelRushton

カスタムtheme.xmlファイルにあるcustom_account_create.xmlのブロックファイルをオーバーライドする必要があります。Magento_Customerフォルダーにあります。default.xmlのmagento_themeまたはmagento_customerを変更する必要がありますか。block.iをオーバーライドできません。 Magento 2.1.3を移動する方が良いですか??
vijay b

3

カタログ製品のListProductブロックをオーバーライドします。

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ブロックファイルを作成します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モデルファイルを作成する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.xmland Block/Html/Topmenu.phpファイル(自分が投稿したコードの上)を追加できるモジュールを作成する必要があります

どこ名前空間には、ベンダー名、モジュールは、あなたのモジュール名です。例:Magentoは名前空間で、テーマはモジュール名です。

モジュールの作成方法の詳細については、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.