1
|
<?php
|
2
|
/**
|
3
|
* @file
|
4
|
* Variable module hook implementations
|
5
|
*/
|
6
|
|
7
|
/**
|
8
|
* Implements hook_variable_group_info().
|
9
|
*/
|
10
|
function variable_variable_group_info() {
|
11
|
// Group for variable that have no group
|
12
|
$groups['default'] = array(
|
13
|
'title' => t('Other'),
|
14
|
'description' => t("Variables that don't belong to any other group."),
|
15
|
);
|
16
|
$groups['debug'] = array(
|
17
|
'title' => t('Debug'),
|
18
|
'description' => t('Debug and development options.'),
|
19
|
);
|
20
|
$groups['variable'] = array(
|
21
|
'title' => t('Variable'),
|
22
|
'description' => t('Variables that contain metadata about the variable system.'),
|
23
|
);
|
24
|
return $groups;
|
25
|
}
|
26
|
|
27
|
/**
|
28
|
* Implements hook_variable_type_info().
|
29
|
*/
|
30
|
function variable_variable_type_info() {
|
31
|
// Array of values
|
32
|
$type['array'] = array(
|
33
|
'title' => t('Array'),
|
34
|
'element' => array('#type' => 'fieldset', '#tree' => TRUE),
|
35
|
// Properties for each array item
|
36
|
'repeat' => array(
|
37
|
'element' => array('#type' => 'textfield'),
|
38
|
),
|
39
|
'format callback' => 'variable_format_array',
|
40
|
'element callback' => 'variable_form_element_array',
|
41
|
'default' => array(),
|
42
|
);
|
43
|
// Array whose keys are named properties.
|
44
|
$type['properties'] = array(
|
45
|
'title' => t('Properties'),
|
46
|
'format callback' => 'variable_format_properties',
|
47
|
'type' => 'array',
|
48
|
);
|
49
|
// TRUE / FALSE value, checkbox
|
50
|
$type['boolean'] = array(
|
51
|
'title' => t('Boolean'),
|
52
|
'element' => array('#type' => 'checkbox'),
|
53
|
'format callback' => 'variable_format_boolean',
|
54
|
);
|
55
|
// Default type for variables with no other type
|
56
|
$type['default'] = array(
|
57
|
'title' => t('Default'),
|
58
|
'element' => array('#type' => 'textfield'),
|
59
|
'access' => 'administer site configuration',
|
60
|
);
|
61
|
// Enable/Disable
|
62
|
$type['enable'] = array(
|
63
|
'title' => t('Enable'),
|
64
|
'options' => array(t('Disabled'), t('Enabled')),
|
65
|
'default' => 0,
|
66
|
'element' => array('#type' => 'radios'),
|
67
|
'format callback' => 'variable_format_selection',
|
68
|
);
|
69
|
// Multiple variable that will spawn into multiple elements
|
70
|
$type['multiple'] = array(
|
71
|
'title' => t('Multiple'),
|
72
|
'element' => array('#type' => 'fieldset'),
|
73
|
'build callback' => 'variable_build_multiple',
|
74
|
'format callback' => 'variable_format_multiple',
|
75
|
'element callback' => 'variable_form_element_multiple',
|
76
|
'value callback' => 'variable_multiple_get_value',
|
77
|
'default callback' => 'variable_multiple_get_default',
|
78
|
);
|
79
|
$type['mail_address'] = array(
|
80
|
'title' => t('E-mail address'),
|
81
|
'element' => array('#type' => 'textfield'),
|
82
|
'token' => TRUE,
|
83
|
);
|
84
|
$type['mail_text'] = array(
|
85
|
'title' => t('Mail text'),
|
86
|
'multiple' => array('subject' => t('Subject'), 'body' => t('Body')),
|
87
|
'build callback' => 'variable_build_mail_text',
|
88
|
'localize' => TRUE,
|
89
|
'type' => 'multiple',
|
90
|
);
|
91
|
$type['number'] = array(
|
92
|
'title' => t('Number'),
|
93
|
'element' => array('#type' => 'textfield', '#size' => 15, '#maxlength' => 10),
|
94
|
'token' => TRUE,
|
95
|
'validate callback' => 'variable_validate_number',
|
96
|
'format callback' => 'variable_format_number',
|
97
|
);
|
98
|
// Select multiple options from multiple choices
|
99
|
$type['options'] = array(
|
100
|
'title' => t('Options'),
|
101
|
'options' => TRUE,
|
102
|
'element' => array('#type' => 'checkboxes'),
|
103
|
'element callback' => 'variable_form_element_options',
|
104
|
'format callback' => 'variable_format_options',
|
105
|
);
|
106
|
// Select single option from multiple choices
|
107
|
$type['select'] = array(
|
108
|
'title' => t('Select'),
|
109
|
'options' => TRUE,
|
110
|
// This will become radios or drop-down depending on the number of options
|
111
|
'element callback' => 'variable_form_element_options',
|
112
|
'format callback' => 'variable_format_selection',
|
113
|
);
|
114
|
// Select number from array of values. Options array that can be list of numbers will be converted to a value => value
|
115
|
$type['select_number'] = array(
|
116
|
'title' => t('Select'),
|
117
|
'options' => TRUE,
|
118
|
'element callback' => 'variable_form_element_options',
|
119
|
'options callback' => 'variable_options_select_number',
|
120
|
);
|
121
|
$type['string'] = array(
|
122
|
'title' => t('String'),
|
123
|
'element' => array('#type' => 'textfield'),
|
124
|
'localize' => TRUE,
|
125
|
'format callback' => 'variable_format_string',
|
126
|
'token' => TRUE,
|
127
|
// This type may have an 'allowed tags' attribute.
|
128
|
// If empty it will be formatted as plain text
|
129
|
'allowed tags' => array(),
|
130
|
);
|
131
|
$type['text'] = array(
|
132
|
'title' => t('Text'),
|
133
|
'element' => array('#type' => 'textarea'),
|
134
|
'localize' => TRUE,
|
135
|
'format callback' => 'variable_format_text',
|
136
|
'token' => TRUE,
|
137
|
// This type may have an 'allowed tags' attribute.
|
138
|
// If empty it will be formatted with filter_xss_admin.
|
139
|
'allowed tags' => array(),
|
140
|
);
|
141
|
// Default type for variables with no other type
|
142
|
$type['unknown'] = array(
|
143
|
'title' => t('Unknown'),
|
144
|
'access' => 'administer site configuration',
|
145
|
'format' => 'variable_format_unknown',
|
146
|
'element callback' => 'variable_form_element_unknown',
|
147
|
'element' => array('#type' => 'item'),
|
148
|
);
|
149
|
$type['url'] = array(
|
150
|
'title' => t('URL'),
|
151
|
'element' => array('#type' => 'textfield', '#size' => 80, '#maxlength' => 255),
|
152
|
'token' => TRUE,
|
153
|
);
|
154
|
$type['mail_part'] = array(
|
155
|
'title' => t('Mail parts'),
|
156
|
'options' => array('subject' => t('Subject'), 'body' => t('Body')),
|
157
|
);
|
158
|
$type['text_format'] = array(
|
159
|
'title' => t('Formatted text'),
|
160
|
'element' => array('#type' => 'text_format'),
|
161
|
'element callback' => 'variable_form_element_text_format',
|
162
|
'format callback' => 'variable_format_text_format',
|
163
|
'default callback' => 'variable_text_format_default',
|
164
|
'localize' => TRUE,
|
165
|
);
|
166
|
return $type;
|
167
|
}
|
168
|
|
169
|
/**
|
170
|
* Build multiple mail variable
|
171
|
*/
|
172
|
function variable_build_mail_text($variable, $options = array()) {
|
173
|
$name = str_replace('[mail_part]', '', $variable['name']);
|
174
|
// For mail text, children have different types
|
175
|
$variable['children'][$name . 'subject']['type'] = 'string';
|
176
|
$variable['children'][$name . 'body']['type'] = 'text';
|
177
|
$variable = variable_build_multiple($variable, $options);
|
178
|
return $variable;
|
179
|
}
|
180
|
|
181
|
/**
|
182
|
* Format select variable
|
183
|
*/
|
184
|
function variable_format_selection($variable, $options = array()) {
|
185
|
$variable = variable_build_options($variable, $options);
|
186
|
if (isset($variable['value'])) {
|
187
|
return isset($variable['options'][$variable['value']]) ? $variable['options'][$variable['value']] : '<' . t('Invalid option') . '>';
|
188
|
}
|
189
|
else {
|
190
|
return variable_format_empty($variable);
|
191
|
}
|
192
|
}
|
193
|
|
194
|
/**
|
195
|
* Format options variable. Value is an array of options.
|
196
|
*/
|
197
|
function variable_format_options($variable, $options = array()) {
|
198
|
$variable = variable_build_options($variable, $options);
|
199
|
$names = array();
|
200
|
if (isset($variable['value']) && $variable['value']) {
|
201
|
if (is_array($variable['value'])) {
|
202
|
foreach ($variable['value'] as $index => $value) {
|
203
|
$names[$index] = isset($variable['options'][$value]) ? $variable['options'][$value] : '<' . t('Invalid option') . '>';
|
204
|
}
|
205
|
return implode(', ', $names);
|
206
|
}
|
207
|
else {
|
208
|
return '<' . t('Invalid value') . '>';
|
209
|
}
|
210
|
}
|
211
|
else {
|
212
|
return variable_format_empty($variable);
|
213
|
}
|
214
|
}
|
215
|
|
216
|
/**
|
217
|
* Format array variable, handling nested arrays
|
218
|
*/
|
219
|
function variable_format_array($variable = NULL, $options = array()) {
|
220
|
if (empty($variable['value'])) {
|
221
|
return variable_format_empty($variable);
|
222
|
}
|
223
|
else {
|
224
|
$list = array();
|
225
|
foreach ($variable['value'] as $index => $item) {
|
226
|
if (is_array($item) || is_object($item)) {
|
227
|
$list[$index] = variable_format_array(array('value' => (array)$item), $options);
|
228
|
}
|
229
|
else {
|
230
|
$list[$index] = check_plain((string)$item);
|
231
|
}
|
232
|
}
|
233
|
return theme('item_list', array('items' => $list));
|
234
|
}
|
235
|
}
|
236
|
/**
|
237
|
* Format array variable with known keys, handling nested arrays
|
238
|
*/
|
239
|
function variable_format_properties($variable = NULL, $options = array()) {
|
240
|
if (empty($variable['value'])) {
|
241
|
return variable_format_empty($variable);
|
242
|
}
|
243
|
else {
|
244
|
$rows = array();
|
245
|
foreach ($variable['value'] as $name => $item) {
|
246
|
$title = check_plain((string)$name);
|
247
|
if (is_array($item) || is_object($item)) {
|
248
|
$value = variable_format_array(array('value' => (array)$item), $options);
|
249
|
}
|
250
|
else {
|
251
|
$value = check_plain((string)$item);
|
252
|
}
|
253
|
$rows[] = array('<em>' . $title . '</em>', $value);
|
254
|
}
|
255
|
return theme('table', array('rows' => $rows));
|
256
|
}
|
257
|
}
|
258
|
|
259
|
/**
|
260
|
* Format boolean variable
|
261
|
*/
|
262
|
function variable_format_boolean($variable, $options = array()) {
|
263
|
if (isset($variable['value'])) {
|
264
|
return $variable['value'] ? t('True') : t('False');
|
265
|
}
|
266
|
else {
|
267
|
return t('Undefined');
|
268
|
}
|
269
|
}
|
270
|
|
271
|
/**
|
272
|
* Format variable empty value
|
273
|
*/
|
274
|
function variable_format_empty($variable) {
|
275
|
return isset($variable['empty']) ? $variable['empty'] : t('Empty');
|
276
|
}
|
277
|
|
278
|
/**
|
279
|
* Format variable as number.
|
280
|
*/
|
281
|
function variable_format_number($variable, $options = array()) {
|
282
|
if (is_numeric($variable['value'])) {
|
283
|
return (string)$variable['value'];
|
284
|
}
|
285
|
elseif (empty($variable['value'])) {
|
286
|
return '';
|
287
|
}
|
288
|
else {
|
289
|
return check_plain($variable['value']);
|
290
|
}
|
291
|
}
|
292
|
|
293
|
/**
|
294
|
* Format variable as string. Either check plain for filter_xss.
|
295
|
*/
|
296
|
function variable_format_string($variable, $options = array()) {
|
297
|
if (empty($variable['value'])) {
|
298
|
return '';
|
299
|
}
|
300
|
elseif (!empty($variable['allowed tags'])) {
|
301
|
return filter_xss($variable['value'], $variable['allowed tags']);
|
302
|
}
|
303
|
else {
|
304
|
return check_plain($variable['value']);
|
305
|
}
|
306
|
}
|
307
|
|
308
|
/**
|
309
|
* Format text variable
|
310
|
*/
|
311
|
function variable_format_text($variable, $options = array()) {
|
312
|
if (empty($variable['value'])) {
|
313
|
return '';
|
314
|
}
|
315
|
elseif (!empty($variable['allowed tags'])) {
|
316
|
return filter_xss($variable['value'], $variable['allowed tags']);
|
317
|
}
|
318
|
else {
|
319
|
return filter_xss_admin($variable['value']);
|
320
|
}
|
321
|
}
|
322
|
|
323
|
/**
|
324
|
* Options callback for numeric select
|
325
|
*/
|
326
|
function variable_options_select_number($variable, $options = array()) {
|
327
|
return drupal_map_assoc($variable['options']);
|
328
|
}
|
329
|
|
330
|
/**
|
331
|
* Default callback for text_format.
|
332
|
*/
|
333
|
function variable_text_format_default($variable, $options = array()) {
|
334
|
$out = array(
|
335
|
'value' => '',
|
336
|
'format' => filter_default_format(),
|
337
|
);
|
338
|
if (!empty($variable['default'])) {
|
339
|
if (is_string($variable['default'])) {
|
340
|
$out['value'] = $variable['default'];
|
341
|
}
|
342
|
elseif (is_array($variable['default'])) {
|
343
|
if (isset($variable['default']['value'])) {
|
344
|
$out['value'] = $variable['default']['value'];
|
345
|
}
|
346
|
if (isset($variable['default']['format'])) {
|
347
|
$out['format'] = $variable['default']['format'];
|
348
|
}
|
349
|
}
|
350
|
}
|
351
|
return $out;
|
352
|
}
|
353
|
|
354
|
/**
|
355
|
* Format text_format.
|
356
|
*/
|
357
|
function variable_format_text_format($variable, $options = array()) {
|
358
|
return check_markup($variable['value']['value'], $variable['value']['format']);
|
359
|
}
|
360
|
|
361
|
/**
|
362
|
* Format multiple variable.
|
363
|
*/
|
364
|
function variable_format_multiple($variable, $options = array()) {
|
365
|
$rows = array();
|
366
|
foreach ($variable['children'] as $name => $child) {
|
367
|
$rows[$name] = array(
|
368
|
array('data' => check_plain($child['title']), 'header' => TRUE),
|
369
|
variable_format_value($child)
|
370
|
);
|
371
|
}
|
372
|
return theme('table', array('rows' => $rows));
|
373
|
}
|
374
|
|
375
|
/**
|
376
|
* Validate numeric variable.
|
377
|
*/
|
378
|
function variable_validate_number($variable) {
|
379
|
if (!is_numeric($variable['value'])) {
|
380
|
return t('The value is not a number.');
|
381
|
}
|
382
|
}
|