Magento2: Reihenfolge der Tabs auf der Produktseite ändern

15

Ich versuche, die Reihenfolge der Registerkarten auf der Produktseite in Magento 2 zu ändern. Standard ist Details|More Information|Reviews.

Ich habe es versucht:

Anbieter / theme / 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>

Aber das funktioniert nicht und das ist die empfohlene Methode zum Verschieben von Elementen. Ich konnte die Registerkarten aus dem Registerkartenbereich in andere Bereiche verschieben und neue Registerkarten hinzufügen, aber die Reihenfolge der Registerkarten nicht steuern.

Ich vermute, dass es etwas damit zu tun hat group="detailed_info"; Es sieht so aus, als würde Magento die Layout-Elemente mit diesem Attribut in der XML-Datei erfassen und durchlaufen, um die Registerkarten zu erstellen.

Gibt es eine Möglichkeit, die Reihenfolge der Registerkarten zu ändern, ohne das Modul neu zu schreiben?

andyjv
quelle
Hast du eine Antwort darauf gefunden? Ich habe das gleiche Problem.
Alex
Ich habe noch keine Antwort, sorry.
Andyjv
Ich habe versucht, das Element move zu verwenden, und bin zu dem gleichen Ergebnis wie Sie gekommen. Sie können außerhalb der Registerkarten verschoben, aber nicht in ihnen angeordnet werden.
Ben Crook
Das Layout kann nur mit einem kleinen Trick erstellt werden. Hier gezeigt: magento.stackexchange.com/questions/106412/…
skymeissner
@andyjv hier finden Sie die Lösung, dies könnte Ihnen helfen, Ihre Wunschausgabe zu erreichen. magento.stackexchange.com/a/242709/52244
Kanhaiya lal

Antworten:

22

Mein Ansatz ist ein wenig anders, aber wahrscheinlich zukunftssicherer, wenn ich später neue Registerkarten hinzufüge und die Priorität / Reihenfolge dieser Registerkarten ändere.

Ich habe für jede Registerkarte ein Argument über die XML-Datei in der XML-Themendatei übergeben

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

Die XML-Datei für meine Designs sieht also ungefähr so ​​aus:

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

Desweiteren müssen wir das anpassen details.phtml, also kopiere es ab

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

zu

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

Bitte beachten Sie, dass die details.phtmlMagento-Version in zukünftigen Magento-Versionen oder Patches geändert werden kann. Diese Änderungen sollten auch auf Ihre Themen angewendet werdendetails.phtml

Wir müssen jetzt die Priorität erhalten, die wir über die XML-Datei weitergeleitet haben.

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

Sie sehen also: Sie müssen nur ein paar Zeilen hinzufügen und können jederzeit die Priorität / Reihenfolge der Registerkarten über die XML-Datei ändern, Sie müssen die details.phtmlin Zukunft nicht mehr ändern .

juhanix
quelle
Wie kann der Inhalt der Registerkarte "Detail" unten auf der Registerkarte "Weitere Informationen" angezeigt werden?
Jai
Ihre Frage bezieht sich nicht auf die ursprüngliche Frage. Sie sollten ein neues Ticket öffnen. Wie auch immer: Sie können auf eine neue phtml-Datei in der catalog_product_view.xml Ihres Themas verweisen (z. B. description-attributes-combined.phtml) und den Inhalt aus der ursprünglichen descrption.phtml und attributes.phtml einfügen.
Juhanix
Ich habe den Inhalt beider Dateien in eine eingefügt und in XML-Dateien folgendermaßen aufgerufen: <referenceBlock name = "product.info.details"> <block class = "Magento \ Katalog \ Block \ Produkt \ Ansicht \ Beschreibung" name = "product.info .description.attributes "template =" product / view / description-attributes-combined.phtml "group =" Detailed_info "> <Argumente> <Argument translate =" true "name =" title "xsi: type =" string "> More Information </ argument> </ arguments> </ block> </ referenceBlock> Leere Site und zeige nur den Inhalt der Registerkarten an. Was fehlt?
Jai
Ich habe hier eine Frage hinzugefügt: magento.stackexchange.com/q/157376/29175
Jai
@juhanix Dazu müssen Sie eine Vorlage nach vorne ziehen, die in späteren Magento-Patches geändert werden kann. Siehe meine Antwort, die keine Kerndateien ändert. Hoffentlich ist dies ein Kernproblem, das behoben werden kann.
LordZardeck
14

In diesem Fall hilft es nicht, die Position der Registerkarte auf der Detailseite zu ändern, wenn Sie die XML-Konfigurationsdatei nach oder vor dem Attribut verwenden.

Sie müssen von der Vorlagendatei wechseln.

Kopieren Sie die Datei details.phtml vom Core in Ihr Theme.

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

In dieser Datei können Sie alle Registerkarten holen Namen, print_r ($ detailedInfoGroup) Sie haben wie zu bekommen Wert,

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

Sie müssen entsprechend Ihrer Anforderung in einem neuen Array festlegen, bevor Sie in einer Datei suchen.

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

hinzufügen <?php foreach ($newOrderTab as $name):?>,

Der vollständige Code in der Datei details.phtml ist wie folgt:

<?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
quelle
Danke Rakesh Jesadiya, es funktioniert wie ein Zauber ...!
Sarfaraj Sipai
13

In sort_order" app/design/frontend/Packagename/themename/Magento_Catalog/layout/catalog_product_view.xml" Magento 2.3.1 oder höher können wir Argumente in der XML - Konfiguration verwenden

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

Achte auch darauf, die Methode zu aktualisieren. "getGroupChildNames " mit " getGroupSortedChildNames" in der Vorlagendatei ( wenn Sie sie überschreiben ) " app/design/frontend/Packagename/themename/Magento_Catalog/templates/product/view/details.phtml".

Alte Methode

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

Aktualisierte Methode

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

Wenn Sie eine Magento\Catalog\Block\Product\View\Details.phpBlockklasse überschreiben , sollte " getGroupSortedChildNames" Ihre Blockklasse auch diese aktualisierte Methode haben .

Nadeem0035
quelle
1
Dies ist definitiv die richtige Antwort ab 2.3.1.
Geat
Es funktioniert für mich am 2.3.2, vielen Dank!
Jared Chu
3

Ein anderer Weg mit Sortierreihenfolge Argument.

Dateipfad - app\design\frontend\<companyNAme>\<ThemeName>\Magento_Catalog\layout\catalog_product_view.xml

Fügen Sie das Argument für die Sortierreihenfolge im Blockcontainer product.info.details hinzu.

Beispielcode

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

Ändern Sie den Sortierreihenfolgen-Argumentwert gemäß Ihrer Bestellung in 10, 20, 30.

Rathna
quelle
1
Die perfekte Antwort mit einem Beispiel sort_orderwar wichtig für mich, +1 machte meinen Tag :)
SagarPPanchal
2

Ich weiß, dass es andere Antworten auf diese Frage gegeben hat, aber alle waren zu invasiv für meinen Geschmack. Mit Blick auf das Problem fügt Magento einem Element ein separates "Gruppen" -Attribut hinzu und fügt diesem Attribut untergeordnete Elemente in der Reihenfolge hinzu, in der sie im Layout geladen sind, und zwar völlig getrennt von dem untergeordneten Array, das das sortierte Array von Elementen enthält. Um dies zu beheben, habe ich ein einfaches Around-Plugin geschrieben, das die Sortierung beim Abrufen von untergeordneten Gruppen korrigiert:

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

Auf diese Weise können Sie die Registerkarten nun wie erwartet unter Verwendung des Standards beforeund der afterAttribute in Layout-XML anordnen und müssen in zukünftigen Magento-Patches möglicherweise nicht mehr geändert werden.

LordZardeck
quelle
Der mächtige und ehrenwerte LordZardeck hat die richtige Antwort gegeben. Das Hinzufügen von so viel Logik zu einer Vorlage, wie es die meisten der obigen Antworten tun, ist nur ein Problem beim Aktualisieren auf neuere Magento-Versionen.
Nathan Toombs
2

Ich denke, Sie müssen sie nur in der Reihenfolge Ihrer Wahl hinzufügen. Für mich verwende ich 4 Registerkarten in dieser Reihenfolge:

  1. Einzelheiten
  2. Produkt Tags
  3. Benutzerdefinierte Registerkarte 1
  4. Benutzerdefinierte Registerkarte 2

In meinem benutzerdefinierten Modul habe ich folgende Layoutdatei erstellt: catalog_product_view.xml mit folgendem Inhalt:

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

Sie können sehen, dass ich nur 3 Registerkarten hinzugefügt habe, da die Registerkarte "Details" bereits vorhanden ist. Als Ergebnis habe ich die Registerkarten in dieser Reihenfolge erhalten:

  1. Produkt Tags
  2. Benutzerdefinierte Registerkarte 1
  3. Benutzerdefinierte Registerkarte 2
  4. Einzelheiten

Das ist nicht das, was ich wollte, jetzt besteht meine Lösung darin, auch die Registerkarte Details wieder hinzuzufügen, sodass meine Layoutdatei folgendermaßen aussehen würde:

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

Jetzt habe ich die Bestellung, die ich will :) Bildbeschreibung hier eingeben

Abdelkebir ELHARFALI
quelle
1

Der einfachste und beste Weg ist meiner Meinung nach die Lösung von LordZardeck mit einem Plugin. Nach dem Update des Herstellers / module / 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>

alles hat wie gewünscht funktioniert.

Danke @LordZardeck für den sauberen Code!

GeorgeGos
quelle
0

Hier ist die Lösung, die ich verwendet habe. Die Registerkarte Beschreibung und Attribute werden ausgetauscht, wenn beide verfügbar sind. Dies ist das Ultimo-Thema. Aber Sie werden es verstehen. KUSS.

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

Meine Lösung für das Problem besteht darin, die Vorlage details.phtml so zu ändern, dass die untergeordneten Blöcke aus dem Layout entfernt werden.

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

Auf diese Weise wird die Reihenfolge eingehalten, die von den After- und Before- Modifikatoren vorgegeben wurde .

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

Ich verwende immer noch das von getGroupChildNames bereitgestellte Array, um zu überprüfen , ob der Block zur Gruppe gehört.

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

Antonio Alonso
quelle
0

Ich wollte nicht an dem Thema arbeiten, sondern das Verhalten der Methode 'getGroupChildNames' ändern. Dieser Ansatz sollte auch dann funktionieren, wenn die Vorlage geändert wird.

Ich habe Folgendes zu catalog_product_view.xml hinzugefügt:

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

Erstellen Sie dann einen Block, um das Verhalten von 'getGroupChildNames' zu ändern:

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

Das ist alles.

amcastror
quelle
0

LordZardeck hat die beste Antwort, aber dies ist im Grunde ein Fehler und sollte im Kern behoben werden.

Die einfachste Lösung für das gefundene Problem ist folgende: Überschreiben Sie die Vorlage Magento_Catalog :: product / view / details.phtml und nach der ersten PHP-Bedingung in Zeile 10:

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

Fügen Sie folgenden Code hinzu, um die Reihenfolge zu ändern:

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

Dadurch wird die Reihenfolge geändert, und alle in $ _prepend aufgeführten Registerkarten werden in der festgelegten Reihenfolge an den Anfang des Arrays verschoben .

siux
quelle
0

Es sieht so aus, als ob all das nicht mehr relevant ist. Ab Magento 2.3.1 können wir sort_orderargument in xml config verwenden.

Krzysztof Wołowski
quelle
0

Ein Plugin ist eine schöne Lösung. Aber Sie können es noch verbessern. Sie möchten nicht jedes Mal ein anderes Plugin schreiben, wenn Sie die Tabs neu anordnen müssen. Sie möchten die Reihenfolge in XML festlegen. So was:

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

Anstatt die Vorlage zu ändern, erstellen Sie ein Plugin, mit dem Magento das priorityin xml config verwendete Argument versteht :

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

Und schließlich muss das Plugin auf die Magento\Catalog\Block\Product\View\DescriptionKlasse in der Datei di.xml angewendet werden.

Krzysztof Wołowski
quelle
0

Ändern Sie für Magento 2 die Reihenfolge der Registerkarten auf der Produktseite.

Sie können die Reihenfolge der Registerkarten auf einfache Weise anpassen.

  1. Erstellen Sie die Datei details.phtml in

app / design / frontend / anbieter / theme / Magento_Catalog / templates / product / view /

Wenn die Datei details.phtml bereits vorhanden ist, aktualisieren Sie sie.

  1. Fügen Sie diesen Code vor jeder Schleife hinzu. Definieren Sie das Array "$ DetailedInfoGroup".

Originalcode:

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

Nach dem Hinzufügen des Codes:

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

Und fügen Sie benutzerdefinierte Registerkarte in der Produktseite überprüfen Sie diesen Link

Magento 2 - Produktregisterkarte erstellen, auf der benutzerdefinierte Attribute angezeigt werden

Sohel Khan
quelle