如何获取产品与我当前所在商店相关的类别ID

时间:2013-03-19 16:33:26

标签: php magento magento-1.7

我在产品页面上有产品对象,但是当我尝试使用以下内容获取类别ID时

$_product->getCategoryIds();

或:

$_product->getResource()->getAttribute('category_ids')->getFrontend()->getValue($_product); 

它为我提供了所有类别ID,我只想要我所在商店的那些。

这是一个多线圈环境因此我的问题。 其他一切似乎都没问题,类别列表工作正常。 这是我唯一的问题。 有人可以帮忙吗?

3 个答案:

答案 0 :(得分:10)

非常类似于Alans的回答,可能会少一些循环:

$rootCategory = Mage::getModel('catalog/category')
    ->load(Mage::app()->getStore()->getRootCategoryId());

$sameStoreCategories = Mage::getResourceModel('catalog/category_collection')
    ->addIdFilter($product->getCategoryIds())
    ->addFieldToFilter('path', array('like' => $rootCategory->getPath() . '/%'))
    ->getItems();

var_dump(array_keys($sameStoreCategories));

这将始终有效。丑陋的是你仍然需要加载类别。

如果启用了平面类别表,则可以使用以下变体:

$sameStoreCategories = Mage::getResourceModel('catalog/category_flat_collection')
    ->addIdFilter($product->getCategoryIds())
    ->getItems();

var_dump(array_keys($sameStoreCategories));

为什么会这样?因为平面表是按商店索引的,并且每个平面表仅包含与该商店组根类别关联的类别实体记录。

因此,即使您按照与产品关联的所有类别ID进行过滤,该集合也只会包含当前商店中存在的类别。

答案 1 :(得分:1)

如果您有数百万个类别或数百万个产品或需要收集所有类别的所有产品 - 您可以尝试下一个怪胎方式(仅在类别平面索引重建后再次工作):

  • 在某些安装程序或cron中 - 创建一个新表并使其与下一个请求保持同步
每个商店

CREATE TABLE IF NOT EXISTS categories_X SELECT product_id, CONVERT(GROUP_CONCAT(category_id) USING utf8) as category_id FROM catalog_category_product where category_id in (select entity_id from catalog_category_flat_store_X) GROUP BY product_id
  • 其中X - 是商店的ID

  • 再次撰写模型或直接请求以获取所需商店和所需产品的所有类别

答案 2 :(得分:0)

这个有点棘手,所以如果以下不起作用,可能是代码,而不是你。

问题是,据我所知,Magento没有跟踪哪个类别在哪个商店。相反,Magento会跟踪特定商店的根类别

这意味着一旦我们有了类别ID列表,我们需要获取每个类别的根类别,然后检查该根类别是否与当前商店的根类别匹配。

以下代码应该这样做,但请使用各种产品进行测试

    //get root category for current store
    $store_root_id = Mage::app()->getStore()->getRootCategoryId();

    //get category IDs from product
    $ids = $product->getCategoryIds();        

    //load full cateogires
    $categories = Mage::getModel('catalog/category')
    ->getCollection()
    ->addIdFilter($ids);

    //filter out categories with different root
    $category_ids = array();
    foreach($categories as $cat)
    {
        //path property is 1/root_id/id/id
        $parts      = explode('/', $cat->getPath());
        $one        = array_shift($parts);
        $root_id    = array_shift($parts);

        if($root_id == $store_root_id)
        {
            $category_ids[] = $cat->getId();    
        }            
    }

    var_dump($category_ids);