2012-07-21 12 views
16

में बाहरी चर का उपयोग करें मेरे पास मेरे शिक्षक मॉडल में एक फ़ंक्शन है जो श्रेणियों की सरणी देता है।वाईआई ग्रिडव्यू मूल्य

getCaterogies() { 
    return array('1' => 'short tempered', '2' => 'funny', '3' => 'visionary', ...); 
} 

मैं डेटाबेस में अनुक्रमणिका भंडारण कर रहा हूँ और हर जगह सरणी कि करने के लिए इसी के मूल्य का उपयोग कर मूल्यों को प्रदर्शित ..

$categories = $teacher->categories; 
$category = $categories[$teacher->category]; 

मैं क्योंकि एक बार किसी ने मुझसे में तार स्टोर करने के लिए नहीं करने का सुझाव दिया यह कर रहा हूं एक डेटाबेस जो स्थितियां हैं, इसके बजाय पूर्णांक मान स्टोर करें, और या तो डेटाबेस में रूपांतरण संग्रहीत करें या इसे एचटी मॉडल में परिभाषित करें। तारों के साथ समस्या यह है कि वे तुलना में मानव त्रुटियों से अधिक प्रवण हैं। शायद संवेदनशीलता के कारण।

अब मुझे जिस समस्या का सामना करना पड़ रहा है वह यह है कि ग्रिडव्यू में मान प्रदर्शित करते समय, मुझे एक मूल्य फ़ील्ड में 2 लाइनें लिखनी होंगी, लेकिन यह एक अभिव्यक्ति है, और बाहरी चर भी यह नहीं लेता है।

मैं इसे ग्रिडव्यू के लिए कैसे काम कर सकता हूं?

उत्तर

45

आप मूल्य के रूप में अज्ञात फ़ंक्शन जो $row, $data पैरामीटर ले जा सकते हैं का उपयोग कर सकते हैं जहां $row रखती है पंक्ति संख्या (शून्य-आधारित) और $data में पंक्ति के लिए डेटा मॉडल शामिल है।

इस तरह आप इसे केवल अंदर ही परिभाषित कर सकते हैं।

$this->widget('zii.widgets.grid.CGridView', array(
    'dataProvider'=>$dataProvider, 
    'columns'=>array(
     array(
      'name'=>'..', 
      'value'=>function($data,$row){ 
       $categories = $teacher->categories; 
       return $categories[$data->category]; 
      }, 
     ), 
    ), 
)); 

और तुम बाहर से इसका उपयोग करना चाहते हैं, तो आप पर भरोसा कर सकते PHP के use:

$categories = $teacher->categories; 
$this->widget('zii.widgets.grid.CGridView', array(
    'dataProvider'=>$dataProvider, 
    'columns'=>array(
     array(
      'name'=>'..', 
      'value'=>function($data,$row) use ($categories){ 
       return $categories[$data->category]; 
      }, 
     ), 
    ), 
)); 

मैं व्यक्तिगत रूप से एक दूसरे की सिफारिश करेंगे, क्योंकि इस तरह सरणी की गणना केवल एक बार किया जाएगा और सभी मामलों में इस्तेमाल किया जाएगा।

+4

एक आकर्षण की तरह काम करता है .. दोनों समाधान .. थंक्यौ ..:) –

+0

युक्ति: यदि आवश्यकता हो - तो आप कहा गया रिकॉर्ड के लिए अलग-अलग ग्रिडव्यू कॉलम में प्रिंट करने के लिए कई मान वापस करने के लिए, एक मॉडल फ़ंक्शन (प्रत्येक रिकॉर्ड के लिए) को कॉल करना चाह सकते हैं। प्रत्येक कॉलम में फ़ंक्शन को कॉल करने के बजाय, आप इसे पहले कॉलम से कॉल कर सकते हैं और परिणाम के साथ $ श्रेणियां अपडेट कर सकते हैं। अन्य कॉलम इस प्रकार सिर्फ $ श्रेणियों से पढ़ सकते हैं। ऐसा करने के लिए, संदर्भ के आधार पर पैरामीटर का उपयोग करें (पैरामीटर के सामने बस एक एम्पर्सेंड (&) जोड़ें - फ़ंक्शन के अंदर भी नहीं)। 'मान' => फ़ंक्शन ($ डेटा, $ पंक्ति) उपयोग (& $ श्रेणियां) { $ श्रेणियां = ... }, –

2

आप एक पंक्ति में

$categories = $teacher->categories; 
$category = $categories[$teacher->category]; 

लिख सकते हैं:

$category = $teacher->categories[$teacher->category];  

इसके अलावा, मैं सुझाव है कि आप एक और समाधान का उपयोग करें:

class ModelClass 
{ 
    const STATUS_SHORT_TEMPERED = 1; 
    const STATUS_FUNNY = 2; 
    const STATUS_VISIONARY = 3; 
} 

यह आपको एक अधिक अर्थ उपयोग करने की अनुमति

ModelClass::STATUS_FUNNY; 
कम अर्थ

2; 

इसके अलावा के बजाय

, तो आप इस तरीके से अपने सरणी रचना कर सकते हैं:

getCaterogies() { 
    return array(
     ModelClass::STATUS_FUNNY => 'status funny', 
     ... 
    ); 
} 
+0

आपके कॉन्स सुझाव के लिए बहुत बहुत धन्यवाद .. –

+0

क्या आप निश्चित रूप से '$ श्रेणी = $ शिक्षक-> श्रेणियां [$ शिक्षक-> श्रेणी] हैं; 'विर्क होगा, क्योंकि यह मॉडल में गतिशील गेटर है और गेटर मुझे सरणी वापस कर रहा है .. –

+2

आपके समय और सुझावों के लिए धन्यवाद, लेकिन जो मैं खोज रहा हूं उसे दूसरे व्यक्ति द्वारा ठीक से उत्तर दिया गया है, और मुझे कई अन्य मामलों में उन समाधानों की आवश्यकता हो सकती है .. इस मामले में आपका समाधान परिपूर्ण काम करता है, लेकिन लैटर मुझे इस तरह के 'उपयोग' सामान की आवश्यकता हो सकती है .. स्टैकओवरफ्लो मुझे ऊपर उठाने की इजाजत नहीं देता .. :( –