4

我在产品页面上并拥有产品对象,但是当我尝试使用以下方法获取类别 ID 时:

$_product->getCategoryIds();

或者:

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

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

这是一个多商店环境,因此是我的问题。其他一切似乎都很好,并且类别列表工作正常。这是我唯一的问题。任何人都可以帮忙吗?

4

3 回答 3

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 进行过滤,该集合也将仅包含当前商店中存在的类别。

于 2013-03-19T20:02:07.573 回答
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

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

于 2013-03-19T20:19:06.697 回答
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);
于 2013-03-19T19:16:36.580 回答