php 按类别分类的 Magento 产品

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/272818/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-24 22:09:22  来源:igfitidea点击:

Magento products by categories

phpmagentocategoriesproductcatalog

提问by mivec

Does anyone know how I can get a list of products belonging to a specific category from within a view file in Magento?

有谁知道如何从Magento的视图文件中获取属于特定类别的产品列表?

回答by mivec

You can use magento object to filter.

您可以使用 magento 对象进行过滤。

Example:

例子:

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

回答by Till

It all depends on which view you're in. ;-)

这完全取决于您所在的视图。;-)

First off, I hope you stayed within your template set (default in my example).

首先,我希望你留在你的模板集中(在我的例子中是默认的)。

Use this as an example:

以此为例

<?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 ;-)
?>

I'm using the above code to display sister categories in my template - it's not ideal but it works.

我正在使用上面的代码在我的模板中显示姊妹类别 - 这并不理想,但它有效。

It's sort of a hack because I did not yet have time to learn all the layout XML madness. Otherwise if you use the XMLs you need to keep in mind - it all depends on where you are at. Wheremeans the template file and essentially also the layout (in terms of app/design/frontend/default/default/layout/*).

这有点像黑客,因为我还没有时间学习所有的布局 XML 疯狂。否则,如果您使用 XML,则需要牢记——这完全取决于您所处的位置。哪里是指模板文件,本质上也是布局(就 app/design/frontend/default/default/layout/* 而言)。

I know it's not much, but I hope it helps to get you started.

我知道这并不多,但我希望它可以帮助您入门。

回答by Mukesh Chapagain

Here is the code to get products from any particular category. You can use this in view file as well.

这是从任何特定类别获取产品的代码。您也可以在视图文件中使用它。

// 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 />";
}

回答by Jatin Soni

<?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 } ?>

回答by Raheel Hasan

I pretty much needed the same. Here is how I have done it:

我几乎需要同样的。这是我如何做到的:

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

Hope this helps.

希望这可以帮助。

回答by Chiragit007

<?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';

        }              

    ?>

回答by Shorabh

Here is a code to export all product with it's category into csv

这是将所有产品及其类别导出到 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>

回答by Andrew

You should always avoid putting code like this into a view, it's very bad practice. You can also run into issues as views can be cached, leading to unexpected behaviour.

您应该始终避免将这样的代码放入视图中,这是非常糟糕的做法。您还可能会遇到问题,因为可以缓存视图,从而导致意外行为。

you should override the block you are using, placing code there. you can then call any new methods inside your view files.

你应该覆盖你正在使用的块,在那里放置代码。然后,您可以在视图文件中调用任何新方法。

for example, you could copy Mage_Catalog_Block_Product_List

例如,您可以复制 Mage_Catalog_Block_Product_List

from: app/code/core/Catalog/Block/Product/List.php

来自:app/code/core/Catalog/Block/Product/List.php

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

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

you could then add a new method, possibly using some of the code mentioned in the above posts. your new method would then be available inside your view file (list.phtml or any view using this block)

然后你可以添加一个新方法,可能使用上面帖子中提到的一些代码。您的新方法将在您的视图文件中可用(list.phtml 或使用此块的任何视图)