Magento2: ordem de alteração das guias na página do produto

15

Estou tentando alterar a ordem das guias na página do produto no Magento 2. O padrão é Details|More Information|Reviews.

Eu tentei:

Fornecedor / tema / 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>

Mas isso não funciona e é a maneira recomendada para mover elementos. Consegui mover as guias para fora da área e para outras áreas, além de adicionar novas guias, mas não consigo controlar a ordem das guias.

Meu palpite é que isso tem algo a ver com group="detailed_info"; Parece que o Magento pega os elementos de layout com esse atributo no XML e percorre o caminho para criar as guias.

Existe uma maneira de alterar a ordem das guias sem reescrever o módulo?

andyjv
fonte
Você encontrou uma resposta para isso? Estou tendo o mesmo problema.
Alex
Ainda não tenho resposta, desculpe.
22616 Andy
Tentei usar o elemento move e cheguei à mesma conclusão que você, eles podem ser movidos para fora das guias, mas não ordenados dentro delas.
Ben Crook
Isso pode ser feito pelo layout apenas com um pequeno truque. Mostrado aqui: magento.stackexchange.com/questions/106412/…
skymeissner
@andyjv, encontre a solução aqui, isso pode ajudá-lo a alcançar o resultado desejado. magento.stackexchange.com/a/242709/52244
Kanhaiya lal

Respostas:

22

Minha abordagem é um pouco diferente, mas provavelmente mais à prova do futuro, no caso de adicionar novas guias mais tarde e alterar a prioridade / ordem dessas guias.

Passei um argumento para cada guia via arquivo XML no arquivo XML dos meus temas

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

Então, meu arquivo XML de temas se parece com isso:

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

Mais ainda, temos que ajustar o details.phtml, então copie-o de

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

para

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

Lembre-se de que o próprio details.phtmlMagento pode ser alterado em versões ou patches futuras do Magento. Essas alterações também devem ser aplicadas ao conteúdo do seu tema.details.phtml

Agora precisamos obter a prioridade que passamos por meio do arquivo 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; ?>

Então você vê: você só precisa adicionar algumas linhas e sempre pode alterar a prioridade / ordem das guias através do arquivo xml, não precisa mais alterar o details.phtmlfuturo.

juhanix
fonte
Como podemos exibir o conteúdo da guia "Detalhes" na parte inferior da parte inferior da guia "Mais informações", por favor?
Jai
sua pergunta não está se referindo à pergunta original. você deve abrir um novo ticket. Enfim: você pode fazer referência a um novo arquivo phtml no catalog_product_view.xml do seu tema (por exemplo, description-attribute-combinado.phtml) e colar o conteúdo do descrption.phtml original e attribute.phtml.
21917 juhanix
Colei o conteúdo de ambos os arquivos em um e chamei os arquivos xml como: <referenceBlock name = "product.info.details"> <block class = "Magento \ Catalog \ Block \ Product \ View \ Description" name = "product.info .description.attributes "template =" produto / visualização / descrição-atributos-combinados.phtml "group =" information_info "> <argumentos> <argumento translate =" true "name =" title "xsi: tipo =" string "> Mais Informações </argument> </arguments> </block> </referenceBlock> Mas site em branco e exibe apenas o conteúdo das guias. O que está a faltar?
Jai
Eu adicionei a pergunta aqui: magento.stackexchange.com/q/157376/29175
Jai
@juhanix Isso requer que você avance um modelo que pode ser modificado em patches posteriores do Magento. Veja minha resposta que não modifica nenhum arquivo principal. Felizmente, esse é um problema central que pode ser corrigido.
11267 LordZardeck
14

Para alterar a posição do Tabbing na página de detalhes, usando arquivo de configuração XML após ou antes atributo não ajuda neste caso.

Você precisa mudar do arquivo de modelo.

Copie o arquivo details.phtml do núcleo para o seu tema,

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

Dentro deste arquivo, você pode buscar o nome de todas as guias usando, print_r ($ detailInfoGroup) , para obter valor como,

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

Você deve definir de acordo com seus requisitos em uma nova matriz antes de cada arquivo,

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

adicionar <?php foreach ($newOrderTab as $name):?>,

O código completo em details.phtml é como abaixo,

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

// @codingStandardsIgnoreFile

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

No Magento 2.3.1 ou acima, podemos usar o sort_orderargumento em " 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>

Certifique-se também de atualizar o método " getGroupChildNames" com " getGroupSortedChildNames" no arquivo de modelo ( se você o estiver substituindo ) " app/design/frontend/Packagename/themename/Magento_Catalog/templates/product/view/details.phtml".

Método antigo

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

Método atualizado

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

Se você estiver substituindo a Magento\Catalog\Block\Product\View\Details.phpclasse de bloco, sua classe de bloco também deverá ter esse método " getGroupSortedChildNames" atualizado .

Nadeem0035
fonte
1
Esta é definitivamente a resposta certa a partir do 2.3.1.
Geat
Funciona para mim no 2.3.2, muito obrigado!
Jared Chu
3

Outra maneira usando o argumento de ordem de classificação.

Caminho de arquivo - app\design\frontend\<companyNAme>\<ThemeName>\Magento_Catalog\layout\catalog_product_view.xml

Adicione o argumento da ordem de classificação dentro do contêiner do bloco de referência product.info.details.

Código de exemplo

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

Altere o valor do argumento da ordem de classificação para 10, 20, 30 conforme seu pedido.

Rathna
fonte
1
resposta perfeita com um exemplo sort_orderfoi importante para mim, +1 fez o meu dia :)
SagarPPanchal
2

Sei que houve outras respostas para essa pergunta, mas todas elas foram muito invasivas para o meu gosto. Analisando a questão, o Magento adiciona um atributo "group" separado a um elemento e adiciona filhos a esse atributo na ordem carregada no layout, completamente separado da matriz filho que contém a matriz classificada de elementos. Para corrigir isso, escrevi um plug-in simples que corrige a classificação ao recuperar filhos do grupo:

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

Agora, você poderá solicitar as guias usando o XML padrão beforee os afteratributos no layout, como seria de esperar, e provavelmente não precisará ser modificado em patches futuros do Magento.

LordZardeck
fonte
O poderoso e honrado LordZardeck deu a resposta correta. Adicionar tanta lógica a um modelo, como a maioria das respostas acima, está apenas pedindo problemas ao atualizar para versões mais recentes do magento.
Nathan Toombs
2

Eu acho que você precisa apenas adicioná-los na ordem de sua escolha. Para mim, estou usando 4 guias nesta ordem:

  1. Detalhes
  2. Tags do produto
  3. Guia Personalizada 1
  4. Guia 2 personalizada

No meu módulo personalizado, criei este arquivo de layout: catalog_product_view.xml com este conteúdo:

<?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>

Você pode ver que eu adicionei apenas 3 guias porque a guia detalhes já existe. Como resultado, tenho as guias nesta ordem:

  1. Tags do produto
  2. Guia Personalizada 1
  3. Guia 2 personalizada
  4. Detalhes

O que não era o que eu queria, agora minha solução é adicionar também a guia Detalhes novamente, para que meu arquivo de layout fique assim:

<?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>

Agora eu tenho a ordem que eu quero :) insira a descrição da imagem aqui

Abdelkebir ELHARFALI
fonte
1

A maneira mais fácil e melhor é, na minha opinião, a solução do LordZardeck com um plugin. Após atualizar o fornecedor / módulo / 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>

tudo funcionou como desejado.

Obrigado @LordZardeck pelo código limpo!

GeorgeGos
fonte
0

Aqui está a solução que eu usei. Ele trocará a guia de descrição e atributos, se ambos estiverem disponíveis. Isso está usando o tema Ultimo. Mas você entenderá. BEIJO.

<?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
fonte
0

Minha solução para o problema é modificar o template details.phtml para obter os blocos filhos do layout.

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

Ao fazê-lo desta maneira, ele respeita a ordem dada pelos modificadores depois e antes .

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

Eu ainda uso a matriz fornecida por getGroupChildNames para validar se o bloco pertence ao grupo.

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

Antonio Alonso
fonte
0

Eu não queria trabalhar no tema, queria modificar o comportamento do método 'getGroupChildNames'. Essa abordagem deve funcionar mesmo se o modelo for modificado.

Adicionei isso ao 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>

Em seguida, crie um bloco para alterar o comportamento '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);
    }
}

Isso é tudo.

amcastror
fonte
0

LordZardeck tem a melhor resposta, mas isso é basicamente um bug e deve ser corrigido no núcleo.

A solução mais simples para o problema que encontrei é a seguinte: Substitua o modelo Magento_Catalog :: product / view / details.phtml e após a primeira condição php na linha 10:

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

adicione o seguinte código para modificar a ordem:

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

isso mudará a ordem e empurrará todas as guias listadas em $ _prepend para o início da matriz na ordem definida.

siux
fonte
0

Parece que tudo o que foi mencionado acima não é mais relevante. A partir do Magento 2.3.1, podemos usar sort_orderargumentos em xml config.

Krzysztof Wołowski
fonte
0

Um plugin é uma boa solução. Mas você ainda pode melhorar. Você não deseja escrever um plug-in diferente toda vez que precisar reordenar as guias. O que você deseja fazer é definir a ordem em xml. Como isso:

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

e então, em vez de modificar o modelo, crie um plugin que faça o Magento entender o priorityargumento usado na configuração 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;
    }
}

E, finalmente, o plug-in deve ser aplicado à Magento\Catalog\Block\Product\View\Descriptionclasse no arquivo di.xml.

Krzysztof Wołowski
fonte
0

Para o Magento 2, altere a ordem das guias na página do produto.

Você pode personalizar facilmente a ordem da guia de maneira simples.

  1. Crie o arquivo details.phtml em

app / design / frontend / fornecedor / tema / Magento_Catalog / templates / product / view /

Se o arquivo details.phtml já existir, atualize-o.

  1. Adicione esse código antes do loop foreach. Defina a matriz "$ detailInfoGroup".

Código original:

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

Depois de adicionar o código:

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

E adicione uma guia personalizada na página do produto, verifique este link

Magento 2 - Criar guia de produto que exibe atributo personalizado

Sohel Khan
fonte