dependent.inc
6.16 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
<?php
/**
* @file
* Provide dependent checkboxes that can be easily used in forms.
*
* This system will ensure that form items are invisible if the dependency is
* not met. What this means is that you set the #dependency of an item to a
* list of form ids that must be set, and the list of values that qualify.
*
* For a simple use, setting an item to be dependent upon a select box, if
* any of the listed values are selected, the item will be visible. Otherwise,
* the item will be invisible.
*
* If dependent upon multiple items, use #dependency_count = X to set the
* number of items that must be set in order to make this item visible. This
* defaults to 1. If set to 2, then at least 2 form items in the list must
* have their items set for the item to become visible.
*
* When hiding checkboxes and radios you need to add their id in a div
* manually via #prefix and #suffix since they don't have their own id. You
* actually need to add TWO divs because it's the parent that gets hidden.
*
* Fieldsets can not be hidden by default. Adding '#input' => TRUE to the
* fieldset works around that.
*
* For radios, because they are selected a little bit differently, instead of
* using the CSS id, use: radio:NAME where NAME is the #name of the property.
* This can be quickly found by looking at the HTML of the generated form, but
* it is usually derived from the array which contains the item. For example,
* $form['menu']['type'] would have a name of menu[type]. This name is the same
* field that is used to determine where in $form_state['values'] you will find
* the value of the form.
*
* The item that is dependent on, should be set to #tree = TRUE.
*
* Usage:
*
* First, ensure this tool is loaded:
* @code { ctools_include('dependent'); }
*
* On any form item, add
* - @code '#dependency' => array('id-of-form-without-the-#' => array(list, of, values, that, make, this, gadget, visible)), @endcode
*
* A fuller example, that hides the menu title when no menu is selected:
* @code
*function ctools_dependent_example() {
* $form = array();
* $form['menu'] = array(
* '#type' => 'fieldset',
* '#title' => t('Menu settings'),
* '#tree' => TRUE,
* );
* $form['menu']['type'] = array(
* '#title' => t('Menu type'),
* '#type' => 'radios',
* '#options' => array(
* 'none' => t('No menu entry'),
* 'normal' => t('Normal menu entry'),
* 'tab' => t('Menu tab'),
* 'default tab' => t('Default menu tab'),
* ),
* '#default_value' => 'none',
* );
*
* $form['menu']['title'] = array(
* '#title' => t('Title'),
* '#type' => 'textfield',
* '#default_value' => '',
* '#description' => t('If set to normal or tab, enter the text to use for the menu item.'),
* '#dependency' => array('radio:menu[type]' => array('normal', 'tab', 'default tab')),
* );
*
* return system_settings_form($form);
*}
* @endcode
*
* An example for hiding checkboxes using #prefix and #suffix:
* @code
*function ctools_dependent_example_checkbox() {
* $form = array();
* $form['object'] = array(
* '#type' => 'fieldset',
* '#title' => t('Select object type'),
* '#tree' => TRUE,
* );
* $form['object']['type'] = array(
* '#title' => t('Object type'),
* '#type' => 'radios',
* '#options' => array(
* 'view' => t('View'),
* 'node' => t('Node'),
* 'field' => t('Field'),
* 'term' => t('Term'),
* ),
* '#default_value' => 'view',
* );
*
* $form['object']['elements'] = array(
* '#title' => t('Select the elements to load from the node.'),
* '#type' => 'checkboxes',
* '#prefix' => '<div id="edit-elements-wrapper"><div id="edit-elements">',
* '#suffix' => '</div></div>',
* '#dependency' => array('radio:menu[type]' => array('node')),
* '#options' => array(
* 'body' => t('Body'),
* 'fields' => t('Fields'),
* 'taxonomy' => t('Taxonomy'),
* ),
* '#default_value' => array('body', 'fields'),
* );
*
* return system_settings_form($form);
*}
* @endcode
*
* Deprecated:
*
* You no longer use ctools_dependent_process(), and it should be removed
* completely.
*
* If you have a form element which isn't listed in ctools_dependent_element_info_alter
* you have to add [#pre_render'][] => 'ctools_dependent_pre_render' to your form.
*/
/**
* Process callback to add dependency to form items.
*
*/
function ctools_dependent_process($element, &$form_state, &$form) {
return $element;
}
function ctools_dependent_pre_render($element) {
// Preprocess only items with #dependency set.
if (isset($element['#dependency'])) {
if (!isset($element['#dependency_count'])) {
$element['#dependency_count'] = 1;
}
if (!isset($element['#dependency_type'])) {
$element['#dependency_type'] = 'hide';
}
$js = array(
'values' => $element['#dependency'],
'num' => $element['#dependency_count'],
'type' => $element['#dependency_type'],
);
// Add a additional wrapper id around fieldsets, textareas to support depedency on it.
if (in_array($element['#type'], array('textarea', 'fieldset', 'text_format'))) {
$element['#theme_wrappers'][] = 'container';
$element['#attributes']['id'] = $element['#id'] . '-wrapper';
}
// Text formats need to unset the dependency on the textarea
// or it gets applied twice.
if ($element['#type'] == 'text_format') {
unset($element['value']['#dependency']);
}
$element['#attached']['js'][] = ctools_attach_js('dependent');
$options['CTools']['dependent'][$element['#id']] = $js;
$element['#attached']['js'][] = array('type' => 'setting', 'data' => $options);
}
return $element;
}
/**
* CTools alters the element_info to be able to add #process functions to
* every major form element to make it much more handy to use #dependency,
* because you don't have to add #process.
*/
function ctools_dependent_element_info_alter(&$type) {
$form_elements = array('checkbox', 'checkboxes', 'date', 'fieldset', 'item', 'machine_name', 'markup', 'radio', 'radios', 'select', 'textarea', 'textfield', 'text_format');
foreach ($form_elements as $element) {
$type[$element]['#pre_render'][] = 'ctools_dependent_pre_render';
}
}