Model::generateList deprecated
Written by Gnuget on 2008.01.07
Con la salida de la beta cakephp1.2 se anunciaron algunos métodos como deprecated es decir que a la salida del release estable estos métodos dejaran de funcionar.Uno de ellos es generateList(); que era una función que generaba un arreglo del tipo:
array(
"0" => "Cero",
"1" => "uno",
"2" => "dos"
);
"0" => "Cero",
"1" => "uno",
"2" => "dos"
);
Que era muy útil para llenar de datos los selects en las vistas.
Ahora al actualizar al beta muestra un mensaje como este:
('(Model::generateList) Deprecated, use Model::find("list") or Model::find("all") and Set::combine()'
Que nos propone dos soluciones alternativas al uso de generatelist y ahora daremos un par de ejemplos, uno de cada solución de las que propone:
Usando Model::find('list');
Con la nueva versión de cakephp viene una nueva forma de usar el comando find ahora en base de este método podremos remplazar muchos viejos métodos como por ejemplo 'findAll' ,'findCount' y como vemos en este ejemplo generateList de la siguiente forma:
$lista = $this->Model1->find("list");
Y es todo, esto funciona presuponiendo que uno de los elementos de la lista es el identificador y el otro es el campo "name". (Con esta forma no he encontrado la forma de poder decirle al find que el otro field no sea name)
Usando Model::find("all") y set::combine()
Con este método pude escoger los campos que yo quería para formar la lista y el ejemplo va así:
$lista = $this->Model->find('all','fields' => array('Model.id','User.user'));
$lista = Set::combine($lista,"{n}.Model.id","{n}.Model.user");
$lista = Set::combine($lista,"{n}.Model.id","{n}.Model.user");
Me encontré solo con una complicación, al reemplazar generateList() que utilizaban el último parámetro ($groupPath). Los cuales los reemplacé de esta manera:
Suponiendo que tenemos diferentes Operadores de Telefonía Móvil asociados a un País
$result = $this->MobileOperator->find('all', array (
'order' => 'Country.name ASC, MobileOperator.name ASC'
));
$keyPath = '{n}.MobileOperator.id';
$valuePath = '{n}.MobileOperator.name';
$groupPath = '{n}.Country.name';
$mobileOperators = Set :: combine($result, $keyPath, $valuePath, $groupPath);
esto nos da el mismo resultado que
$mobileOperators = $this->MobileOperator->generateList((null, 'Country.name ASC, MobileOperator.name ASC', null, null, null, '{n}.Country.name');
Saludos