Magento - 获取集合中的类别和子类别
Magento - get categories and subcategories in a collection
我的 magento 商店中有以下类别结构
- root
- category 0 (ID 26)
- category 1 (main)
- category A (sub)
- category V (sub)
- category 2 (main)
- category G (sub)
- category J (sub)
- category E (sub)
- category 3 (main)
- category L (sub)
等等...
在页面上我希望能够输出以下内容:
1. get each (main) category and its name and url
2. get the first (sub) category in (main) and its icon (custom attribute)
所以它会为每个输出:
<a href="main-cat-link"><img src="main-cat-first-sub-icon"></a>
<a href="main-cat-link">main-cat-name</a>
给予类似的东西:
<category 1 link><category A icon img></link>
<category 1 link><category 1 name>
<category 2 link><category G icon img>
<category 2 link><category 2 link>
<category 3 link><category L icon img>
<category 3 link><category 3 link>
最好的方法是什么?到目前为止我有:
<?php
$_id = 26 // category 0
$_main_categories = Mage::getModel('catalog/category')
->getCollection()
->addFieldToFilter('parent_id', array('eq'=>$_id))
->addAttributeToFilter('is_active', 1)
->addAttributeToSelect(array('id','name','url'))
foreach($_main_categories as $_main_cat)
{
// load full main category
$_category = Mage::getModel('catalog/category')->load($_main_cat->getId());
// get sub category's children
$_main_cat_subs = $_category->getChildrenCategories();
// loop through sub catagories, get icon in first and break
foreach($_main_cat_subs as $_sub_cat)
{
// load full sub category
$_sub = Mage::getModel('catalog/category')->load($_sub_cat->getId());
$i++;
$_icon = $_sub_cat->getIcon();
}
if( $i >= 1 ){
break; // as i only want the first one
}
}
// output
?>
<a href="<?php echo $_main_cat->getUrl() ?>">
<img src="<?php echo $_icon ?>">
</a>
<a href="<?php echo $_main_cat->getUrl() ?>">
<?php echo $_main_cat->getName() ?>
</a>
<?php
}
?>
这可行,但在 foreach 循环中加载完整类别模型两次似乎是非常糟糕的做法,并且当站点增长时可能需要很长时间。
实现上述性能的最佳方式是什么?
你可以优化的是:
$_category = Mage::getModel('catalog/category')->load($_main_cat->getId());
此处您正在(再次)从数据库加载类别。虽然您已经加载了一个集合,但您应该将您需要的所有类别都放入该集合中并具有正确的属性。
然后代替上面的代码,使用这个少数集合函数来获取类别实体:
$_category = $_main_categories->getItemById($_main_cat->getId());
//...
$_sub = $_main_categories->getItemById($_sub_cat->getId());
您应该会看到明显的性能提升,尤其是当您有很多类别时。
我的 magento 商店中有以下类别结构
- root
- category 0 (ID 26)
- category 1 (main)
- category A (sub)
- category V (sub)
- category 2 (main)
- category G (sub)
- category J (sub)
- category E (sub)
- category 3 (main)
- category L (sub)
等等...
在页面上我希望能够输出以下内容:
1. get each (main) category and its name and url
2. get the first (sub) category in (main) and its icon (custom attribute)
所以它会为每个输出:
<a href="main-cat-link"><img src="main-cat-first-sub-icon"></a>
<a href="main-cat-link">main-cat-name</a>
给予类似的东西:
<category 1 link><category A icon img></link>
<category 1 link><category 1 name>
<category 2 link><category G icon img>
<category 2 link><category 2 link>
<category 3 link><category L icon img>
<category 3 link><category 3 link>
最好的方法是什么?到目前为止我有:
<?php
$_id = 26 // category 0
$_main_categories = Mage::getModel('catalog/category')
->getCollection()
->addFieldToFilter('parent_id', array('eq'=>$_id))
->addAttributeToFilter('is_active', 1)
->addAttributeToSelect(array('id','name','url'))
foreach($_main_categories as $_main_cat)
{
// load full main category
$_category = Mage::getModel('catalog/category')->load($_main_cat->getId());
// get sub category's children
$_main_cat_subs = $_category->getChildrenCategories();
// loop through sub catagories, get icon in first and break
foreach($_main_cat_subs as $_sub_cat)
{
// load full sub category
$_sub = Mage::getModel('catalog/category')->load($_sub_cat->getId());
$i++;
$_icon = $_sub_cat->getIcon();
}
if( $i >= 1 ){
break; // as i only want the first one
}
}
// output
?>
<a href="<?php echo $_main_cat->getUrl() ?>">
<img src="<?php echo $_icon ?>">
</a>
<a href="<?php echo $_main_cat->getUrl() ?>">
<?php echo $_main_cat->getName() ?>
</a>
<?php
}
?>
这可行,但在 foreach 循环中加载完整类别模型两次似乎是非常糟糕的做法,并且当站点增长时可能需要很长时间。
实现上述性能的最佳方式是什么?
你可以优化的是:
$_category = Mage::getModel('catalog/category')->load($_main_cat->getId());
此处您正在(再次)从数据库加载类别。虽然您已经加载了一个集合,但您应该将您需要的所有类别都放入该集合中并具有正确的属性。
然后代替上面的代码,使用这个少数集合函数来获取类别实体:
$_category = $_main_categories->getItemById($_main_cat->getId());
//...
$_sub = $_main_categories->getItemById($_sub_cat->getId());
您应该会看到明显的性能提升,尤其是当您有很多类别时。