Magento2: змінення порядку вкладок на сторінці продукту


16

Я намагаюся змінити порядок вкладок на сторінці продукту в 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

Я спробував використовувати елемент переміщення і дійшов того ж висновку, що і ви, їх можна переміщувати за межами вкладок, але не впорядковувати їх.
— Бен Крук

Це можна зробити за допомогою макету лише з невеликою хитрістю. Показано тут: magento.stackexchange.com/questions/106412/…
— skymeissner

@andyjv знайдіть рішення тут, це може допомогти вам досягти бажаного результату. magento.stackexchange.com/a/242709/52244
— Kanhaiya lal

Відповіді:


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

Будь ласка, майте на увазі, що власне магенто 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у майбутньому.


Як ми можемо відобразити вміст вкладки "Детальніше" внизу вкладки "Детальніше", будь ласка?
— Джай

Ваше запитання не стосується оригінального запитання. ви повинні відкрити новий квиток. У будь-якому випадку: Ви можете посилатися на новий файл phtml у каталозі_продукції теми_ теми (наприклад, опис-атрибути-комбіновані.phtml) та вставляти вміст у оригінальний descrption.phtml та attributes.phtml.
— juhanix

Я вставив вміст обох файлів в один і зателефонував у файли xml у вигляді: <referenceBlock name = "product.info.details"> <block class = "Magento \ Каталог \ Блок \ Продукт \ Перегляд \ Опис" name = "product.info .description.attributes "template =" product / view / description-attributes-united.phtml "group =" детально_інфо "> <аргументи> <аргумент перевести =" справжнє "ім'я =" заголовок "xsi: type =" string "> Ще Інформація </argument> </arguments> </block> </referenceBlock> Але пустий сайт відображає лише вміст вкладок. Чого не вистачає?
— Джай

Я додав питання тут: magento.stackexchange.com/q/157376/29175
— Jai

@juhanix Це вимагає, щоб ви висунули вперед шаблон, який можна було б змінити в наступних виправленнях Magento. Дивіться мою відповідь, яка не змінює жодних основних файлів. Сподіваємось, це головна проблема, яка може отримати виправлення.
— LordZardeck

14

Для зміни положення вкладки на сторінці деталей, використовуючи файл конфігурації XML після або перед атрибутом у цьому випадку не допоможе.

Ви повинні перейти з файлу шаблону.

Скопіюйте файл Details.phtml з ядра на свою тему,

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

Всередині цього файла ви можете отримати назву всіх вкладок, використовуючи print_r ($ detaInfoGroup) , щоб отримати значення типу,

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

Ви повинні встановити відповідно до вашої вимоги в новому масиві, перш ніж пропонувати файл,

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

додати <?php foreach ($newOrderTab as $name):?> ,

Повний код у деталях.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; ?>

Спасибі Ракеш Єсадія, це працює як шарм ...!
— Сарфарай Сіпай

13

У Magento 2.3.1 або вище ми можемо використовувати sort_orderаргумент у app/design/frontend/Packagename/themename/Magento_Catalog/layout/catalog_product_view.xmlxml-конфігурації

<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

Я знаю, що на це питання були й інші відповіді, але всі вони були занадто інвазивними на мій смак. Дивлячись на проблему, Magento додає окремий атрибут "group" до елемента та додає дітям цей атрибут у порядку, завантаженому у макеті, повністю окремо від дитячого масиву, який містить відсортований масив елементів. Для того, щоб виправити це, я написав простий плагін навколо, який виправляє сортування під час отримання групових дітей:

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

Це дозволить вам замовляти вкладки, використовуючи стандарт beforeта afterатрибути в макеті XML, як ви очікували, і, ймовірно, не потрібно буде змінювати майбутні патчі Magento.


Могутній і почесний лордЗардек дав правильну відповідь. Додавання такої кількості логіки до шаблону, як це робить більшість вищезазначених відповідей, просто задає проблеми під час оновлення до новіших версій magento.
— Натан Томбс

використав це для мого магазину Magento 2.2.4.! працював як магія.!
— ішу

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

Я думаю, вам потрібно просто додати їх у обраному вами порядку. Для мене я використовую 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 за допомогою плагіна. Після оновлення постачальника / модуля / тощо / 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. Але ви отримаєте точку. KISS.

<?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());

Роблячи це таким чином, він дотримується порядку, виданого після і перед модифікаторами.

<?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 та після першого умови php у рядку 10:

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

це змінить порядок і відсуне всі вкладки, перелічені в $ _преду до початку масиву, у визначеному порядку.


0

Схоже, все вищезазначене більше не актуально. Станом на Magento 2.3.1 ми можемо використовувати sort_orderаргумент у xml config.


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-конфігурації:

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 у

додаток / дизайн / frontend / постачальник / тема / Magento_Catalog / шаблони / продукт / перегляд /

Якщо файл Details.phtml вже існує, то оновіть його.

  1. Додайте цей код перед циклом foreach. Визначте масив "$ detaInInGroup".

Оригінальний код:

<?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 - Створіть вкладку продукту, на якій відображається спеціальний атрибут

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.