[Magento] Ukrywanie niedostępnych produktów w wyszukiwarce zaawansowanej

Data dodania wpisu: 27-05-2010

Dawno nie pisałem nic na temat Magento. A jakoś tak złożyło się dzisiaj, że potrzebowałem do modułu autorstwa Colina Mollenhour'a dorzucić opcję taką jak w temacie. Jego moduł wspiera ukrywanie produktów, które nie są dostępne w magazynie, na listach produktów (kategorie, polecane, bestsellery, crossselling, alternatywne - jakie chcemy - wystarczy podpięcie obserwatora pod odpowiedni moduł - kwestia konfiguracji w config.xml).
 
Jednak jego moduły (ukrywanie niedostępnych produktów oraz ukrywanie niedostępnych produktów w nawigacji warstwowej) nie wspierają ukrywania produktów w wynikach wyszukiwarki zaawansowanej.
 
Dlatego postanowiłem napisać dodatkowy modulik. Najpierw tworzymy klasę, która docelowo będzie przeciążać domyślny moduł wyszukiwarki zaawansowanej:
app/code/local/Endryu/AdvancedInStockOnly/CatalogSearch/Model/Advanced.php

i w tym pliku wklejamy poniższy kod. Metoda getProductCollection będzie przeciążać podstawową metodę z rdzenia Magento i zawiera ona dodatkową regułę (->joinField(...)), która docelowo filtruje listę pobieranych wyników o te, które są dostępne w magazynie. Dodatkowo używamy filtra w postaci aktywnej witryny sklepu ($websiteId):

<?php

class Endryu_AdvancedInStockOnly_CatalogSearch_Model_Advanced extends Mage_CatalogSearch_Model_Advanced {

  /**
   * filters product collection via in stock only filter
   */
    public function getProductCollection(){
        if (is_null($this->_productCollection)) {
            $storeId = Mage::app()->getStore()->getId();
            $websiteId = Mage::getModel('core/store')->load($storeId)->getWebsiteId();
            $this->_productCollection = Mage::getResourceModel('catalogsearch/advanced_collection')
                ->addAttributeToSelect(Mage::getSingleton('catalog/config')
->getProductAttributes())
                ->addMinimalPrice()
                ->addTaxPercents()
                ->addStoreFilter()
                ->joinField('stock_status', 'cataloginventory/stock_status', 'stock_status', 'product_id=entity_id', array('stock_status' => Mage_CatalogInventory_Model_Stock_Status::STATUS_IN_STOCK, 'website_id' => $websiteId));
                Mage::getSingleton('catalog/product_status')
->addVisibleFilterToCollection($this->_productCollection);
                Mage::getSingleton('catalog/product_visibility')
->addVisibleInSearchFilterToCollection($this->_productCollection);
        }

        return $this->_productCollection;
    }

}

Dalej potrzebujemy pliku konfiguracji, aby wskazać model do przeciążenia. Tworzymy plik:

app/code/local/Endryu/AdvancedInStockOnly/etc/config.xml

i w nim wklejamy:

<?xml version="1.0"?>
<config>
 <global>
  <models>

   <catalogsearch>
    <rewrite>
	 <advanced>Endryu_AdvancedInStockOnly_CatalogSearch_Model_Advanced</advanced>
    </rewrite>
   </catalogsearch>

  </models>
 </global>
</config>

Na sam koniec potrzebujemy włączyć modulik, więc tworzymy plik:

app/etc/modules/Endryu_AdvancedInStockOnly.xml

i w nim wklejamy:

<?xml version="1.0"?>

<config>
 <modules>
  <Endryu_AdvancedInStockOnly>
   <active>true</active>
   <codepool>local</codepool>

  </Endryu_AdvancedInStockOnly>
 </modules>
</config>

Pozdrawiam:)

Komentarze

Ten wpis nie posiada jeszcze komentarzy

Comments closed...