3

我正在为 Magento 构建一个自定义产品导入模块,并且以前从未与 Magento 合作过。

我有一个包含所有产品的 CSV 文件。其中一列包含产品应分配到的类别,用斜杠分隔。前任:

Jewelry / Rings / Diamond
Jewelry / Neckless / Diamond

等等。

我遇到的问题是 Diamond 类别可以作为子类别存在于任意数量的父类别中。我的解决方案是打破路径(即 expload($categoryPath, "/"))

使用第一个示例(珠宝/戒指/钻石),我从商店根类别开始,检查它是否包含珠宝的子类别,如果包含,我获取该子类别的 ID 并递归地到达终点线,或者至少这是理论。

我遇到的问题就在这里...

$rootCategory = Mage::getModel('catalog/category') -> load($rootCategoryId);
$currentCategory = $rootCategory -> getChildrenCategories() -> loadByAttribute('name', $targetCategoryName);

这会给我一个错误...“在非对象中调用成员函数 getName()”...我假设是因为 getChildrenCategories() 正在返回一个集合,而我无法对其调用 loadByAttribute。

如果这对任何人都有意义,请告诉我如何仅使用名称从根类别加载子类别。我希望如果 loadByAttribute 无法加载类别(因为它不存在),它将返回 False,然后我可以创建类别。


为了回应 Pavels 的建议,我尝试了:

$targetCategoryName = 'Jewelry';

$subCategories = $rootCategory
                    -> getChildrenCategories()
                    -> addAttributeToFilter('name',$targetCategoryName) 
                    -> setCurPage(1)
                    -> setPageSize(1)
                    -> load();

    $currentCategory = $subCategories
                    -> getFirstItem();

$currentCategory 的名称是“dummy-category”。过滤器似乎不起作用。

4

2 回答 2

6

根据您的问题,我认为您需要根据父类别按名称查找类别,即仅搜索其子类别?

如果是这样的话……

$childCategoryName = 'Bedroom';
$parentCategoryId = 10;

$parentCategory = Mage::getModel('catalog/category')->load($parentCategoryId);
$childCategory = Mage::getModel('catalog/category')->getCollection()
    ->addAttributeToFilter('is_active', true)
    ->addIdFilter($parentCategory->getChildren())
    ->addAttributeToFilter('name', $childCategoryName)
    ->getFirstItem()    // Assuming your category names are unique ??
;

if (null !== $childCategory->getId()) {
    echo "Found Category: " . $childCategory->getData('name');
} else {
    echo "Category not found";
}

您的原始代码走在了正确的轨道上:

$currentCategory = $rootCategory -> getChildrenCategories() -> loadByAttribute('name', $targetCategoryName);

但问题是它$rootCategory->getChildrenCategories()返回一个集合,因此您需要过滤它,而不是loadByAttribute对模型起作用。

但是,$rootCategory->getChildrenCategories()返回一个加载的集合,所以不幸的是你仍然无法过滤它。因此,我的答案中的代码略有不同 - 尽管其背后的逻辑相同。

于 2012-10-04T08:58:23.007 回答
2

试试这个

<?php
$name = 'Furniture';
$categories = Mage::getResourceModel('catalog/category_collection');
$categories->addAttributeToFilter('is_active', 1)
        ->addAttributeToFilter('name', $name)
        ->setCurPage(1)->setPageSize(1)
        ->load();

if ($categories->getFirstItem()) {
    $category = $categories->getFirstItem();
    echo $category->getId();
} else {
    echo 'No category exists with the name ' . $name;
}
于 2012-10-03T20:25:32.163 回答