特別オファーで製品のカテゴリを取得する


7

特別オファーのすべての製品のカテゴリのリストを取得するにはどうすればよいですか。それは少しトリッキーです。以下を使用して製品のリストを取得できます。

        $collection
          ->addAttributeToFilter(
              array(
                  array('attribute' => 'news_from_date', 'is'=>new Zend_Db_Expr('not null')),
                  array('attribute' => 'news_to_date', 'is'=>new Zend_Db_Expr('not null'))
                  )
            )
          ->addAttributeToFilter('news_from_date', array('or'=> array(
              0 => array('date' => true, 'to' => $todayEndOfDayDate),
              1 => array('is' => new Zend_Db_Expr('null')))
          ), 'left')
          ->addAttributeToFilter('news_to_date', array('or'=> array(
              0 => array('date' => true, 'from' => $todayStartOfDayDate),
              1 => array('is' => new Zend_Db_Expr('null')))
          ), 'left')
          ->addAttributeToSort('news_from_date', 'desc');

しかし、どのようにしてそれらのカテゴリを取得できますか?

ありがとう。


良い論理的な質問です。+1してください。うまくいけば、私の答えがあなたの問題を解決するでしょう。
Ashish Jagnani 2016年

特別オファーで製品をどのように定義しますか?
アミットベラ

回答:


2

したがって、$collectionオブジェクト内にすでに製品があります。
あなたはこれを行うことができます。

$categoryIds = array();
foreach ($collection as $product) {
   $categoryIds = array_merge($categoryIds, $product->getCategoryIds());
}
$categoryIds = array_unique($categoryIds);

これで、必要なカテゴリIDが手に入りました。
ここでは、上でフィルタリングしたものの中でIDを持つ最上位のカテゴリを取得する方法を示します。

if (count($categoryIds) > 0) {
    $categories = Mage::getModel('catalog/category')->getCollection()
        //add the attributes you need to the select. * = all.
        ->addAttributeToSelect('*')
        //filter by ids you need
        ->addAttributeToFilter('entity_id', array('in' => $categoryIds))
        //get only active categories
        ->addAttributeToFilter('is_active', 1)
        //get only top level categories: 2 means top level (1 is root catalog and 0 is root of all roots)
        ->addAttributeToFilter('level', 2)
        //sort by position if needed
        ->addAttributeToSort('position', 'ASC');
}

これで、カテゴリコレクションをループして、カテゴリで必要なことを実行できます。loadそれぞれのためにもう呼び出す必要はありません。


2

あなたが製品コレクションを得たと言ったように、製品コレクションが$ collectionであると仮定しましょう。

    $cat = array();
    foreach ($collection as $col) {
        foreach ($col->getCategoryIds() as $catId) {
            //check if category id exist.
            if(!in_array($catId, $cat))
            {
               //push to $cat
                array_push($cat,$catId);
            }
        }
    }

$ cat変数ストアの商品のカテゴリID。

ここで、カテゴリIDでカテゴリコレクションをロードします。

    $categoryCollection = Mage::getModel('catalog/category')->getCollection()->addFieldToFilter('entity_id',array('in' => $cat));
    foreach ($categoryCollection as $catCol) {
        echo $catCol->getId();
    }

これはこれを行うには長い道のりです。

または、特別価格が設定されているときにフラグをカテゴリ属性として設定できます。


1

これを試して :

...
// to get all categories
foreach($collection as $singleProduct)
{
    $categories = $singleProduct->getCategoryIds();
    foreach($categories as $singleCategory)
    {
        array_push($allCategories,$singleCategory);
    }
}
$allCategories = array_unique($allCategories);
...

...
// to get top level categories (which are under default category)
foreach($collection as $singleProduct)
{
    $categories = $singleProduct->getCategoryIds();

    foreach($categories as $singleCategory)
    {
        $CategoryObj = Mage::getModel('catalog/category')->load($singleCategory);
        if($CategoryObj->getLevel() == 2)       
        {
            array_push($allCategories,$singleCategory);
        }
    }
}
$allCategories = array_unique($allCategories);
...

私はそうすることを考えていましたが、500個の製品を提供している場合、他の方法でdbに500回ヒットしますか?
Yehia A.Salam 2016年

私はこれを自分の店でも使用しており、3000以上の製品を持っています。このソリューションしかありません。より良い方法を見つけたら共有してください。
Vinaya Maheshwari

0
$rootCategories = array();
$intRootCategoryId = Mage::app()->getStore()->getRootCategoryId();
$category = Mage::getModel('catalog/category')->load($intRootCategoryId);
$subcats = explode(',',$category->getChildren());

foreach($subcats as $cat)
{
    $collection = Mage::getModel('catalog/category')->load($cat)->getProductCollection();
    $collection
      ->addAttributeToFilter(
          array(
              array('attribute' => 'news_from_date', 'is'=>new Zend_Db_Expr('not null')),
              array('attribute' => 'news_to_date', 'is'=>new Zend_Db_Expr('not null'))
              )
        )
      ->addAttributeToFilter('news_from_date', array('or'=> array(
          0 => array('date' => true, 'to' => $todayEndOfDayDate),
          1 => array('is' => new Zend_Db_Expr('null')))
      ), 'left')
      ->addAttributeToFilter('news_to_date', array('or'=> array(
          0 => array('date' => true, 'from' => $todayStartOfDayDate),
          1 => array('is' => new Zend_Db_Expr('null')))
      ), 'left')
      ->addAttributeToSort('news_from_date', 'desc');
    if(!empty($collection))       
    {
        array_push($rootCategories,$cat);
    }

}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.