Magento 2: Ghi đè tập tin khối Magento \ ConfigurableSản phẩm \ Block \ Product \ View \ Type \ Configurable.php


8

Cách ghi đè function getAllowProducts()từ Magento\ConfigurableProduct\Block\Product\View\Type\Configurable.phptrong magento 2.

Tôi muốn ghi đè chức năng trên nhưng không nhận được thay đổi chức năng và không có gì hiển thị bất kỳ vấn đề nào. Không có bất kỳ lỗi hiển thị bên trong tệp nhật ký.

tôi sẽ chia sẻ mã của tôi ở đây,

registration.php tập tin,

<?php

\Magento\Framework\Component\ComponentRegistrar::register(
    \Magento\Framework\Component\ComponentRegistrar::MODULE,
    'Test_Configuration',
    __DIR__
);

thư mục vv

module.xml 

mã là,

<?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="Test_Configuration" setup_version="1.0.0"/>
</config>

tôi có khối ghi đè bên trong di.xmlmã là

<?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\ConfigurableProduct\Block\Product\View\Type\Configurable" type="Test\Configuration\Block\Outstock" />
</config>

Chặn thư mục, Outstock.phptập tin,

<?php
namespace Test\Configuration\Block;

class Outstock extends \Magento\ConfigurableProduct\Block\Product\View\Type\Configurable
{
    public function getAllowProducts()
    {
        if (!$this->hasAllowProducts()) {
            $products = [];
            $skipSaleableCheck = $this->catalogProduct->getSkipSaleableCheck();
            $allProducts = $this->getProduct()->getTypeInstance()->getUsedProducts($this->getProduct(), null);
            foreach ($allProducts as $product) {
                    $products[] = $product;
            }
            $this->setAllowProducts($products);
        }
        return $this->getData('allow_products');
    }   

    protected function _toHtml()
    {
        $this->setModuleName($this->extractModuleName('Magento\ConfigurableProduct\Block\Product\View\Type\Configurable'));
        return parent::_toHtml();
    } 
}

Tôi không hiển thị bất kỳ lỗi nào, không phải bất kỳ bản ghi nhật ký nào cho tệp này và mô-đun được kích hoạt. setup_modulemục bên trong được tạo ra.

Bất kỳ đề nghị cho chức năng ghi đè của configurable.phptập tin.

Cảm ơn.

Câu trả lời:


5

bạn không phải ghi đè lên ưu tiên và bạn không nên.

Bạn có thể dễ dàng sử dụng Plugin để đặt dữ liệu allow_products trước khi phương thức được gọi. Bạn tìm thấy một hướng dẫn tốt đẹp về plugin tại đây:

http://alanstorm.com/magento_2_object_manager_plugin_system

Để tạo Plugin của bạn, trước tiên bạn cần thêm một loại vào etc / frontend / di.xml của bạn

<type name="Magento\ConfigurableProduct\Block\Product\View\Type\Configurable">
    <plugin name="changeAllowProductsBehaviour" type="Vendor\Module\Model\ConfigurableProduct\Block\Product\View\Type\Configurable\Plugin" sortOrder="10" />
</type>

Sau đó, Lớp Plugin của bạn sẽ trông như thế này:

<?php
namespace Vendor\Module\Model\ConfigurableProduct\Block\Product\View\Type\Configurable;

class Plugin
{
    /**
     * getAllowProducts
     *
     * @param \Magento\ConfigurableProduct\Block\Product\View\Type\Configurable $subject
     *
     * @return array
     */
    public function beforeGetAllowProducts($subject)
    {
        if (!$subject->hasData('allow_products')) {
            $products = [];
            $allProducts = $subject->getProduct()->getTypeInstance()->getUsedProducts($subject->getProduct(), null);
            foreach ($allProducts as $product) {
                    $products[] = $product;
            }
            $subject->setData('allow_products', $products);
        }

        return [];
    }

}

Hãy chắc chắn xóa bộ nhớ cache và thư mục var / thế hệ của bạn để áp dụng các thay đổi này


Nó không hoạt động đối với tôi bằng cách sử dụng phương pháp plugin. trang biến mất và chỉ chọn hộp hiển thị với giá trị null trong toàn bộ trang.
Rakesh Jesadiya

sau đó rất có thể vẫn còn một lỗi ở đâu đó. Kiểm tra bạn nhật ký lỗi trong magento và nhật ký lỗi máy chủ web của bạn. Bạn có bật chế độ nhà phát triển trong tệp .htaccess không? Ngoài ra, tôi không chắc liệu bạn có phải trả về một mảng trống hay không, không có gì khi phương thức orgininal không có đối số (không nên tạo sự khác biệt nhưng có thể)
David Verholen

Tôi phải hiển thị tùy chọn sản phẩm chứng khoán trong danh sách thả xuống vì vậy tôi phải xóa nếu điều kiện từ chức năng trên nhưng sử dụng plugin không hoạt động cũng không hiển thị bất kỳ đề xuất log.any lỗi nào.
Rakesh Jesadiya

Bây giờ bạn đang hỏi theo cách này, có thể là đủ nếu bạn chỉ thay đổi cấu hình để hiển thị các sản phẩm chứng khoán ở lối vào. Trong phần phụ trợ của bạn, đi đến Cửa hàng -> Cấu hình. Sau đó chọn Danh mục-> Tab Hàng tồn kho và thay đổi hiển thị các sản phẩm chứng khoán thành có
David Verholen

những cài đặt tôi đã làm, tôi muốn hiển thị các tùy chọn sản phẩm chứng khoán bên trong sản phẩm cấu hình. theo mặc định ra khỏi tùy chọn cấu hình sản phẩm chứng khoán không hiển thị bên trong thả xuống của trang chi tiết sản phẩm cấu hình. Vì vậy, tôi phải hiển thị các tùy chọn trong thả xuống.
Rakesh Jesadiya

12

Đối với phiên bản Magento2.1, bạn cần ghi đè Magento\Swatches\Block\Product\Renderer\Configurable

1) Tạo di.xml tập tin trong thư mụcNamespace\Module\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\Swatches\Block\Product\Renderer\Configurable" type="Namespace\Module\Block\Outstock" />
</config>

2) Tạo Outstock.phptập tin chặn trong thư mụcNamespace\Module\Block

<?php 

namespace Namespace\Module\Block;

class Outstock extends \Magento\Swatches\Block\Product\Renderer\Configurable
{

    public function getAllowProducts()
    {
        if (!$this->hasAllowProducts()) {
            $products = [];
            $skipSaleableCheck = $this->catalogProduct->getSkipSaleableCheck();
            $allProducts = $this->getProduct()->getTypeInstance()->getUsedProducts($this->getProduct(), null);
            foreach ($allProducts as $product) {
                if ($product->isSaleable() || $skipSaleableCheck) {
                    $products[] = $product;
                }
            }
            $this->setAllowProducts($products);
        }
        return $this->getData('allow_products');
    }


}

Nên gõ = "Không gian tên \ Mô-đun \ Chặn \ Outstock"
Rooster242

Nhưng nó không hoạt động cho trang danh sách, Tại sao?
zed Blackbeard

4

Bạn cần ghi đè

Magento\Swatches\Block\Product\Renderer\Configurable 

thay vì ghi đè

Magento\ConfigurableProduct\Block\Product\View\Type\Configurable 

tập tin.


Nhưng nó không hoạt động cho trang danh sách, Tại sao?
zed Blackbeard

1

Để ghi đè chức năng của tập tin configureable.php.

1) Trước tiên tạo tệp di.xml trong Kiểm tra thư mục / Cấu hình / vv

<?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\ConfigurableProduct\Block\Product\View\Type\Configurable" type="Test\Configuration\Block\Outstock" />
</config>

2) Bây giờ tạo tập tin Khối Outstock.php trong Kiểm tra thư mục \ Cấu hình \ Chặn

<?php 

namespace Test\Configuration\Block;

use Magento\ConfigurableProduct\Block\Product\View\Type\Configurable;

class Outstock extends \Magento\ConfigurableProduct\Block\Product\View\Type\Configurable
{

    public function getAllowProducts()
    {
        if (!$this->hasAllowProducts()) {
            $products = [];
            $skipSaleableCheck = $this->catalogProduct->getSkipSaleableCheck();
            $allProducts = $this->getProduct()->getTypeInstance()->getUsedProducts($this->getProduct(), null);
            foreach ($allProducts as $product) {
                if ($product->isSaleable() || $skipSaleableCheck) {
                    $products[] = $product;
                }
            }
            $this->setAllowProducts($products);
        }
        return $this->getData('allow_products');
    }


}

Nhưng nó không hoạt động cho trang danh sách, Tại sao?
zed Blackbeard

Cách ghi đè \ Magento \ ConfigurableSản phẩm \ Chặn \ Sản phẩm \ Xem \ Loại \ Cấu hình tôi đang thử nhưng không hoạt động trên mã
Rv Singh

Trong tùy chọn sản phẩm có thể định cấu hình yêu cầu của tôi, hãy bỏ nhãn "Tùy chọn tùy chỉnh"
Rv Singh
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.