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?


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.


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

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 .


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.


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.


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


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!


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

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


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.


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.


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.


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.


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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.