Criando Combo Box com Optgroups de Relacionamento

Bem, estava eu novamente quebrando a cabeça pra tentar resolver o seguinte problema:
Meu projeto possui os seguintes relacionamentos:

  • Diretoria hasMany Coordenadoria
  • Coordenadoria hasMany Membro

Eu precisava que quando fosse inserir um Membro, o usuário pudesse escolher a que Coordenadoria o Membro pertence, pois escolhendo a Coordenadoria pode-se saber a Diretoria a qual o mesmo pertence.
Eu vi duas soluções possíveis.

  1. Utilizando o AJAX Helper do Cake e fazendo duas combo boxes () uma de Diretoria que atualizasse dinamicamente o conteúdo da de Coordenadorias. O problema era, eu na hora não sabia usar o helper e não tava afim de aprender. Mas recomendo que tentem essa solução.
  2. E a segunda, criar um combo box () que mostrasse todas as Coordenadorias separadas por optgroups de Diretorias. Essa pode não ser eficiente caso haja muitas Coordenadorias, o que não era o meu caso.

Enfim, escolhi pela segunda, e ralei um pouco. Porquê? No meu controller eu tinha que montar o array de opções da combo box que deveria ser da forma:
array(’optgroup’ =>array(’idCoordenadoria’ => ‘nomeCoordenadoria’), etc), etc)
Esse array teria que entrar no Form Helper no método que cria minha combo box, para que o conteúdo aparecesse da forma desejada. Mas como criar esse array nesse formato?
Depois de ficar tentando inutilmente criar ele através de várias linhas de código montando arrays a partir de outros arrays, eu comecei a reparar e lembrar que se você está escrevendo muitas linhas de código pra fazer alguma coisa, então isso não é cake. Fui no Cook Book e procurei pelo método find para saber como usá-lo com esse fim. Esse método, para que não sabe é o principal método para pegar informações referentes a algum model.
Porém não sabia como montar meu find de forma adequada. Até que li bastante e cheguei a conclusão simples: tinha que usar o parâmetro ‘list’ do método find, que serve principalmente para isso, montar listas, como a mostrada na combo box.
Substituí todas aquelas linhas de código por uma:
$coordinations = $this->Member->Coordination->find(’list’, array(’fields’=>array(’Coordination.id’, ‘Coordination.nome’, ‘Director.nome’), ‘recursive’ =>1));
Notas importantes sobre esse pedaço de código:

  1. É importante setar o recursive para que ele possa achar o campo Director.nome sabendo-se que ele não pertence ao model que estou listando. Nesse caso estou mandando o método find a partir de um objeto Coordenadoria.
  2. Leiam o exemplo que se encontra aqui para entenderem o que cada parâmetro desse método está fazendo, qualquer dúvida postem perguntando que eu respondo.

Abraços e bom desenvolvimento para todos! =)