Magento 2: Mengganti file blok Magento \ ConfigurableProduct \ Block \ Product \ View \ Type \ Configurable.php

8

Cara mengganti function getAllowProducts()dari Magento\ConfigurableProduct\Block\Product\View\Type\Configurable.phpdi magento 2.

Saya ingin mengganti fungsi di atas tetapi tidak mendapatkan perubahan fungsi dan tidak ada yang menampilkan masalah apa pun. Tidak ada tampilan kesalahan di dalam file log.

saya akan membagikan kode saya di sini,

registration.php mengajukan,

<?php

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

folder dll,

module.xml 

kode adalah,

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

Saya telah menimpa blok di dalam di.xmlkode

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

Blokir folder, Outstock.phpfile,

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

i havent setiap tampilan kesalahan tidak menghasilkan log untuk file dan modul ini diaktifkan. setup_moduleentri dalam dihasilkan.

Setiap saran untuk mengganti fungsi configurable.phpfile.

Terima kasih.

Rakesh Jesadiya
sumber

Jawaban:

5

Anda tidak harus mengesampingkan preferensi dan Anda seharusnya tidak.

Anda dapat dengan mudah menggunakan Plugin untuk mengatur data allow_products sebelum metode dipanggil. Anda menemukan tutorial yang bagus tentang plugin di sini:

http://alanstorm.com/magento_2_object_manager_plugin_system

Untuk membuat Plugin Anda, pertama-tama Anda perlu menambahkan tipe ke etc / frontend / di.xml Anda

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

Maka Kelas Plugin Anda akan terlihat seperti ini:

<?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 [];
    }

}

Pastikan untuk menghapus cache dan juga dir var / generation Anda agar perubahan ini diterapkan

David Verholen
sumber
itu tidak berfungsi untuk saya menggunakan metode plugin. halaman menghilang dan hanya pilih tampilan kotak dengan nilai nol di seluruh halaman.
Rakesh Jesadiya
maka kemungkinan besar masih ada kesalahan di suatu tempat. Periksa log kesalahan Anda di magento dan juga log kesalahan server web Anda. Apakah Anda memiliki mode pengembang yang diaktifkan dalam file .htaccess? Juga saya tidak yakin apakah Anda harus mengembalikan array kosong atau lebih tepatnya tidak ada ketika metode orgininal tidak memiliki argumen (seharusnya tidak membuat perbedaan tetapi bisa)
David Verholen
saya harus menampilkan opsi produk yang tidak ada dalam dropdown jadi saya harus menghapus jika kondisi dari fungsi di atas tetapi menggunakan plugin yang tidak berfungsi juga tidak menampilkan kesalahan log.any saran.
Rakesh Jesadiya
Sekarang Anda bertanya seperti ini, mungkin sudah cukup jika Anda hanya mengubah konfigurasi untuk keluar dari stok produk di frontend. Di backend Anda pergi ke Toko -> Konfigurasi. Kemudian Pilih Katalog-> Inventory Tab dan ubah tampilan dari stok produk menjadi ya
David Verholen
pengaturan yang telah saya lakukan, saya ingin menampilkan opsi stok produk di dalam produk konfigurasi. secara default kehabisan stok opsi konfigurasi produk tidak ditampilkan di dalam dropdown halaman detail produk konfigurasi. jadi saya harus menampilkan opsi tersebut di dropdown.
Rakesh Jesadiya
12

Untuk versi Magento2.1 Anda harus mengganti Magento\Swatches\Block\Product\Renderer\Configurable

1) Buat di.xml file di FolderNamespace\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) Buat Outstock.phpBlokir file di FolderNamespace\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');
    }


}
Pengembang Pimpinan
sumber
Harus ketik = "Namespace \ Module \ Block \ Outstock"
Rooster242
tetapi tidak berfungsi untuk halaman daftar, Mengapa?
zed Blackbeard
4

Anda harus mengganti

Magento\Swatches\Block\Product\Renderer\Configurable 

bukannya mengesampingkan

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

mengajukan.

Bersukacitalah
sumber
tetapi tidak berfungsi untuk halaman daftar, Mengapa?
zed Blackbeard
1

Untuk mengganti fungsi file configurable.php.

1) Pertama-tama buat file di.xml di Tes Folder / Konfigurasi / dll

<?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) Sekarang buat file Blok Outstock.php di Tes Folder \ Konfigurasi \ Blok

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


}
Cartin24
sumber
tetapi tidak berfungsi untuk halaman daftar, Mengapa?
zed Blackbeard
Cara mengganti \ Magento \ ConfigurableProduct \ Block \ Product \ View \ Type \ Configurable saya mencoba tetapi tidak bekerja dengan kode di atas
Rv Singh
Dalam persyaratan saya, pilihan produk yang dapat dikonfigurasi drop down hapus label "Opsi kustom"
Rv Singh