开发者

Magento 1.4 - Displaying some products under specific category

开发者 https://www.devze.com 2023-01-24 09:02 出处:网络
Hi I have assigned 20 products to a category called Phone, I would like to create a module to retrieve these products and displayed as a list format. Could someone tell me how to do this?开发者_如何转

Hi I have assigned 20 products to a category called Phone, I would like to create a module to retrieve these products and displayed as a list format. Could someone tell me how to do this?开发者_如何转开发

thanks


To create a widget (which you can insert via the cms) that uses a category to do something, begin by creating a standard module structure with: /Block /etc /Helper /Model

Note that in my code samples and filenames below you will need to replace [Namespace], [Module], and [module] with the appropriate namespace and module that you want to use. Case is important!

Begin by creating app/code/local/[Namespace]/[Module]/etc/config.xml

<?xml version="1.0"?>
<config>
  <modules>
    <[Namespace]_[Module]>
      <version>0.0.1</version>
    </[Namespace]_[Module]>
  </modules>
  <global>
    <helpers>
      <[module]>
        <class>[Namespace]_[Module]_Helper</class>
      </[module]>
    </helpers>
    <blocks>
      <[module]>
        <class>[Namespace]_[Module]_Block</class>
      </[module]>
    </blocks>
    <models>
      <[module]>
        <class>[Namespace]_[Module]_Model</class>
      </[module]>   
    </models>
  </global>
</config>

Then create a app/code/local/[Namespace]/[Module]/etc/widget.xml This widget includes a setting called "selected_category"

<?xml version="1.0"?>
<widgets>
  <[module]_category type="[module]/category">
    <name>[Module]: Category</name>
    <description type="desc">Adds a [module] for a category.</description>
    <parameters>
      <selected_category>
        <label>Categories</label>
        <visible>1</visible>
        <required>1</required>
        <type>select</type>
        <source_model>[module]/catopt</source_model>
      </selected_category>
    </parameters>
  </[module]_category>
</widgets>

Then the obligatory Helper file in app/code/local/[Namespace]/[Module]/Helper/Data.php

 <?php
    class [Namespace]_[Module]_Helper_Data extends Mage_Core_Helper_Abstract
    {
    }

Then a model to allow the user to select the category in the widget dialog box. This goes in app/code/local/[Namespace]/[Module]/Model/Catopt.php

<?php
class [Namespace]_[Module]_Model_Catopt
{
    public function toOptionArray()
    {
        $category = Mage::getModel('catalog/category'); 
        $tree = $category->getTreeModel(); 
        $tree->load();
        $ids = $tree->getCollection()->getAllIds(); 
        $arr = array();
        if ($ids){ 
          foreach ($ids as $id){ 
            $cat = Mage::getModel('catalog/category'); 
            $cat->load($id); 
            array_push($arr, array('value' => $id, 'label' => $cat->getName().' ('.$cat->getProductCount().')')); 
          } 
        }
        uasort($arr, array($this, 'labelsort'));
        return $arr;
    }

    function labelsort($a, $b){
      if ( $a['label'] == $b['label'] ) 
                  return 0; 
              else if ( $a['label'] < $b['label'] ) 
                  return -1; 
              else 
                  return 1;
    }
}

Finally on the module side of things a block which goes in app/code/local/[Namespace]/[Module]/Block/Category.php This block is using a custom .phtml file for it's display but you can change that to use anything else you might need to show by changing the type of block and input to setTemplate.

<?php
class [Namespace]_[Module]_Block_Category
    extends Mage_Core_Block_Template
    implements Mage_Widget_Block_Interface
{

        /**
         * A model to serialize attributes
         * @var Varien_Object
         */
        protected $_serializer = null;

        /**
         * Initialization
         */
        protected function _construct()
        {
            $this->_serializer = new Varien_Object();
            $this->setTemplate('[module]/[module].phtml');
            parent::_construct();
        }

        public function getCategory(){
          return $this->getData('selected_category');
        }
}

Don't forget to add a module install file under /app/etc/modules/[Namespace]_[Module].xml like this

<?xml version="1.0"?>
<config>
    <modules>
        <[Namespace]_[Module]>
            <active>true</active>
            <codePool>local</codePool>
            <depends>
                <Mage_Cms />
            </depends>
        </[Namespace]_[Module]>
    </modules>
</config>

Lastly you need to create a template file to display the block content. This will go under /app/design/frontend/default/default/template/[module]/[module].phtml

This .phtml file can use $this->getCategory() to get the category and go from there. You can easily customize the block included in these samples to display the default magento product list grids instead of using a custom .phtml file.


No need to create a module. just place this in a block in your layout: It will show all the products linked to the specified category (id=XXX).

<!-- Show all products linked to this category -->
<block type="catalog/product_list" name="best_sellers" template="catalog/product/list.phtml">
    <action method="setCategoryId">
        <category_id>XXX</category_id>
    </action>
</block>

Update:

You can create a module that overide the "Mage_Catalog_Block_Product_List", and add a method to limit a certain number of products.

1- Create "app/code/local/[Namespace]/Catalog/etc/config.xml" and put this in it:

<config>
    <modules>
        <[Namespace]_Catalog>
            <version>0.1.0</version>
        </[Namespace]_Catalog>
    </modules>

    <global>

        <blocks>
            <catalog>
                <rewrite>
                    <product_list>[Namespace]_Catalog_Block_Product_List</product_list>
                </rewrite>
            </catalog>
        </blocks>

    </global>
</config>

2- Override the Block by creating the class: "app/code/local/[Namespace]/Catalog/Block/Product/List.php"

class [Namespace]_Catalog_Block_Product_List extends Mage_Catalog_Block_Product_List
{
    /**
     * Default number of product to show.
     *
     * @var int default = 5
     */
    private $_productCount = 5;

    /**
     * Initialize the number of product to show.
     *
     * @param int $count
     * @return Mage_Catalog_Block_Product_List
     */
    public function setProductCount($count)
    {
        $this->_productCount = intval($count);

        return $this;
    }


    /**
     * Get the number of product to show.
     *
     * @return int
     */
    public function getProductCount()
    {
        return $this->_productCount;
    }
}

3- Overide your theme to add the product limit feature:

copy "app/design/frontend/default/default/template/catalog/product/list.phtml" to "app/design/frontend/default/[your_theme]/template/catalog/product/list.phtml"

// Insert between the foreachs and <li> for the list mode and grid mode
<?php if($_iterator < $this->getProductCount()) : ?>
...
// Insert between the foreachs and <li> for the list mode and grid mode
<?php endif; ?>

4- In the home page content tab, add this line where you want it:

// category_id = Procucts linked to this category
// product_count = Maximum number of product
{{block type="catalog/product_list" category_id="7" product_count="3" template="catalog/product/list.phtml"}}

Hope this help someone.


Thanks for the informative post. For those of you who are not so fluent in PHP but landed on this page because you were looking for a solution to display a product name list from a given category I managed to find a solution by simply modifying someone else's template file. For this solution I found the best suited extension was:

http://www.cubewebsites.com/blog/magento/extensions/freebie-magento-featured-products-widget-version-2/

(find the latest version on github: https://github.com/cubewebsites/Cube-Category-Featured-Products/tags).

After logging in and out and clearing the cache I was able to insert the widget into a static block and modify the .phtml file used to produce the custom view that I wanted.

The widget looked like this when inserted:

{{widget type="categoryfeatured/list" template="categoryfeatured/block.phtml" categories="118" num_products="10" products_per_row="1" product_type="all"}}. 

I simply opened

app/design/frontend/base/default/template/categoryfeatured/block.phtml

copied it's contents and created a new .phtml file called category_product_listing.phtml

and then pointed the widget instance to the new .phtml file as follows:

{{widget type="categoryfeatured/list" template="categoryfeatured/category_product_listing.phtml" categories="118" num_products="10" products_per_row="1" product_type="all"}}. 

I then went through this .phtml file with my basic understanding of PHP and removed all items like images, add to cart buttons, reviews, etc. until I was left with just the basic linked product title as well as the category title left intact.

I hope this helps someone as I spent hours trying to figure this out.

0

精彩评论

暂无评论...
验证码 换一张
取 消