我的视图中有一个dropDownList
,它是从clients
表填充的,该表包含first_name
,last_name
,id
等列。 ,现在我想将first_name
和last_name
显示为显示文本,将id
显示为下拉列表中的值,我已完成id
作为值和{{1作为显示文字,但在这里我想将这些列(first_name
和first_name
)组合起来并用作显示文字。
在模型中
last_name
视野
function getClients()
{
$Clients = Client::model()->findAll();
$list = CHtml::listData($Clients , 'client_id', 'first_name');
return $list;
}
答案 0 :(得分: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
虚拟属性,而且还需要使用全名。
答案 1 :(得分:7)
第一个变种(简单):
$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;
}
答案 2 :(得分:0)
使用"匿名功能"尝试这种紧凑模式PHP的功能:
function getClients()
{
return CHtml::listData(Client::model()->findAll(), 'id', function($client) { return $client->first_name . ' ' . $client->last_name; });
}
答案 3 :(得分:0)
以前使用匿名函数的“紧凑模式”注释有错误! 正确的代码是:
function getClients()
{
$clients = Client::model()->findAll();
return CHtml::listData($clients, 'id', function($clients) { return $client->first_name . ' ' . $client->last_name; });
}