3

私は Magento 用のカスタム製品インポート モジュールを構築していますが、これまで Magento を使用したことはありません。

すべての製品を含む CSV ファイルがあります。列の 1 つには、製品を割り当てる必要があるカテゴリがスラッシュで区切られて含まれています。元:

Jewelry / Rings / Diamond
Jewelry / Neckless / Diamond

など。

私が抱えている問題は、Diamond カテゴリが任意の数の親カテゴリのサブカテゴリとして存在できることです。私の解決策は、パスを分割することでした(つまり、expload($categoryPath, "/"))

最初の例 (Jewelry / Rings / Diamond) を使用して、ストアのルート カテゴリから開始し、Jewelry のサブカテゴリが含まれているかどうかを確認します。含まれている場合は、そのサブカテゴリの 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 の名前は「ダミー カテゴリ」です。フィルターが機能していないようです。

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 に答える