4

我正在尝试根据 magento 中的产品 ID 在类别路径中获取类别名称。

假设我的产品 ID = 1 并且我定义了 category5 (id = 5) 并且我得到了像 2/3/5 这样的类别路径。而不是这种类型的类别路径,我需要像 category2/category3/category5 这样的类别路径。这意味着我需要路径中的类别名称而不是类别 ID。我通过使用以下代码得到了这个,但它需要很多时间。我需要减少处理时间。

请就如何减少处理时间给我建议。

$category_model = Mage::getModel('catalog/category');  
$product_model = Mage::getModel('catalog/product'); 
$all_cats = array();
$product_model->reset();
$_product = $product_model->load($entityId);
$all_cats = $product_model->getCategoryIds($_product); 
$main_cnt = count($all_cats);
$cat_str_main = ''; 
$j = 0;
foreach($all_cats as $ac)
{
    $root_category = $category_model->load($ac);
    $cat_path = $root_category->getPath();
    $cat_arr = explode("/",$cat_path);
    $cnt = count($cat_arr);
    $cat_str = '';
    $main_str = '';
    $i=0;
    foreach($cat_arr as $ids)
    {
                $root_category = $category_model->load($ids); //load root catalog
        if($i == 2)
        {
            $cat_str = $category_model->getName();
        }
        else if($i > 2)
        {
            $cat_str = $cat_str."/".$category_model->getName();
        }
        $i = $i+1;
    }
    if($j < 1)
    {
        $cat_str_main = $cat_str;
    }
    else 
    {
        $cat_str_main = $cat_str_main .",".$cat_str;
    }
    $j = $j+1;
}

谢谢.....

4

4 回答 4

7

您应该使用类别集合而不是加载每个类别来减少数据库查询。

编辑:我给你写了一个代码示例。我假设您具有要获取路径名称为 $categoryId 的类别的类别 ID:

$category = Mage::getModel('catalog/category')->load($categoryId);
$collection = $category->getResourceCollection();
$pathIds = $category->getPathIds();
$collection->addAttributeToSelect('name');
$collection->addAttributeToFilter('entity_id', array('in' => $pathIds));
$result = '';
foreach ($collection as $cat) {
    $result .= $cat->getName().'/';
}
于 2013-01-02T10:11:00.900 回答
3

我认为您应该查看为您处理此问题的magento目录url重写...在您的magento管理员中,它应该在目录>> URL重写管理中

编辑:

因为您想在其他页面中执行此操作,您可以简单地执行以下操作:

$store = Mage::app()->getStore();

$product_url = $store->getBaseUrl().$product->getUrlPath();

$category_url = $store->getBaseUrl().$category->getUrlPath();
于 2013-01-02T10:53:46.130 回答
0

这是比@mpaepper 建议更快的解决方案。我只加载一次集合,然后不询问数据库。

echo "################################", PHP_EOL;
$collection = Mage::getResourceModel('catalog/category_collection');
/* @var $collection Mage_Catalog_Model_Resource_Category_Collection */
$pattern    = '1/2/';
$collection->addNameToResult()
        ->addPathFilter($pattern . '.+');


$categories = array();

foreach ($collection as $id => $_cat) {
    /* @var $_cat Mage_Catalog_Model_Category */
    $path = explode('/', $_cat->getPath());

    $namedPath = [];

    foreach ($path as $_id) {
        $subcat = $collection->getItemById($_id);
        if ($subcat) {
            $namedPath[] = $subcat->getName();
        }
    }
    $categories[implode('/', $namedPath)] = $id;
}
print_r($categories);
echo $collection->count(), $collection->getSelect()->assemble(), PHP_EOL;
于 2015-08-21T15:05:41.233 回答
0

这是 Magento 代码:使用类别路径获取类别名称。请尝试一下。我希望它会帮助你。

<?php
    set_time_limit(0);
    require_once '../app/Mage.php';
    Mage::app();
    ?>

    <table class="category-data" border="1" align="center">
    <tr>
        <td><h2>Category Path</h2></td>
        <td><h2>Category Id</h2></td>
        </tr>
    <?php
    $category = Mage::getModel('catalog/category');
    $tree = $category->getTreeModel();
    $tree->load();

    $ids = $tree->getCollection()->getAllIds();
    $categories = array();
    if ($ids)
    {
        foreach ($ids as $id)
        {
            $category->load($id);
            $root = 'Root Catalog';
                $isRoot = strtolower($root);
                $categoryName = strtolower($category->getName());
                if($categoryName == $isRoot){
                    continue;
                }
            $categories[$id]['name'] = $category->getName();
            $categories[$id]['path'] = $category->getPath();
        }
        foreach ($ids as $id)
        {

            $path = explode('/', $categories[$id]['path']);
            $len = count($path);
            $string = '';
            if($id > 2){
                foreach ($path as $k=>$pathId)
                {
                    $separator = '';
                    if($pathId > 2){
                        if($k != $len-1){ $separator = ' || ';}
                        $string.= $categories[$pathId]['name'] . $separator;
                    }
                    $cnt++;
                }
            ?>
            <tr>
            <td><?php echo $string; ?></td>
            <td><?php echo $id; ?></td>
            </tr>
            <?php
            }
        ?>

        <?php
        }
    }
    ?>
    </table>
于 2018-04-13T09:38:47.297 回答