Magento2: modifica dell'ordine delle schede nella pagina del prodotto


16

Sto cercando di modificare l'ordine delle schede nella pagina del prodotto in Magento 2. L'impostazione predefinita è Details|More Information|Reviews .

Provai:

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

Ma questo non funziona e questo è il modo consigliato per spostare gli elementi. Sono stato in grado di spostare le schede dall'area delle schede e in altre aree, nonché di aggiungere nuove schede, ma non riesco a controllare l'ordine delle schede.

La mia ipotesi è che abbia qualcosa a che fare con group="detailed_info"; Sembra che Magento afferri gli elementi del layout con questo attributo nell'XML e lo attraversi per creare le schede.

C'è un modo per cambiare l'ordine delle schede senza riscrivere il modulo?


Hai trovato una risposta a questo? Sto avendo lo stesso problema.
Alex,

Non ho ancora una risposta, scusa.
Andyjv,

Ho provato a utilizzare l'elemento move e sono giunto alla tua stessa conclusione, possono essere spostati all'esterno delle schede ma non ordinati al loro interno.
Ben Crook,

Può essere fatto dal layout solo con un piccolo trucco. Indicato qui: magento.stackexchange.com/questions/106412/…
skymeissner

@andyjv, trova la soluzione qui, questo potrebbe aiutarti a ottenere il risultato desiderato. magento.stackexchange.com/a/242709/52244
Kanhaiya lal

Risposte:


22

Il mio approccio è un po 'diverso ma probabilmente più a prova di futuro, in caso di aggiunta di nuove schede in seguito e modifica della priorità / ordine di queste schede.

Ho passato un argomento per ogni scheda tramite il file XML nel mio file XML dei temi

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

Quindi il mio file XML dei temi è simile al seguente:

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

Inoltre, dobbiamo regolare il details.phtml, quindi copiarlo da

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

per

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

Tieni presente che Magento details.phtmlpotrebbe essere modificato nelle future versioni o patch di Magento. Queste modifiche dovrebbero essere applicate anche al tuo temadetails.phtml

Ora dobbiamo ottenere la priorità che abbiamo passato tramite il file 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; ?>

Quindi vedi: devi solo aggiungere alcune righe e puoi sempre cambiare la priorità / ordine delle schede tramite il file xml, non devi più cambiare details.phtmlin futuro.


Come possiamo visualizzare il contenuto della scheda "Dettagli" nella parte inferiore della scheda "Ulteriori informazioni", per favore?
Jai,

la tua domanda non si riferisce alla domanda originale. dovresti aprire un nuovo biglietto. Ad ogni modo: puoi fare riferimento a un nuovo file phtml nel catalog_product_view.xml del tuo tema (ad es. Descrizione-attributi-combinato.phtml) e incollare il contenuto dall'originale descrption.phtml e stats.phtml.
juhanix,

Ho incollato il contenuto di entrambi i file in uno e ho chiamato in file xml come: <referenceBlock name = "product.info.details"> <block class = "Magento \ Catalog \ Block \ Product \ View \ Descrizione" name = "product.info .description.attributes "template =" prodotto / vista / descrizione-attributi-combinata.phtml "gruppo =" dettaglio_info "> <arguments> <argomento translate =" true "name =" title "xsi: type =" string "> Altro Informazioni </argument> </arguments> </block> </referenceBlock> Ma sito vuoto e visualizza solo il contenuto delle schede. Cosa manca?
Jai

Ho aggiunto una domanda qui: magento.stackexchange.com/q/157376/29175
Jai

@juhanix Questo richiede di tirare avanti un modello che potrebbe essere modificato nelle successive patch di Magento. Vedi la mia risposta che non modifica alcun file principale. Speriamo che questo sia un problema fondamentale che può essere corretto.
LordZardeck,

14

Per Cambiare posizione di tabulazione nella pagina dei dettagli, Usare il file di configurazione XML dopo o prima attributo non aiuta in questo caso.

Devi cambiare dal file modello.

Copia il file details.phtml dal core al tuo tema,

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

All'interno di questo file, puoi recuperare il nome di tutte le schede usando, print_r ($ dettagliateInfoGroup) devi ottenere un valore come,

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

È necessario impostare in base alle proprie esigenze nel nuovo array prima di foreach in file,

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

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

Il codice completo in details.phtml è come sotto,

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

Grazie Rakesh Jesadiya, funziona come un fascino ...!
Sarfaraj Sipai,

13

In Magento 2.3.1 o sopra possiamo usare l' sort_orderargomento in " app/design/frontend/Packagename/themename/Magento_Catalog/layout/catalog_product_view.xml" configurazione xml

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

Assicurati anche di aggiornare il metodo " getGroupChildNames" con " getGroupSortedChildNames" nel file modello ( se lo stai sovrascrivendo ) " app/design/frontend/Packagename/themename/Magento_Catalog/templates/product/view/details.phtml".

Vecchio metodo

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

Metodo aggiornato

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

Se si esegue l'override della Magento\Catalog\Block\Product\View\Details.phpclasse di blocco, anche la classe di blocco dovrebbe avere quel metodo " getGroupSortedChildNames" aggiornato.


1
Questa è sicuramente la risposta giusta dalla 2.3.1 in poi.
Completa il

Funziona per me sulla 2.3.2, grazie mille!
Jared Chu,

3

Un altro modo usando l'argomento di ordinamento.

Percorso del file - app\design\frontend\<companyNAme>\<ThemeName>\Magento_Catalog\layout\catalog_product_view.xml

Aggiungere l'argomento ordinamento all'interno del contenitore del blocco di riferimento product.info.details.

Codice di esempio

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

Modificare il valore dell'argomento ordinamento in 10, 20, 30 secondo il proprio ordine.


1
la risposta perfetta con un esempio è sort_orderstata importante per me, +1 ha reso la mia giornata :)
SagarPPanchal

2

So che ci sono state altre risposte a questa domanda, ma erano tutte troppo invasive per i miei gusti. Esaminando il problema, Magento aggiunge un attributo "gruppo" separato a un elemento e aggiunge elementi secondari a quell'attributo nell'ordine caricato nel layout, completamente separato dall'array figlio che contiene l'array ordinato di elementi. Per risolvere questo problema, ho scritto un semplice plug-in attorno che corregge l'ordinamento durante il recupero dei figli del gruppo:

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

Questo ora ti permetterà di ordinare le schede usando lo standard beforee gli afterattributi nel layout XML come ti aspetteresti, e probabilmente non sarà necessario modificarlo su future patch Magento.


Il potente e onorevole Lord Zardeck ha dato la risposta corretta. Aggiungere tanta logica a un modello, come fanno la maggior parte delle risposte sopra, è solo chiedere problemi quando si aggiorna alle nuove versioni di Magento.
Nathan Toombs,

2

Penso che tu debba solo aggiungerli nell'ordine che preferisci. Per me, sto usando 4 schede in questo ordine:

  1. Dettagli
  2. Tag del prodotto
  3. Scheda personalizzata 1
  4. Scheda personalizzata 2

Nel mio modulo personalizzato ho creato questo file di layout: catalog_product_view.xml con questo contenuto:

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

Puoi vedere che ho aggiunto solo 3 schede perché la scheda dettagli esiste già. Di conseguenza ho le schede in questo ordine:

  1. Tag del prodotto
  2. Scheda personalizzata 1
  3. Scheda personalizzata 2
  4. Dettagli

Il che non è quello che volevo, ora la mia soluzione è aggiungere di nuovo anche la scheda Dettagli, quindi il mio file di layout sarebbe così:

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

Ora ho l'ordine che voglio :) inserisci qui la descrizione dell'immagine


1

Il modo più semplice e migliore è secondo me la soluzione di LordZardeck con un plugin. Dopo aver aggiornato il fornitore / modulo / 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>

tutto ha funzionato come desiderato.

Grazie @LordZardeck per il codice pulito!


0

Ecco la soluzione che ho usato. Sostituirà la scheda descrizione e attributi se sono entrambi disponibili. Questo sta usando il tema Ultimo. Ma otterrai il punto. BACIO.

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

La mia soluzione al problema è quella di modificare i dettagli del template.phtml in modo da ottenere i blocchi dei bambini dal layout.

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

In questo modo, rispetta l'ordine dato dai modificatori dopo e prima .

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

Uso ancora l'array fornito da getGroupChildNames per confermare se il blocco appartiene al gruppo.

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


0

Non volevo lavorare sul tema, volevo modificare il comportamento del metodo 'getGroupChildNames'. Questo approccio dovrebbe funzionare anche se il modello viene modificato.

Ho aggiunto questo a 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>

Quindi, crea un blocco per modificare il comportamento di "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);
    }
}

È tutto.


0

LordZardeck ha la risposta migliore, ma questo è fondamentalmente un bug e dovrebbe essere risolto nel nucleo.

La soluzione più semplice al problema che ho riscontrato è la seguente: Sostituisci il modello Magento_Catalog :: product / view / details.phtml e dopo la prima condizione php sulla riga 10:

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

aggiungi il seguente codice per modificare l'ordine:

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

questo cambierà l'ordine e spingerà tutte le schede elencate in $ _prepend all'inizio dell'array nell'ordine definito.


0

Sembra che tutto quanto sopra non sia più rilevante. A partire da Magento 2.3.1 possiamo usare sort_orderargomento in xml config.


0

Un plugin è una bella soluzione. Ma puoi ancora migliorare. Non vuoi scrivere un plug-in diverso ogni volta che devi riordinare le schede. Quello che vuoi fare è impostare l'ordine in xml. Come questo:

<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 quindi, invece di modificare il modello, crea un plugin che faccia capire a Magento l' priorityargomento usato in xml config:

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 infine il plugin deve essere applicato alla Magento\Catalog\Block\Product\View\Descriptionclasse nel file di.xml.


0

Per Magento 2 cambia l'ordine delle schede nella pagina del prodotto.

Puoi personalizzare facilmente l'ordine delle schede in modo semplice.

  1. Crea il file details.phtml in

app / design / frontend / vendor / tema / Magento_Catalog / templates / prodotto / view /

Se il file details.phtml esiste già, aggiornalo.

  1. Aggiungi questo codice prima di foreach loop. Definire l'array "$ dettagliateInfoGroup".

Codice originale:

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

Dopo aver aggiunto il codice:

<?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 aggiungi la scheda personalizzata nella pagina del prodotto controlla questo link

Magento 2 - Crea una scheda prodotto che visualizza l'attributo personalizzato

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.