Magento 2 – nadpisywanie corowych modeli – jak zablokować sprzedaż produktów za 0zł

Skupiłam się ostatnio na nadpisywaniu logiki corowych bloków. Podczas rozwoju platformy jednak nie tylko bloki nadpisujemy. Zdarza się również, że i inne elementy modułu potrzebujemy zmodyfikować. Załóżmy, że niezależnie od ustawień magazynowych chcemy zrobić zabezpieczenie polegające na tym by produkt, który jest za 0zł nie był możliwy do kupienia.

Za to czy produkt jest dostępny w sprzedaży czy nie odpowiada metoda isSalable() w modelu \Magento\Catalog\Model\Product. Ma ona jakąś swoją logikę ale nie chciałabym się na niej skupiać. Co musimy zatem zrobić aby móc zmodyfikować tę metodę? Przede wszystkim ją nadpisać. Tworzymy więc plik:

app/code/<namespace>/Catalog/Model/Product.php

a w nim umieszczamy naszą zmodyfikowaną metodę:

namespace <namespace>\Catalog\Model;

use \Magento\Catalog\Model\Product as ProductBase;

class Product extends ProductBase
{

    public function isSalable()
    {
        if (!(float) $this->getPrice()) {
            return false;
        } else {
            return parent::isSalable();
        }
    }
}

I co się tak na prawdę wydarzyło? Otóż sprawdzamy czy cena produktu (rzutowana na float) jest fałszem (zero jest fałszem). Jeśli tak to zwracamy false. W przeciwnym wypadku wykonujemy corową logikę, sprawdzającą czy produkt jest „sprzedawalny”.  Jednak aby ta metoda chciała zadziałać, musimy jeszcze, podobnie jak w przypadku nadpisywania bloków, poinformować magento o tym, że nadpisaliśmy model.  W tym celu tworzymy plik di.xml w katalogu etc naszego modułu

app/code/<namespace>/Catalog/etc/di.xml 

W pliku tym zamieszczamy:

<?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="<namespace>\Catalog\Model\Product" />
</config>  

Następnie wykonujemy polecenie:

php bin/magento cache:clean
php bin/magento setup:di:compile

I włala 🙂 Prawda, że proste 😉 ?

Gdyby jednak okazało się, że nadpisanie nie działa, a miałam takie przypadki, można w katalogu:

app/etc/di.xml

dospisać na końcu linię:

<preference for="Magento\Catalog\Model\Product" type="<namespace>\Catalog\Model\Product" />