1

I'm trying to add a static block to a page with an observer. The event that I'm listening to is controller_action_layout_generate_blocks_after and this is my observer code:

<?php
...
class Antonino_Banner_Model_Observer
{
 public function showBannerWhenLoad(Varien_Event_Observer $observer) 
 {
 $layout = Mage::app()->getLayout();
 $pageId = Mage::app()->getRequest()->getParam('id');
 $selectedCatId = Mage::getStoreConfig('antoninobanner/general/choose_category');
 if ($pageId==$selectedCatId){
 Mage::log('Bingo! PageId= '. $pageId.' SelectedId= '.$selectedCatId);
 $messageBlock = $layout->createBlock('cms/block')->setBlockId('antonino_banner');
 $breadcrumbs = $layout->getBlock('breadcrumbs');
 $breadcrumbs->append($messageBlock);
 }/*else{
 Mage::log('Oh no! The ids do not match');
 }*/
 }
}

The event is regularly triggered and in the system.log I can read the "Bingo!..." string. But on the page, the 'antonino_banner' block is not added. Naturally, I've created a static block in admin->static blocks.

Any help will be appreciated, thanks.

Ner
1,09113 silver badges28 bronze badges
asked Nov 17, 2017 at 13:13
2
  • Make sure breadcrumbs block is there on the page as you are appending your block to it Commented Nov 17, 2017 at 13:23
  • Thank you for your answer. Yes, the breadcrumbs block is on the page because if I write var_dump(Mage::app()->getLayout()), when I reload the page, in the protected '_blocks' array there is the following element 'breadcrumbs' => object(Mage_Page_Block_Html_Breadcrumbs)[199] Commented Nov 17, 2017 at 13:33

2 Answers 2

0

Ok, I think could handle this, but I'm not very satisfied by the result. I'm listening to

core_block_abstract_to_html_after

And my Observer code is:

<?php 
class Antonino_Banner_Model_Observer
{
 public function showBannerWhenLoad(Varien_Event_Observer $observer) {
 $pageId = Mage::app()->getRequest()->getParam('id');
 $selectedCatId = Mage::getStoreConfig('antoninobanner/general/choose_category');
 if ($pageId==$selectedCatId){
 $block = $observer->getBlock();
 if($block->getNameInLayout() == 'breadcrumbs')
 {
 $transport = $observer->getTransport();
 $html = $transport->getHtml();
 $html .= '<h1>We need to append something here</h1>';
 $transport->setHtml($html);
 }
 }/*else{
 Mage::log('Oh no! The ids do not match');
 }*/
 }
}

I don't like this solution very much because this means I must write some raw HTML code directly in this page...

answered Nov 17, 2017 at 17:05
0

I think that your are not using a good event, it's a little late and the layout is already rendered, try to use these :

  • controller_action_layout_load_before
  • controller_action_layout_generate_blocks_before

Edit:

Try this one: core_block_abstract_prepare_layout_before

Reference

answered Nov 17, 2017 at 16:10
3
  • Thank you for your answer. Unfortunatly both the events that you suggested appen too soon: the blocks are not still loaded. In fact I get this error: Call to a member function append() on boolean . I think this means that magento still doesn't know the name of the blocks. Commented Nov 17, 2017 at 16:54
  • Or, he don't find a breadcrumbs block, please try the footer $layout->getBlock('footer'), try also this event core_block_abstract_prepare_layout_before Commented Nov 17, 2017 at 17:07
  • With those changes I've got the following error: Fatal error: Maximum function nesting level of '256' reached, aborting! Commented Nov 17, 2017 at 17:35

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.