Magento2:製品ページのタブの順序を変更する


15

Magento 2の製品ページのタブの順序を変更しようとしています。デフォルトはDetails|More Information|Reviewsです。

私は試した:

ベンダー/テーマ/Magento_Catalog/layout/catalog_product_view.xml

<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
    <body>
        <move element="product.info.description" destination="product.info.details" after="-" />
    </body>
</page>

しかし、それは機能せず、要素を移動するための推奨される方法です。タブをタブ領域から他の領域に移動したり、新しいタブを追加したりできましたが、タブの順序を制御することはできません。

私の推測では、それは何か関係があると思いgroup="detailed_info"ます。MagentoはXMLでこの属性を持つレイアウト要素を取得し、それをループしてタブを作成しているようです。

モジュールを書き換えずにタブの順序を変更する方法はありますか?


これに対する答えを見つけましたか?私は同じ問題を抱えています。
アレックス

まだ答えがありません、ごめんなさい。
-andyjv

move要素を使用してみましたが、あなたと同じ結論に達しました。タブの外に移動できますが、タブ内で順序付けすることはできません。
ベン・クルック

それは、ちょっとしたトリックだけでレイアウトによって行うことができます。ここに示す:magento.stackexchange.com/questions/106412/...
skymeissner

@andyjvはここで解決策を見つけてください。これはあなたが望む出力を達成するのに役立つかもしれません。magento.stackexchange.com/a/242709/52244
Kanhaiya

回答:


22

私のアプローチは少し異なりますが、おそらく新しいタブを後で追加し、これらのタブの優先順位/順序を変更する場合に備えて、より将来性があるかもしれません。

テーマXMLファイルのXMLファイルを介して各タブの引数を渡しました

...
<arguments>
    <argument name="priority" xsi:type="string">REPLACE WITH SOME NUMBER</argument>
</arguments>
...

したがって、私のテーマのXMLファイルは次のようになります。

<referenceBlock name="product.info.details">
        <referenceBlock name="product.info.description">
            <arguments>
                <argument name="priority" xsi:type="string">1</argument>
            </arguments>
        </referenceBlock>
        <referenceBlock name="product.attributes">
            <arguments>
                <argument name="priority" xsi:type="string">3</argument>
            </arguments>
        </referenceBlock>
        <referenceBlock name="reviews.tab">
            <arguments>
                <argument name="priority" xsi:type="string">4</argument>
            </arguments>
        </referenceBlock>
        <!-- MY OWN CUSTOM BLOCK ON THE SECOND POSITION -->
        <block class="Magento\Catalog\Block\Product\View\Description" name="product.features" as="features" template="product/view/features.phtml" group="detailed_info">
            <arguments>
                <argument translate="true" name="title" xsi:type="string">Features</argument>
                <argument name="priority" xsi:type="string">2</argument>
            </arguments>
        </block>
        <!-- MY OWN CUSTOM BLOCK ENDS HERE -->
    </referenceBlock>

さらに、より多くの我々は調整する必要がありdetails.phtmlそうからそれをコピーし、

<magento_root>/vendor/magento-catalog-view/frontend/templates/product/view/details.phtml

<magento_root>/app/design/frontend/<Vendor>/<theme>/Magento_Catalog/templates/product/view/details.phtml

magento自体details.phtmlは将来のMagentoバージョンまたはパッチで変更される可能性があることに注意してください。これらの変更は、テーマのdetails.phtml

ここで、XMLファイルを介して渡した優先順位を取得する必要があります。

<?php
/**
 * Copyright © 2016 Magento. All rights reserved.
 * See COPYING.txt for license details.
 */

// @codingStandardsIgnoreFile

?>
<?php if ($detailedInfoGroup = $block->getGroupChildNames('detailed_info', 'getChildHtml')):?>
    <div class="product info detailed">
        <?php $layout = $block->getLayout(); ?>
        <?php
            # We create a new array;
            $newPriority = array();
            # forEach the original $detailedInfoGroup Array;
            foreach ($detailedInfoGroup as $name){
                $alias = $layout->getElementAlias($name);
                # Get the priority which we applied via xml file
                # If no priority is applied via xml file then just set it to 10
                $priority = $block->getChildData($alias,'priority') ? $block->getChildData($alias,'priority') : '10';
                # variables pushed into new two-dimensional array
                array_push($newPriority, array($name, $priority));
            }
            # Sort array by priority
            usort($newPriority, function($a, $b) {
                return $a['1'] <=> $b['1'];
            });
        ?>
        <div class="product data items" data-mage-init='{"tabs":{"openedState":"active"}}'>
            <?php
            # Delete the original forEach statement
            #foreach ($detailedInfoGroup as $name)
            foreach ($newPriority as $name):?>
                <?php
                    # rename $name[0] to $name because it's a two-dimensional array
                    # No further changes to this file, it works as explained
                    $name = $name[0];
                    $html = $layout->renderElement($name);
                    if (!trim($html)) {
                        continue;
                    }
                    $alias = $layout->getElementAlias($name);
                    $label = $block->getChildData($alias, 'title');
                ?>
                <div class="data item title"
                     aria-labeledby="tab-label-<?php /* @escapeNotVerified */ echo $alias;?>-title"
                     data-role="collapsible" id="tab-label-<?php /* @escapeNotVerified */ echo $alias;?>">
                    <a class="data switch"
                       tabindex="-1"
                       data-toggle="switch"
                       href="#<?php /* @escapeNotVerified */ echo $alias; ?>"
                       id="tab-label-<?php /* @escapeNotVerified */ echo $alias;?>-title">
                        <?php /* @escapeNotVerified */ echo $label; ?>
                    </a>
                </div>
                <div class="data item content" id="<?php /* @escapeNotVerified */ echo $alias; ?>" data-role="content">
                    <?php /* @escapeNotVerified */ echo $html; ?>
                </div>
            <?php endforeach;?>
        </div>
    </div>
<?php endif; ?>

数行を追加するだけで、xmlファイルを介してタブの優先度/順序をいつでも変更できdetails.phtmlます。今後変更する必要はありません。


[詳細]タブの下部にある[詳細]タブのコンテンツを表示するにはどうすればよいですか?
ジャイ

あなたの質問は元の質問を参照していません。新しいチケットを開く必要があります。とにかく:テーマのcatalog_product_view.xml(例えばdescription-attributes-combined.phtml)で新しいphtmlファイルを参照し、元のdescrption.phtmlとattributes.phtmlからコンテンツを貼り付けることができます。
ジュハニックス

両方のファイルのコンテンツを1つに貼り付け、xmlファイルで次のように呼び出しました。<referenceBlock name = "product.info.details"> <block class = "Magento \ Catalog \ Block \ Product \ View \ Description" name = "product.info .description.attributes "template =" product / view / description-attributes-combined.phtml "group =" detailed_info "> <arguments> <argument translate =" true "name =" title "xsi:type =" string ">その他情報</ argument> </ arguments> </ block> </ referenceBlock>ただし、サイトは空白で、タブのコンテンツのみが表示されます。不足しているものは何ですか?
ジャイ

私はここで質問を追加しました:magento.stackexchange.com/q/157376/29175
ジャイ

@juhanixこれには、後のMagentoパッチで変更できるテンプレートをプルアップする必要があります。コアファイルを変更しない私の答えを参照してください。うまくいけば、これはパッチを当てることができるコアの問題です。
-LordZardeck

14

XML設定ファイルを使用して詳細ページでタブ移動の変化位置については、または前に、この場合の属性ではありません助け。

テンプレートファイルから変更する必要があります。

details.phtmlファイルをコアからテーマにコピーし、

app/design/frontend/Packagename/themename/Magento_Catalog/templates/product/view/details.phtml

このファイル内では、print_r($ detailedInfoGroup)を使用してすべてのタブ名を取得できます。を。

Array
(
    [0] => product.info.description
    [1] => product.attributes
    [2] => reviews.tab
)

ファイル内のforeachの前に、新しい配列で要件に従って設定する必要があります。

<?php $newOrderTabbing = array('product.info.description',,'reviews.tab','product.attributes'); //custom add ?>,

追加 <?php foreach ($newOrderTab as $name):?>

details.phtmlの完全なコードは以下のようなものです。

<?php
/**
 * Copyright © 2016 Magento. All rights reserved.
 * See COPYING.txt for license details.
 */

// @codingStandardsIgnoreFile

?>
<?php if ($detailedInfoGroup = $block->getGroupChildNames('detailed_info', 'getChildHtml')):?>
    <?php $newOrderTabbing = array('product.info.description','reviews.tab','product.attributes'); //custom added position ?>
    <div class="product info detailed">
        <?php $layout = $block->getLayout(); ?>
        <div class="product data items" data-mage-init='{"tabs":{"openedState":"active"}}'>
            <?php foreach ($newOrderTabbing as $name): //custom arrayname?>
                <?php
                    $html = $layout->renderElement($name);
                    if (!trim($html)) {
                        continue;
                    }
                    $alias = $layout->getElementAlias($name);
                    $label = $block->getChildData($alias, 'title');
                ?>
                <div class="data item title"
                     aria-labeledby="tab-label-<?php /* @escapeNotVerified */ echo $alias;?>-title"
                     data-role="collapsible" id="tab-label-<?php /* @escapeNotVerified */ echo $alias;?>">
                    <a class="data switch"
                       tabindex="-1"
                       data-toggle="switch"
                       href="#<?php /* @escapeNotVerified */ echo $alias; ?>"
                       id="tab-label-<?php /* @escapeNotVerified */ echo $alias;?>-title">
                        <?php /* @escapeNotVerified */ echo $label; ?>
                    </a>
                </div>
                <div class="data item content" id="<?php /* @escapeNotVerified */ echo $alias; ?>" data-role="content">
                    <?php /* @escapeNotVerified */ echo $html; ?>
                </div>
            <?php endforeach;?>
        </div>
    </div>
<?php endif; ?>

Rakesh Jesadiyaに感謝します、それは魅力のように働いています...!
サルファラージシパイ

13

Magento 2.3.1以降sort_orderでは、 " app/design/frontend/Packagename/themename/Magento_Catalog/layout/catalog_product_view.xml" xml configで引数を使用できます

<referenceBlock name="product.info.description">
    <arguments>
        <argument name="title" translate="true" xsi:type="string">Description</argument>
        <argument name="sort_order" xsi:type="string">20</argument>
    </arguments>
</referenceBlock>

また、テンプレートファイル内のメソッド " getGroupChildNames"を必ず更新getGroupSortedChildNamesしてください(オーバーライドする場合) " app/design/frontend/Packagename/themename/Magento_Catalog/templates/product/view/details.phtml"。

古い方法

<?php if ($detailedInfoGroup = $block->getGroupChildNames('detailed_info', 'getChildHtml')):?>

更新されたメソッド

<?php if ($detailedInfoGroup = $block->getGroupSortedChildNames('detailed_info', 'getChildHtml')):?>

オーバーライドしている場合 Magento\Catalog\Block\Product\View\Details.phpブロッククラス、ブロッククラスにもその更新されたメソッド " getGroupSortedChildNames" が必要です。


1
これは間違いなく2.3.1以降の正しい答えです。
-Geat

2.3.2で動作します、どうもありがとう!
ジャレッドチュー

3

ソート順引数を使用する別の方法。

ファイルパス - app\design\frontend\<companyNAme>\<ThemeName>\Magento_Catalog\layout\catalog_product_view.xml

product.info.details参照ブロックコンテナー内にソート順引数を追加します。

サンプルコード

<block class="Magento\Catalog\Block\Product\View" name="shipping_tab" template="Magento_Catalog::product/view/shipping.phtml" group="detailed_info" >
    <arguments>
    <argument translate="true" name="title" xsi:type="string">Shipping</argument>
    <argument name="sort_order" xsi:type="string">10</argument>
    </arguments>
</block>

並べ替え順序の引数の値を、注文に応じて10、20、30に変更します。


1
例と完璧な答えは、sort_order私にとって重要だった、1は私の一日行わ:)
SagarPPanchal

2

この質問には他にも答えがあったことは知っていますが、それらはすべて私の好みにはあまりにも侵襲的でした。問題を検討すると、Magentoは要素に個別の「グループ」属性を追加し、要素を並べ替えた子要素の配列を含む子配列とは完全に分離して、レイアウトに読み込まれた順序でその属性に子を追加します。これを修正するために、グループの子を取得する際のソートを修正するシンプルな周辺プラグインを作成しました。

class Structure
{
    /**
     * Re-orders the array of group children based on the sort order defined on the parent's children
     *
     * @param \Magento\Framework\Data\Structure $subject
     * @param callable $proceed
     * @param $parentId
     * @param $groupName
     * @return array
     */
    function aroundGetGroupChildNames( \Magento\Framework\Data\Structure $subject, callable $proceed, $parentId, $groupName )
    {
        $sortedList = [];

        // Go ahead and get all the children
        $groupChildNames = $proceed( $parentId, $groupName );

        // If there was no group children, just leave early
        if (empty( $groupChildNames ))
        {
            return $groupChildNames;
        }

        // Go through the order of the parent's children and if it's in the list of group children aggregated above,
        // add it to our own list
        foreach ($subject->getElement( $parentId )['children'] as $childId => $childAlias)
        {
            if (!in_array( $childId, $groupChildNames ))
            {
                continue;
            }

            array_push( $sortedList, $childId );
        }

        return $sortedList;
    }
}

これにより、レイアウトXMLの標準beforeafter属性を使用して、期待どおりにタブを並べることができ、今後のMagentoパッチで変更する必要はおそらくないでしょう。


勇敢で名誉あるLordZardeckは正しい答えを与えました。上記の回答のほとんどがそうであるように、テンプレートに非常に多くのロジックを追加することは、新しいmagentoバージョンに更新するときに問題を尋ねるだけです。
ネイサントゥームズ

2

あなたが選んだ順番で追加するだけでいいと思います。私にとって、私はこの順序で4つのタブを使用しています:

  1. 詳細
  2. 商品タグ
  3. カスタムタブ1
  4. カスタムタブ2

私のカスタムモジュールでは、次のレイアウトファイルを作成しました:このコンテンツでcatalog_product_view.xml:

<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
    <body>
        <referenceBlock name="product.info.details">
            <block class="Magento\Catalog\Block\Product\View" name="tab.tags" template="Godogi_Utilities::catalog/product/tab_tags.phtml" group="detailed_info" >
                <arguments>
                    <argument translate="true" name="title" xsi:type="string">Product Tags</argument>
                </arguments>
            </block>
            <block class="Magento\Catalog\Block\Product\View" name="tab.custom.tab.one" template="Godogi_Utilities::catalog/product/custom_tab_1.phtml" group="detailed_info" >
                <arguments>
                    <argument translate="true" name="title" xsi:type="string">Custom Tab 1</argument>
                </arguments>
            </block>
            <block class="Magento\Catalog\Block\Product\View" name="tab.custom.tab.n" template="Godogi_Utilities::catalog/product/custom_tab_n.phtml" group="detailed_info" >
                <arguments>
                    <argument translate="true" name="title" xsi:type="string">Custom Tab N</argument>
                </arguments>
            </block>
        </referenceBlock>
    </body>
</page>

詳細タブがすでに存在するため、3つのタブのみを追加したことがわかります。結果として、私はこの順序でタブを持っています:

  1. 商品タグ
  2. カスタムタブ1
  3. カスタムタブ2
  4. 詳細

これは私が望んでいたものではありませんが、これに対する私の解決策は、[詳細]タブも再度追加することですので、レイアウトファイルは次のようになります:

<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
    <body>
        <referenceBlock name="product.info.details">
            <block class="Magento\Catalog\Block\Product\View\Description" name="product.info.description" template="product/view/attribute.phtml" group="detailed_info">
                <arguments>
                    <argument name="at_call" xsi:type="string">getDescription</argument>
                    <argument name="at_code" xsi:type="string">description</argument>
                    <argument name="css_class" xsi:type="string">description</argument>
                    <argument name="at_label" xsi:type="string">none</argument>
                    <argument name="title" translate="true" xsi:type="string">Details</argument>
                </arguments>
            </block>
            <block class="Magento\Catalog\Block\Product\View" name="tab.tags" template="Godogi_Utilities::catalog/product/tab_tags.phtml" group="detailed_info" >
                <arguments>
                    <argument translate="true" name="title" xsi:type="string">Product Tags</argument>
                </arguments>
            </block>
            <block class="Magento\Catalog\Block\Product\View" name="tab.custom.tab.one" template="Godogi_Utilities::catalog/product/custom_tab_1.phtml" group="detailed_info" >
                <arguments>
                    <argument translate="true" name="title" xsi:type="string">Custom Tab 1</argument>
                </arguments>
            </block>
            <block class="Magento\Catalog\Block\Product\View" name="tab.custom.tab.n" template="Godogi_Utilities::catalog/product/custom_tab_n.phtml" group="detailed_info" >
                <arguments>
                    <argument translate="true" name="title" xsi:type="string">Custom Tab N</argument>
                </arguments>
            </block>
        </referenceBlock>
    </body>
</page>

今、私は欲しい順序があります:) ここに画像の説明を入力してください


1

私の意見では、最も簡単で最良の方法は、プラグインを使用したLordZardeckソリューションですvendor / module / etc / frontend / di.xmlを更新した後

    <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">

    ...

        <type name="Magento\Framework\Data\Structure">
            <plugin name="vendor_sort_tabs" type="Vendor\Module\Plugins\Structure" sortOrder="0"/>
        </type>

   ...

    </config>

すべてが望みどおりに機能しました。

@LordZardeckのきれいなコードに感謝します!


0

これが私が使用した解決策です。両方が使用可能な場合、説明と属性のタブを入れ替えます。これはUltimoテーマを使用しています。しかし、あなたはポイントを得るでしょう。接吻。

<?php 
$detailedInfoGroup = $block->getGroupChildNames('detailed_info', 'getChildHtml');

if ($detailedInfoGroup[0] == 'product.info.description' && $detailedInfoGroup[1] == 'product.attributes') {
    $detailedInfoGroup[0] = 'product.attributes';
    $detailedInfoGroup[1] = 'product.info.description';
}

// rest of the code to look through $detailedInfoGroup
?>

0

この問題に対する私の解決策は、テンプレートのdetails.phtmlを変更して、レイアウトから子ブロックを取得することです。

$blocks = $layout->getChildBlocks($block->getNameInLayout());

それをこのようにすれば、によって与えられた順序尊重した後 modificatorsを。

<?php
/**
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */

// @codingStandardsIgnoreFile

?>
<?php if ($detailedInfoGroup = $block->getGroupChildNames('detailed_info', 'getChildHtml')):?>
    <div class="product info detailed">
        <?php $layout = $block->getLayout(); ?>
        <?php $blocks = $layout->getChildBlocks($block->getNameInLayout());?>
        <div class="product data items" data-mage-init='{"tabs":{"openedState":"active"}}'>
            <?php foreach($blocks as $alias=>$child_block):?>
                <?php if(in_array($child_block->getNameInLayout(),$detailedInfoGroup)):?>
                    <?php
                        $html = $child_block->toHtml();
                        if (!trim($html)) {
                            continue;
                        }       
                        $label = $child_block->getData('title');
                    ?>
                    <div class="data item title"
                         aria-labeledby="tab-label-<?= /* @escapeNotVerified */ $alias ?>-title"
                         data-role="collapsible" id="tab-label-<?= /* @escapeNotVerified */ $alias ?>">
                        <a class="data switch"
                           tabindex="-1"
                           data-toggle="switch"
                           href="#<?= /* @escapeNotVerified */ $alias ?>"
                           id="tab-label-<?= /* @escapeNotVerified */ $alias ?>-title">
                            <?= /* @escapeNotVerified */ $label ?>
                        </a>
                    </div>
                    <div class="data item content" id="<?= /* @escapeNotVerified */ $alias ?>" data-role="content">
                        <?= /* @escapeNotVerified */ $html ?>
                    </div>
                <?php endif; ?>
            <?php endforeach;?>
        </div>
    </div>
<?php endif; ?>

ブロックがグループに属しているかどうかを検証するために、getGroupChildNamesが提供する配列を引き続き使用します。

if(in_array($child_block->getNameInLayout(),$detailedInfoGroup))


0

テーマで作業したくなかったので、「getGroupChildNames」メソッドの動作を変更したかった。このアプローチは、テンプレートが変更された場合でも機能するはずです。

これをcatalog_product_view.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>
    <!-- CODE TO REORDER PRODUCT TABS -->
    <block class="Dsy\Ton\Block\Product\View\Description" name="product.info.details.new" template="Magento_Catalog::product/view/details.phtml">
        <!-- ADD MORE BOCKS IF NEEDED -->
    </block>
    <move element="product.info.details.new" destination="content" after="product.info.details"/> 

    <move element="product.info.description" destination="product.info.details.new" after="-"/>
    <move element="product.attributes" destination="product.info.details.new" after="-"/> 

    <referenceBlock name="product.info.details" remove="true"/>
    <!-- CODE TO REORDER PRODUCT TABS -->
  </body>

次に、ブロックを作成して「getGroupChildNames」の動作を変更します。

<?php

namespace My\Module\Block\Product\View;

use Magento\Catalog\Model\Product;

class Description extends \Magento\Catalog\Block\Product\View\Description
{
    public function getGroupChildNames($groupName)
    {
        if ('detailed_info' === $groupName) {
            return [
                // here you can change the order
                'product.attributes',
                'product.info.description',
            ];
        }

        return parent::getGroupChildNames($groupName);
    }
}

それで全部です。


0

LordZardeckが最良の答えを持っていますが、これは基本的にバグであり、コアで修正する必要があります。

私が見つけた問題の最も簡単な解決策は次のとおりです:Magento_Catalog :: product / view / details.phtmlテンプレートをオーバーライドし、10行目の最初のphp条件の後:

if ($detailedInfoGroup = $block->getGroupChildNames(...

次のコードを追加して順序を変更します。

$_prepend = array_reverse(['product.overview.description']);
foreach ($_prepend as $_name) {
    $k = array_search($_name,$detailedInfoGroup);
    if ( $k !== false) {
        unset($detailedInfoGroup[$k]);
        array_unshift($detailedInfoGroup,$_name);
    }
}

これにより順序が変更され、$ _ prependにリストされているすべてのタブが定義された順序で配列の先頭にプッシュされます。



0

プラグインは素晴らしい解決策です。しかし、あなたはまだそれを改善することができます。タブを並べ替える必要があるたびに異なるプラグインを作成する必要はありません。やりたいことは、xmlで順序を設定することです。このような:

<referenceBlock name="product.info.details">
        <referenceBlock name="product.info.description">
            <arguments>
                <argument name="priority" xsi:type="number">1</argument>
            </arguments>
        </referenceBlock>
        <referenceBlock name="product.attributes">
            <arguments>
                <argument name="priority" xsi:type="number">3</argument>
            </arguments>
        </referenceBlock>
        <referenceBlock name="reviews.tab">
            <arguments>
                <argument name="priority" xsi:type="number">4</argument>
            </arguments>
        </referenceBlock>
        <!-- MY OWN CUSTOM BLOCK ON THE SECOND POSITION -->
        <block class="Magento\Catalog\Block\Product\View\Description" name="product.features" as="features" template="product/view/features.phtml" group="detailed_info">
            <arguments>
                <argument translate="true" name="title" xsi:type="string">Features</argument>
                <argument name="priority" xsi:type="number">2</argument>
            </arguments>
        </block>
        <!-- MY OWN CUSTOM BLOCK ENDS HERE -->
    </referenceBlock>

そして、テンプレートを変更する代わりに、Magento priorityにxml configで使用される引数を理解させるプラグインを作成します。

class TabOrder
{
    const TABS_BLOCK_NAME = 'product.info.details';
    const ORDER_ARGUMENT_NAME = 'priority';

    public function afterGetGroupChildNames(
        \Magento\Catalog\Block\Product\View\Description $subject,
        array $result
    ) {
        if ($subject->getNameInLayout() === self::TABS_BLOCK_NAME) {
            foreach ($result as $blockName) {
                // get priority for each block and include it in modifiedResult
                $alias = $subject->getLayout()->getElementAlias($blockName);

                // 100 default value guarantees the tab without priority argument goes last
                $blockPosition =
                    $subject->getChildData($alias, self::ORDER_ARGUMENT_NAME) ?? 100;
                $modifiedResult[] = array(
                    $blockName,
                    $blockPosition);
            }

            // order elements from $modifiedResult by priority
            usort($modifiedResult, function ($a, $b) {
                return $a[1] <=> $b[1];
            });

            // remove priority and leave original values only
            array_walk($modifiedResult, function (&$value, $key) {
                $value = $value[0];
            });

            return $modifiedResult;
        }

        return $result;
    }
}

最後に、プラグインMagento\Catalog\Block\Product\View\Descriptionをdi.xmlファイルのクラスに適用する必要があります。


0

Magento 2では、製品ページのタブの順序を変更します。

タブの順序は簡単な方法で簡単にカスタマイズできます。

  1. details.phtmlファイルを作成します

app / design / frontend / vendor / theme / Magento_Catalog / templates / product / view /

details.phtmlファイルが既に存在する場合は、更新してください。

  1. foreachループの前にこのコードを追加します。「$ detailedInfoGroup」配列を定義します。

元のコード:

<?php if ($detailedInfoGroup = $block->getGroupChildNames('detailed_info', 'getChildHtml')):?>
    <div class="product info detailed">
        <?php $layout = $block->getLayout(); ?>
        <div class="product data items" data-mage-init='{"tabs":{"openedState":"active"}}'>
            <?php foreach ($detailedInfoGroup as $name):?>
                <?php
                    $html = $layout->renderElement($name);
                    if (!trim($html)) {
                        continue;
                    }
                    $alias = $layout->getElementAlias($name);
                    $label = $block->getChildData($alias, 'title');
                ?>
                <div class="data item title"
                     aria-labeledby="tab-label-<?= /* @escapeNotVerified */ $alias ?>-title"
                     data-role="collapsible" id="tab-label-<?= /* @escapeNotVerified */ $alias ?>">
                    <a class="data switch"
                       tabindex="-1"
                       data-toggle="switch"
                       href="#<?= /* @escapeNotVerified */ $alias ?>"
                       id="tab-label-<?= /* @escapeNotVerified */ $alias ?>-title">
                        <?= /* @escapeNotVerified */ $label ?>
                    </a>
                </div>
                <div class="data item content" id="<?= /* @escapeNotVerified */ $alias ?>" data-role="content">
                    <?= /* @escapeNotVerified */ $html ?>
                </div>
            <?php endforeach;?>
        </div>
    </div>
<?php endif; ?> 

コードを追加した後:

<?php if ($detailedInfoGroup = $block->getGroupChildNames('detailed_info', 'getChildHtml')):?>
    <div class="product info detailed">
        <?php $layout = $block->getLayout(); ?>
        <div class="product data items" data-mage-init='{"tabs":{"openedState":"active"}}'>
            <?php $detailedInfoGroup = ["product.info.description", "product.attributes", "reviews.tab"]; ?>
            <?php foreach ($detailedInfoGroup as $name):?>
                <?php
                    $html = $layout->renderElement($name);
                    if (!trim($html)) {
                        continue;
                    }
                    $alias = $layout->getElementAlias($name);
                    $label = $block->getChildData($alias, 'title');
                ?>
                <div class="data item title"
                     aria-labeledby="tab-label-<?= /* @escapeNotVerified */ $alias ?>-title"
                     data-role="collapsible" id="tab-label-<?= /* @escapeNotVerified */ $alias ?>">
                    <a class="data switch"
                       tabindex="-1"
                       data-toggle="switch"
                       href="#<?= /* @escapeNotVerified */ $alias ?>"
                       id="tab-label-<?= /* @escapeNotVerified */ $alias ?>-title">
                        <?= /* @escapeNotVerified */ $label ?>
                    </a>
                </div>
                <div class="data item content" id="<?= /* @escapeNotVerified */ $alias ?>" data-role="content">
                    <?= /* @escapeNotVerified */ $html ?>
                </div>
            <?php endforeach;?>
        </div>
    </div>
<?php endif; ?>

製品ページにカスタムタブを追加するには、このリンクをチェックしてください

Magento 2-カスタム属性を表示する製品タブを作成します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.