Erhalten Sie Produktkategorien im Sonderangebot


7

Wie kann ich die Liste der Kategorien aller Produkte auf Sonderangeboten erhalten. Es ist ein bisschen schwierig. Ich kann die Liste der Produkte abrufen mit:

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

Aber wie kann ich ihre Kategorien bekommen (vorzugsweise Top-Level-Kategorien).

Vielen Dank.


Gute logische Frage. +1 für dich. Hoffentlich wird meine Antwort Ihr Problem lösen.
Ashish Jagnani

Wie definieren Sie ein Produkt im Sonderangebot?
Amit Bera

Antworten:


2

Sie haben also bereits die Produkte im $collectionObjekt.
Du kannst das.

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

Jetzt haben Sie die Kategorie-IDs, die Sie benötigen.
Hier erfahren Sie, wie Sie die Kategorien der obersten Ebene mit IDs unter den oben gefilterten erhalten.

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

Jetzt können Sie einfach die Kategoriesammlung durchlaufen und mit Ihrer Kategorie das tun, was Sie brauchen. Sie müssen nicht loadmehr für jeden anrufen .


2

Wie Sie sagten, Sie haben eine Produktkollektion. Nehmen wir an, die Produktsammlung ist $ 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 Variable Store Kategorie ID der Produkte.

Laden Sie nun die Kategoriesammlung nach Kategorie-IDs.

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

Dies ist ein langer Weg, um dies zu tun.

oder Sie können das Flag als Kategorieattribut setzen, während der Sonderpreis festgelegt wird.


1

Versuche dies :

...
// 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);
...

Ich habe darüber nachgedacht, aber was ist, wenn ich 500 Produkte im Angebot habe, werden wir die Datenbank 500 Mal treffen, auf andere Weise?
Yehia A. Salam

Ich benutze dies auch in meinem Geschäft und ich habe mehr als 3000 Produkte, ich habe nur diese Lösung. Wenn Sie einen besseren Weg finden, teilen Sie ihn bitte mit.
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);
    }

}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.