XML – How to Remove Blocks from Footer on CMS Page

blocksfooterxml

In my magento store I have the recently viewed products block and newsletter signup block inside my footer as shown with the below code all working ok:

footer.phtml

<?php echo $this->getLayout()->createBlock('reports/product_viewed')->setTemplate('reports/product_viewed.phtml')->toHtml(); ?>

<?php echo $this->getChildHtml('footer.newsletter') ?>

On one of my CMS pages i want to hide these 2 blocks. In the design admin tab for my CMS page i have already hidden the breadcrumbs with the below in the Custom Layout Update XML section, again working fine:

<reference name="root">
    <remove name="breadcrumbs" />
</reference>

I cannot seem to come up with the correct code to remove these blocks. I have tried several lines of code for each block:

<reference name="footer">
    <remove name="reports.product.viewed" />
</reference>

<reference name="root">
    <remove name="footer.reports.product.viewed" />
</reference>

<reference name="footer">
    <action method="unsetChild"><alias>reports.product.viewed</alias></action>
</reference>

Best Answer

I would love to share my thoughts on your code. So this is the code that you have tried in your footer.phtml

<?php echo $this->getLayout()->createBlock('reports/product_viewed')->setTemplate('reports/product_viewed.phtml')->toHtml(); ?>

<?php echo $this->getChildHtml('footer.newsletter') ?>

Your first code cretes a new block and render its content. Code is correct and you got output. However your block is not set with a name. Hence you cannot refer your block in layout update files. In layout update XML files every block is referencing by its name. So the first step is to set a name for your block.

Footer section is normally cached. So some times even if we unset some blocks from that part, it won't see get affected in frontend. Avoiding this issue is somewhat a long step. However in getChildHtml() method, you can specify whether the block need to use cache to render it. For this you need to pass false value as its second parameter. So in effect the code inside footer.phtml should look like this.

<?php echo $this->getLayout()->createBlock('reports/product_viewed', 'footer_product_viewed')->setTemplate('reports/product_viewed.phtml')->toHtml(); ?>

<?php echo $this->getChildHtml('footer.newsletter', false) ?>

See I have specifed name for reports/prodcut_viewed block by passing a second parameter in createBlock() and also specified false as second parameter in getChildHtml() method.

Now your layout XML file should look like this.

<cms_page>
    <reference name="footer">
        <remove name="footer_product_viewed" />
        <remove name="name_of_footer_news_letter_block" />
    </reference>
</cms_page>

This will remove these two blocks from every cms pages. Hope that gives you some idea