Erhalten Sie ein leeres Ergebnis, wenn Sie versuchen, ein filterbares Attribut für eine bestimmte Kategorie abzurufen


7

Ich muss alle filterbaren Attribute für die Kategorie abrufen. Ich benutze dieses Snippet:

$category = Mage::getModel('catalog/category')->load($categoryId);

$layer = Mage::getModel('catalog/layer');

$layer->setCurrentCategory($category);

$attributes = $layer->getFilterableAttributes();//$attributes now is empty array

Kategorie hat Produkt mit filterbaren Attributen, auch in Kategorienoptionen wurde der Anker aktiviert. Dieser Code wird in der SOAP-API verwendet.

Vielleicht weiß jemand, wo ich Fehler gemacht habe?


Versuchen Sie herauszufinden, var_dump($category)ob im Allgemeinen alles in Ordnung ist.
Michael


Ich kann var_dump nicht verwenden, da es Code für API ist und nur Werte zurückgibt, die in der Datei wsdl.xml definiert sind. Aber ich überprüfe die Kategorie, indem ich sie an einen dieser Werte weitergebe. Das Kategoriemodell ist in Ordnung und wird auf die richtige Ebene eingestellt. Ich kann es über $ layer-> getCurrentCategory (); P
Quickerz am

Sie können versuchen , hinzuzufügen , Mage::log($collection->getSelect(), Zend_Log::INFO, 'blah.log', true);in app/code/core/Mage/Catalog/Model/Layer.php-> public function getFilterableAttributes()vor returnund protokollierten SQL - Abfrage direkt in der Datenbank zu laufen oder mit der SQL - Abfrage zu vergleichen , die protokollieren, wenn Sie die Kategorie über die Website zu öffnen.
Michael

getFilterableAttributes () gibt ein leeres Array zurück, da $ setIds = $ this -> _ getSetIds () ein leeres Array zurückgibt. Es passiert, weil $ this-> getProductCollection () eine leere Sammlung zurückgibt. Vielleicht brauchte etwas anderes für die Schicht, um eine Produktkollektion daraus zu erhalten?
Quickerz

Antworten:


0

Höchstwahrscheinlich haben Sie die Store-ID nicht festgelegt. Wir müssen dies tun, da sie in der API implementiert ist:

protected function _retrieve(){

    $id = $this->getRequest()->getParam('id');
    $store_id = $this->getRequest()->getParam('store_id');

    $category = Mage::getModel("catalog/category")->load($id);        
    $category->setStoreId($store_id);

    if (!($category->getId())) $this->_critical(self::RESOURCE_NOT_FOUND);

    $layer = Mage::getModel("catalog/layer");
    $layer->setCurrentCategory($category);
    $attributes = $layer->getFilterableAttributes();

0

Der folgende Code wird verwendet, um filterbare Attribute und deren Optionen abzurufen

$categoryId = '5'; // replace with your category id
$category = Mage::getModel("catalog/category")->load($categoryId);
$layer = Mage::getModel("catalog/layer");
$layer->setCurrentCategory($category);

$setIds = Mage::getModel('eav/entity_attribute_set')
            ->load($attrSetName, 'attribute_set_name')
            ->getAttributeSetId();

$attributes = Mage::getResourceModel('catalog/product_attribute_collection');
$attributes->setItemObjectClass('catalog/resource_eav_attribute')
                ->setAttributeSetFilter($setIds)
                ->addStoreLabel(Mage::app()->getStore()->getId())
                ->setOrder('position', 'ASC');


$attributes->addFieldToFilter('additional_table.is_filterable', array('gt' => 0));
$attributes->load();

foreach ($attributes as $attribute) {
    $filter_attr = array();
    $filter_attr['title'] = $attribute->getFrontendLabel();
    $filter_attr['code'] = $attribute->getAttributeCode();

    if ($attribute->getAttributeCode() == 'price') {
        $filterBlockName = 'catalog/layer_filter_price';
    }elseif ($attribute->getBackendType() == 'decimal') {
        $filterBlockName = 'catalog/layer_filter_decimal';
    }else {
        $filterBlockName = 'catalog/layer_filter_attribute';
    }

    $result =  Mage::app()->getLayout()->createBlock($filterBlockName)->setLayer($layer)->setAttributeModel($attribute)->init();
    $i=0;

    foreach($result->getItems() as $option) {
        $attr_option = array();
        if($attribute->getAttributeCode() == 'price') {
            $attr_option['label'] = str_replace(array('<span class="price">','</span>'),'',$option->getLabel());
        } else {
            $attr_option['label'] = $option->getLabel();
        }

        $attr_option['value'] = $option->getValue();
        $attr_option['count'] = $option->getCount();
        $i++;
        $filter_attr['options'][] = $attr_option;
    }

    if($i!=0){
        $filter_attributes[] = $filter_attr;
    }
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.