Hi there cakephp experts! I am looking for you help on a dyanmic dropdown list with dyanamic optgroup. Suppose I have two tables:
countries: id, country_na
bind tableB to tableA in tableA model, do
$hasMany = array("tableB"=>array("className"=>"tableB","foreignKey"=>"aId"));
then use
find("all")
might need
$this->tableA->recursive->2
right before find
You can also use the Hash::combine function instead of a nested loop as suggested by @neilcrookes
$counties = Hash::combine($countries,'{n}.County.id','{n}.County.name','{n}.Country.name');
Cake's FormHelper::input method will render a select tag with optgroups if the options are correct, e.g.
echo $form->input('county');
provided there is a variable available in the view called $counties which contains data in the following format:
$counties = array(
'Country Name 1' => array(
'county_1_id' => 'County 1 Name',
'county_2_id' => 'County 2 Name',
'county_3_id' => 'County 3 Name',
),
'Country Name 2' => array(
'county_4_id' => 'County 4 Name',
'county_5_id' => 'County 5 Name',
'county_6_id' => 'County 6 Name',
),
);
So, in your controller, do something like:
$this->set('counties', ClassRegistry::init('Country')->getCountiesByCountry());
and in your Country Model, do something like:
function getCountiesByCountry() {
$countries = $this->find('all', array('contain' => array('County')));
$return = array();
foreach ($countries as $country) {
foreach ($country['County'] as $county) {
$return[$country['Country']['name']][$county['id']] = $county['name'];
}
}
return $return;
}