4

私は製品ページにいて、製品オブジェクトを持っていますが、次を使用してカテゴリ ID を取得しようとすると:

$_product->getCategoryIds();

また:

$_product->getResource()->getAttribute('category_ids')->getFrontend()->getValue($_product); 

それは私にすべてのカテゴリー ID を取得し、私がいるストアの ID だけが必要です。

それはマルチストア環境なので、私の問題です。他のすべては問題ないようで、カテゴリ リストは正常に機能します。これが私の唯一の問題です。誰でも助けることができますか?

4

3 に答える 3

10

アランの答えにかなり似ていますが、ループが少し少ないかもしれません:

$rootCategory = Mage::getModel('catalog/category')
    ->load(Mage::app()->getStore()->getRootCategoryId());

$sameStoreCategories = Mage::getResourceModel('catalog/category_collection')
    ->addIdFilter($product->getCategoryIds())
    ->addFieldToFilter('path', array('like' => $rootCategory->getPath() . '/%'))
    ->getItems();

var_dump(array_keys($sameStoreCategories));

これは常に機能します。醜いのは、まだカテゴリをロードする必要があることです。

フラット カテゴリ テーブルが有効な場合に使用できるバリエーションを次に示します。

$sameStoreCategories = Mage::getResourceModel('catalog/category_flat_collection')
    ->addIdFilter($product->getCategoryIds())
    ->getItems();

var_dump(array_keys($sameStoreCategories));

なぜそれが機能するのですか?フラット テーブルは店舗ごとにインデックスが作成され、各フラット テーブルには、その店舗グループのルート カテゴリに関連付けられているカテゴリ エンティティ レコードのみが含まれているためです。

そのため、製品に関連付けられたすべてのカテゴリ ID でフィルタリングしている場合でも、コレクションには現在のストアに存在するカテゴリのみが含まれます。

于 2013-03-19T20:02:07.573 に答える
1

数百万のカテゴリまたは数百万の製品がある場合、またはすべての製品とそのすべてのカテゴリのコレクションが必要な場合は、次の奇妙な方法を試すことができます(これもカテゴリフラットインデックスの再構築後にのみ機能します)。

  • 一部のインストーラーまたはcronで-新しいテーブルを作成し、次のリクエストで最新の状態に保ちます

各店舗の場合:

CREATE TABLE IF NOT EXISTS categories_X SELECT product_id, CONVERT(GROUP_CONCAT(category_id) USING utf8) as category_id FROM catalog_category_product where category_id in (select entity_id from catalog_category_flat_store_X) GROUP BY product_id
  • ここで、X-はストアのIDです。

  • モデルを作成するか、リクエストを再度送信して、必要な店舗と必要な商品のすべてのカテゴリを取得します

于 2013-03-19T20:19:06.697 に答える
0

これは少しトリッキーなので、次の方法でうまくいかない場合は、おそらくコードであり、あなたではありません。

問題は、私が知る限り、どのカテゴリがどのストアにあるかを Magento が追跡していないことです。代わりに、Magento は特定のストア のルート カテゴリを追跡します。

つまり、カテゴリ ID のリストを取得したら、それぞれのルート カテゴリを取得し、そのルート カテゴリが現在のストアのルート カテゴリと一致するかどうかを確認する必要があります。

次のコードはそれを行うはずですが、さまざまな製品でこれをテストしてください

    //get root category for current store
    $store_root_id = Mage::app()->getStore()->getRootCategoryId();

    //get category IDs from product
    $ids = $product->getCategoryIds();        

    //load full cateogires
    $categories = Mage::getModel('catalog/category')
    ->getCollection()
    ->addIdFilter($ids);

    //filter out categories with different root
    $category_ids = array();
    foreach($categories as $cat)
    {
        //path property is 1/root_id/id/id
        $parts      = explode('/', $cat->getPath());
        $one        = array_shift($parts);
        $root_id    = array_shift($parts);

        if($root_id == $store_root_id)
        {
            $category_ids[] = $cat->getId();    
        }            
    }

    var_dump($category_ids);
于 2013-03-19T19:16:36.580 に答える