如何获得类别ID,一个产品是相对于我目前在商店(How do I get the category

2019-08-17 18:33发布

我是一个产品页面上,并有产品对象,但是当我试图让使用类别ID:

$_product->getCategoryIds();

要么:

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

能把我所有的类别ID,我只是想为商店我的人。

这是一个MultiStore的环境,所以我的问题。 一切似乎确定,类别列表正常工作。 这是我唯一的问题。 任何人都可以帮忙吗?

Answer 1:

相当类似阿兰的回答,也许少了几分循环:

$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过滤,收集将只包含存在于当前商店的类别。



Answer 2:

如果你有几百万的产品类别或数百万或需要与他们的所有类别的产品集合 - 你可以尝试下怪胎的方式(再次工作后,才类别扁平索引重建):

  • 在一些安装程序或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

  • 再写一个模型或直接要求得到所有类别所需的存储和所需的产品



Answer 3:

这一个是有点棘手,因此,如果下面不工作它可能是代码,而不是你。

问题是,据我所知,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);


文章来源: How do I get the category ids that a product is in with respect to the store that I'm currently on