Creare una lista per la select in CakePHP

Ho bisogno di creare un’array di date per alimentare una select.
Al di là della correttezza progettuale del metodo da me adottato, quanto segue mi serve come “esercizio” nell’uso del metodo find che ha sostituito il generateList ormai deprecato.

Nella mia select vorrei avere un elenco di date, in formato italiano (d-m-Y), ordinate in ordine discendente, che rappresentano tutte le date utilizzate in una tabella nel campo ‘data’.

Una prima soluzione è quella di eseguire una normale query utilizzando il metodo $model->query().
$mylista = $this->$table->query("SELECT news.data, DATE_FORMAT(news.data , '%d-%m-%Y' ) AS `datait` FROM `news` GROUP BY `data` ORDER BY `data` DESC ");
In questo caso si dovrebbero utilizzare i nomi delle tabelle impiegate e non i nomi dei modelli.

La soluzione che utilizza il nome del model è la seguente.
$mylista = $this->$table->find('all',array('fields'=>array("DATE_FORMAT(data , '%d-%m-%Y' ) as datait",'data'),'order'=>'data DESC'));

$mylista è un array che contiene i dati cercati e è sufficente utilizzare combine per ottenre l’array desiderato.
$datelist = Set::combine($mylista,'{n}.News.data','{n}.0.datait');

FormHelper: creare una select automagicamente

Nella creazione di un form con l’helper è sufficente assegnare il giusto nome ad una variabile affinchè venga utilizzata come options in una select, senza dover specificare altri parametri. Mi spiego con un esempio.

Devo gestire dei gruppi di utenti con la possibilità di avere dei sotto-gruppi, quindi ho il model Group che agisce come un albero (beahvior Tree) e in fase di inserimento devo specificare il gruppo parent, popolando il campo parent_id con l’id del gruppo padre.
Il form di inserimento deve quindi contenere una select da dove poter scegliere il gruppo padre.

Controller: groups_controller
$groups = $this->Group->findAll(null,'id,groupname','groupname ASC',null,null,-1);
$groups = Set::combine($groups, "{n}.Group.id","{n}.Group.groupname");
$this->set('parents',$groups);

Nel controller ho ricavato l’elenco dei gruppi e lo assegno alla variabile ‘parents’. Questo è il passaggio determinante.

View: add.ctp
input('Group.parent_id', array('label'=>false));?>

La chiave di questo comportamento è l’assegnazione del giusto nome alla variabile che contiene le options, ovvero deve essere un nome che risponde alle regole delle inflessioni di CakePHP, infatti il nome della variabile giusto è definito dalla seguente espressione

$varName = Inflector::variable(Inflector::pluralize(preg_replace('/_id$/', '', $this->field())));

Ma poichè sto utilizzando un TreeBehavior è sicuramente conveniente avere una select organizzata appunto come un albero sfruttando la funzione

$groups = $this->Group->generatetreelist (null,"{n}.Group.id","{n}.Group.groupname",'-- ');