Magento2: उत्पाद पृष्ठ पर टैब का क्रम बदलें


16

मैं Magento 2 में उत्पाद पृष्ठ पर टैब के क्रम को बदलने की कोशिश कर रहा हूं। डिफ़ॉल्ट है Details|More Information|Reviews

मैंने कोशिश की:

विक्रेता / विषय / Magento_Catalog / लेआउट / 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>

लेकिन यह काम नहीं करता है, और चलती तत्वों के लिए अनुशंसित तरीका thats। मैं टैब क्षेत्र से और अन्य क्षेत्रों में टैब को स्थानांतरित करने में सक्षम था, साथ ही नए टैब भी जोड़ सकता था, लेकिन मैं टैब के क्रम को नियंत्रित नहीं कर सकता।

मेरा अनुमान है कि इसके साथ कुछ करना है group="detailed_info"; ऐसा लगता है कि Magento XML में इस विशेषता के साथ लेआउट तत्वों को पकड़ता है और टैब बनाने के लिए इसके माध्यम से लूप करता है।

क्या मॉड्यूल को फिर से लिखने के बिना टैब के क्रम को बदलने का एक तरीका है?


क्या आपको इसका जवाब मिला? मुझे भी यही तकलीफ़ है।
एलेक्स

मेरे पास अभी कोई जवाब नहीं है, क्षमा करें।
andyjv

मैंने चाल तत्व का उपयोग करने की कोशिश की और आप के रूप में उसी निष्कर्ष पर पहुंचे, उन्हें टैब से बाहर ले जाया जा सकता है लेकिन उनके भीतर आदेश नहीं दिया गया है।
बेन क्रुक

यह केवल एक छोटी सी चाल के साथ लेआउट द्वारा किया जा सकता है। यहाँ दिखाया गया है: magento.stackexchange.com/questions/106412/…
skymeissner

@andyjv कृपया यहां समाधान ढूंढें, इससे आपको इच्छा उत्पादन प्राप्त करने में मदद मिल सकती है। magento.stackexchange.com/a/242709/52244
कन्हैया लाल

जवाबों:


22

बाद में नए टैब जोड़ने और इन टैब की प्राथमिकता / क्रम बदलने के मामले में मेरा दृष्टिकोण थोड़ा अलग है, लेकिन शायद अधिक भविष्य का प्रमाण है।

मैंने अपने विषय XML फ़ाइल में XML फ़ाइल के माध्यम से प्रत्येक टैब के लिए एक तर्क दिया

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

तो मेरे विषय XML फ़ाइल कुछ इस तरह दिखता है:

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

इसके अलावा, हमें इसे समायोजित करना होगा details.phtml, इसलिए इसे कॉपी करें

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

सेवा

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

कृपया ध्यान रखें कि details.phtmlभविष्य के Magento के संस्करणों या पैच में Magento के स्वयं को बदला जा सकता है। ये परिवर्तन आपकी थीम पर भी लागू होने चाहिएdetails.phtml

अब हमें उस प्राथमिकता को प्राप्त करने की आवश्यकता है जिसे हमने 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; ?>

इसलिए आप देखते हैं: आपको बस कुछ पंक्तियों को जोड़ना होगा और हमेशा xml फ़ाइल के माध्यम से टैब की प्राथमिकता / क्रम को बदल सकते हैं, आपको details.phtmlभविष्य में और नहीं बदलना होगा।


हम "अधिक जानकारी" टैब के नीचे कृपया नीचे "विवरण" टैब की सामग्री कैसे प्रदर्शित कर सकते हैं?
जय

आपका प्रश्न मूल प्रश्न का संदर्भ नहीं है। आपको एक नया टिकट खोलना चाहिए। फिर भी: आप अपनी थीम के कैटलॉग_प्रोडक्ट_व्यू.एक्सएमएल में एक नई phtml फ़ाइल का संदर्भ दे सकते हैं (जैसे विवरण-विशेषताएँ-संयुक्त-phtml) और मूल descrption.phtml और विशेषताएँ.phtml से सामग्री पेस्ट करें।
जुहनीक्स

मैंने दोनों फ़ाइल की सामग्री को एक में चिपकाया और xml फ़ाइलों में बुलाया: <referenceBlock नाम = "product.info.details"> <ब्लॉक वर्ग = "Magento \ कैटलॉग \ ब्लॉक \ उत्पाद \ दृश्य \ विवरण" नाम = "product.info .description.attributes "टेम्पलेट =" उत्पाद / दृश्य / वर्णन-विशेषताएँ-संयुक्त। phtml "समूह =" विस्तृत_इनफो "> <तर्क> <तर्क अनुवाद =" सही "नाम =" शीर्षक "xsi: प्रकार =" स्ट्रिंग "> अधिक सूचना </ तर्क> </ तर्क> </ ब्लॉक> </ संदर्भबेल> लेकिन रिक्त साइट और केवल टैब की सामग्री प्रदर्शित करें। क्या कमी है?
जय

मैंने यहाँ प्रश्न जोड़ा: magento.stackexchange.com/q/157376/29175
जय

@juhanix इसके लिए आपको एक टेम्प्लेट को आगे खींचना होगा, जिसे बाद में Magento के पैच में संशोधित किया जा सकता है। मेरा उत्तर देखें जो किसी भी कोर फ़ाइलों को संशोधित नहीं करता है। उम्मीद है, यह एक मुख्य मुद्दा है जो पैच हो सकता है।
लॉर्डजार्डक जुले

14

विवरण पृष्ठ में टैबिंग की स्थिति बदलने के लिए, इस स्थिति में मदद नहीं करने से पहले या बाद में XML कॉन्फ़िगरेशन फ़ाइल का उपयोग करना ।

आपको टेम्पलेट फ़ाइल से बदलना होगा।

अपने विषय के लिए विवरण की प्रतिलिपि बनाएँ।

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

इस फ़ाइल के अंदर, आप सभी टैब नाम का उपयोग करके प्रिंट कर सकते हैं, print_r ($ विस्तृतInfoGroup) जैसे मूल्य प्राप्त करने के लिए आपको

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

आपको फ़ाइल में फ़ार्च से पहले नए सरणी में अपनी आवश्यकता के अनुसार सेट करना होगा,

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

जोड़ना <?php foreach ($newOrderTab as $name):?> ,

विवरणों में पूरा कोड। phtml नीचे जैसा है,

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

धन्यवाद राकेश जेसादिया, यह एक आकर्षण की तरह काम कर रहा है ...!
सरफराज सिपाई

13

Magento 2.3.1 या इसके बाद के संस्करण में हम sort_orderतर्क का उपयोग कर सकते हैं " app/design/frontend/Packagename/themename/Magento_Catalog/layout/catalog_product_view.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>

टेम्पलेट फ़ाइल में " getGroupChildNames" के साथ " getGroupSortedChildNames" विधि को अपडेट करना सुनिश्चित करें ( यदि आप इसे ओवरराइड कर रहे हैं ) " app/design/frontend/Packagename/themename/Magento_Catalog/templates/product/view/details.phtml"।

पुरानी विधि

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

अपडेटेड विधि

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

यदि आप Magento\Catalog\Block\Product\View\Details.phpब्लॉक क्लास को ओवरराइड कर रहे हैं तो आपके ब्लॉक क्लास में वह अपडेटेड विधि " getGroupSortedChildNames" होनी चाहिए ।


1
यह निश्चित रूप से 2.3.1 से सही उत्तर है।
गत

यह 2.3.2 पर मेरे लिए काम करता है, बहुत बहुत धन्यवाद!
जारेड चू

3

मुझे पता है कि इस प्रश्न के अन्य उत्तर भी हैं, लेकिन वे सभी मेरे स्वाद के लिए बहुत आक्रामक थे। इस मुद्दे को देखते हुए, Magento एक तत्व में एक अलग "समूह" विशेषता जोड़ता है और लेआउट में लोड किए गए क्रम में उस विशेषता में बच्चों को जोड़ता है, जो बच्चों के सरणी से पूरी तरह से अलग होता है जिसमें तत्वों का क्रमबद्ध सरणी होता है। इसे ठीक करने के लिए, मैंने एक सरल चारों ओर प्लगइन लिखा जो समूह के बच्चों को निकालते समय छंटाई को ठीक करता है:

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

यह अब आपको लेआउट XML में मानक beforeऔर afterविशेषताओं का उपयोग करके टैब को ऑर्डर करने की अनुमति देगा जैसा कि आप उम्मीद करेंगे, और संभवतः भविष्य के मैगेंटो पैच पर संशोधित करने की आवश्यकता नहीं होगी।


शक्तिशाली और सम्माननीय लॉर्डज़ार्ड ने सही उत्तर दिया है। एक टेम्प्लेट में इतना तर्क जोड़ना, जैसा कि ऊपर दिए गए अधिकांश उत्तर करते हैं, नए मैगेंटो संस्करणों में अपडेट करते समय सिर्फ परेशानी पूछ रहे हैं।
नाथन टॉम्ब्स

मेरे Magento 2.2.4 स्टोर के लिए इसका इस्तेमाल किया। जादू की तरह काम किया।!
ishu

3

एक अन्य तरीका क्रम क्रम तर्क का उपयोग कर रहा है।

फ़ाइल पथ - app\design\frontend\<companyNAme>\<ThemeName>\Magento_Catalog\layout\catalog_product_view.xml

Product.info.details संदर्भ ब्लॉक कंटेनर के अंदर क्रम क्रम तर्क जोड़ें।

उदाहरण कोड

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

अपने आदेश के अनुसार क्रम क्रम तर्क मान को 10, 20, 30 में बदलें।


1
एक उदाहरण के साथ सही जवाब sort_orderमेरे लिए महत्वपूर्ण था, +1 ने मेरा दिन बना दिया :)
सागरपंचल

2

मुझे लगता है कि आपको अपनी पसंद के क्रम में उन्हें जोड़ने की जरूरत है। मेरे लिए, मैं इस क्रम में 4 टैब का उपयोग कर रहा हूँ:

  1. विवरण
  2. उत्पाद टैग
  3. प्रथा Tab १
  4. कस्टम टैब 2

अपने कस्टम मॉड्यूल में मैंने यह लेआउट फ़ाइल बनाई: कैटलॉग_प्रोडक्ट_व्यू। Xml इस सामग्री के साथ:

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

आप देख सकते हैं कि मैंने सिर्फ 3 टैब जोड़े हैं क्योंकि विवरण टैब पहले से मौजूद है। परिणामस्वरूप मुझे इस क्रम में टैब मिले हैं:

  1. उत्पाद टैग
  2. प्रथा Tab १
  3. कस्टम टैब 2
  4. विवरण

जो मैं नहीं चाहता था, अब इसका समाधान यह है कि विवरण टैब को भी फिर से जोड़ा जाए, इसलिए मेरी लेआउट फ़ाइल इस तरह होगी:

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

अब मुझे आदेश है कि मुझे चाहिए :) यहाँ छवि विवरण दर्ज करें


1

सबसे आसान और सबसे अच्छा तरीका मेरी राय में एक प्लगइन के साथ लॉर्डज़ार्डेक का समाधान हैविक्रेता / मॉड्यूल / आदि / फ्रंटेंड / 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>

सब कुछ वांछित के रूप में काम किया।

स्वच्छ कोड के लिए @LordZardeck धन्यवाद!


0

यहाँ समाधान मैं इस्तेमाल किया है। यदि वे दोनों उपलब्ध हैं तो यह विवरण और गुण टैब को स्वैप कर देगा। यह अल्टिमो थीम का उपयोग कर रहा है। लेकिन आपको बात मिल जाएगी। चुम्मा।

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

इस मुद्दे का मेरा समाधान टेम्पलेट विवरण को संशोधित करना है। HTML को ताकि यह बच्चों को लेआउट से ब्लॉक करता है।

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

इसे इस तरह से करने के बाद , यह मॉडरेटर्स के बाद और पहले दिए गए आदेश का सम्मान करता है ।

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

यदि समूह ब्लॉक से संबंधित है, तो मान्य करने के लिए मैं अभी भी getGroupChildNames द्वारा प्रदान की गई सरणी का उपयोग करता हूं ।

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


0

मैं विषय पर काम नहीं करना चाहता था, मैं 'getGroupChildNames' विधि व्यवहार को संशोधित करना चाहता था। यदि टेम्पलेट संशोधित हो जाता है तो भी यह दृष्टिकोण काम करना चाहिए।

मैंने इसे 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>

फिर, '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);
    }
}

बस इतना ही।


0

लॉर्डज़ार्ड का सबसे अच्छा जवाब है, लेकिन यह मूल रूप से एक बग है और कोर में तय किया जाना चाहिए।

मेरे द्वारा पाई गई समस्या का सबसे सरल समाधान इस प्रकार है: Magento_Catalog ओवरराइड करें :: उत्पाद / दृश्य / विवरण.phtml टेम्पलेट और लाइन 10 पर पहली php स्थिति के बाद:

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

आदेश को संशोधित करने के लिए निम्नलिखित कोड जोड़ें:

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

यह ऑर्डर को बदल देगा और $ _prepend में सूचीबद्ध सभी टैब को परिभाषित किए गए क्रम में सरणी की शुरुआत में धकेल देगा


0

ऐसा लगता है कि उपरोक्त सभी अब प्रासंगिक नहीं हैं। Magento 2.3.1 के रूप में हम sort_orderxml कॉन्फिगरेशन में तर्क का उपयोग कर सकते हैं ।


0

एक प्लगइन एक अच्छा समाधान है। लेकिन आप अभी भी उस पर सुधार कर सकते हैं। आपको हर बार टैब को पुनः व्यवस्थित करने के लिए एक अलग प्लगइन लिखने की ज़रूरत नहीं है। आप जो करना चाहते हैं, वह ऑर्डर को xml में सेट करना है। ऐशे ही:

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

और फिर, टेम्पलेट को संशोधित करने के बजाय, एक प्लगइन बनाएं जो Magento priorityको xml config में प्रयुक्त तर्क को समझेगा :

class TabOrder
{
    const TABS_BLOCK_NAME = 'product.info.details';
    const ORDER_ARGUMENT_NAME = 'priority';

    public function afterGetGroupChildNames(
        \Magento\Catalog\Block\Product\View\Description $subject,
        array $result
    ) {
        if ($subject->getNameInLayout() === self::TABS_BLOCK_NAME) {
            foreach ($result as $blockName) {
                // get priority for each block and include it in modifiedResult
                $alias = $subject->getLayout()->getElementAlias($blockName);

                // 100 default value guarantees the tab without priority argument goes last
                $blockPosition =
                    $subject->getChildData($alias, self::ORDER_ARGUMENT_NAME) ?? 100;
                $modifiedResult[] = array(
                    $blockName,
                    $blockPosition);
            }

            // order elements from $modifiedResult by priority
            usort($modifiedResult, function ($a, $b) {
                return $a[1] <=> $b[1];
            });

            // remove priority and leave original values only
            array_walk($modifiedResult, function (&$value, $key) {
                $value = $value[0];
            });

            return $modifiedResult;
        }

        return $result;
    }
}

और अंत में प्लगइन को Magento\Catalog\Block\Product\View\Descriptiondi.xml फ़ाइल में कक्षा में लागू किया जाना चाहिए ।


0

Magento के लिए 2 उत्पाद पृष्ठ के टैब का क्रम बदलें।

आप सरल तरीके से टैब के क्रम को आसानी से अनुकूलित कर सकते हैं।

  1. विवरण बनाएँ

एप्लिकेशन / डिजाइन / दृश्यपटल / विक्रेता / विषय / Magento_Catalog / टेम्पलेट्स / उत्पाद / देखें /

यदि details.phtml फ़ाइल पहले से मौजूद है तो इसे अपडेट करें।

  1. इस कोड को foreach loop से पहले जोड़ें। "$ विस्तृतInfoGroup" सरणी को परिभाषित करें।

मूल कोड:

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

कोड जोड़ने के बाद:

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

और उत्पाद पृष्ठ में कस्टम टैब जोड़ें इस लिंक की जांच करें

Magento 2 - उत्पाद टैब बनाएँ जो कस्टम विशेषता प्रदर्शित करता है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.