2012-03-23 5 views
10

zu blockieren Ich versuche, eine Variable in meiner local.xml Datei für meinen benutzerdefinierten Block zu setzen:Passing Daten von Layout-Controller mit setData

<layout> 
    <!-- ... --> 
    <page_homepage> 
     <!-- ... --> 
     <reference name="root">  
      <!-- ... --> 
      <block type="core/template" name="home_page_sections" template="page/homepage/sections.phtml"> 
       <block type="layout/carousel" name="featured_carousel"> 
        <action method="setData"> 
         <name>filter_attribute</name> 
         <value>is_featured_product</value> 
        </action> 
       </block> 
      </block> 
     </reference> 
    </page_homepage> 
</layout> 

Aber ich bin nicht die Daten am anderen Ende immer in mein Controller:

class Foo_Layout_Block_Carousel extends Mage_Core_Block_Template 
{ 
    public function __construct() 
    { 
     parent::__construct(); 

     $filterAttribute = $this->getFilterAttribute(); // Nothing 
     $filterAttribute = $this->getData('filter_attribute'); // Nada 

     // Alright, fine, what DO I have?! 
     var_dump($this->getData()); // array(0) {} ... Argh! 
    } 
} 

aus aller meiner Suche habe ich festgestellt, dass dies wirklich funktionieren sollte, aber da es nicht tut habe ich ein Gefühl, das ich offensichtlich etwas fehlt bin. Hier ist mein Layout-Modul der Konfiguration (Ich bin ein einzelnes Modul mit einer Homepage zu definieren und alle anderen Blöcke I für die Website benötigen):

<?xml version="1.0"?> 
<config> 
    <modules> 
     <Foo_Layout> 
      <version>0.1.0</version> 
     </Foo_Layout> 
    </modules> 
    <global> 
     <page> 
      <layouts> 
       <foo_homepage translate="label"> 
        <label>Homepage</label> 
        <template>page/homepage.phtml</template> 
        <layout_handle>page_homepage</layout_handle> 
       </foo_homepage> 
      </layouts> 
     </page> 
     <blocks> 
      <layout> 
       <class>Foo_Layout_Block</class> 
      </layout> 
     </blocks> 
    </global> 
</config> 

Antwort

28

Wenn die Layout-Code macht diesen sofort instanziiert Es

<block type="layout/carousel" name="featured_carousel"> 

trifft den Block. Das bedeutet, dass die __construct Methode des Blocks heißt, bevor Ihre setData Methode aufgerufen wird. Zum Zeitpunkt der Erstellung wurden keine Daten festgelegt. Deshalb geben Ihre Aufrufe an var_dump ein leeres Array zurück.

Auch unmittelbar nach seiner Erstellung wird der Block an das Layout

#File: app/code/core/Mage/Core/Model/Layout.php 
... 
$block->setLayout($this); 
... 

hinzugefügt wird, wenn dies geschieht, die _prepareLayout Methode der Block aufgerufen wird.

#File: app/code/core/Mage/Core/Block/Abstract.php 
public function setLayout(Mage_Core_Model_Layout $layout) 
{ 
    $this->_layout = $layout; 
    Mage::dispatchEvent('core_block_abstract_prepare_layout_before', array('block' => $this)); 
    $this->_prepareLayout(); 
    Mage::dispatchEvent('core_block_abstract_prepare_layout_after', array('block' => $this)); 
    return $this; 
} 

Also, bedeutet dies, daß in Ihrem Layout-Update xml Datensatz ist noch nicht zur Verfügung, auch in _prepareLayout. Sobald das System den Block erstellt hat, fährt es mit dem nächsten XML-Knoten fort.

<action method="setData"> 
    <name>filter_attribute</name> 
    <value>is_featured_product</value> 
</action> 

und ruft die Methode setData auf. Jetzt hat dein Block seine Datenmenge.

Versuchen Sie, eine _beforeToHtml Methode auf Ihrem Block zu definieren und dort auf Daten zu prüfen.(Vorausgesetzt, Ihr Block gerendert wird)

+0

Wow, fantastische Antwort. Die Definition eines '_beforeToHtml' hat den Zweck erfüllt und wird für meinen Anwendungsfall perfekt funktionieren. –

+0

Alan, seit dem Verfassen dieser Antwort haben Sie eine andere Methode Mage_Core_Block_Abstract oder Mage_Core_Block_Template gefunden, die beim Überschreiben nützlich sein könnte, wenn wir Daten verwenden wollen, die mit '' XML Layout-Anweisungen erstellt wurden? Ich möchte einige Cache-Einstellungen auf dem Block basierend auf den Daten setzen, die ich eingestellt habe, aber es scheint keine guten Methoden zu geben, um dies zu überschreiben. Die 'final public toHtml()' Methode wird versuchen, aus dem Cache vor der '_beforeToHtml() 'Methode zu laden, und wird daher nicht für den Zweck funktionieren, nach dem ich suche. – Meogi

3

ich denke, dass die Definition des Blockes falsch ist. Können Sie versuchen

<block type="layout/carousel"name="featured_carousel" attribute=value> 

und im phtml den Wert mit $ this-> getAttribute() abrufen

Sie können das nächste Beispiel sehen:

class Elblogdeselo_Blocksparams_Block_Test extends Mage_Core_Block_Abstract{  
protected function _toHtml(){ 

    //$nombre=$this->getNombre(); 
    $nombre=$this->getData('nombre'); 
    $html=$html." ".$this->getData('nuevo_parametro'); 
    return $html; 
} 

}

Und in die definition im backend stelle ich in mein zuhause ein CMS

{{block type="blocksparams/test" name="bloque_con_parametros" nuevo_parametro="nuevo" nombre="david" template="blocksparams/test.phtml"}} 

ein weiteres Beispiel, das ich in einer Erweiterung finden:

protected function _construct(){ 
    parent::_construct(); 
    $this->setData('customer', Mage::getSingleton('customer/session')->getCustomer()); 
    $this->addData(Mage::getModel('model/model'));  
} 
+0

Danke für die schnelle Antwort, aber Ich bekomme immer noch keine Daten. Ich habe versucht '' und in meinem Controller habe ich sowohl $ this-> getFilterAttribute() 'und' $ this-> getData ('filter_attribute ")". –

+1

aber Sie versuchen $ this-> getData ('filter_attribute') seit der Vorlage .phtml ??? – davidselo

+0

Ja, es ist dort in der Vorlage .phtml. Ich vermute, ich habe missverstanden, was passieren würde, wenn Sie 'SetData' im Layout setzen. Gibt es eine Möglichkeit, Daten vom Layout-XML an den Block-Controller zu übergeben? –

0

Pass Variablen aus einem Layout zu einem Block:

<action method="setData"> 
    <name>variablename</name> 
    <value>10</value> 
</action> 

Get Wert der Variablen in Block vom Layout:

$variableName = $this->getVariablename(); 
$variableName = $this->getData('variablename'); 
Verwandte Themen