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

Я попытался использовать элемент перемещения и пришел к тому же выводу, что и вы, их можно перемещать за пределы вкладок, но не упорядочивать внутри них.
Бен Крук

Это может быть сделано по макету только с небольшой хитростью. Показано здесь: 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в будущем.


Как мы можем отобразить содержимое вкладки «Подробности» внизу вкладки «Подробнее», пожалуйста?
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".


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 добавляет отдельный атрибут «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.
Натан Тоомбс

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 за чистый код!


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

Делая это таким образом, он уважает порядок, заданный модификаторами 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);
    }
}

Это все.


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, в начало массива в указанном порядке.


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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.