Magento2: Ürün Sayfasındaki Sekmelerin sırasını değiştirme


16

Magento 2'deki ürün sayfasındaki sekmelerin sırasını değiştirmeye çalışıyorum. Varsayılan değerdir Details|More Information|Reviews.

Denedim:

Satıcı / tema / Magento_Catalog / düzeni / 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>

Ancak bu işe yaramaz ve öğeleri taşımak için önerilen yol budur. Sekmeleri sekme alanının dışına ve diğer alanlara taşıyabildim, ayrıca yeni sekmeler ekledim, ancak sekmelerin sırasını kontrol edemiyorum.

Benim tahminim bunun bir ilgisi var group="detailed_info"; Görünüşe göre Magento, XML'deki bu öznitelikle düzen öğelerini yakalar ve sekmeleri oluşturmak için içinden geçer.

Modülü yeniden yazmadan sekmelerin sırasını değiştirmenin bir yolu var mı?


Buna bir cevap buldunuz mu? Bendede aynı sorun var.
Alex

Henüz bir cevabım yok, üzgünüm.
andyjv

Taşıma elemanını kullanmayı denedim ve sizinle aynı sonuca vardım, sekmelerin dışına taşınabilirler ancak içinde sipariş edilmezler.
Ben Crook

Sadece küçük bir hile ile düzen ile yapılabilir. Burada gösterilen: magento.stackexchange.com/questions/106412/…
skymeissner

@andyjv lütfen çözümü burada bulabilirsiniz, bu size arzu çıktısı elde etmenize yardımcı olabilir. magento.stackexchange.com/a/242709/52244
lal

Yanıtlar:


22

Daha sonra yeni sekmeler eklemek ve bu sekmelerin önceliğini / sırasını değiştirmek durumunda, yaklaşımım biraz farklı ama muhtemelen daha fazla kanıt.

Temalarımın XML dosyasındaki XML Dosyası aracılığıyla her sekme için bir bağımsız değişken geçtim

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

Bu yüzden temalarım XML dosyası şöyle görünüyor:

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

Daha fazla ayarlamamız gerekiyor details.phtml, bu yüzden

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

için

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

details.phtmlMagento'nun kendisinin gelecekteki Magento versiyonlarında veya yamalarında değiştirilebileceğini lütfen unutmayın . Bu değişiklikler temanızın uygulamalarına da uygulanmalıdır.details.phtml

Şimdi XML dosyası üzerinden aktardığımız önceliği almamız gerekiyor.

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

Gördüğünüz gibi: Sadece birkaç satır eklemeniz gerekiyor ve her zaman xml dosyası aracılığıyla sekmelerin önceliğini / sırasını değiştirebilirsiniz, details.phtmlileride değiştirmek zorunda değilsiniz .


Lütfen "Daha fazla bilgi" sekmesinin altında "Ayrıntı" sekmesinin içeriğini nasıl gösterebiliriz?
Jai

sorunuz orijinal soruya değinmiyor. yeni bir bilet açmalısınız. Her neyse: Temanızın catalog_product_view.xml dosyasındaki yeni bir phtml dosyasına (örn. Description-attributes-combined.phtml) başvurabilir ve içeriği orijinal descrption.phtml ve attributes.phtml dosyalarından yapıştırabilirsiniz.
juhanix

Her iki dosyanın içeriğini bir dosyaya yapıştırdım ve xml dosyalarına şöyle çağırdım: <referenceBlock name = "product.info.details"> <block class = "Magento \ Catalogue \ Block \ Product \ View \ Açıklama" name = "product.info .description.attributes "template =" ürün / görünüm / açıklama-öznitelikler-combined.phtml "grup =" detaylı_bilgi "> <argümanlar> <argument translate =" true "name =" title "xsi: type =" string "> Daha fazla Bilgiler </argument> </arguments> </block> </referenceBlock> Ancak siteyi boş bırakın ve yalnızca sekmelerin içeriğini görüntüleyin. Ne kayıp?
Jai

Buraya soru ekledim: magento.stackexchange.com/q/157376/29175
Jai

@juhanix Bu, sonraki Magento düzeltme eklerinde değiştirilebilecek bir şablonu ileri çekmenizi gerektirir. Temel dosyaları değiştirmeyen cevabımı görün. İnşallah, bu yamalı olabilir çekirdek bir konudur.
LordZardeck

14

XML yapılandırma dosyası kullanarak ayrıntıları sayfasında Tabbing değiştirme pozisyonu için sonra veya önce bu durumda özellik değil yardım.

Şablon dosyasından değiştirmek zorundasınız.

Details.phtml dosyasını çekirdekten temanıza kopyalayın,

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

Bu dosyanın içinde, gibi değer almanız gereken print_r ($ detailInfoGroup) kullanarak tüm sekmelerin adını alabilirsiniz,

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

Dosyada her adresten önce yeni dizideki gereksiniminize göre ayarlamanız gerekir,

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

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

Ayrıntılar içindeki tam kod.phtml aşağıdaki gibidir,

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

Teşekkürler Rakesh Jesadiya, Bir cazibe gibi çalışıyor ...!
Sarfaraj Sipai

13

Magento 2.3.1 ve üzeri sürümlerde sort_order" app/design/frontend/Packagename/themename/Magento_Catalog/layout/catalog_product_view.xml" xml config

<referenceBlock name="product.info.description">
    <arguments>
        <argument name="title" translate="true" xsi:type="string">Description</argument>
        <argument name="sort_order" xsi:type="string">20</argument>
    </arguments>
</referenceBlock>

Ayrıca şablon dosyasında getGroupChildNames" getGroupSortedChildNames" yöntemini " " ile güncellediğinizden emin olun ( Geçersiz kılıyorsanız ) " app/design/frontend/Packagename/themename/Magento_Catalog/templates/product/view/details.phtml".

Eski Yöntem

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

Güncellenmiş Yöntem

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

Magento\Catalog\Block\Product\View\Details.phpBlok sınıfını geçersiz kılarsanız , blok sınıfınızda güncellenmiş " getGroupSortedChildNames" yöntemi de olmalıdır.


1
Bu kesinlikle 2.3.1'den sonraki doğru cevaptır.
Geat

2.3.2'de benim için çalışıyor, çok teşekkürler!
Jared Chu

3

Bu sorunun başka cevapları olduğunu biliyorum, ama hepsi benim zevkime göre çok invaziv. Soruna bakarak Magento, bir öğeye ayrı bir "grup" özniteliği ekler ve bu özniteliğe, düzende yüklü sırayla, sıralı öğe dizisini içeren children dizisinden tamamen ayrı olarak alt öğeler ekler. Bunu düzeltmek için, grup çocuklarını alırken sıralamayı düzelten basit bir eklenti etrafında yazdım:

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

Bu, şimdi , beklediğiniz gibi düzen XML'deki standardı beforeve afternitelikleri kullanarak sekmeleri sipariş etmenize izin verecek ve muhtemelen gelecekteki Magento yamalarında değiştirilmesi gerekmeyecek.


Güçlü ve onurlu LordZardeck doğru cevabı verdi. Yukarıdaki yanıtların çoğunda olduğu gibi bir şablona çok fazla mantık eklemek, daha yeni magento sürümlerine güncelleme yaparken sorun istiyor.
Nathan Toombs

Bunu Magento 2.2.4 mağazam için kullandı.! sihir gibi çalıştı.!
ishu

3

Sıralama düzeni bağımsız değişkenini kullanarak başka bir yol.

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

Sıralama düzeni bağımsız değişkenini product.info.details başvuru bloğu kabının içine ekleyin.

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

Sıralama düzeni bağımsız değişken değerini siparişinize göre 10, 20, 30 olarak değiştirin.


1
bir örnekle mükemmel cevap sort_orderbenim için önemliydi, +1 günümü yaptı :)
SagarPPanchal

2

Bence bunları sadece seçtiğiniz sırayla eklemeniz gerekiyor. Benim için şu sırayla 4 sekme kullanıyorum:

  1. ayrıntılar
  2. Ürün etiketleri
  3. Özel Sekme 1
  4. Özel Sekme 2

Özel modülümde şu düzen dosyasını oluşturdum: catalog_product_view.xml bu içerikle:

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

Ayrıntılar sekmesi zaten mevcut olduğundan yalnızca 3 sekme eklediğimi görebilirsiniz. Sonuç olarak sekmeleri bu sırayla aldım:

  1. Ürün etiketleri
  2. Özel Sekme 1
  3. Özel Sekme 2
  4. ayrıntılar

Bu istediğim şey değil, şimdi benim çözümüm de yine Ayrıntılar sekmesini eklemek, böylece düzen dosyam şöyle olacak:

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

Şimdi istediğim sipariş var :) resim açıklamasını buraya girin


1

En kolay ve en iyi yol bence LordZardeck'in bir eklenti ile çözümü . Satıcı / modül / etc / frontend / di.xml dosyasını güncelledikten sonra

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

her şey istendiği gibi çalıştı.

Temiz kod için @LordZardeck teşekkürler!


0

İşte kullandığım çözüm. Her ikisi de mevcutsa, açıklama ve özellikler sekmesini değiştirir. Bu Ultimo temasını kullanıyor. Ama konuyu anlayacaksınız. ÖPMEK.

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

Konuya Çözümümün şablon değiştirmektir details.phtml o düzeni çocukları blokları alır böylece.

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

Bu şekilde yaparak, bunun verdiği siparişi saygı sonrasında ve öncesinde modificators.

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

Hala bloğa gruba ait olup olmadığını doğrulamak için getGroupChildNames tarafından sağlanan dizi kullanın .

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


0

Tema üzerinde çalışmak istemedim, 'getGroupChildNames' yöntem davranışını değiştirmek istedim. Bu yaklaşım, şablon değiştirilse bile çalışmalıdır.

Bunu catalog_product_view.xml dosyasına ekledim:

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

Ardından, 'getGroupChildNames' davranışını değiştirmek için bir blok oluşturun:

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

Bu kadar.


0

LordZardeck en iyi cevaba sahiptir, ancak bu temelde bir hatadır ve çekirdeğe sabitlenmelidir.

Bulduğum soruna en basit çözüm aşağıdaki gibidir: Magento_Catalog :: product / view / details.phtml şablonunu ve 10. satırdaki ilk php koşulundan sonra geçersiz kılın :

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

siparişi değiştirmek için aşağıdaki kodu ekleyin:

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

bu, sırayı değiştirir ve $ _ppendide olarak listelenen tüm sekmeleri tanımlanan sırayla dizinin başına iter .


0

Yukarıdakilerin hepsi artık alakalı değil gibi görünüyor. Magento 2.3.1'den itibaren sort_orderxml config'te argüman kullanabiliriz .


0

Bir eklenti güzel bir çözümdür. Ama yine de geliştirebilirsiniz. Sekmeleri yeniden sıralamanız gerektiğinde farklı bir eklenti yazmak istemezsiniz. Ne yapmak istediğinizi xml olarak ayarlamaktır. Bunun gibi:

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

ve sonra şablonu değiştirmek yerine Magento'nun priorityxml config'te kullanılan argümanı anlamasını sağlayacak bir eklenti oluşturun :

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

Ve son olarak eklenti Magento\Catalog\Block\Product\View\Descriptionsınıfa di.xml dosyasında uygulanmalıdır.


0

Magento 2 için, ürün sayfasındaki sekmelerin sırasını değiştirin.

Sekme sırasını basit bir şekilde kolayca özelleştirebilirsiniz.

  1. Details.phtml dosyası oluşturun

Uygulamanın / tasarım / kullanıcı arayüzü / satıcı / tema / Magento_Catalog / templates / ürün / görünüm /

Details.phtml dosyası zaten varsa, güncelleyin.

  1. Foreach döngüsünden önce bu kodu ekleyin. "$ DetailInfoGroup" dizisini tanımlayın.

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

Kod ekledikten sonra:

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

Ürün sayfasına özel sekme ekle ve bu bağlantıyı kontrol et

Magento 2 - Özel özellik gösteren ürün sekmesi oluştur

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.