Magento2'de Core Block, Model ve controller nasıl geçersiz kılınır


49

Magento2'de temel model blokları ve kontrolörleri geçersiz kıldım. Birisi bana bu konuda yardım edebilir mi?

Listenin araç çubuğunu, en popüler sıralama olarak adlandırılan yeni bir sıralama seçeneği eklemem gereken örnek olarak alalım . Nasıl eklerim? Bunun için blok seviyesinde seçenek ve List.phptoplama seviyesinde koşul eklememiz gerekiyor .


1
Çekirdek sınıfları geçersiz kılmak kötü bir fikirdir ve birçok farklı şekilde yapılabilir. Özel durumunuzu açıklayabilir misiniz?
KAndy

@KAndy: - en popüler olan sıralama denilen yeni bir sıralama seçeneği eklemem gereken liste araç çubuğunun örneğini örnekleyelim, sonra bunun nasıl ekleneceğini umuyorum. Bunun için List.php toplama seviyesindeki blok seviyesinde ve koşulunda seçenek eklemeliyiz
Pradeep Kumar

Bunun için \ Magento \ Catalogue \ Block \ Product \ ProductList \ Toolbar :: getAvailableOrders üzerindeki Plugin Yürütme işleminden sonra tam olarak kullanmanız gerekir. Başka herhangi bir eklenti kullanacak olursa müşteri tüm siparişleri alır. yeniden
yazma

@KAndy: - lütfen örnek kod verebilir misiniz, eklenti alıyorum di.xml ve eklenti php koduna ihtiyacım var ve eklenti ex sipariş ızgarasını kullanarak admin ızgarası için yeni sütun eklemek için nasıl lütfen eklenti ex kodunda bana yardım edin
Pradeep Kumar

@Kandy: - lütfen herhangi bir eklenti kodunu ürün modelinde paylaşın, ürün getname () ile biraz metin ekleyin
Pradeep Kumar

Yanıtlar:


30

Magento2, Plugin adında çok iyi bir konsept verdi.

çekirdek işlevinden önce ve sonra ne yapabiliriz ve ayrıca aşağıda daha önce ve sonra yapacak olan bir tane daha var.

Mymodule / etc / di.xml dosyasında di.xml dosyasını oluşturun

<?xml version="1.0"?>
<!--
/**
 * Copyright © 2015 Magento. All rights reserved.
 * See COPYING.txt for license details.
 */
-->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/ObjectManager/etc/config.xsd">
   <type name="Magento\Catalog\Block\Product\View">
        <plugin name="inroduct-custom-module" type="Sugarcode\Test\Block\Plugin\Product\View" sortOrder="1"/>
    </type>
    <type name="Magento\Catalog\Model\Product">
        <plugin name="getname-test-module" type="Sugarcode\Test\Model\Plugin\Product" sortOrder="10"/>
    </type>
</config>

bu konuda örnek Model ve Ürün Görünümü Bloğu örneğini aldım.

Sonra emin 2 parametre birincisi senin 2 birini kullanarak nesne hangi orada olmalı yapmak etrafında herhangi fonksiyon kullanımı öneki ve Ürün Görüntüle bloğunda etrafında kullanılan Kapatma eski dönüş bilgisi korumak olduğunu

<?php
namespace Sugarcode\Test\Block\Plugin\Product;

class View 
{ 
    public function aroundGetProduct(\Magento\Catalog\Block\Product\View $subject, \Closure $proceed)
    {

        echo 'Do Some Logic Before <br>';
        $returnValue = $proceed(); // it get you old function return value
        //$name='#'.$returnValue->getName().'#';
        //$returnValue->setName($name);
        echo 'Do Some Logic  After <br>';
        return $returnValue; // if its object make sure it return same object which you addition data
    }


}

İ modelinde önce ve sonra kullanılır.

<?php
/**
 * Copyright © 2015 Magento. All rights reserved.
 * See COPYING.txt for license details.
 */
namespace Sugarcode\Test\Model\Plugin;

class Product
{        
    public function beforeSetName(\Magento\Catalog\Model\Product $subject, $name)
    {
        return array('(' . $name . ')');
    }

     public function afterGetName(\Magento\Catalog\Model\Product $subject, $result)
    {
        return '|' . $result . '|';
    }

}

bu şekilde eski kodu koruyabiliriz, böylece yarın Magento çekirdek kodu güncellenirse, hem yeni güncellenmiş kodumuz hem de özel mantığımız olacak, eğer doğrudan geçersiz kılsaydık o zaman o fonksiyonun veya dosyanın güncellenmiş yeni kodunu kaybettik :-)

http://devdocs.magento.com/guides/v2.0/extension-dev-guide/plugins.html


Ya bir sınıfa yeni bir yöntem eklemek istersen? Tercih dışında ne seçeneğimiz var?
MagePsycho 24:16

@MagePsycho: - Yeni bir işleve sahipseniz, bunun magentodan çıktığı anlamına gelir. eğer onun bloğu yeni bir blok oluşturuyorsa ve çekirdeğinden uzatıyorsa, ancak tercihi hariç. eğer bazı modellerde sıra yazarsanız umarım başka yol yok
Pradeep Kumar

19

Sonunda anladım !!!!
Blok, Kontrolör ve Modeli geçersiz kılmak için aşağıdaki adımları takip ediyorum: Ürün Modeli ve Ürün Görünüm Bloğu ve Görünüm Kontrol Cihazı / Eylem Örneğini aldım

/Etc/di.xml dosyasında di.xml adlı bir dosya oluşturun.

<?xml version="1.0"?>
<!--
/**
 * Copyright © 2015 Magento. All rights reserved.
 * See COPYING.txt for license details.
 */
-->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/ObjectManager/etc/config.xsd">
    <preference for="Magento\Catalog\Model\Product" type="Sugarcode\Test\Model\Product" />
    <preference for="Magento\Catalog\Block\Product\View" type="Sugarcode\Test\Block\Product\View" />
    <preference for="Magento\Catalog\Controller\Product\View" type="Sugarcode\Test\Controller\Product\View" />
</config>

Sonra / Model / Proroduct.php model dosyasını yarattım.

<?php
/**
 * Copyright © 2015 Magento. All rights reserved.
 * See COPYING.txt for license details.
 */
namespace Sugarcode\Test\Model;

class Product extends \Magento\Catalog\Model\Product
{
    /**
     * Get product name
     *
     * @return string
     * @codeCoverageIgnoreStart
     */
    public function getName()
    {
        return $this->_getData(self::NAME).'Local';
    }    
}

Sonra /Block/Product/View.php içinde Block dosyasını oluşturdum

<?php
/**
 * Copyright © 2015 Magento. All rights reserved.
 * See COPYING.txt for license details.
 */
namespace Sugarcode\Test\Block\Product;
/**
 * Product View block
 * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
 */
class View extends \Magento\Catalog\Block\Product\View
{


    /**
     * Retrieve current product model
     *
     * @return \Magento\Catalog\Model\Product
     */
    public function getProduct()
    {
       echo 'Local Block';
       if (!$this->_coreRegistry->registry('product') && $this->getProductId()) {
            $product = $this->productRepository->getById($this->getProductId());
            $this->_coreRegistry->register('product', $product);
        }
        return $this->_coreRegistry->registry('product');
    }


}

Şimdi Ürün Görünümü Kontrol Cihazını Oluşturun / Control / Ürün / Görüntü.php

<?php
/**
 *
 * Copyright © 2015 Magento. All rights reserved.
 * See COPYING.txt for license details.
 */
namespace Sugarcode\Test\Controller\Product;

class View extends \Magento\Catalog\Controller\Product\View
{

    /**
     * Product view action
     *
     * @return \Magento\Framework\Controller\Result\Forward|\Magento\Framework\Controller\Result\Redirect
     */
    public function execute()
    {
        // Get initial data from request
       echo 'I Am in Local Controller';
       $categoryId = (int) $this->getRequest()->getParam('category', false);
        $productId = (int) $this->getRequest()->getParam('id');
        $specifyOptions = $this->getRequest()->getParam('options');

        if ($this->getRequest()->isPost() && $this->getRequest()->getParam(self::PARAM_NAME_URL_ENCODED)) {
            $product = $this->_initProduct();
            if (!$product) {
                return $this->noProductRedirect();
            }
            if ($specifyOptions) {
                $notice = $product->getTypeInstance()->getSpecifyOptionMessage();
                $this->messageManager->addNotice($notice);
            }
            if ($this->getRequest()->isAjax()) {
                $this->getResponse()->representJson(
                    $this->_objectManager->get('Magento\Framework\Json\Helper\Data')->jsonEncode([
                        'backUrl' => $this->_redirect->getRedirectUrl()
                    ])
                );
                return;
            }
            $resultRedirect = $this->resultRedirectFactory->create();
            $resultRedirect->setRefererOrBaseUrl();
            return $resultRedirect;
        }

        // Prepare helper and params
        $params = new \Magento\Framework\Object();
        $params->setCategoryId($categoryId);
        $params->setSpecifyOptions($specifyOptions);

        // Render page
        try {
            $page = $this->resultPageFactory->create(false, ['isIsolated' => true]);
            $this->viewHelper->prepareAndRender($page, $productId, $this, $params);
            return $page;
        } catch (\Magento\Framework\Exception\NoSuchEntityException $e) {
            return $this->noProductRedirect();
        } catch (\Exception $e) {
            $this->_objectManager->get('Psr\Log\LoggerInterface')->critical($e);
            $resultForward = $this->resultForwardFactory->create();
            $resultForward->forward('noroute');
            return $resultForward;
        }
    }
}

Benim için Çalışması Para cezası :-)


6

Blok, Model ve Denetleyici dosyasını geçersiz kılmak için iki adım vardır

1) di.xml de tercihinizi ekleyin

2) Modülünüzde blok, model ve denetleyici dosyası oluşturun

İsim alanı: Prince

Modül Adı: Helloworld

Örneğin katalog ürün ListProduct bloğunu geçersiz kılmak için

1) Klasörde di.xml dosyası oluşturunPrince/Helloworld/etc

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
 <preference for="Magento\Catalog\Model\Product" type="Prince\Helloworld\Model\Rewrite\Catalog\Product" />
</config>

2) Klasörde ListProduct.php oluşturunPrince/Helloworld/Block/Rewrite/Product

<?php
    namespace Prince\Helloworld\Block\Rewrite\Product;

    class ListProduct extends \Magento\Catalog\Block\Product\ListProduct
    {
        public function _getProductCollection()
        {
            // Do your code here
        }
    }

Örneğin katalog ürün modelini geçersiz kılmak için.

1) di.xml de tercihinizi ekleyin .Prince/Helloworld/etc

<preference for="Magento\Catalog\Model\Product" type="Prince\Helloworld\Model\Rewrite\Catalog\Product" /> 

2) Product.php Model dosyasını Folder klasöründe oluşturun. Prince/Helloworld/Model/Rewrite/Catalog

<?php
namespace Prince\Helloworld\Model\Rewrite\Catalog;

class Product extends \Magento\Catalog\Model\Product
{
    public function isSalable()
    {
        // Do your code here

        return parent::isSalable();
    }

}

Denetleyici geçersiz kılma

1) di.xml de tercihinizi ekleyin .Prince/Helloworld/etc

<preference for="Magento\Catalog\Controller\Product\View" type="Prince\Helloworld\Controller\Rewrite\Product\View" />

2) Klasörde View.php oluşturunPrince/Helloworld/Controller/Rewrite/Product

class View extends \Magento\Catalog\Controller\Product\View
{
    public function execute()
    {
        // Do your stuff here
        return parent::execute();
    }
}

Aynı yaklaşımı kullanarak diğer blok, model ve denetleyicileri geçersiz kılabilirsiniz.


Denetleyici, Model ve Bloktan sonra yeniden yazma eklememiz gerekir mi? Benim için yeniden yazma eklemeden de çalıştı.
sagar sapkota,

@sagarsapkota Evet Denetleyici, Model ve Engelleme'yi yeniden klasör yazmadan doğrudan kullanabilirsiniz.
Prens Patel,

4

Küçük düzeltme ancak büyük yararlı, eklenti konseptinde her fonksiyon için n numarası oluşturmaya gerek yok. Bir modül için bir eklenti dosyası, tüm modülü, tüm model ve blokları ve Magento'nun tüm kontrol ünitesini genişletebilmeniz için yeterlidir;

<?xml version="1.0"?>
<!--
/**
 * Copyright © 2015 Magento. All rights reserved.
 * See COPYING.txt for license details.
 */
-->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/ObjectManager/etc/config.xsd">

    <type name="Magento\Catalog\Block\Product\View">
        <plugin name="inroduct-custom-module" type="Sugarcode\Test\Model\Plugin\Product" sortOrder="1"/>
    </type>
    <type name="Magento\Catalog\Model\Product">
        <plugin name="getname-test-module" type="Sugarcode\Test\Model\Plugin\Product" sortOrder="10"/>
    </type>
    <type name="Magento\Catalog\Controller\Product\View">
        <plugin name="product-cont-test-module" type="Sugarcode\Test\Model\Plugin\Product" sortOrder="10"/>
    </type>
</config>

ve eklenti php dosyasında

<?php
/**
 * Copyright © 2015 Magento. All rights reserved.
 * See COPYING.txt for license details.
 */
namespace Sugarcode\Test\Model\Plugin;

class Product
{        
    public function beforeSetName(\Magento\Catalog\Model\Product $subject, $name)
    {
        return array('(' . $name . ')');
    }

     public function afterGetName(\Magento\Catalog\Model\Product $subject, $result)
    {
        return '|' . $result . '|';
    } 
    public function aroundGetProduct(\Magento\Catalog\Block\Product\View $subject, \Closure $proceed)
    {

        echo 'Do Some Logic Before <br>';
        $returnValue = $proceed(); // it get you old function return value
        $name='#'.$returnValue->getName().'#';
        $returnValue->setName($name);
        echo 'Do Some Logic  After <br>';
        return $returnValue;// if its object make sure it return same object which you addition data
    }
    public function aroundExecute(\Magento\Catalog\Controller\Product\View $subject, \Closure $proceed)
    {
        echo 'I Am in Local Controller Before <br>';
        $returnValue = $proceed(); // it get you old function return value
        //$name='#'.$returnValue->getName().'#';
        //$returnValue->setName($name);
        echo 'I Am in Local Controller  After <br>';
        return $returnValue;// if its object make sure it return same object which you addition data
    }
}

Magento2 Kayalar


Merhaba Pradeep - Bu soruya üç cevap gönderdin - Muhtemelen onları tek bir cevapta birleştirmene değer
Robbie Averill

Bu cevabı denedim, Onun gösteren hatası Uncaught Error: Call to undefined method Magento\\Backend\\Model\\View\\Result\\Redirect\\Interceptor::getEntityId()İşte \Clousure $proceedobejctMagento\\Backend\\Model\\View\\Result\\Redirect\\Interceptor
Praful Rajput

3

Özel bloğunuzda veya kontrol cihazınızdaki magento bloğu veya kontrol cihazı sınıfını doğrudan uzatabilirsiniz. Örneğin, faturanın PDF logosunu değiştirmek için, özel modülümde PDF fatura modelini genişletirken, blok veya kontrol cihazını geçersiz kılabilirsiniz. di.xml dosyası oluşturmak ve tercihleri ​​belirlemek zorunda değilsiniz.

class Invoice extends \Magento\Sales\Model\Order\Pdf\Invoice
{


    /**
     * Return PDF document
     *
     * @param array|Collection $invoices
     * @return \Zend_Pdf
     */
    public function getPdf($invoices = [])
    {

        $this->_beforeGetPdf();
        $this->_initRenderer('invoice');

        $pdf = new \Zend_Pdf();
        $this->_setPdf($pdf);
        $style = new \Zend_Pdf_Style();
        $this->_setFontBold($style, 10);

        foreach ($invoices as $invoice) {
            if ($invoice->getStoreId()) {
                $this->_localeResolver->emulate($invoice->getStoreId());
                $this->_storeManager->setCurrentStore($invoice->getStoreId());
            }
            $page = $this->newPage();
            $order = $invoice->getOrder();
            /* Add image */
            $this->insertCustomLogo($page, $invoice->getStore());
            /* Add address */
            $this->insertCustomAddress($page, $invoice->getStore());
            /* Add head */

            $this->insertOrder(
                $page,
                $order,
                $this->_scopeConfig->isSetFlag(
                    self::XML_PATH_SALES_PDF_INVOICE_PUT_ORDER_ID,
                    \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
                    $order->getStoreId()

                )
            );

            /* Add document text and number */
            $this->insertDocumentNumber($page, __('Invoice # ') . $invoice->getIncrementId());
            /* Add table */

            $this->_drawHeader($page);
            /* Add body */

            foreach ($invoice->getAllItems() as $item) {
                if ($item->getOrderItem()->getParentItem()) {
                    continue;
                }

                /* Draw item */
                $this->_drawItem($item, $page, $order);

                $page = end($pdf->pages);
            }

            /* Add totals */
            $this->insertTotals($page, $invoice);
            if ($invoice->getStoreId()) {
                $this->_localeResolver->revert();
            }
        }

        $this->_afterGetPdf();
        return $pdf;
    } 

   protected function insertCustomLogo(&$page, $store = null)
   {

     $image='demo.png'

     if ($image) {
        $imagePath = '/logo/' . $image;
        if ($this->_mediaDirectory->isFile($imagePath)) {
            $image = \Zend_Pdf_Image::imageWithPath($this->_mediaDirectory->getAbsolutePath($imagePath));
            $top = 830;
            //top border of the page
            $widthLimit = 270;
            //half of the page width
            $heightLimit = 270;
            //assuming the image is not a "skyscraper"
            $width = $image->getPixelWidth();
            $height = $image->getPixelHeight();

            //preserving aspect ratio (proportions)
            $ratio = $width / $height;
            if ($ratio > 1 && $width > $widthLimit) {
                $width = $widthLimit;
                $height = $width / $ratio;
            } elseif ($ratio < 1 && $height > $heightLimit) {
                $height = $heightLimit;
                $width = $height * $ratio;
            } elseif ($ratio == 1 && $height > $heightLimit) {
                $height = $heightLimit;
                $width = $widthLimit;
            }

            $y1 = $top - $height;
            $y2 = $top;
            $x1 = 25;
            $x2 = $x1 + $width;

            //coordinates after transformation are rounded by Zend
            $page->drawImage($image, $x1, $y1, $x2, $y2);

            $this->y = $y1 - 10;
        }
    }
}

}


M2'ye girmenin yolu gerçekten bu mu?
Maksimum

Magento 2'deki numara, içindeki bir tercihi tanımlamaktır di.xml. Cevabınızdaki bu oldukça önemli kısmı
özlüyorum

3
  • Geliştirici / helloworld / registration.php

    
    \Magento\Framework\Component\ComponentRegistrar::register(
        \Magento\Framework\Component\ComponentRegistrar::MODULE,
        'Developer_Helloworld',
        __DIR__
    );
    
  • Geliştirici / helloworld / etc / module.xml

    <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
        <module name="Developer_Helloworld" setup_version="1.0.0">
        </module>
    </config>
    

  • Geliştirici / helloworld / etc / di.xml

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">    
    <preference for="Magento\Catalog\Controller\Product\View" type="Developer\Helloworld\Controller\Catalog\Product\View" />
</config>

  • Geliştirici / helloworld / Kontrolör / Katalog / Ürün / View.php

    namespace Developer\Helloworld\Controller\Catalog\Product;
    class View extends \Magento\Catalog\Controller\Product\View
    {
        public function execute(){
            echo '__TEST__';exit;
        }
    }

Umarım bu yardımcı

2

Bir aksiyon sınıfı Magento 1'deki gibi yeniden yazılabilir. Magento 1'de beforeetiketlerin etrafında bir öznitelik vardı.<routers>..<args><modules><... before="Mage_Catalog">Namespace_MyModule ..

İçinde [module path]/etc/[nothing|adminhtml|frontend]/routes.xml:

<config>
    <router id="[admin|standard|]">
        <route id="catalog" frontName="catalog">
            <module name="Namespace_MyModule" before="Magento_Catalog"/>
        </route>
    </router>
</config>

Ve aksiyon sınıfı \Namespace\MyModule\Controller\[same path of action as in core module]\SameActionName.phpneredeclass SameActionName.php extends \Magento\Catalog\...\SameActionName

Bu Magento_Catalog modülü, admin'e Magento\Catalog\etc\adminhtml\routes.xmlyeni bir rota kaydeden dosya :

<router id="admin">
    <route id="catalog" frontName="catalog">
        <module name="Magento_Catalog" before="Magento_Backend" />
    </route>
</router>

http://devdocs.magento.com/guides/v2.1/extension-dev-guide/routing.html

Denetleyici eylemini bir rotadaki özel eylemle değiştirmek için, orijinal denetleyiciden önce özel denetleyici sınıfını ekleyin.

Özel denetleyici ve eylem, orijinal isimlerle aynı adları paylaşmalıdır.

Sistem, özel kontrolörü orijinalden önce işler, bir rota ise aynı kalır.

Bir rotayı sıfırlamanız ve tasarlamanız gerekiyorsa, istek işlemeyi başka bir rotaya iletin:

$this->_forward('other/controller/action')

Denetleyici eylemini kaldırmak için, örneğin app / code / Company / SomeExtension / Controller / Account.php dizininde noroute konumuna ilerleyin:

Action sınıflarındaki tercihlerin veya eklentilerin, Magento'nun en iyi uygulamaları tarafından iyi bir fikir olduğuna inanmıyorum. Ve bundan daha fazlası olabilir.


0

Doğrudan bir sınıfı geçersiz kılmak için tercihleri ​​kullanmanız gerekir. Dev docs hakkında daha fazla bilgi için: https://devdocs.magento.com/guides/v2.0/extension-dev-guide/build/di-xml-file.html#abstraction-implementation-mappings
Interceptors kullanıyoruz (eklentiler) yöntemi, çünkü bu, değişikliklerinizi yeniden yazmak veya eklemek için en iyi yöntemdir. Dev docs'a bakınız: https://devdocs.magento.com/guides/v2.0/extension-dev-guide/plugins.html

Yeni bir sıralama düzeni ekleyerek sıralama örneklerinizi koruyarak 'En Popüler' size veriyorum sonucu değiştirmenin en iyi yolu.
Özel bir modül oluşturun ve konfigürasyon oluşturun app/code/Arsal/SortOption/etc/module.xml:

<?xml version="1.0" ?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
   <module name="Arsal_SortOption" setup_version="1.0.0" />
</config> 

Şimdi modülünüzü kaydedin app/code/Arsal/SortOption/registration.php:

<?php
 \Magento\Framework\Component\ComponentRegistrar::register(
     \Magento\Framework\Component\ComponentRegistrar::MODULE,
     'Arsal_SortOption',
      __DIR__
 );

Şimdi di.xml oluşturun app/code/Arsal/SortOption/etc/di.xml:

<?xml version="1.0" ?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <type name="Magento\Catalog\Block\Product\ProductList\Toolbar">
       <plugin name="toolbar_instance" type="Arsal\SortOption\Block\Product\ProductList\Toolbar" />
    </type>
</config>

Şimdi bir blok sınıfı oluşturun Arsal\SortOption\Block\Product\ProductListToolbar.php:

<?php
namespace Arsal\SortOption\Block\Product\ProductList;

class Toolbar {

    public function afterGetAvailableOrders (
        \Magento\Catalog\Block\Product\ProductList\Toolbar $subject, $result
    ) {
        $result ['most_popular'] = 'most popular';
        return $result;
    }

Bu, sipariş listesini sıralamak için özel sıralama düzeni seçeneği ekleyecektir. görüntü tanımını buraya girin }

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.