Extending Magento's topLinks to Include Nested/Dropdown Child Menu's - magento

We've extended the Magento class Mage_Page_Block_Template_Links using the method outlined by Sonassi here.
Editing the _construct function to include our custom template:-
protected function _construct()
{
$this->setTemplate('page/template/links_nested.phtml');
}
Editing the function addLink to include $childMenu variable and allow this to be used in XML layout:-
public function addLink($label, $url = '', $title = '', $prepare = false, $urlParams = array(), $position = null, $liParams = null, $aParams = null, $beforeText = '', $afterText = '', $childMenu = false)
{
if (is_null($label) || false === $label) {
return $this;
}
$link = new Varien_Object(array(
'label' => $label,
'url' => ($prepare ? $this->getUrl($url, (is_array($urlParams) ? $urlParams : array())) : $url),
'title' => $title,
'li_params' => $this->_prepareParams($liParams),
'a_params' => $this->_prepareParams($aParams),
'before_text' => $beforeText,
'after_text' => $afterText,
'child_menu' => ($childMenu ? $this->getLayout()->getBlock($childMenu) : '')
));
$this->_links[$this->_getNewPosition($position)] = $link;
if (intval($position) > 0) {
ksort($this->_links);
}
return $this;
}
Then we wish to include <childMenu> parameter in local.xml for an item in topLinks:-
<reference name="top.links">
<action method="addLink" translate="label title before_text">
<label>Account</label>
<url />
<title>Account</title>
<prepare />
<urlParams />
<position>10</position>
<liParams>id="account-dropdown"</liParams>
<aParams />
<before_text />
<after_text />
<childMenu>account-submenu</childMenu>
</action>
</reference>
And then construct the childMenu as account-submenu:-
<reference name="top.links">
<block type="page/template_links" name="submenu" as="submenu">
<action method="setName">
<name>account-submenu</name>
</action>
<action method="addLink" translate="label title before_text">
<label>Contact Us</label>
<url />
<title>Contact Us</title>
<prepare />
<urlParams />
<position>110</position>
<liParams />
<before_text />
<after_text />
</action>
</block>
</reference>
Then we've made a few modifications to the template file to render childMenu if declared:-
<?php $_links = $this->getLinks(); ?>
<?php if(count($_links)>0): ?>
<ul class="links nav"<?php if($this->getName()): ?> id="<?php echo $this->getName() ?>"<?php endif;?>>
<?php foreach($_links as $count=>$_link): ?>
<?php if ($_link instanceof Mage_Core_Block_Abstract):?>
<?php echo $_link->toHtml() ?>
<?php else: ?>
<li<?php if($_link->getIsFirst()||$_link->getIsLast()||$count): ?> class="<?php if($_link->getIsFirst()): ?>first<?php endif; ?><?php if($_link->getIsLast()): ?> last<?php endif; ?> link-<?php echo $count ?>"<?php endif; ?> <?php echo $_link->getLiParams() ?>>
<?php echo $_link->getBeforeText() ?><a href="<?php echo $_link->getUrl() ?>" title="<?php echo $_link->getTitle() ?>" <?php echo $_link->getAParams() ?>><?php echo $_link->getLabel() ?></a><?php echo $_link->getAfterText() ?>
<?php var_dump($_link->getChildMenu()); ?>
<?php echo ($_link->getChildMenu()) ? $_link->getChildMenu()->toHtml() : ''; ?>
</li>
<?php endif;?>
<?php endforeach; ?>
</ul>
<?php endif; ?>
Everything is working as expected apart from the fact that childMenu doesn't render anything at all in the front end, so the 'My Account' top link contains no submenu.
Is there something incorrect with the call for childMenu in the template file ?
<?php echo ($_link->getChildMenu()) ? $_link->getChildMenu()->toHtml() : ''; ?>

In the layout XML, you should define your submenu block (<block> node) before adding it to the top links (<action method="addLink"> within <reference name="top.links">). As Magento treats the nodes as they come, he won't know that the block exists otherwise

To anybody having any issues with this - I thought I'd post my solution.
I don't think it's too wise to copy the core Page/Block/Template/Links.php file from app/code/core to app/code/local and making the adjustments to that file (what happens if this Links.php file is updated in a future Magento update, you'd need to ensure your override complies with the new updated file from the core).
Anyways, the issue here is definitely that the instructions are missing a step - everything makes sense right to the point where they reference (out of nowhere) the block "mymainmenu.links" - this block doesn't exist anywhere, hence it won't work. And if you keep adding your links to the "top.links" block, Magento will just keep using the default block to display your links. So the obvious answer here is to create a new block.
In your layout file add the following block (I'm using local.xml) app/design/frontend/(package)/(theme)/layout.xml
<?xml version="1.0"?>
<layout version="0.1.0">
<default>
<reference name="header"> <!-- You could also use root here to give it a larger scale access -->
<block type="templatelinks/page_template_links" name="mymainmenu.links" as="mymainmenuLinks">
<action method="setName">
<name>mymainmenu-links</name>
</action>
<action method="addLink" translate="label title">
....
</action>
</block>
</reference>
</default>
</layout>
Setting the block type to (custom module name)/(block location) instantiates our custom module and and processes our actions through that.
You'll also have to remember to display your newly created (in this instance mymainmenuLinks) block in our template(s) - In most cases it'll be your app/design/frontend/(package)/(theme)/template/page/html/header.phtml file
Locate
<?php echo $this->getChildHtml('topLinks') ?>
And replace with your new block name
<?php echo $this->getChildHtml('mymainmenuLinks') ?>

Related

Magento: How can I show the category description in the left sidebar?

I want to display the category description in my left sidebar instead of the main column.
I added this to my catalog.xml:
<reference name="left">
<block type="catalog/navigation" name="catalog.leftnav" after="currency" template="catalog/navigation/left.phtml"/>
</reference>
<reference name="left">
<block type="catalog/navigation" name="catalog.catdes" after="catalog.leftnav" template="catalog/navigation/description.phtml"/>
</reference>
And I created this file: catalog/navigation/description.phtml
<?php
$_helper = $this->helper('catalog/output');
$_category = $this->getCurrentCategory();
?>
<?php if($_description=$this->getCurrentCategory()->getDescription()): ?>
<div class="category-description">
<?php echo $_helper->categoryAttribute($_category, $_description, 'description') ?>
</div>
There is no result at all. What could I be doing wrong?
The following solved this issue for me.
echo Mage::getModel('catalog/layer')->getCurrentCategory()->getDescription();
Have you just tried to echo $_description since you set it equal in the if statement?
If that doesn't work then just try to load it:
$cat = Mage::getModel('catalog/category')->load($_category->getId());
$description = $cat->getDescription();
<?php if($category = Mage::registry('current_category')): ?>
<div class="category-description std">
<?php echo $category->getDescription(); ?>
</div>
<?php endif; ?>
Anywhere in custom phtml file :
<?php
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$currentCategory = $objectManager->get('Magento\Framework\Registry')->registry('current_category');//get current category information
echo $currentCategory->getDescription();
?>

Call a block in another template

I just create a module name referral. Now I want to place the referral block to another module template file name success.phtml. Can it be done?
referral.xml(in referral module)
<?xml version="1.0"?>
<layout version="0.1.0">
<checkout_onepage_success>
<reference name="checkout.success">
<block type="referral/referral" name="referralCallLink"><action method="referralCallLink"></action></block>
</reference>
</checkout_onepage_success>
<!--block type="referral/referral" name="referralAddSession"><action method="referralAddSession"></action></block-->
</layout>
success.phtml
<?php if($hasBoughtMCash): ?>
<div> Your
<?php echo implode(', ',$hasBoughtMCash); ?>
purchase is successful.
</div>
<?php endif; ?>
<h2>Share in Facebook and Earn for Free MCash!</h2>
<?php echo $this->getChildHtml(); ?>
Referral.php(block)
public function referralCallLink() //success page
{
...
$collection7 = Mage::getModel('referral/referrallink')->getCollection();
$collection7->addFieldToFilter('customer_id', array('eq' => $cust_id));
$collection7->addFieldToFilter('grouped', array('eq' => $grouped));
foreach($collection7 as $data3)
{
$product = $data3->getData('product');
$link = $data3->getData('link');
$imageurl = $data3->getData('url');
//facebook
$title=urlencode('Shop, Save and Get Rewarded at MRuncit.com');
$url=urlencode($link);
$summary=urlencode('I just bought '.$product.' from MRuncit.com and earned some MReward Points!');
$image=urlencode($imageurl);
?>
<p>
<a href="http://www.facebook.com/sharer.php?s=100&p[title]=<?php echo $title;?>&p[summary]=<?php echo $summary;?>&p[url]=<?php echo $url; ?>&p[images][0]=<?php echo $image;?>','sharer','toolbar=0,status=0,width=548,height=325');" target="_blank">
<img src="<?php echo $imageurl;?>" width="30">
I just bought <?php echo $product; ?> from MRuncit.com and earned some MReward Points!
</a>
</p>
<?php
}
}
Results
You should create the block as child of the success block in your layout XML:
<layout_handle_of_the_success_page>
<reference name="name_of_the_success_block_in_layout">
<block type="your/referral_block" />
</reference>
</layout_handle_of_the_success_page>
Then you can insert the following line in success.phtml:
<?php echo $this->getChildHtml('referral'); ?>
There are some names in the example XML that you have to replace with your own:
layout_handle_of_the_success_page - you will find it in the layout XML of the corresponding module. It should be in the form module_controller_action --> checkout_onepage_success
name_of_the_success_block_in_layout - also from the layout XML, look for the block with the success.phtml template and its name attribute --> checkout.success
your/referral_block - that's the class alias of the block that you want to insert in the form module/class --> referral/referral

magento product

I have posted this issue on the magneto Forums but haven't herd anything in two weeks so I'm going to post here and hopefully get a little more insight
"I have been going through the forums and working out how to change the view for one product, and I found a good post on the forums that let me change the view like I want but my page seems to be created from two seperate files. One called view.phtml in app/design/frontend/base/default/template/catalog/product and another called default.phtml in the same path just down two more directories view/type/. The Code I need to modify is in default.phtml but when i do that and set it to display that it stops displaying the other half of the page or the view.phtml part.
I am using ....
<reference name="product.info">
<action method="setTemplate">
<template>catalog/product/view/type/default1.phtml</template></action>
</reference>
...in the custom layout section of the product in the backend.
But this only shows the sizing section of the page and not the name/description/picture witch is output by view.phtml
So how do I get view.phtml to display the new default1.phtml
and if I try.....
<reference name="product.info">
<action method="setTemplate">
<template>catalog/product/view.phtml</template>
</action>
</reference>
it works but does not show default1.phtml in the size section.
All this because I need to show 2 different size charts one for males and one for females. You can see my issue by going to mysteryhousecostumes.net and navigating to a womans product and then a mans and you will see the mens products still link to the womens size chart.
How do I fix view.phtml so that it links to default1 instead of default? I realize I’ll need to make a duplicate view.phtml but I cant find the connection between the two files here is my view.phtml…
<?php $_helper = $this->helper('catalog/output'); ?>
<?php $_product = $this->getProduct(); ?>
<script type="text/javascript">
var optionsPrice = new Product.OptionsPrice(<?php echo $this->getJsonConfig() ?>);
</script>
<div id="messages_product_view"><?php echo $this->getMessagesBlock()->getGroupedHtml() ?> </div>
<div class="product-view">
<div class="product-essential">
<form action="<?php echo $this->getSubmitUrl($_product) ?>" method="post" id="product_addtocart_form"<?php if($_product->getOptions()): ?> enctype="multipart/form-data"<?php endif; ?>>
<div class="no-display">
<input type="hidden" name="product" value="<?php echo $_product->getId() ?>" />
<input type="hidden" name="related_product" id="related-products-field" value="" />
</div>
<div class="product-shop">
<div class="product-name">
<h1><?php echo $_helper->productAttribute($_product, $_product->getName(), 'name') ?></h1>
</div>
<?php if ($this->canEmailToFriend()): ?>
<p class="email-friend"><?php echo $this->__('Email to a Friend') ?></p>
<?php endif; ?>
<?php echo $this->getReviewsSummaryHtml($_product, false, true)?>
<?php echo $this->getChildHtml('alert_urls') ?>
<?php echo $this->getChildHtml('product_type_data') ?>
<?php echo $this->getTierPriceHtml() ?>
<?php echo $this->getChildHtml('extrahint') ?>
<?php if (!$this->hasOptions()):?>
<div class="add-to-box">
<?php if($_product->isSaleable()): ?>
<?php echo $this->getChildHtml('addtocart') ?>
<?php if( $this->helper('wishlist')->isAllow() || $_compareUrl=$this->helper('catalog/product_compare')->getAddUrl($_product)): ?>
<span class="or"><?php echo $this->__('OR') ?></span>
<?php endif; ?>
<?php endif; ?>
<?php echo $this->getChildHtml('addto') ?>
</div>
<?php echo $this->getChildHtml('extra_buttons') ?>
<?php endif; ?>
<?php if ($_product->getShortDescription()):?>
<div class="short-description">
<h2><?php echo $this->__('Quick Overview') ?></h2>
<div class="std"><?php echo $_helper->productAttribute($_product, nl2br($_product->getShortDescription()), 'short_description') ?></div>
</div>
<?php endif;?>
<?php echo $this->getChildHtml('other');?>
<?php if ($_product->isSaleable() && $this->hasOptions()):?>
<?php echo $this->getChildChildHtml('container1', '', true, true) ?>
<?php endif;?>
</div>
<div class="product-img-box">
<?php echo $this->getChildHtml('media') ?>
</div>
<div class="clearer"></div>
<?php if ($_product->isSaleable() && $this->hasOptions()):?>
<?php echo $this->getChildChildHtml('container2', '', true, true) ?>
<?php endif;?>
</form>
<script type="text/javascript">
//<![CDATA[
var productAddToCartForm = new VarienForm('product_addtocart_form');
productAddToCartForm.submit = function(button, url) {
if (this.validator.validate()) {
var form = this.form;
var oldUrl = form.action;
if (url) {
form.action = url;
}
var e = null;
try {
this.form.submit();
} catch (e) {
}
this.form.action = oldUrl;
if (e) {
throw e;
}
if (button && button != 'undefined') {
button.disabled = true;
}
}
}.bind(productAddToCartForm);
productAddToCartForm.submitLight = function(button, url){
if(this.validator) {
var nv = Validation.methods;
delete Validation.methods['required-entry'];
delete Validation.methods['validate-one-required'];
delete Validation.methods['validate-one-required-by-name'];
if (this.validator.validate()) {
if (url) {
this.form.action = url;
}
this.form.submit();
}
Object.extend(Validation.methods, nv);
}
}.bind(productAddToCartForm);
//]]>
</script>
</div>
<div class="product-collateral">
<?php foreach ($this->getChildGroup('detailed_info', 'getChildHtml') as $alias => $html):?>
<div class="box-collateral <?php echo "box-{$alias}"?>">
<?php if ($title = $this->getChildData($alias, 'title')):?>
<h2><?php echo $this->escapeHtml($title); ?></h2>
<?php endif;?>
<?php echo $html; ?>
</div>
<?php endforeach;?>
<?php echo $this->getChildHtml('upsell_products') ?>
<?php echo $this->getChildHtml('product_additional_data') ?>
</div>
Something that may help you find what blocks are used on what page is by enabling "debug mode". You can enable it by going to your admin panel and goto system->configuration then in the left nav switch the "Current Configuration Scope" from "Default Config" to "your-stores-name Web Store".
The page will auto refresh then towards the bottom of the left nav in the ADVANCED section click Developer then in the Debug section of the accordion you will see "Template Path Hints" and "Add Block Names to Hints" switch each of these select fields to "yes" then click the Save Config button at the top right of the page.
Once debug mode is active you will all your blocks will be outlined in red and labeled with template locations and block name references. Hope this helps in the future.
The reason it's not working is because view.phtml is kinda like the parent block for the product view page, therefore when you disable it it only shows the sizing section, and when you enable it you get the wrong sizing section.
What you need to do is within view.phtml tell it about the new sizing template.
This is done by first creating a block, then assigning it a template, and then calling it in your view.phtml file
The easiest way to do this is find out what the first sizing block is called, then look in the xml for it and copy it and change it's name to something unique and the template to you new file.
Then you go in to your view.phtml file and call the block by name to be displayed.
In your case I think it's the following lines that need to be changed:
<?php if ($_product->isSaleable() && $this->hasOptions()):?>
<?php echo $this->getChildChildHtml('container2', '', true, true) ?>
<?php endif;?>
It should read:
<?php if ($_product->isSaleable() && $this->hasOptions()):?>
<?php echo $this->getChildHtml('your_new_block_name') ?>
<?php endif;?>
OK So I found the code including my size chart block
<?php echo $this->getChildHtml('product_type_data') ?>
When I comment it out I get the results i expect and my sizing charts disappear
In Catalog.xml I have found what I think the code is (theres a few catalog.xml files is there a way to be sure i have the right one?)
Anyway the code I found there is...
<PRODUCT_TYPE_simple translate="label" module="catalog">
<label>Catalog Product View (Simple)</label>
<reference name="product.info">
<block type="catalog/product_view_type_simple" name="product.info.simple"as="product_type_data" template="catalog/product/view/type/default.phtml">
<block type="core/text_list" name="product.info.simple.extra" as="product_type_data_extra" translate="label">
<label>Product Extra Info</label>
</block>
</block>
</reference>
</PRODUCT_TYPE_simple>
<PRODUCT_TYPE_configurable translate="label" module="catalog">
<label>Catalog Product View (Configurable)</label>
<reference name="product.info">
<block type="catalog/product_view_type_configurable" name="product.info.configurable" as="product_type_data" template="catalog/product/view/type/default.phtml">
<block type="core/text_list" name="product.info.configurable.extra" as="product_type_data_extra" translate="label">
<label>Product Extra Info</label>
</block>
</block>
</reference>
<reference name="product.info.options.wrapper">
<block type="catalog/product_view_type_configurable" name="product.info.options.configurable" as="options_configurable" before="-" template="catalog/product/view/type/options/configurable.phtml"/>
</reference>
</PRODUCT_TYPE_configurable>
To which I added
<PRODUCT_TYPE_simple translate="label" module="catalog">
<label>Catalog Product View (Simple)</label>
<reference name="product.info">
<block type="catalog/product_view_type_simple" name="product.info.simple" as="product_type_data1" template="catalog/product/view/type/default1.phtml">
<block type="core/text_list" name="product.info.simple.extra" as="product_type_data_extra" translate="label">
<label>Product Extra Info</label>
</block>
</block>
</reference>
</PRODUCT_TYPE_simple>
and
<PRODUCT_TYPE_configurable translate="label" module="catalog">
<label>Catalog Product View (Configurable)</label>
<reference name="product.info">
<block type="catalog/product_view_type_configurable" name="product.info.configurable" as="product_type_data1" template="catalog/product/view/type/default1.phtml">
<block type="core/text_list" name="product.info.configurable.extra" as="product_type_data_extra" translate="label">
<label>Product Extra Info</label>
</block>
</block>
</reference>
<reference name="product.info.options.wrapper">
<block type="catalog/product_view_type_configurable" name="product.info.options.configurable" as="options_configurable" before="-" template="catalog/product/view/type/options/configurable.phtml"/>
</reference>
</PRODUCT_TYPE_configurable>
Then I changed the calling php to look like...
<?php echo $this->getChildHtml('product_type_data1') ?>
But I have missed something in translation

Custom blocks not being rendered

I have developed a collections module for a clients Magento site. Among other things, this module pulls in product details (media, description, attributes) on the category listing page. The issue I am running into is that my blocks are not rendering on the clients site (Magento EE 1.8), even though everything works locally (Magento CE 1.6).
Developer mode has been activated, but I see no errors on the page, and I know that Magento is seeing the module as it correctly shows up in the admin under System > Configuration > Advanced.
We set the base block class name in app/code/local/Mycompany/Collections/etc/config.xml
<?xml version="1.0"?>
<config>
<modules>
<Mycompany_Collections>
<version>0.1.0</version>
</Mycompany_Collections>
</modules>
<global>
<blocks>
<mycompany_collections>
<class>Mycompany_Collections_Block</class>
</mycompany_collections>
</blocks>
</global>
</config>
We insert our blocks to the layout in app/design/frontend/enterprise/mytheme/layout/local.xml
<?xml version="1.0"?>
<layout version="0.1.0">
<catalog_category_view>
<reference name="product_list">
<block type="mycompany_collections/collection" name="collection" template="collections/collection.phtml">
<block type="mycompany_collections/product" name="add-to-cart" template="collections/product/add-to-cart.phtml" />
<block type="mycompany_collections/product" name="description" template="catalog/product/view/description.phtml" />
<block type="mycompany_collections/product_attributes" name="attributes" template="catalog/product/view/attributes.phtml" />
<block type="mycompany_collections/product_media" name="media" template="catalog/product/view/media.phtml" />
</block>
</reference>
</catalog_category_view>
</layout>
The mycompany_collections/collection block extends Mage_Catalog_Block_Product_List and reloads the products to ensure we have fetched all the relevant data from the database.
class Mycompany_Collections_Block_Collection extends Mage_Catalog_Block_Product_List {
public function reloadProducts() {
// Fully reload each of the products in this category so that we have
// all the information required to display product details.
// TODO: find a more efficient way to grab all the info for all the
// products, as this would seem to add 1 (or more) additional
// query per product.
$reloaded = array();
foreach($this->getParentBlock()->getLoadedProductCollection() as $product){
$reloaded[] = Mage::getModel('catalog/product')->load($product->getId());
}
return $reloaded;
}
}
The mycompany_collections/product block extends Mage_Catalog_Block_Product_Abstract with custom methods to allow us to explicitly set the product on the block and return that product without pulling from the registry.
class Mycompany_Collections_Block_Product extends Mage_Catalog_Block_Product_Abstract {
private $_product = null;
public function _prepareLayout() {
// We don't need to do anything here.
}
// NOTE: Must be called before ->toHtml()
public function setProduct($product) {
$this->_product = $product;
return $this;
}
public function getProduct() {
return $this->_product;
}
}
Both the mycompany_collections/product_attributes and mycompany_collections/product_media blocks do the same get/set_product overrides for their equivalent abstract parent classes.
Inside our collection.phtml template, we call $this->reloadProducts() and iterate over the product list to display the product details and buy collection popups (these are js lightboxes that activate on click)
<?php
$_productCollection = $this->reloadProducts();
?>
<!-- Buy collection popup -->
<div id="buy-collection" class="no-display">
<h1>Buy Collection</h1>
<?php foreach($_productCollection as $_product): ?>
<div id="buy-collection-product-<?php echo $_product->getId(); ?>" class="product">
<div class="media"><?php echo $this->getChild('media')->setProduct($_product)->toHtml(); ?></div>
<?php /*
<img src="<?php echo $this->helper('catalog/image')->init($_product, 'small_image')->resize(100); ?>" width="100" height="100" alt="<?php echo $this->stripTags($this->getImageLabel($_product, 'small_image'), null, true) ?>" />
*/ ?>
<a href="<?php echo $_product->getProductUrl() ?>" ><?php echo $_product->getName(); ?></a>
<?php if($_product->isSaleable()): ?>
<div class="add-to-cart"><?php echo $this->getChild('add-to-cart')->setProduct($_product)->toHtml(); ?></div>
<?php else: ?>
<div class="out-of-stock"><?php echo $this->__('Out of stock') ?></div>
<?php endif; ?>
<div class="details">
<div class="description">
<?php echo $this->getChild('description')->setProduct($_product)->toHtml(); ?>
</div>
<div class="attributes">
<?php echo $this->getChild('attributes')->setProduct($_product)->toHtml(); ?>
</div>
</div>
</div>
<?php endforeach; ?>
</div>
<!-- Product detail popups -->
<div id="product-details" class="no-display">
<?php foreach ($_productCollection as $_product): ?>
<div id="product-detail-<?php echo $_product->getId(); ?>" class="product">
<div class="media"><?php echo $this->getChild('media')->setProduct($_product)->toHtml(); ?></div>
<div class="description"><?php echo $this->getChild('description')->setProduct($_product)->toHtml(); ?></div>
<div class="attributes"><?php echo $this->getChild('attributes')->setProduct($_product)->toHtml(); ?></div>
</div>
<?php endforeach; ?>
</div>
To actually fire all this off, for any product category that we wish to display as collection we override the category.listing and product_list templates in the Custom Design tab of that category in the admin. These templates contain design changes, and product/list.phtml calls the collection block.
<reference name="product_list">
<action method="setTemplate">
<template>catalog/collections/product/list.phtml</template>
</action>
</reference>
<reference name="category.products">
<action method="setTemplate">
<template>catalog/collections/category/view.phtml</template>
</action>
</reference>
Inside product/list.phtml we call the collection block with a simple echo $this->getChildHtml('collection');. Nothing is returned on this line. No template, no PHP errors, nothing. As mentioned above, this all works beautifully in my local dev environment.
That's the overview of how things are setup. Here's what I have done to debug:
Using Alan Storm's Layoutviewer module, I have confirmed that my blocks are listed on ?showLayout=page, and the handle "catalog_category_view" is listed in ?showLayout=handles. However, when I print $this->getSortedChildren() in product/list.phtml the collection block is not listed.
If I replace the collection block in layout.xml with a super simple core/text block, it does render.
<?xml version="1.0"?>
<layout version="0.1.0">
<catalog_category_view>
<reference name="product_list">
<block type="core/text" name="collection"><action method="setText"><text>This is a test</text></action></block>
</reference>
</catalog_category_view>
</layout>
This led me to believe the problem was deeper in my own code, so I simplified and went totally basic… I removed the reloadProducts method from Mycompany_Collections_Block_Collection and reduced collections.phtml to a single line of text to see if something in the template or child blocks were causing an issue. Unfortunately this had no affect and I still got no output.
I'm really at a loss as to why this is not working. I first thought it may be a difference between the Enterprise and Community editions, but something as fundamental as the layout/block system is unlikely to differ between them. There clearly seems to be something missing, and I'm hoping someone may be able to point in the right direction.
Thanks!
Did you check Mycompany_Collections.xml available in /app/etc/modules section and codepool enabled?
<?xml version="1.0"?>
<config>
<modules>
<Mycompany_Collections>
<active>true</active>
<codePool>local</codePool>
</Mycompany_Collections>
</modules>
</config>

how to show latest,top rated and best products in left bar in magento

i'm using Magento ver. 1.5.0.1. In homepage i used 2 columns with left bar. i want to show latest,top rated and best products one below the other. please help me how to do this. i'm new to magento please help me....
In your app/design/frontend/{your-interface}/{your-theme}/template/catalog/navigation/left.phtml add the following code for latest products:
<?php
$_productCollection = Mage::getResourceModel('reports/product_collection')
->addAttributeToSelect('*')
->setVisibility(array(2,3,4))
->setOrder('created_at', 'desc')
->setPage(1, 5);
?>
<h2>Latest Products</h2>
<ul>
<?php foreach($_productCollection as $_product) : ?>
<li><?php echo $_product->getName(); ?></li>
<?php endforeach; ?>
</ul>
The top rated products are a bit more complicated. Use the following code:
<?php
$_productCollection = Mage::getResourceModel('reports/product_collection')
->addAttributeToSelect('*')
->setVisibility(array(2,3,4));
$_productCollection->joinField('rating_summary', 'review/review_aggregate', 'rating_summary', 'entity_pk_value=entity_id', array('entity_type' => 1, 'store_id' => Mage::app()->getStore()->getId()), 'left');
$_productCollection->setOrder('rating_summary', 'desc');
$_productCollection->setPage(1, 5);
?>
<h2>Latest Products</h2>
<ul>
<?php foreach($_productCollection as $_product) : ?>
<li><?php echo $_product->getName(); ?></li>
<?php endforeach; ?>
</ul>
Not sure what you meant by the best products but if bestsellers, here is the code for that:
<?php
$_productCollection = Mage::getResourceModel('reports/product_collection')
->addAttributeToSelect('*')
->setVisibility(array(2,3,4));
$select = $_productCollection->getSelect();
$sqlSelectColumns = $select->getPart('columns');
$sqlSelectColumns[] = array(
'',
new Zend_Db_Expr('(
SELECT SUM(order_item.qty_invoiced - order_item.qty_refunded)
FROM ' . Mage::getSingleton('core/resource')->getTableName('sales/order_item') . ' AS order_item
WHERE order_item.product_id = e.entity_id)
'),
'ordered_qty'
);
$select->setPart('columns', $sqlSelectColumns);
$_productCollection->setOrder('ordered_qty', 'desc');
$_productCollection->setPage(1, 5);
?>
<h2>Top Selling Products</h2>
<ul>
<?php foreach($_productCollection as $_product) : ?>
<li><?php echo $_product->getName(); ?></li>
<?php endforeach; ?>
</ul>
This extesnsion is very helpfull for your requirement. You can install this extension from url :
http://www.magentocommerce.com/magento-connect/mageoutsourcing/extension/6669/bnm
After installation in your magento, a little chage into xml which helps to display best selling product in the left side of other.
You should change layout xml from :
<?xml version="1.0"?>
<layout version="0.1.0">
<default>
<reference name="right">
<block type="bnm/bestsellingproduct" name="bestsellingproduct.sidebar" after="cart_sidebar" template="bnm/bestselling-sidebar.phtml"/>
</reference>
</default>
</layout>
To :
<?xml version="1.0"?>
<layout version="0.1.0">
<default>
<reference name="left">
<block type="bnm/bestsellingproduct" name="bestsellingproduct.sidebar" after="-" template="bnm/bestselling-sidebar.phtml"/>
</reference>
</default>
</layout>
NOTE : before (and) after – These are two ways to position a content block within a structural block. before="-" and after="-" are commands used to position the block accordingly at the very top or very bottom of a structural block.

Resources