Dropdownlist Customized Full Name

Hola a todos, despues de intentar varias cosa para otener el nombre de usuario completo en un dropDownList he creado una solución que creo que a muchos le servira, dado que es una opcion util para cualquier caso…

Les explico mi problema primero:

yo tengo una tabla usuarios ya saben almaceno idusuario, nombre, apellido, etc…

entonces en un dropDownList yo quiero mostrar el nombre y el apellido asi:

Pepito Perez, pero no me era posible pues al usar el CHtml::listData solo obtenia Pepito, asi que busque y intecte de todo pero todo era un complique para mostrar como yo queria asi que pense un poco y cree lo siguiente, yo se que no sera la mejor opcion pero almenos esta funciona bien y lo mejor sirve para cualquier caso de dropDownList.

cree un modelo en la carpeta models llamado HHtml.php que contiene lo siguiente:

su_apps->protected->models->HHtml.php




<?php


class HHtml extends CActiveRecord

{

	

	public function listData($arrayDatos,$value,$campo_1,$campo_2='')

	{

		

		/*

		$arrayDatos=array que contiene los datos

		$value = id o campo para las key o values. Ej:iduser

		$campo_1 = texto que se va mostrar campo_1. Ej:nombre

		$campo_2= texto que se va mostrar campo_2. Ej:apellido

		*/

		$values = array(); //array utilizado para guardar los values del select

		$texto = array(); //array utilizado para guardar el texto que se mostrara en las opciones del select

		$listCombo=array(); //array que contine los option con sus value y texto 


		if ($arrayDatos!=null && $value!=null && $campo_1!=null) {


			foreach ($arrayDatos as $key) { //recorremos el array de los datos

				array_push($values, $key->$value); //añadimos el nuevo valor o value al array values

				if ($campo_2!='' && $campo_2!=null) {//validamos si viene el segundo campo

					# code...

					array_push($texto, ucwords(strtolower($key[$campo_1].' '.$key[$campo_2]))); //añadimos el texto correspondiente del value al array texto

				}else{

					array_push($texto, ucwords(strtolower($key[$campo_1]))); //añadimos el texto correspondiente del value al array texto

				}

			}

		}

		/* Combinamos los dos array values y texto para otener el un solo array.

		Ej: el resultado sera algo como esto <option name='xx' value='$values'>$texto</option>

		es decir; <option name='xx' value='5'>Manzana</option> */

		$listCombo=array_combine($values, $texto); 


		return $listCombo;

	}




} 

?>




NOTA: Yo cree un nuevo modelo para esto pero si ustedes quieren no tienen que crearlo solo creen el metodo dentro de cualquier modelo de los que ya tiene.

Ahora en la vista donde lo necesiten solo tien que hacer lo siguiente:




<?php 

 echo $form->dropDownList($model,'userid',HHtml::listData(Usuario::model()->findAll(),'idusuario','nombre','apellido'),array('prompt'=>'Seleccione...')); 


?>


o esto si no crearon el modelo HHtml.php




<?php 

echo $form->dropDownList($model,'userid',su_modelo::listData(Usuario::model()->findAll(),'idusuario','nombre','apellido'),array('prompt'=>'Seleccione...')); 

?>



Espero les sea de mucha ayuda.

Captura de prueba que si funciona 100%

En este post Antonio también habla de este problema y plantea su función, otra alternativa My link.

Esta bien compararlas y ver las diferencias en la programación.

Se Agradece el aporte (a los dos), estas funciones resuelven fácilmente problemas que parecen tontos y luego no lo son tanto.

Gracias la verdad no lo habia visto pero bueno entre mas opciones mejor.

Hay otra forma de hacerlo

en el Model crear la siguiente función




public function getFullName() {

	$fullName = (! empty ( $this->nombre )) ? $this->nombre : '';

	$fullName .= (! empty ( $this->apellido )) ? ((! empty ( $fullName )) ? " " . $this->apellido : $this->apellido) : '';

	return $fullName;

}



y en la vista poner el dropDownList


echo $form->dropDownList($model,'userid',CHtml::listData(Usuario::model()->findAll(),"id","fullname"),array('prompt'=>'Seleccione...')); 

Se coloca el nombre de la función(fullname) como columna a mostrar.

Pero tal como lo pones solo servira paro obtener los usuarios, pero si quiero obtener por ejemplo otros datos donde tenga que hace la union de dos columnas tendria que volver a crear el metodo en el modelo. pero con al opcion que doy puede ser util para optener cualquier dato…

Esto es lo q hay que hacer para seguir el estilo Yii. Y si se quiere recuperar más información habría que crear las propiedades correspondientes. Sería lo correcto.

Por supuesto se puede hacer de muchas otras maneras igualmente válidas funcionalmente.

Un saludo.

Excelente todos!!!!!

Muchas Gracias!!!!