Table of Contents

This tutorial will show you how to implement a Featured Product feature. The Featured Product is a product with an attribute added from the admin. When the administrator selects “Yes” in the “Featured” attribute, that product will be displayed in a content block on the category page.

I’ll explain each step I took to make this custom feature. Please forgive me if I left anything out.


Step 1) Create new "Featured" attribute

Create a new attribute by going to Catalog > Attributes > Manage Attributes > Add New Attribute.

Attribute Properties

Front End Properties

Manage Label/Options

Save the new attribute and go to Catalog → Attributes → Manage Attributes Sets to add the attribute to the default feature set.


Step 2) Add Block configuration to catalog.xml

Open MyCompany/app/design/frontend/default/default/layout/catalog.xml. We want to add a new <block> right above the product list block in the default category layout.

Insert the block configuration on line 73 (default catalog.xml).

  1.     <block type="catalog/product_featured" name="product_featured" as="product_featured" template="catalog/product/featured.phtml"></block>

Step 3) Create new block class that will instantiate the featured product

Create a new file, and directories: app/code/local/MyCompany/Catalog/Block/Product/Featured.php

  1. class MyCompany_Catalog_Block_Product_Featured extends Mage_Catalog_Block_Product_Abstract
  2. {
  3.     public function getFeaturedProduct()
  4.     {
  5.         // instantiate database connection object
  6.         $categoryId = $this->getRequest()->getParam('id', false);
  7.         $resource = Mage::getSingleton('core/resource');
  8.         $read = $resource->getConnection('catalog_read');
  9.         $categoryProductTable = $resource->getTableName('catalog/category_product');
  10.         //$productEntityIntTable = $resource->getTableName('catalog/product_entity_int'); // doesn't work :(
  11.         $productEntityIntTable = (string)Mage::getConfig()->getTablePrefix() . 'catalog_product_entity_int';
  12.         $eavAttributeTable = $resource->getTableName('eav/attribute');
  13.    
  14.         // Query database for featured product
  15.         $select = $read->select()
  16.                        ->from(array('cp'=>$categoryProductTable))
  17.                        ->join(array('pei'=>$productEntityIntTable), 'pei.entity_id=cp.product_id', array())
  18.                        ->joinNatural(array('ea'=>$eavAttributeTable))
  19.                        ->where('cp.category_id=?', $categoryId)
  20.                        ->where('pei.value=1')
  21.                        ->where('ea.attribute_code="featured"');
  22.        
  23.         $row = $read->fetchRow($select);
  24.         return Mage::getModel('catalog/product')->load($row['product_id']);
  25.     }
  26. }

We’re almost there!


Step 4) Extend Mage_Catalog_Block_Category_View

Create a new file, and directories, called app/code/local/MyCompany/Catalog/Block/Category/View.php. We’re extending the core class here so our module will be separate from the core code base. When upgrading, we won’t have to worry about our code not working or having to patch files.

  1.     class MyCompany_Catalog_Block_Category_View extends Mage_Catalog_Block_Category_View
  2.     {
  3.         public function getFeaturedProductHtml()
  4.         {
  5.             return $this->getBlockHtml('product_featured');
  6.         }
  7.     }

Step 5) Modify the templates

I haven’t really integrated any real HTML changes, so I will simply point out the files to create and where to edit the HTML.

Edit app/design/frontend/default/default/template/catalog/category/view.phtml and add the following code:

  1.     <?=$this->getFeaturedProductHtml()?>

right above this line:

  1.     <?=$this->getProductListHtml()?>

Edit app/design/frontend/default/default/template/catalog/product/featured.phtml and customize your HTML here (see any of the product templates for Product object member variables).


Step 6) Add new blocks to the app/etc/local.xml

Add the following inside the config global tag:

  1.     <blocks>
  2.         <catalog>
  3.             <rewrite>
  4.                 <product_featured>MyCompany_Catalog_Block_Product_Featured</product_featured>
  5.            </rewrite>
  6.             <rewrite>
  7.                 <category_view>MyCompany_Catalog_Block_Category_View</category_view>
  8.             </rewrite>
  9.          </catalog>
  10.     </blocks>

I hope this helps you add a “Featured Product” feature. It certainly feels thorough, but if I left anything out, please let me know and I’ll be happy to help.

Thanks,

Andy