9

ich eine dropDownList meiner Ansicht haben, ist es aus clients Tabelle bevölkern, die Tabelle enthält Spalten wie first_name, last_name, id etc. Jetzt möchte ich zeigen die first_name und last_name als Anzeigetext und id als Wert in Dropdown-Liste, ich bin mit id als Wert und first_name als Anzeigetext getan, aber hier möchte ich diese Spalten kombinieren (first_name und last_name) und als Anzeigetext verwenden.In Yü Rahmen wie kann ich Spalten und zeigen als Display-String in Dropdownlist Kombinieren

in Modell

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

im Blick

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

Antwort

20

Heres eine andere Methode Im Modell

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

und

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

Ich denke, diese Methode irgendwie wiederverwendbar ist, da Sie verwenden können, die fullName virtuelle attrib nicht nur in der Dropdown-Liste, sondern überall wird ein vollständiger Name benötigt.

+1

@ Kannan, Es ist cool :) effektiver denke ich. Ich habe meine ExtHtml vor 2 Jahren geschrieben. – Sergey

+0

Ja das ist so schnell und einfach, und jetzt bin ich verwirrt, um die beste Antwort zu wählen .. :) trotzdem danke @ dInGd0nG – nu6A

+0

nach einigem Experiment festgestellt, dass diese Methode zu meinem veränderten Szenario geeignet ist. Und im Allgemeinen ist das passend. Also akzeptiere ich das. – nu6A

7

1. Variante (Easy):

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

2. Variante (Universal):

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

dritte Variante (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

wow !! .. thank u @Sergey, mir den zweiten Weg folgt, .. Dank viel – nu6A

+1

@Kannan, 2. Weg: ob (is_callable ($ Textfield)) $ text = call_user_func ($ textField, $ modell); - Sie können es für viele Varianten mit Callback-Funktion verwenden – Sergey

+0

yeah ich sah das, das ist wirklich cool .. – nu6A

0

Versuchen Sie, diese Kompakt-Modus „anonyme Funktion“ -Funktion von PHP:

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

Zurück Kommentar mit „Kompakt-Modus“ mit anonymer Funktion einen Fehler! Rechts-Code ist:

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