Search code examples
xmlmagentolayerobservers

Updating the Layout from the Observer


I am workin on a slider block Magento, and I am trying to genreate and update my Layout from the Observer :

Event: controller_action_layout_load_before

This my Observer Method :

        $myXml="<".$page.">";
    $myXml.='<reference name="'.$posH.'">';
    $myXml.='<block type="sliderboard/slider" name="sliderboard" '.$posV.'="-" template="sliderboard/myview.phtml"/>';
    $myXml.='</reference>';
    $myXml.="</".$page.">";

    $layout = $observer->getEvent()->getLayout();
    //$layout=Mage::getSingleton('core/layout');
    //Zend_Debug::dump($myXml); die();          
    $layout->getUpdate()->addUpdate($myXml);
    $layout->getUpdate()->load();
    $layout->generateXml();
    $layout->generateBlocks();

the fact is, this is what i get from the "$myXML" variable :

<cms_page>
<reference name="content">
<block type="sliderboard/slider" name="sliderboard" after="-" template="sliderboard/myview.phtml"/>
</reference>
</cms_page>

And It doesn't work !! but whene I have tried to copy/past this xml in my layout it works ! the Xml code is correct! I Need Help
Thanks !


Solution

  • $layout->getUpdate()->addUpdate($myXml);
    

    addUpdate() don't work with "Actions" so we can only put this part of the layout :

    <reference name="content">
    <block type="myblock/block" name="sliderboard" after="-" template="mytemp/tmplate.phtml"/>
    </reference>
    

    And to choose between (cms, category and product) we use :

    $action = $observer->getEvent()->getAction();
    $fullActionName = $action->getFullActionName();
    

    We compare $fullActionName to : cms_index_index / catalog_category_view /catalog_product_view

    And if it equal tu what we need we contunu to :

    $page="cms_index_index";    
    switch ($slider->getSldPage()){
    
        case 'product':  $page="catalog_product_view";  
            break;
        case 'category': $page="catalog_category_view";         
            break;
    }
    
    $myXml.='<reference name="'.$posH.'">';
    $myXml.='<block type="sliderboard/slider" name="sliderboard" '.$posV.'="-" template="sliderboard/myview.phtml"/>';
    $myXml.='</reference>';
    
    $action = $observer->getEvent()->getAction();
    $fullActionName = $action->getFullActionName();
    $layout = $observer->getEvent()->getLayout();
    
    if ($fullActionName==$page)
    {
        $layout->getUpdate()->addUpdate($myXml);
        $layout->generateXml();         
    }
    

    Hope this will help:)

    Now I'm trying to choose what category and what product I'll display in, if you have an idea.