Magento2: Zmień kolejność kart na stronie produktu

16

Próbuję zmienić kolejność kart na stronie produktu w Magento 2. Domyślnie jest Details|More Information|Reviews.

Próbowałem:

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

Ale to nie działa i jest to zalecany sposób przenoszenia elementów. Byłem w stanie przenieść karty z obszaru kart i do innych obszarów, a także dodać nowe karty, ale nie mogę kontrolować kolejności kart.

Domyślam się, że ma to coś wspólnego group="detailed_info" ; Wygląda na to, że Magento pobiera elementy układu z tym atrybutem w pliku XML i przechodzi przez nie, aby utworzyć zakładki.

Czy istnieje sposób na zmianę kolejności zakładek bez przepisywania modułu?

andyjv
źródło
Znalazłeś odpowiedź na to? Mam ten sam problem.
Alex
Nie mam jeszcze odpowiedzi, przepraszam.
andyjv
Próbowałem użyć elementu move i doszedłem do tego samego wniosku co ty, można je przenieść poza zakładki, ale nie można w nich porządkować.
Ben Crook
Można to zrobić za pomocą układu tylko z małą sztuczką. Pokazane tutaj: magento.stackexchange.com/questions/106412/…
skymeissner
@andyjv proszę znaleźć rozwiązanie tutaj, może to pomóc w osiągnięciu pożądanej wydajności. magento.stackexchange.com/a/242709/52244
Kanhaiya lal

Odpowiedzi:

22

Moje podejście jest nieco inne, ale prawdopodobnie bardziej przyszłościowe, w przypadku późniejszego dodawania nowych kart i zmiany priorytetu / kolejności tych kart.

Podałem argument dla każdej karty poprzez plik XML w moim pliku XML motywów

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

Tak więc plik XML moich motywów wygląda mniej więcej tak:

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

Ponadto musimy dostosować details.phtml, więc skopiuj go z

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

do

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

Należy pamiętać, że własne Magento details.phtmlmogą zostać zmienione w przyszłych wersjach lub łatkach Magento. Te zmiany należy również zastosować do motywudetails.phtml

Teraz musimy uzyskać priorytet, który przekazaliśmy za pomocą pliku 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; ?>

Więc widzisz: Musisz tylko dodać kilka wierszy i zawsze możesz zmienić priorytet / kolejność kart za pomocą pliku xml, nie musisz details.phtmljuż więcej zmieniać w przyszłości.

juhanix
źródło
Jak możemy wyświetlić zawartość zakładki „Szczegóły” u dołu zakładki „Więcej informacji”?
Jai
twoje pytanie nie odnosi się do pierwotnego pytania. powinieneś otworzyć nowy bilet. W każdym razie: możesz odwołać się do nowego pliku phtml w pliku katalog_produktu_widoku.xml kompozycji (np. Opis-atrybuty-połączone.phtml) i wkleić treść z oryginalnego pliku descrption.phtml i atrybuty.phtml.
juhanix
Wkleiłem zawartość obu plików w jednym i wywołałem w plikach xml jako: <referenceBlock name = "product.info.details"> <block class = "Magento \ Catalog \ Block \ Product \ View \ Description" name = "product.info .description.attributes "template =" produkt / widok / opis-atrybuty-połączone.phtml "grupa =" szczegółowe_info "> <arguments> <argument translate =" true "name =" title "xsi: type =" string "> Więcej Informacje </argument> </arguments> </block> </referenceBlock> Ale pusta strona i wyświetla tylko zawartość kart. Czego brakuje?
Jai
Dodałem pytanie tutaj: magento.stackexchange.com/q/157376/29175
Jai
@juhanix Wymaga to pobrania szablonu, który można zmodyfikować w późniejszych łatkach Magento. Zobacz moją odpowiedź, która nie modyfikuje żadnych podstawowych plików. Mamy nadzieję, że jest to podstawowy problem, który można rozwiązać.
LordZardeck
14

Aby zmienić pozycję Tabulacji na stronie szczegółów, użycie pliku konfiguracyjnego XML po lub przed atrybutem nie pomaga w tym przypadku.

Musisz zmienić z pliku szablonu.

Skopiuj plik details.phtml z rdzenia do motywu,

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

Wewnątrz tego pliku możesz pobrać nazwę wszystkich kart, używając print_r ($ szczegółowyInfoGroup) , musisz uzyskać wartość, np.

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

Musisz ustawić zgodnie z wymaganiami w nowej tablicy, zanim zaczniesz w pliku,

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

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

Pełny kod w pliku details.phtml jest jak poniżej,

<?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
źródło
Dzięki Rakesh Jesadiya, Działa jak urok ...!
Sarfaraj Sipai
13

W Magento 2.3.1 lub powyżej możemy użyć sort_orderargumentu w app/design/frontend/Packagename/themename/Magento_Catalog/layout/catalog_product_view.xmlkonfiguracji „ ” 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>

Upewnij się także, aby zaktualizować metodę „ getGroupChildNames” za pomocą „ getGroupSortedChildNames” w pliku szablonu ( jeśli ją zastępujesz ) „ app/design/frontend/Packagename/themename/Magento_Catalog/templates/product/view/details.phtml”.

Stara metoda

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

Zaktualizowana metoda

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

Jeśli przesłaniasz Magento\Catalog\Block\Product\View\Details.phpklasę bloków, twoja klasa bloków również powinna mieć zaktualizowaną metodę „ getGroupSortedChildNames”.

Nadeem0035
źródło
1
To zdecydowanie właściwa odpowiedź od 2.3.1.
Geat,
Działa dla mnie 2.3.2, wielkie dzięki!
Jared Chu
3

Wiem, że były inne odpowiedzi na to pytanie, ale wszystkie były zbyt inwazyjne na mój gust. Analizując problem, Magento dodaje osobny atrybut „grupa” do elementu i dodaje elementy podrzędne do tego atrybutu w kolejności załadowanej w układzie, całkowicie oddzielone od tablicy podrzędnej zawierającej posortowaną tablicę elementów. Aby to naprawić, napisałem prostą wtyczkę, która naprawia sortowanie podczas pobierania grup dzieci:

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

Umożliwi to teraz zamawianie kart przy użyciu standardu beforei afteratrybutów w układzie XML zgodnie z oczekiwaniami i prawdopodobnie nie będzie potrzeby modyfikacji w przyszłych łatkach Magento.

LordZardeck
źródło
Potężny i honorowy LordZardeck udzielił poprawnej odpowiedzi. Dodanie tyle logiki do szablonu, jak większość powyższych odpowiedzi, po prostu prosi o kłopoty przy aktualizacji do nowszych wersji Magento.
Nathan Toombs
użyłem tego do mojego sklepu Magento 2.2.4.! działało jak magia!
ishu
3

Innym sposobem jest użycie argumentu kolejności sortowania.

Ścieżka pliku - app\design\frontend\<companyNAme>\<ThemeName>\Magento_Catalog\layout\catalog_product_view.xml

Dodaj argument kolejności sortowania w kontenerze bloku referencyjnego product.info.details.

Przykładowy kod

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

Zmień wartość argumentu kolejności sortowania na 10, 20, 30 zgodnie z zamówieniem.

Rathna
źródło
1
idealna odpowiedź z przykładem sort_orderbyła dla mnie ważna, +1 sprawiło, że mój dzień :)
SagarPPanchal
2

Myślę, że musisz je dodać w wybranej przez siebie kolejności. Dla mnie używam 4 zakładek w tej kolejności:

  1. Detale
  2. Tagi produktów
  3. Karta niestandardowa 1
  4. Karta niestandardowa 2

W moim module niestandardowym utworzyłem ten plik układu: katalog_produktu_widok.xml z następującą zawartością:

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

Widać, że dodałem tylko 3 zakładki, ponieważ zakładka szczegółów już istnieje. W rezultacie mam zakładki w następującej kolejności:

  1. Tagi produktów
  2. Karta niestandardowa 1
  3. Karta niestandardowa 2
  4. Detale

Co nie jest tym, czego chciałem, teraz moim rozwiązaniem jest dodanie jeszcze raz zakładki Szczegóły, aby mój plik układu wyglądał następująco:

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

Teraz mam zamówienie, które chcę :) wprowadź opis zdjęcia tutaj

Abdelkebir ELHARFALI
źródło
1

Moim zdaniem najłatwiejszym i najlepszym sposobem jest rozwiązanie LordZardeck z wtyczką. Po zaktualizowaniu dostawcy / modułu / 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>

wszystko działało zgodnie z oczekiwaniami.

Dzięki @LordZardeck za czysty kod!

GeorgeGos
źródło
0

Oto rozwiązanie, którego użyłem. Zamieni zakładkę opisu i atrybutów, jeśli są one dostępne. To używa motywu Ultimo. Ale dostaniesz sens. POCAŁUNEK.

<?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
źródło
0

Moim rozwiązaniem tego problemu jest zmodyfikowanie szablonu details.phtml, aby pobierał bloki potomne z układu.

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

Robiąc to w ten sposób, przestrzega kolejności podanej przez modyfikatory po i przed nimi .

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

Nadal używam tablicy dostarczonej przez getGroupChildNames w celu sprawdzenia, czy blok należy do grupy.

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

Antonio Alonso
źródło
0

Nie chciałem pracować nad kompozycją, chciałem zmodyfikować zachowanie metody „getGroupChildNames”. To podejście powinno działać, nawet jeśli szablon zostanie zmodyfikowany.

Dodałem to do 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>

Następnie utwórz blok, aby zmienić zachowanie „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);
    }
}

To wszystko.

amcastror
źródło
0

LordZardeck ma najlepszą odpowiedź, ale jest to zasadniczo błąd i powinien zostać naprawiony w rdzeniu.

Najprostsze rozwiązanie problemu, jaki znalazłem, jest następujące: Zastąp szablon Magento_Catalog :: product / view / details.phtml i po pierwszym warunku php w linii 10:

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

dodaj następujący kod, aby zmodyfikować zamówienie:

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

to zmieni kolejność i popchnie wszystkie karty wymienione w $ _prepend na początek tablicy w zdefiniowanej kolejności.

siux
źródło
0

Wygląda na to, że wszystkie powyższe nie są już istotne. Od Magento 2.3.1 możemy używać sort_orderargumentu w konfiguracji xml.

Krzysztof Wołowski
źródło
0

Wtyczka jest dobrym rozwiązaniem. Ale nadal możesz to poprawić. Nie chcesz pisać innej wtyczki za każdym razem, gdy musisz zmienić kolejność kart. Co chcesz zrobić, to ustawić kolejność w XML. Lubię to:

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

a następnie, zamiast modyfikować szablon, utwórz wtyczkę, dzięki której Magento zrozumie priorityargument użyty w konfiguracji 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;
    }
}

I wreszcie wtyczka musi zostać zastosowana do Magento\Catalog\Block\Product\View\Descriptionklasy w pliku di.xml.

Krzysztof Wołowski
źródło
0

W przypadku Magento 2 zmień kolejność zakładek na stronie produktu.

Możesz łatwo dostosować kolejność kart w prosty sposób.

  1. Utwórz plik details.phtml w

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

Jeśli plik details.phtml już istnieje, zaktualizuj go.

  1. Dodaj ten kod przed pętlą foreach. Zdefiniuj tablicę „$ szczegółowyInfoGroup”.

Oryginalny kod:

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

Po dodaniu kodu:

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

I dodaj niestandardową kartę na stronie produktu sprawdź ten link

Magento 2 - Utwórz kartę produktu, która wyświetla niestandardowy atrybut

Sohel Khan
źródło