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.