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?


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.


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

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


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.


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.


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


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!


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

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


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.


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.


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.


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.


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.