Cách ghi đè Khối lõi, Mô hình và bộ điều khiển trong Magento2


49

Tôi bị mắc kẹt trong việc ghi đè các khối và bộ điều khiển mô hình lõi trong Magento2. Bất cứ ai có thể giúp đỡ về điều này?

Hãy lấy thanh công cụ danh sách làm ví dụ nơi tôi cần thêm một tùy chọn sắp xếp mới gọi là sắp xếp phổ biến nhất . Làm thế nào để tôi thêm nó? Tôi đoán cho điều này, chúng ta cần thêm tùy chọn ở cấp độ khối và điều kiện ở List.phpcấp độ thu thập.


1
Ghi đè các lớp cốt lõi là ý tưởng tồi, và có thể được thực hiện theo nhiều cách khác nhau. Bạn có thể mô tả trường hợp cụ thể của bạn?
KAndy

@KAndy: - hãy lấy ví dụ về thanh công cụ danh sách nơi tôi cần thêm tùy chọn sắp xếp mới được gọi là sort theo phổ biến nhất sau đó làm thế nào để thêm nó Tôi hy vọng điều này chúng ta cần thêm tùy chọn ở cấp độ khối và điều kiện ở cấp độ thu thập List.php
Pradeep Kumar

Bạn chính xác cần phải sử dụng sau khi Thực thi Plugin trên \ Magento \ Catalog \ Block \ Product \ ProductList \ Thanh công cụ :: getAv AvailableOrder cho việc này. Nếu có ai khác sẽ sử dụng plugin, khách hàng sẽ nhận được tất cả các đơn đặt hàng. trong trường hợp sử dụng viết lại, bạn sẽ bị xung đột mô-đun và một mô-đun sẽ không hoạt động
KAndy

@KAndy: - bạn có thể vui lòng cung cấp mã ví dụ không, tôi không nhận được plugin Tôi cần di.xml và mã php plugin làm thế nào để hoạt động và cũng như cách thêm cột mới cho lưới quản trị bằng cách sử dụng lưới của plugin ex xin vui lòng giúp tôi trong mã ex plugin
Pradeep Kumar

@Kandy: - vui lòng chia sẻ bất kỳ ví dụ mã plugin nào trong mô hình sản phẩm thêm một số văn bản với tên sản phẩm ()
Pradeep Kumar

Câu trả lời:


30

Magento2 đã đưa ra khái niệm rất hay gọi là Plugin

chúng ta có thể làm những gì mãi mãi trước và trước chức năng cốt lõi và chúng ta cũng có thêm một lệnh gọi xung quanh sẽ làm cả trước và sau bên dưới là mã sẽ bao gồm tất cả thông tin

Tạo một tệp di.xml trong Mymodule / etc / di.xml

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

trong đó tôi lấy ví dụ về Mô hình sản phẩm và Khối xem sản phẩm

Tôi đã sử dụng xung quanh trong khối Chế độ xem sản phẩm là bất kỳ chức năng nào sử dụng tiền tố xung quanh và sau đó đảm bảo rằng 2 tham số sẽ có một tham số đầu tiên là đối tượng của bạn sử dụng Đóng cửa thứ 2 giữ lại thông tin trả về cũ

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


}

Trong mô hình i Được sử dụng trước và sau đó là

<?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 . '|';
    }

}

bằng cách này, chúng tôi có thể giữ lại mã cũ, vì vậy nếu ngày mai mã lõi Magento được cập nhật, chúng tôi sẽ có cả mã cập nhật mới và logic tùy chỉnh của chúng tôi nếu chúng tôi ghi đè trực tiếp thì chúng tôi đã mất mã cập nhật mới của chức năng hoặc tệp đó :-)

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


Điều gì nếu bạn muốn thêm phương thức mới vào một lớp? Khác với sở thích chúng ta có lựa chọn nào?
MagePologistso

@MagePologistso: - nếu bạn có một chức năng mới, nó có nghĩa là từ magento. nếu khối của nó tạo khối mới và mở rộng nó từ lõi nhưng không có ưu tiên. Nếu một số mô hình sau đó viết trình tự tôi hy vọng không có cách nào khác
Pradeep Kumar

19

Cuối cùng tôi đã nhận được nó !!!!
Tôi làm theo các bước dưới đây để ghi đè Khối, Trình điều khiển và Mô hình Tôi đã lấy Sơ đồ mô hình sản phẩm và Khối xem sản phẩm và Xem điều khiển / hành động

Tạo một tệp có tên di.xml trong /etc/di.xml của bạn

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

Sau đó, tôi đã tạo Tệp mô hình trong /Model / Productt.php

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

Sau đó, tôi đã tạo tệp Chặn trong /Block/ Productt / View.php

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


}

Bây giờ Tạo Trình điều khiển Chế độ xem Sản phẩm / Trình điều khiển / Productt / View.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;
        }
    }
}

Nó hoạt động tốt đối với tôi :-)


6

Có hai bước để ghi đè tệp Khối, Mô hình và Trình điều khiển

1) Thêm tùy chọn trong di.xml

2) Tạo tập tin khối, mô hình và bộ điều khiển trong mô-đun của bạn

Không gian tên: Hoàng tử

Tên mô-đun: Hellowworld

Ví dụ để ghi đè danh mục sản phẩm Khối sản phẩm

1) Tạo tệp di.xml trong Thư mụcPrince/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) Tạo List SẢNt.php trong Thư mụcPrince/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
        }
    }

Ví dụ để ghi đè mô hình sản phẩm danh mục.

1) Thêm tùy chọn trong di.xml tạiPrince/Helloworld/etc

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

2) Tạo tệp Model.php trong Thư mục 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();
    }

}

Bộ điều khiển ghi đè

1) Thêm tùy chọn trong di.xml tạiPrince/Helloworld/etc

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

2) Tạo View.php trong thư mụcPrince/Helloworld/Controller/Rewrite/Product

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

Bạn có thể ghi đè khối, mô hình và bộ điều khiển khác bằng cách sử dụng tương tự.


Chúng ta có cần thêm viết lại sau Bộ điều khiển, Mô hình & Khối không? Đối với tôi mà không thêm viết lại cũng làm việc.
sagar sapkota

@sagarsapkota Có, bạn có thể sử dụng Bộ điều khiển, Mô hình & Chặn trực tiếp mà không cần viết lại thư mục.
Hoàng tử Patel

4

Chỉnh sửa nhỏ nhưng rất hữu ích, chúng tôi không cần tạo n số tệp cho mỗi chức năng trong khái niệm plugin. Đối với một mô-đun, một tệp plugin là đủ để bạn có thể mở rộng tất cả mô-đun, tất cả mô hình và khối và bộ điều khiển của Magento hoàn chỉnh, nó tự kiểm tra mã bên dưới

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

và trong tập tin php plugin

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


Xin chào Pradeep - bạn đã đăng ba câu trả lời cho câu hỏi này - có lẽ sẽ đáng để bạn kết hợp chúng thành một câu trả lời duy nhất
Robbie Averill

Tôi đã thử với câu trả lời này, lỗi hiển thị của nó Uncaught Error: Call to undefined method Magento\\Backend\\Model\\View\\Result\\Redirect\\Interceptor::getEntityId()đây \Clousure $proceednhận obejct từMagento\\Backend\\Model\\View\\Result\\Redirect\\Interceptor
Praful Rajput

3

Bạn có thể trực tiếp mở rộng khối hoặc lớp trình điều khiển của magento trong khối hoặc trình điều khiển tùy chỉnh của mình. Ví dụ: trong việc mở rộng mô hình hóa đơn PDF trong mô-đun tùy chỉnh của tôi để thay đổi logo của hóa đơn PDF tạo giống như cách bạn có thể ghi đè khối hoặc trình điều khiển. Bạn không để tạo tệp di.xml và không cần thiết lập tùy chọn.

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

}


Đây thực sự là con đường để đi trong M2?
Tối đa

Thủ thuật trong Magento 2 là xác định tùy chọn trong di.xml. Tôi đang thiếu phần khá quan trọng này trong câu trả lời của bạn ...
7ochem

3
  • Nhà phát triển / Hellowworld / register.php

    
    \Magento\Framework\Component\ComponentRegistrar::register(
        \Magento\Framework\Component\ComponentRegistrar::MODULE,
        'Developer_Helloworld',
        __DIR__
    );
    
  • Nhà phát triển / Hellowworld / 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>
    

  • Nhà phát triển / Hellowworld / 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>

  • Nhà phát triển / Hellowworld / Bộ điều khiển / Danh mục / Sản phẩm / View.php

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

hy vọng điều này hữu ích

2

Một lớp hành động có thể được viết lại theo cách tương tự như trong Magento 1. Trong Magento 1, chúng ta có beforethuộc tính xung quanh các thẻ<routers>..<args><modules><... before="Mage_Catalog">Namespace_MyModule ..

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

Và lớp hành động \Namespace\MyModule\Controller\[same path of action as in core module]\SameActionName.phpở đâuclass SameActionName.php extends \Magento\Catalog\...\SameActionName

Đây là mô-đun Magento_Catalog, tệp Magento\Catalog\etc\adminhtml\routes.xmlđăng ký tuyến mới trong quản trị viên:

<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

Để thay thế hành động của bộ điều khiển trong một tuyến đường bằng một tuyến tùy chỉnh, hãy thêm lớp trình điều khiển tùy chỉnh trước bộ điều khiển gốc.

Bộ điều khiển và hành động tùy chỉnh phải chia sẻ cùng tên với tên gốc.

Hệ thống xử lý bộ điều khiển tùy chỉnh trước bản gốc, trong khi một tuyến vẫn giữ nguyên.

Nếu bạn phải đặt lại tuyến đường và thiết kế, hãy chuyển tiếp yêu cầu xử lý sang tuyến khác:

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

Để loại bỏ hành động của bộ điều khiển, ví dụ, chuyển tiếp đến noroute, trong ứng dụng / mã / Công ty / Một sốExtension / Trình điều khiển / Tài khoản.php:

Tôi không tin rằng các tùy chọn hoặc plugin trên các lớp Hành động là một ý tưởng hay của các thực tiễn tốt nhất của Magento. Và có thể có nhiều hơn cho nó.


0

Để ghi đè trực tiếp một lớp bạn được yêu cầu sử dụng tùy chọn. Xem thêm về dev docs: https://devdocs.magento.com/guides/v2.0/extension-dev-guide/build/di-xml-file.html#abstraction-imcellenceation-mappings
Trong phần lớn thời gian chúng tôi sử dụng Thiết bị chặn (plugin) cách vì đây là cách tốt nhất để viết lại hoặc thêm một phần sửa đổi của bạn. Xem tài liệu dev: https://devdocs.magento.com/guides/v2.0/extension-dev-guide/plugins.html

Bằng cách giữ ví dụ sắp xếp các mục danh sách của bạn bằng cách thêm thứ tự sắp xếp mới 'Phổ biến nhất' Tôi đang cung cấp cho bạn cách tốt nhất để sửa đổi kết quả.
Tạo một mô-đun tùy chỉnh và tạo cấu hình 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> 

Bây giờ Đăng ký mô-đun của bạn app/code/Arsal/SortOption/registration.php:

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

Bây giờ hãy tạo di.xml 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>

Bây giờ tạo một lớp khối 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;
    }

Điều này sẽ thêm tùy chọn thứ tự tùy chỉnh để sắp xếp danh sách thứ tự. nhập mô tả hình ảnh ở đây }

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.