У меня есть dropDownList
на мой взгляд, он dropDownList
из таблицы clients
, в таблице содержатся такие столбцы, как first_name
, last_name
, id
и т. Д. Теперь я хочу показать first_name
и last_name
как отображаемый текст и id
как значение в выпадающем списке, I 'm делается с id
как value и first_name
как отображаемый текст, но здесь я хочу объединить эти столбцы ( first_name
и last_name
) и использовать их в качестве отображаемого текста.
в модели
function getClients() { $Clients = Client::model()->findAll(); $list = CHtml::listData($Clients , 'client_id', 'first_name'); return $list; }
ввиду
echo $form->dropDownList($model,'client_id',$model->getClients());
Heres другой метод В модели
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
не только в раскрывающемся списке, но и везде, где требуется полное имя.
1-й вариант (легкий):
$list = array(); foreach ($Clients as $c) { $list[$c->id] = $c->first_name . ' ' . $c->last_name; }
Второй вариант (универсальный):
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; }
Попробуйте этот компактный режим с использованием функции «анонимной функции» PHP:
function getClients() { return CHtml::listData(Client::model()->findAll(), 'id', function($client) { return $client->first_name . ' ' . $client->last_name; }); }
Предыдущий комментарий с «компактным режимом» с анонимной функцией имеет ошибку! Правильный код:
function getClients() { $clients = Client::model()->findAll(); return CHtml::listData($clients, 'id', function($clients) { return $client->first_name . ' ' . $client->last_name; }); }