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?

Quickerz
quelle
Versuchen Sie herauszufinden, var_dump($category)ob im Allgemeinen alles in Ordnung ist.
Michael
Sie könnten das gleiche hier fragen stackoverflow.com/questions/3157799/…
Sukeshini
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();
Yehia A. Salam
quelle
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;
    }
}
Pradeep Sanku
quelle