如何使用storefilter过滤类别集合?

时间:2012-07-02 14:18:42

标签: php magento collections filter categories

我有一个管理模块,我想在该模块中存储类别集合,那么我们如何使用storefilter过滤集合? addstorefilter不适用于类别集合。

5 个答案:

答案 0 :(得分:1)

使用setStore或setStoreId方法:

$collection = Mage:getResourceModel('catalog/category_collection');

// or $collection = Mage::getModel('catalog/category')->getCollection();

$collection->setStoreId($myStoreId)
   ->load();

<强>更新 有一个简单的脚本可以检查:

<?php
require 'app/Mage.php';

Mage::app('admin');

$collection = Mage::getModel('catalog/category')->getCollection()
    ->addAttributeToSelect('name')
    ->setStoreId(2)
    ->load();

echo $collection->count(), "\n";
foreach ($collection as $item) {
   echo $item->getName(), "\n";
}

如果您有3个商店视图,则会有3个storeIds。有0 - 用于管理存储,1 - 用于默认存储,2(或其他值)用于另一个商店。我刚检查过这个并且有效。

答案 1 :(得分:1)

我已经添加了以下代码,它为我工作

$storecategoryid = Mage::app()->getStore($storeid)->getRootCategoryId(); 

从这段代码我得到商店根类别。

$category = Mage::getModel('catalog/category')->getCollection()->addFieldToFilter('is_active',array('eq' => 1))->load();

从这里我得到整个类别集合

foreach($category as $cat)
{
  if($cat->getData('level')==2 && $cat->getData('parent_id')==$storecategoryid)
  { 
     echo 'my code';
  }
}

这样我获得商店类别。

答案 2 :(得分:1)

$rootCategoryId = Mage::app()->getStore()->getRootCategoryId();
$categories = Mage::getModel('catalog/category')->getCollection();
$categories->addAttributeToFilter('path', array('like' => "1/{$rootCategoryId}/%"));

答案 3 :(得分:0)

道具前往@xpoback寻找正确答案。我想重申一下答案,因为有些答案有些正确,而有些则没有。

简短回答,请使用:

$rootId = Mage::app()->getStore()->getRootCategoryId();
    $collection = Mage::getModel('catalog/category')
        ->getResourceCollection()
        ->addAttributeToSelect('*')
        ->addFieldToFilter('path', array('like' => "1/{$rootId}/%"))
        ->addIsActiveFilter();

对于想要了解其他答案的所有人,请阅读。

首先,@Muffadal的答案是有效的,但在性能方面却极其缓慢。您希望将数据查询到mySQL,而不是在大型集合中使用php循环(假设您的商店中有多个类别)。

使用addPathsFilter('/' . $storecategoryid . '/')的答案下的评论也是正确的,但在这种情况下比使用LIKE运算符要慢(参见article

@Serjio的方法在区分不同类别方面不起作用。它将做什么是拉特定商店的翻译。示例商店1已将类别命名为 Rings ,商店2已将同一类别命名为 My Rings 。 如果我们使用他的代码从商店2进行调用,它将拉出所有类别,无论Root,但将拉出Store 2的命名约定 - My Rings

答案 4 :(得分:0)

在Magento 1.9

$storeId=2;
$rootCategoryId = Mage::app()->getStore($storeId)->getRootCategoryId();


            $categories = Mage::getModel('catalog/category')
                ->getCollection()
                ->setStoreId($storeId)
                ->addFieldToFilter('is_active', 1)
                ->addAttributeToFilter('path', array('like' => "1/{$rootCategoryId}/%"))
                ->addAttributeToSelect('*');

                foreach($categories as $categorie)
                {
                    $catid=$cat->getId();                   
                    $catname=$categorie->getName();
                    $catp=catp$categorie->getParent_id();
                }