Товары Magento по категориям - PullRequest
14 голосов
/ 07 ноября 2008

Кто-нибудь знает, как я могу получить список продуктов, принадлежащих к определенной категории, из файла представления в Magento ?

Ответы [ 8 ]

21 голосов
/ 06 апреля 2011

Вы можете использовать объект magento для фильтрации.

Пример:

$categoryId = 123; // a category id that you can get from admin
$category = Mage::getModel('catalog/category')->load($categoryId);

$products = Mage::getModel('catalog/product')
    ->getCollection()
    ->addCategoryFilter($category)
    ->load();

print_r($products);
8 голосов
/ 17 ноября 2008

Все зависит от того, в каком виде вы находитесь.; -)

Прежде всего, я надеюсь, что вы остались в вашем наборе шаблонов (по умолчанию в моем примере).

Используйте это как пример :

<?php
$_cat         = $this->getCurrentCategory();
$_parent      = $_cat->getParentCategory();
$_categories  = $_parent->getChildren();

/* @var $category Mage_Catalog_Model_Category */
$collection = Mage::getModel('catalog/category')->getCollection();
/* @var $collection Mage_Catalog_Model_Resource_Eav_Mysql4_Category_Collection */
$collection->addAttributeToSelect('url_key')
    ->addAttributeToSelect('name')
    ->addAttributeToSelect('is_anchor')
    ->addAttributeToFilter('is_active', 1)
    ->addIdFilter($_categories)
    ->setOrder('position', 'ASC')
    ->joinUrlRewrite()
    ->load();

$productCollection = Mage::getResourceModel('catalog/product_collection');
$layer             = Mage::getSingleton('catalog/layer');
$layer->prepareProductCollection($productCollection);
$productCollection->addCountToCategories($collection);
// $productCollection should be ready here ;-)
?>

Я использую приведенный выше код для отображения родственных категорий в моем шаблоне - он не идеален, но работает.

Это что-то вроде хака, потому что я еще не успел изучить все безумие XML макета. В противном случае, если вы используете XML-файлы, о которых вам нужно помнить - все зависит от того, где вы находитесь. Где означает файл шаблона и, по сути, также макет (с точки зрения приложения / дизайн / внешний интерфейс / default / default / layout /*).

Я знаю, что это немного, но я надеюсь, что это поможет вам начать.

7 голосов
/ 04 апреля 2011

Вот код для получения товаров из любой конкретной категории. Вы можете использовать это и в файле вида.

// if you want to display products from current category
$category = Mage::registry('current_category'); 

// if you want to display products from any specific category
$categoryId = 10;
$category = Mage::getModel('catalog/category')->load($categoryId);

$productCollection = Mage::getResourceModel('catalog/product_collection')
                                 ->addCategoryFilter($category);

// printing products name
foreach ($productCollection as $product) {
    echo $product->getName(); 
    echo "<br />";
}
5 голосов
/ 18 июля 2013
<?php
$c_id = 2;
$category = new Mage_Catalog_Model_Category();
$category->load($c_id);
$collection = $category->getProductCollection();
$collection->addAttributeToSelect('*');
foreach ($collection as $_product) { ?>
<a href="<?php echo $_product->getProductUrl(); ?>"><?php echo $_product->getName(); ?></a>
<?php } ?>
3 голосов
/ 07 мая 2013
<?php

    $category_id = 10; // if you know static category then enter number

$catagory_model = Mage::getModel('catalog/category')->load($category_id); //where $category_id is the id of the category



     $collection = Mage::getResourceModel('catalog/product_collection');

        $collection->addCategoryFilter($catagory_model); //category filter

        $collection->addAttributeToFilter('status',1); //only enabled product

        $collection->addAttributeToSelect(array('name','url','small_image')); //add product attribute to be fetched

        //$collection->getSelect()->order('rand()'); //uncomment to get products in random order    

        $collection->addStoreFilter();          

        if(!empty($collection))

        {

                foreach ($collection as $_product):

                echo $_product->getName();   //get product name        

            endforeach;

        }else

            {

                echo 'No products exists';

        }              

    ?>
3 голосов
/ 09 июля 2012

Мне в значительной степени нужно то же самое. Вот как я это сделал:

$prod_whole = array();
if(!empty($_menu)) //$_menu = array of Categories with some basic info
foreach($_menu as $v)
{
    if($v['name']=='HOME')
    continue;

    $cat_id = $v['id'];

    #/ Setup Products
    $category = Mage::getModel('catalog/category')->load($cat_id);

    $collection = Mage::getModel('catalog/product')->getCollection()
    ->addAttributeToSelect('*') // select all attributes
    ->addCategoryFilter($category)
    ->setPageSize(8) // limit number of results returned
    ->setCurPage(0)
    ->load()
    ;


    $prod_collection = array();
    foreach ($collection as $product)
    {
      $prod_collection_1 = array();

      #/ Basic Info
      $prod_collection_1['id'] = $product->getId();
      $prod_collection_1['name'] = $product->getName();
      $prod_collection_1['price'] = (float) $product->getPrice();
      //$prod_collection_1['desc'] = $product->getDescription();
      //$prod_collection_1['short'] = $product->getShortDescription();
      $prod_collection_1['type'] = $product->getTypeId();
      $prod_collection_1['status'] = $product->getStatus();
      $prod_collection_1['special_price'] =  $product->getSpecialPrice();
      $prod_collection_1['direct_url'] =  $product->getProductUrl();


      #/ getCategoryIds(); returns an array of category IDs associated with the product
      foreach ($product->getCategoryIds() as $category_id)
      {
          $category = Mage::getModel('catalog/category')->load($category_id);
          $prod_collection_1['parent_category'] = $category->getParentCategory()->getName();
          $prod_collection_1['category'] = $category->getName();
          //$prod_collection_1['category_idx'] = preg_replace('/[\s\'\"]/i', '_', strtolower(trim($prod_collection_1['category'])));
          $prod_collection_1['category_id'] = $category->getId();
      }

      #/gets the image url of the product
      $prod_collection_1['img'] = Mage::getBaseUrl(Mage_Core_Model_Store::URL_TYPE_MEDIA).'catalog/product'.$product->getImage();


      $prod_collection[] = $prod_collection_1;

    }//end foreach.....

    $prod_whole[$cat_id] = $prod_collection;

}//end foreach categories.......
//var_dump('<pre>', $prod_whole);

Надеюсь, это поможет.

0 голосов
/ 13 апреля 2018

Вот код для экспорта всего продукта с его категорией в CSV

<?php 
set_time_limit(0);
ini_set("memory_limit",-1);
ini_set('max_execution_time','1800000000');

require_once '../app/Mage.php';
Mage::app(); 

$category = Mage::getModel('catalog/category');
$tree = $category->getTreeModel();
$tree->load();

$ids = $tree->getCollection()->getAllIds();
$fp = fopen('category-product-export.csv', 'w');
$field = array('Product SKU','Category Name'); 
fputcsv($fp, $field);

$_productCollection = Mage::getModel('catalog/product')
                        ->getCollection()
                        ->addAttributeToSelect('*')
                        ->addFieldToFilter('visibility', Mage_Catalog_Model_Product_Visibility::VISIBILITY_BOTH)
                        ->load();

foreach ($_productCollection as $_product){
   $cats = $_product->getCategoryIds();
   $cnt = 0;
   $catName = '';
    foreach($cats as $id) {
        $category->load($id);
        $root = 'Root Catalog';
            $isRoot = strtolower($root);
            $categoryName = strtolower($category->getName());
            if($categoryName == $isRoot){
                continue;
            }
        $categories[$id]['name'] = $category->getName();
        $categories[$id]['path'] = $category->getPath();

        $path = explode('/', $categories[$id]['path']);
        $len = count($path);
        $string = '';
        if($id > 2){
            foreach ($path as $k=>$pathId)
            {
                $separator = '';
                if($pathId > 2){
                    $category->load($pathId);
                    if($k != $len-1){ $separator = ' || ';}
                    $string.= $category->getName() . $separator;
                }

            }
            if($cnt > 0) {
                $catName.= ','.$string;
            } else {
                $catName = $string;
            }

            $cnt++;
        }
    }
    //echo $catName;
    $field = array($_product->getSku(),$catName); 
    fputcsv($fp, $field);   

} 

?>
<a href="category-product-export.csv">Download</a>
0 голосов
/ 11 мая 2012

Вы всегда должны избегать размещения такого кода в представлении, это очень плохая практика. Вы также можете столкнуться с проблемами, так как представления могут быть кэшированы, что приводит к неожиданному поведению.

Вы должны переопределить блок, который вы используете, поместив код там. затем вы можете вызывать любые новые методы внутри ваших файлов просмотра.

например, вы можете скопировать Mage_Catalog_Block_Product_List

от: app / code / core / Каталог / Блок / Product / List.php

to: app / code / local / Catalog / Block / Product / List.php

затем вы можете добавить новый метод, возможно, используя некоторый код, упомянутый в вышеприведенных постах. Ваш новый метод будет доступен внутри вашего файла представления (list.phtml или любого представления, использующего этот блок)

...