2012-03-23 18 views
10

मैं अपने कस्टम ब्लॉक के लिए मेरी local.xml फ़ाइल में एक चर सेट करने के लिए कोशिश कर रहा हूँ का उपयोग कर नियंत्रक ब्लॉक करने के लिए:पासिंग डेटा 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> 

लेकिन मैं डेटा में दूसरे छोर पर नहीं मिल रहा है मेरी नियंत्रक:

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! 
    } 
} 

मेरे सभी खोज से मैं पाया है कि यह वास्तव में काम करना चाहिए, लेकिन जब से यह नहीं है, मुझे लगता है मैं कुछ स्पष्ट याद कर रहा हूँ है।

<?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> 

उत्तर

28

लेआउट कोड प्रतिपादन इस

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

यह सामना करना पड़ता है जब तुरंत ब्लॉक को दर्शाता है। इसका मतलब है कि ब्लॉक की __construct विधि से पहले setData विधि कहा जाता है। इसलिए, निर्माण के समय, कोई डेटा सेट नहीं किया गया है, यही कारण है कि var_dump पर आपकी कॉल एक खाली सरणी लौटाती है।

इसके अलावा, के तुरंत बाद बनाया जा रहा, ब्लॉक लेआउट

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

जब ऐसा होता है में जोड़ा जाता है, ब्लॉक के _prepareLayout विधि कहा जाता है।

#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; 
} 

तो, इसका मतलब है कि किसी भी डेटा अपने लेआउट अद्यतन एक्सएमएल में सेट अभी भी उपलब्ध नहीं है, _prepareLayout में भी है। एक बार सिस्टम को ब्लॉक बनाने के बाद, यह अगले एक्सएमएल नोड पर चला जाता है।

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

और setData विधि पर कॉल करें। अब आपके ब्लॉक में इसका डेटा सेट है।

अपने ब्लॉक पर _beforeToHtml विधि को परिभाषित करने और वहां डेटा की जांच करने का प्रयास करें।

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

प्राप्त लेआउट से ब्लॉक में चर का मान:: एक लेआउट से एक ब्लॉक करने के लिए (अपने ब्लॉक मान लिया जाये कि प्रदान की गई है जा रहा है)

+0

वाह, शानदार जवाब। '_beforeToHtml' को परिभाषित करना चाल था और मेरे उपयोग मामले के लिए पूरी तरह से काम करेगा। –

+0

एलन, इस उत्तर को पोस्ट करने के बाद से आपको कोई अन्य Mage_Core_Block_Abstract या Mage_Core_Block_Template विधि मिली है जो ओवरराइडिंग में उपयोगी हो सकती है, अगर हम '' XML लेआउट निर्देशों द्वारा डेटा सेट का उपयोग करना चाहते हैं? मैं सेट किए गए डेटा के आधार पर ब्लॉक पर कुछ कैश सेटिंग्स सेट करना चाहता हूं, हालांकि इसके लिए ओवरराइड करने के लिए कोई अच्छी विधि प्रतीत नहीं होती है। '_beforeToHtml() 'विधि से पहले' अंतिम सार्वजनिक एचटीएमएल() 'विधि कैश से लोड करने का प्रयास करेगी, और इसलिए मैं जिस उद्देश्य के लिए खोज रहा हूं उसके लिए काम नहीं करेगी। – Meogi

3

मुझे लगता है कि ब्लॉक की परिभाषा गलत है: यहाँ मेरी लेआउट मॉड्यूल के विन्यास (मैं एक होमपेज और किसी भी अन्य ब्लॉकों मैं साइट के लिए की जरूरत है परिभाषित करने के लिए एक एकल मॉड्यूल का उपयोग कर रहा है)। आप

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

कोशिश कर सकते हैं और phtml में $ this-> getAttribute() के साथ मान प्राप्त

आप अगले उदाहरण देख सकते हैं:

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; 
} 

}

और में बैकएंड में परिभाषा मैंने अपने घर में रखी सीएमएस

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

एक और उदाहरण है कि मैं एक विस्तार में मिल:

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

धन्यवाद त्वरित प्रतिक्रिया के लिए है, लेकिन मुझे अभी भी कोई डेटा नहीं मिल रहा है। मैंने '' और मेरे नियंत्रक में, मैंने दोनों '$ this-> getFilterAttribute() 'और' $ this-> getData (' filter_attribute ' ') '। –

+1

लेकिन आप $-- getData ('filter_attribute') टेम्पलेट के बाद से कोशिश करें। Phtml ??? – davidselo

+0

हां, यह टेम्पलेट .phtml में है। मुझे लगता है कि जब आप लेआउट में 'setData' सेट करेंगे तो क्या होगा। लेआउट xml से ब्लॉक नियंत्रक को डेटा पास करने का कोई तरीका है? –

0

पास चर

$variableName = $this->getVariablename(); 
$variableName = $this->getData('variablename'); 
संबंधित मुद्दे