Obter categorias de produtos em oferta especial

7

Como posso obter a lista de categorias de todos os produtos em ofertas especiais. É um pouco complicado. Consigo obter a lista de produtos usando:

        $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');

Mas como posso obter suas categorias (categorias de nível superior, de preferência).

Obrigado.

Yehia A.Salam
fonte
Boa pergunta lógica. +1 para você. Espero que minha resposta resolva seu problema.
Ashish Jagnani
Como você define um produto em oferta especial?
Amit Bera

Respostas:

2

Então você já tem os produtos dentro do $collectionobjeto.
Você consegue fazer isso.

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

Agora você tem os IDs de categoria necessários.
Veja como você pode obter as categorias de nível superior que têm IDs entre as que você filtrou acima.

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');
}

Agora você pode simplesmente percorrer a coleção de categorias e fazer o que precisar com sua categoria. Você não precisa loadmais ligar para cada um.

Marius
fonte
2

Como você disse que você tem uma coleção de produtos, vamos assumir que a coleção de produtos é $ 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);
            }
        }
    }

ID da categoria da loja variável $ cat dos produtos.

Agora carregue a coleção de categorias por IDs de categoria.

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

Este é um longo caminho para fazer isso.

ou você pode definir o sinalizador como atributo de categoria enquanto o preço especial é definido.

Vaibhav Ahalpara
fonte
1

Tente o seguinte:

...
// 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);
...
Vinaya Maheshwari
fonte
Eu estava pensando em fazer isso, mas e se eu tiver 500 produtos em oferta, estaremos atingindo o db 500 vezes, de alguma outra maneira?
Yehia A.Salam 22/10
Também estou usando isso na minha loja e tenho mais de 3000 produtos, tenho apenas esta solução. Se você encontrar uma maneira melhor, compartilhe.
Vinaya Maheshwari 22/10
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);
    }

}
Ashish Jagnani
fonte