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",'-- ');