@@ -24,21 +24,20 @@ function ajax_chain_select_menu() {
24
24
* Implements hook_element_info().
25
25
*/
26
26
function ajax_chain_select_element_info() {
27
- $elements['ac_select '] = array(
27
+ $elements['ajax_chain_select '] = array(
28
28
"#input" => TRUE,
29
- "#process" => array('ajax_chain_select_element_ac_select '),
29
+ "#process" => array('ajax_chain_select_element_process '),
30
30
);
31
31
return $elements;
32
32
}
33
33
34
34
/**
35
35
* Process callback for ac_select.
36
36
*/
37
- function ajax_chain_select_element_ac_select ($element, &$form_state, $form) {
37
+ function ajax_chain_select_element_process ($element, &$form_state, $form) {
38
38
39
39
$element_name = $element['#name'];
40
40
$config = !empty($element['#config']) ? $element['#config'] : array();
41
- $levels = !empty($element['#levels']) ? $element['#levels'] : 1;
42
41
$required_levels = !empty($element['#required_levels']) ? $element['#required_levels'] : 0;
43
42
$data_callback = !empty($element['#data_callback']) ? $element['#data_callback'] : '';
44
43
$settings = array(
@@ -66,11 +65,12 @@ function ajax_chain_select_element_ac_select($element, &$form_state, $form) {
66
65
'#type' => 'fieldset',
67
66
'#tree' => TRUE,
68
67
'#id' => !empty($element['#id']) ? $element['#id'] : drupal_html_id('edit-' . implode('-', $element['#parents'])),
69
- '#title' => !empty($element['#title']) ? $element['#title'] : array(),
68
+ '#title' => !empty($element['#title']) ? $element['#title'] : '',
69
+ '#title_display' => !empty($element['#title_display']) ? $element['#title_display'] : 'before',
70
70
'#array_parents' => array(),
71
71
'#element_validate' => array('ajax_chain_select_custom_validate'),
72
72
'#states' => !empty($element['#states']) ? $element['#states'] : array(),
73
- '#levels ' => $levels ,
73
+ '#config ' => $config ,
74
74
'#data_callback' => $data_callback,
75
75
);
76
76
@@ -79,53 +79,62 @@ function ajax_chain_select_element_ac_select($element, &$form_state, $form) {
79
79
'data' => array('ajax_chain_select' => array($region_element[$element_name]['#id'] => $settings)),
80
80
);
81
81
82
- for ($level = 0; $level < $levels; $level++) {
83
82
84
- $previous_level = $level - 1;
83
+ $index = 0;
84
+ $levels_count = count($config);
85
+ $levels = array_keys($config);
86
+ $previous_level = $levels[0];
87
+ $previous_level_config = $config[$previous_level];
88
+
89
+ foreach ($config as $level => $level_config) {
85
90
$data = array();
86
91
87
- switch ($level ) {
92
+ switch ($index ) {
88
93
case 0:
89
94
$data = $data_callback($level);
90
95
break;
91
96
92
97
default:
93
98
if ($is_submitted) {
94
- if (!empty($submitted_values['level_' . $previous_level])) {
95
- $data = $data_callback($level, $submitted_values['level_' . $previous_level]);
99
+ if (!empty($submitted_values[$previous_level])) {
100
+ $data = $data_callback($level, $submitted_values[$previous_level]);
96
101
}
97
102
}
98
103
else {
99
- if (!empty($config[$previous_level] ['#default_value'])) {
100
- $data = $data_callback($level, $config[$previous_level] ['#default_value']);
104
+ if (!empty($previous_level_config ['#default_value'])) {
105
+ $data = $data_callback($level, $previous_level_config ['#default_value']);
101
106
}
102
107
}
103
108
break;
104
109
}
105
110
106
111
// Default value must be part of data of that level, if not, nullify it.
107
- if (!empty($config[$level][ '#default_value']) && !in_array($config[$level] ['#default_value'], array_keys($data))) {
108
- unset($config[$level] ['#default_value']);
112
+ if (!empty($level_config[ '#default_value']) && !in_array($level_config ['#default_value'], array_keys($data))) {
113
+ unset($level_config ['#default_value']);
109
114
}
110
115
111
- $region_element[$element_name]['level_' . $level] = array(
116
+ $region_element[$element_name][$level] = array(
112
117
'#type' => 'select',
113
118
'#options' => $data,
114
- '#title' => !empty($config[$level][ '#title']) ? $config[$level][ '#title'] : 'Level ' . ($level + 1) ,
115
- '#empty_option' => !empty($config[$level][ '#empty_option']) ? $config[$level][ '#empty_option'] : '- Select -',
116
- '#required' => ($level < $required_levels) ? TRUE : FALSE,
119
+ '#title' => !empty($level_config[ '#title']) ? t($level_config[ '#title']) : '' ,
120
+ '#empty_option' => !empty($level_config[ '#empty_option']) ? $level_config[ '#empty_option'] : t( '- Select -') ,
121
+ '#required' => ($index < $required_levels) ? TRUE : FALSE,
117
122
'#validated' => TRUE,
118
- '#default_value' => !empty($config[$level][ '#default_value']) ? $config[$level] ['#default_value'] : NULL,
119
- '#title_display' => !empty($config[$level][ '#title_display']) ? $config[$level] ['#title_display'] : 'before',
123
+ '#default_value' => !empty($level_config[ '#default_value']) ? $level_config ['#default_value'] : NULL,
124
+ '#title_display' => !empty($level_config[ '#title_display']) ? $level_config ['#title_display'] : 'before',
120
125
'#disabled' => (empty($data)) ? TRUE : FALSE,
121
- );
126
+ '#attributes' => array('level' => $level)
127
+ );
122
128
123
- if ($level != $levels - 1) {
124
- $region_element[$element_name]['level_' . $level]['#attributes']['level'] = $level;
125
- $region_element[$element_name]['level_' . $level]['#attributes']['class'] = array('ajax-chain-select-select', 'ajax-progress-throbber');
129
+ if ($index != $levels_count - 1) {
130
+ $region_element[$element_name][$level]['#attributes']['class'] = array('ajax-chain-select-select');
126
131
}
127
- }
128
132
133
+ $index++;
134
+ $previous_level = $level;
135
+ $previous_level_config = $level_config;
136
+ }
137
+
129
138
$region_element[$element_name]['dc'] = array(
130
139
'#type' => 'textfield',
131
140
'#value' => base64_encode($element['#data_callback']),
@@ -147,28 +156,33 @@ function ajax_chain_select_element_ac_select($element, &$form_state, $form) {
147
156
function ajax_chain_select_custom_validate(&$element, &$form_state, $form) {
148
157
$values = $form_state['values'];
149
158
$data_callback = $element['#data_callback'];
150
- $levels = $element['#levels '];
159
+ $config = $element['#config '];
151
160
152
- for ($level = 0; $level < $levels; $level++) {
161
+ $index = 0;
162
+ $levels = array_keys($config);
163
+ $previous_level = $levels[0];
153
164
154
- $previous_level = $level - 1;
165
+ foreach ($config as $level => $level_config) {
155
166
156
- if ($level > 0) {
157
- $data = $data_callback($level, $values['region']['level_' . $previous_level]);
167
+ if ($index > 0) {
168
+ $data = $data_callback($level, $values['region'][$previous_level]);
158
169
159
170
if (!empty($data)) {
160
171
161
- if (empty($element['level_' . $level]['#options'])) {
162
- $element['level_' . $level]['#options'] = $data;
172
+ if (empty($element[$level]['#options'])) {
173
+ $element[$level]['#options'] = $data;
163
174
}
164
- $element['level_' . $level]['#validated'] = FALSE;
165
- _form_validate($element['level_' . $level], $form_state);
175
+ $element[$level]['#validated'] = FALSE;
176
+ _form_validate($element[$level], $form_state);
166
177
}
167
178
}
168
179
else {
169
- $element['level_' . $level]['#validated'] = FALSE;
170
- _form_validate($element['level_' . $level], $form_state);
180
+ $element[$level]['#validated'] = FALSE;
181
+ _form_validate($element[$level], $form_state);
171
182
}
183
+
184
+ $index++;
185
+ $previous_level = $level;
172
186
}
173
187
}
174
188
@@ -178,7 +192,7 @@ function ajax_chain_select_custom_validate(&$element, &$form_state, $form) {
178
192
function ajax_chain_select_element_callback($level = 1, $previous_level_key = 0, $dc = NULL, $dch = NULL) {
179
193
$has_data = '0';
180
194
$data_callback = '';
181
- $options = array() ;
195
+ $options = '' ;
182
196
183
197
if (!empty($dc)) {
184
198
$dc2 = base64_decode($dc);
0 commit comments