Dropdownlist Con Datos Tipo Enum

Hola a todos,estoy practicando con el generador de CRUD,usando una tabla que contiene un campo tipo ENUM,pero me aparece un campo de texto y no la lista desplegable,como podría hacer una conversión de los tipos de campos para que gii me coloque listas desplegables Gracias

pon en un buscador por ejemplo

yii enum dropdown y mira la 1ª opcion, es un wiki de yii y da una opción bastante buena.

Si no te vale o tienes dudas con algo, comenta cual es el problema y seguimos con ello.

Un saludo

Ya lo hice pero pasan dos cosas

1 el Dropbox aparece pero con una sola fila donde aparecen todos los campos enum.

2.deseo que si esto se soluciona,la opción escogida se salve junto con los otos campos en la db.

3 las carpetas para insertarlo en el gii no me aparecen o no las encuentro en mi yii

Por cierto Bienvenido que la otra vez no me fije.

1 no debería pasar eso.

2 es lo que tiene que pasar.

3 esto no lo entiendo muy bien.

De todas formas vamos una aplicación rápida desde cero.

  • yiic webapp enumExample.

  • en protected/config/main.php --> habilitar gii (y poner una password)

  • componente db pon mysql con --> ‘connectionString’ => ‘mysql:host=localhost;dbname=xxxxxxx’,

  • en protected/views/layouts/main.php --> añadir otra entrada al menu de inicio para acceder a los enum

              array('label'=>'Enum', 'url'=>array('/camposEnum/index')),
    
  • Crear la tabla en la BBDD de mysql , algo así:


CREATE TABLE IF NOT EXISTS `camposEnum` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `Color` enum('rojo','verde','azul') NOT NULL,

  `estado` enum('activo','inactivo','espera') NOT NULL,

  `via` enum('calle','plaza','avenida','camino') NOT NULL,

  PRIMARY KEY (`id`)

) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

  • Ir a enumExample/index.php?r=gii --> vamos a crear el modelo y el CRUD

  • Ir a model generator, en tablename poner camposEnum (o lo que sea) --> preview --> generar

  • Ir a CRUD generator, en modelClass poner CamposEnum (o lo que sea) --> preview --> generar

  • ya esta todo creado, lo único que falta es la clase del wiki que comente que es:


<?php

class EHtml extends CHtml {

	public static function enumItem($model,$attribute) {

		$attr=$attribute;

		self::resolveName($model,$attr);

		preg_match('/\((.*)\)/',$model->tableSchema->columns[$attr]->dbType,$matches);

		foreach(explode(',', $matches[1]) as $value) {

			$value=str_replace("'",null,$value);

			$values[$value]=Yii::t('enumItem',$value);

		}

		return $values;

	}  


   public static function enumDropDownList($model, $attribute, $htmlOptions=[]) {

	  return CHtml::activeDropDownList( $model, $attribute,EHtml::enumItem($model,  $attribute), $htmlOptions);

   }

}



Y ahora si vas al formulario en protected/views/camposEnum/_form.php sustituir:




      <?php echo $form->textField($model,'via',array('size'=>7,'maxlength'=>7)); ?> --> esto desaparece

      <?php echo EHtml::enumDropDownList( $model,'via'); ?>		            --> esto es lo nuevo



Lo mismo con los otros 2 tipos enum, esto lo llevas a donde quieras.

Prueba y comenta que tal vas.

Gracias, lo probaré y te cuento,el tercer punto hacia referencia a poder configurar el gii para que lo haga automáticamente

Bieeeeeennn Gracias funciono a las mil marravillas,pero aprovechando que me ayudaste con esto que me tenia loco , necesito si puedes otro favor, mi aplicación es un sistema de calificaciones sencilas para un colegio, La DB tiene las siguientes tablas ,

1 TB alumnos

12 TB materias (art mat bio…)

la idea es que cuando un profesor entre a calificar, la materia por decir algo muestra el campo relacionado de la tabla alumnos, los campos de calificacion enum ( ya resuelto por ti ),pero me devuelve el id y no el nombre, como puedo hacer para que aparezca?

Gracias

Adjunto la base de datos con las dos tablas unicamente

Estructura de tabla para la tabla alum

CREATE TABLE IF NOT EXISTS alum (

id_al int(11) NOT NULL AUTO_INCREMENT,

nombre_alumno varchar(100) DEFAULT NULL,

grado enum(‘Cero’,‘Primero’,‘Segundo’,‘Tercero’,‘Cuarto’,‘Quinto’,‘Sexto’,‘Septimo’,‘Octavo’,‘Noveno’,‘Decimo’) DEFAULT NULL,

typeid enum(‘T.I’,‘C.C’,‘R.C’) DEFAULT NULL,

numid int(30) DEFAULT NULL,

sede enum(‘Principal’,‘03’) DEFAULT NULL,

PRIMARY KEY (id_al)

) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=71 ;

– Estructura de tabla para la tabla art

CREATE TABLE IF NOT EXISTS art (

id int(11) NOT NULL AUTO_INCREMENT,

ESNU enum(‘10’,‘11’,‘12’,‘13’,‘14’,‘15’,‘16’,‘17’,‘18’,‘19’,‘20’,‘21’,‘22’,‘23’,‘24’,‘25’,‘26’,‘27’,‘28’,‘29’,‘30’,‘31’,‘32’,‘33’,‘34’,‘35’,‘36’,‘37’,‘38’,‘39’,‘40’,‘41’,‘42’,‘43’,‘44’,‘45’,‘46’,‘47’,‘48’,‘49’,‘50’,‘51’,‘52’,‘53’,‘54’,‘55’,‘56’,‘57’,‘58’,‘59’,‘60’,‘61’,‘62’,‘63’,‘64’,‘65’,‘66’,‘67’,‘68’,‘69’,‘70’,‘71’,‘72’,‘73’,‘74’,‘75’,‘76’,‘77’,‘78’,‘79’,‘80’,‘81’,‘82’,‘83’,‘84’,‘85’,‘86’,‘87’,‘88’,‘89’,‘90’,‘91’,‘92’,‘93’,‘94’,‘95’,‘96’,‘97’,‘98’,‘99’,‘100’) DEFAULT NULL,

ESNA enum(‘SUPERIOR’,‘ALTO’,‘BASICO’,‘BAJO’) DEFAULT NULL,

LOGRO varchar(255) DEFAULT NULL,

PRIMARY KEY (id)

) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=71 ;

– Volcado de datos para la tabla art

INSERT INTO art (id, ESNU, ESNA, LOGRO) VALUES

(2, ‘25’, ‘ALTO’, ‘SI SABE’),

(3, NULL, ‘’, ‘’),

(4, NULL, ‘’, ‘’),

(5, NULL, ‘’, ‘’),

(6, NULL, ‘’, ‘’),

(7, NULL, ‘’, ‘’),

(8, NULL, ‘’, ‘’),

(9, NULL, ‘’, ‘’),

(10, NULL, ‘’, ‘’),

(11, NULL, ‘’, ‘’),

(12, NULL, ‘’, ‘’),

(13, NULL, ‘’, ‘’),

(14, NULL, ‘’, ‘’),

(15, NULL, ‘’, ‘’),

(16, NULL, ‘’, ‘’),

(17, NULL, ‘’, ‘’),

(18, NULL, ‘’, ‘’),

(19, NULL, ‘’, ‘’),

(20, NULL, ‘’, ‘’),

(21, NULL, ‘’, ‘’),

(22, NULL, ‘’, ‘’),

(23, NULL, ‘’, ‘’),

(24, NULL, ‘’, ‘’),

(25, NULL, ‘’, ‘’),

(26, NULL, ‘’, ‘’),

(27, NULL, ‘’, ‘’),

(28, NULL, ‘’, ‘’),

(29, NULL, ‘’, ‘’),

(30, NULL, ‘’, ‘’),

(31, NULL, ‘’, ‘’),

(32, NULL, ‘’, ‘’),

(33, NULL, ‘’, ‘’),

(34, NULL, ‘’, ‘’),

(35, NULL, ‘’, ‘’),

(36, NULL, ‘’, ‘’),

(37, NULL, ‘’, ‘’),

(38, NULL, ‘’, ‘’),

(39, NULL, ‘’, ‘’),

(40, NULL, ‘’, ‘’),

(41, NULL, ‘’, ‘’),

(42, NULL, ‘’, ‘’),

(43, NULL, ‘’, ‘’),

(44, NULL, ‘’, ‘’),

(45, NULL, ‘’, ‘’),

(46, NULL, ‘’, ‘’),

(47, NULL, ‘’, ‘’),

(48, NULL, ‘’, ‘’),

(49, NULL, ‘’, ‘’),

(50, NULL, ‘’, ‘’),

(51, NULL, ‘’, ‘’),

(68, ‘10’, ‘BAJO’, ‘Si sabe’),

(69, ‘10’, ‘ALTO’, ‘SI SABE’),

(70, ‘10’, ‘’, ‘GGG’);


– Estructura de tabla para la tabla tbl_user

CREATE TABLE IF NOT EXISTS tbl_user (

id int(11) NOT NULL AUTO_INCREMENT,

username varchar(128) NOT NULL,

password varchar(128) NOT NULL,

email varchar(128) NOT NULL,

PRIMARY KEY (id)

) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=22 ;

– Volcado de datos para la tabla tbl_user

– Restricciones para tablas volcadas

– Filtros para la tabla alum

ALTER TABLE alum

ADD CONSTRAINT alum_ibfk_1 FOREIGN KEY (id_al) REFERENCES art (id) ON DELETE CASCADE ON UPDATE CASCADE;

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;

/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;

/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

Uff, aquí hay un problema.

El sistema de diseño en BBDD suele ir a --> id,(id_fk),(campos) siendo id primary key, id_fk => las foreign keys necesarias. (Salvo la relación MANY_MANY que tiene una primary key de 2 campos.)

Con este sistema de diseño yii define la funcion relations en los modelos. Si tienes diseñado así la BBDD yii es muy amigable, cualquier modificación de este diseño hace que yii empiece a ser más problemático.

La tabla alumnos tiene un campo id_al + varios campos de datos => Solo indicar a yii que id_al es el primary Key

La tabla art tiene un campo id + varios campos => el id es primary key esto esta bien.

Pero aquí hay un problema el id de la tabla art = id_al de la tabla alumnos, y la relacion que tienes en mysql yii no se como la maneja, quieres que art.id sea primary key y a la vez foreign key. Las relations aquí no creo que funcionen.

Lo ideal en yii sería:

tabla alumnos -> id,nombre_alumno, grado,… =>id es PK

tabla art -> id,id_alumno, … id es PK, id_alumno es FK

Si puedes poner las tablas en este formato es en el que trabaja yii y te facilitará mucho las cosas sino vas a tener que hacer muchas sql a mano.

Lo 1º aquí es el diseño de la BBDD y es MUY IMPORTANTE.

Comenta como lo ves, un saludo

Gracias de nuevo, de hecho mientras me actualizabas estuve trabajando y ya hice lo mismo que me indicaste, ahora necesito (por favor)que me ayudes por que al hacer el despliegue de los datos, me muestra el id al estar relacionado como FK en la otra tabla y quisiera que me mostrara el nombre de alumno, es decir la relacion esta hecha y funciona pero quiero visualizar el nombre del alumno y no el id,Como se puede hacer?De nuevo gracias por tu tiempo

Mientras que me actualizas seguiré leyendo Saludos

pd Configure el indice de la FK como index esta bien?

Generalmente si.

Solo saber que un índice acelera (normalmente mucho) las búsquedas, pero ralentiza algo los insert y delete. Además aumenta el tamaño de la BBDD.

Como lo que más se hace y con mucha diferencia son búsquedas es bastante normal que un FK sea índice.