简体   繁体   English

Magento产品按类别划分

[英]Magento products by categories

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

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

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. 这有点像黑客,因为我还没有时间学习所有布局XML疯狂。 Otherwise if you use the XMLs you need to keep in mind - it all depends on where you are at. 否则,如果您使用XML,则需要记住 - 这一切都取决于您所处的位置。 Where means the template file and essentially also the layout (in terms of app/design/frontend/default/default/layout/*). 其中表示模板文件,基本上也表示布局(就app / design / frontend / default / default / layout / *而言)。

I know it's not much, but I hope it helps to get you started. 我知道这并不多,但我希望能帮助你入门。

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

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. 希望这可以帮助。

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

        }              

    ?>

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 from:app / code / core / Catalog / Block / Product / List.php

to: app/code/local/Catalog/Block/Product/List.php to: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或使用此块的任何视图)

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>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM