2012-10-10 25 views
9

में प्रदर्शन स्ट्रिंग के रूप में कॉलम और शो कम्बाइन कर सकते हैं मैं मेरे विचार में एक dropDownList है, यह clients मेज से पॉप्युलेट है, टेबल की तरह स्तंभ हैं first_name, last_name, id आदि, अब मैं चाहता हूँ सूची ड्रॉप डाउन में first_name और last_name प्रदर्शन पाठ के रूप में और मूल्य के रूप में id दिखाने के लिए, मैं id मूल्य के रूप में और first_name प्रदर्शन पाठ के रूप में पूरा कर लेने, लेकिन यहाँ मैं उन स्तंभों (first_name और last_name) गठबंधन और प्रदर्शन पाठ के रूप में उपयोग करना चाहते हैं।Yii ढांचे में कैसे मैं dropdownlist

मॉडल

function getClients() 
{ 
    $Clients = Client::model()->findAll(); 
    $list = CHtml::listData($Clients , 'client_id', 'first_name'); 
    return $list; 
} 

ध्यान में रखते हुए में

echo $form->dropDownList($model,'client_id',$model->getClients()); 

उत्तर

20

यहाँ एक और तरीका मॉडल में

function getFullName() 
{ 
    return $this->first_name.' '.$this->last_name; 
} 

और

function getClients() 
{ 
    $Clients = Client::model()->findAll(); 
    $list = CHtml::listData($Clients , 'client_id', 'fullName'); 
    return $list; 
} 

मुझे लगता है कि इस थोड़े पुन: प्रयोज्य विधि के बाद से आप उपयोग कर सकते है fullName आभासी attrib न केवल ड्रॉपडाउन सूची में बल्कि हर जगह एक पूर्ण नाम की आवश्यकता है।

+1

@ कन्नन, यह भी अच्छा है :) मुझे लगता है कि अधिक प्रभावशाली रूप से। मैंने 2 साल पहले अपना ExtHtml लिखा था। – Sergey

+0

हाँ यह इतना तेज़ और सरल है, और अब सबसे अच्छा जवाब चुनने के लिए उलझन में है .. :) किसी भी प्रयोग के बाद धन्यवाद @ dInGd0nG – nu6A

+0

कुछ प्रयोगों को एहसास हुआ कि यह विधि मेरे बदले हुए परिदृश्य के लिए उपयुक्त है। और सामान्य रूप से यह उपयुक्त है .. इसलिए मैं इसे स्वीकार कर रहा हूं। – nu6A

7

1 संस्करण (आसान):

$list = array(); 
foreach ($Clients as $c) { 
    $list[$c->id] = $c->first_name . ' ' . $c->last_name; 
} 

2 संस्करण (यूनिवर्सल):

class ExtHtml extends CHtml { 
    public static function listData($models,$valueField,$textField,$groupField='') 
    { 
     $listData=array(); 
     if($groupField==='') 
     { 
      foreach($models as $model) 
      { 
       $value=self::value($model,$valueField); 
       if (is_array($textField)) { 
        $t = array(); 
        foreach ($textField as $field) { 
         $t[]=self::value($model,$field,$field); 
        } 
        $text=implode(' ', $t); 
       } else { 
        $text=self::value($model,$textField, null); 
        if ($text == null) { 
         if (is_callable($textField)) $text=call_user_func($textField, $model); 
         else $text = $textField; 
        } 
       } 
       $listData[$value]=$text; 
      } 
     } 
     else 
     { 
      foreach($models as $model) 
      { 
       $group=self::value($model,$groupField); 
       $value=self::value($model,$valueField); 
       if (is_array($textField)) { 
        $t = array(); 
        foreach ($textField as $field) { 
         $t[]=self::value($model,$field,$field); 
        } 
        $text=implode(' ', $t); 
       } else { 
        $text=self::value($model,$textField, null); 
        if ($text == null) { 
         if (is_callable($textField)) $text=call_user_func($textField, $model); 
         else $text = $textField; 
        } 
       } 
       $listData[$group][$value]=$text; 
      } 
     } 
     return $listData; 
    } 
    public static function value($model,$attribute,$defaultValue=null) 
    { 
     foreach(explode('.',$attribute) as $name) 
     { 
      if(is_object($model) && ($model->hasAttribute($name) || isset($model->{$name}))) 
       $model=$model->$name; 
      else if(is_array($model) && isset($model[$name])) 
       $model=$model[$name]; 
      else 
       return $defaultValue; 
     } 
     return $model; 
    } 
} 

// in model 

function getClients() 
{ 
    $Clients = Client::model()->findAll(); 
    $list = ExtHtml::listData($Clients , 'client_id', array('first_name', 'last_name')); 
    return $list; 
} 

3 संस्करण (Mysql)

function getClients() 
{ 
    $Clients = Client::model()->findAll(array('select' => 'concat(first_name, " ", last_name) as first_name')); 
    $list = CHtml::listData($Clients , 'client_id', 'first_name'); 
    return $list; 
} 
+0

वाह !! .. यू @Sergey, मुझे दूसरा तरीका निम्नलिखित, .. बहुत बहुत शुक्रिया – nu6A

+1

@Kannan, 2 तरह से धन्यवाद: अगर (is_callable ($ textfield)) $ देखना पाठ = call_user_func ($ टेक्स्ट फ़ील्ड, $ मॉडल); - आप इसे कॉलबैक फ़ंक्शन – Sergey

+0

के साथ कई रूपों के लिए उपयोग कर सकते हैं, मैंने देखा कि, यह वास्तव में अच्छा है .. – nu6A

0

PHP के "गुमनाम समारोह" सुविधा का उपयोग इस कॉम्पैक्ट मोड का प्रयास करें:

function getClients() 
    { 
     return CHtml::listData(Client::model()->findAll(), 'id', function($client) { return $client->first_name . ' ' . $client->last_name; }); 
    } 
0

गुमनाम समारोह के साथ "कॉम्पैक्ट मोड" के साथ पिछले टिप्पणी में कोई त्रुटि है! सही कोड है:

function getClients() 
{ 
    $clients = Client::model()->findAll(); 
    return CHtml::listData($clients, 'id', function($clients) { return $client->first_name . ' ' . $client->last_name; }); 
}