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

16

Я пытаюсь изменить порядок вкладок на странице продукта в Magento 2. По умолчанию Details|More Information|Reviews.

Я старался:

Производитель / тема / Magento_Catalog / макет / 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
источник
Вы нашли ответ на это? У меня та же проблема.
Алекс
У меня пока нет ответа, извините.
andyjv
Я попытался использовать элемент перемещения и пришел к тому же выводу, что и вы, их можно перемещать за пределы вкладок, но не упорядочивать внутри них.
Бен Крук
Это может быть сделано по макету только с небольшой хитростью. Показано здесь: magento.stackexchange.com/questions/106412/…
skymeissner
@andyjv, пожалуйста, найдите решение здесь, это может помочь вам достичь желаемого результата. magento.stackexchange.com/a/242709/52244
Канхайя лал

Ответы:

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в будущем.

juhanix
источник
Как мы можем отобразить содержимое вкладки «Подробности» внизу вкладки «Подробнее», пожалуйста?
Jai
Ваш вопрос не относится к первоначальному вопросу. Вы должны открыть новый билет. В любом случае: вы можете сослаться на новый файл phtml в catalog_product_view.xml вашей темы (например, description-attribute-комбинированный.phtml) и вставить содержимое из исходных файлов descrption.phtml и attribute.phtml.
juhanix
Я вставил содержимое обоих файлов в один и назвал их в XML-файлах следующим образом: <referenceBlock name = "product.info.details"> <block class = "Magento \ Catalogue \ Block \ Product \ View \ Description" name = "product.info .description.attributes "template =" product / view / description-attribute-комбинированный.phtml "group =" detail_info "> <arguments> <аргумент translate =" true "name =" title "xsi: type =" string "> Подробнее Информация </ arguments> </ arguments> </ block> </ referenceBlock> Но пустой сайт и отображает только содержимое вкладок. Чего не хватает?
Jai
Я добавил вопрос здесь: 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 ($ detailInfoGroup), вы должны получить значение, например,

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; ?>
Ракеш Джесадия
источник
Спасибо Ракеш Джесадия, это работает как шарм ...!
Сарфарадж Сипай
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".

Nadeem0035
источник
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 согласно вашему заказу.

Rathna
источник
1
sort_orderдля меня был важен идеальный ответ с примером , +1 сделал мой день :)
SagarPPanchal
2

Я знаю, что были и другие ответы на этот вопрос, но все они были слишком агрессивными на мой вкус. Рассматривая проблему, 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.

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. Детали

Это не то, что я хотел, теперь мое решение состоит в том, чтобы снова добавить также вкладку Details, чтобы мой файл макета выглядел так:

<?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 с плагином. После обновления вендор / модуль / 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 за чистый код!

GeorgeGos
источник
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
?>
craigtadlock
источник
0

Мое решение проблемы состоит в том, чтобы изменить шаблон details.phtml, чтобы он получал дочерние блоки из макета.

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

Делая это таким образом, он уважает порядок, заданный модификаторами after и before .

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

Это все.

amcastror
источник
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);
    }
}

это изменит порядок и переместит все вкладки, перечисленные в $ _prepend, в начало массива в указанном порядке.

SiUX
источник
0

Похоже, все вышеперечисленное уже не актуально. Начиная с версии Magento 2.3.1 мы можем использовать sort_orderаргумент в конфигурации xml.

Кшиштоф Воловски
источник
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 в

приложение / дизайн / интерфейс / продавец / тема / Magento_Catalog / шаблоны / продукта / вид /

Если файл details.phtml уже существует, обновите его.

  1. Добавьте этот код перед циклом foreach. Определите массив «$ detailsInfoGroup».

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

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

Сохел Хан
источник