| 1 |
<?php
|
| 2 |
// $Id: formfilter.module,v 1.8 2008/11/03 05:01:25 davidlesieur Exp $
|
| 3 |
|
| 4 |
/**
|
| 5 |
* Array of form element types for which filtering is supported.
|
| 6 |
*/
|
| 7 |
function formfilter_supported_types() {
|
| 8 |
return array('button', 'fieldset', 'select', 'textfield', 'checkbox', 'checkboxes', 'radio', 'radios', 'textarea', 'item', 'file', 'weight', 'markup');
|
| 9 |
}
|
| 10 |
|
| 11 |
/**
|
| 12 |
* Filter a form so the requested elements are invisible (passed as values).
|
| 13 |
*
|
| 14 |
* @param $form
|
| 15 |
* A reference to the form to be altered.
|
| 16 |
* @param $filters
|
| 17 |
* An array of elements to make invisible in the form, each element in turn being
|
| 18 |
* an array of form keys corresponding to the path of the element in the form
|
| 19 |
* structure. For example, to hide the element $form['comment_filter']['format']
|
| 20 |
* from $form, you could call this function as follows:
|
| 21 |
* formfilter_filter_form($form, array(array('comment_filter', 'format')));
|
| 22 |
* @param $inverse
|
| 23 |
* If TRUE, all elements except the ones given in $filters will become
|
| 24 |
* invisible. This defaults to FALSE.
|
| 25 |
*/
|
| 26 |
function formfilter_filter_form(&$form, $filters, $inverse = FALSE) {
|
| 27 |
// Iterate through filters.
|
| 28 |
$filtered = array();
|
| 29 |
foreach ($filters as $filter) {
|
| 30 |
_formfilter_filter_form($form, $filter, $inverse);
|
| 31 |
$filtered[] = $filter[0];
|
| 32 |
}
|
| 33 |
if ($inverse) {
|
| 34 |
foreach (element_children($form) as $key) {
|
| 35 |
if (!in_array($key, $filtered)) {
|
| 36 |
_formfilter_filter_element($form[$key]);
|
| 37 |
}
|
| 38 |
}
|
| 39 |
}
|
| 40 |
}
|
| 41 |
|
| 42 |
/**
|
| 43 |
* Apply filtering to a form.
|
| 44 |
*/
|
| 45 |
function _formfilter_filter_form(&$form, $filter, $inverse) {
|
| 46 |
// Iterate through form elements.
|
| 47 |
foreach (element_children($form) as $key) {
|
| 48 |
// Determine if there are further levels of nesting.
|
| 49 |
if ($filter[0] == $key) {
|
| 50 |
// If not, send the element for filtering.
|
| 51 |
if (count($filter) == 1) {
|
| 52 |
if ($inverse) {
|
| 53 |
continue;
|
| 54 |
}
|
| 55 |
else {
|
| 56 |
_formfilter_filter_element($form[$key]);
|
| 57 |
}
|
| 58 |
}
|
| 59 |
// If so, go one level deeper in the nested array.
|
| 60 |
else {
|
| 61 |
if ($inverse) {
|
| 62 |
_formfilter_filter_element($form[$key], FALSE);
|
| 63 |
}
|
| 64 |
array_shift($filter);
|
| 65 |
_formfilter_filter_form($form[$key], $filter, $inverse);
|
| 66 |
}
|
| 67 |
break;
|
| 68 |
}
|
| 69 |
elseif ($inverse) {
|
| 70 |
_formfilter_filter_element($form[$key]);
|
| 71 |
}
|
| 72 |
}
|
| 73 |
}
|
| 74 |
|
| 75 |
/**
|
| 76 |
* Filter a form element.
|
| 77 |
*/
|
| 78 |
function _formfilter_filter_element(&$element, $recurse = TRUE) {
|
| 79 |
// Don't filter unsupported types. If no type is set, however, we do filter.
|
| 80 |
if ($element['#type'] && !in_array($element['#type'], formfilter_supported_types())) {
|
| 81 |
return;
|
| 82 |
}
|
| 83 |
|
| 84 |
// Read in values. Bail if filtering conditions not met.
|
| 85 |
switch ($element['#type']) {
|
| 86 |
case 'fieldset':
|
| 87 |
case 'button':
|
| 88 |
case 'item':
|
| 89 |
case 'file':
|
| 90 |
case 'markup':
|
| 91 |
break;
|
| 92 |
case 'select':
|
| 93 |
case 'checkboxes':
|
| 94 |
case 'radios':
|
| 95 |
$value = isset($element['#default_value']) ? $element['#default_value'] : key($element['#options']);
|
| 96 |
break;
|
| 97 |
case 'weight':
|
| 98 |
$value = isset($element['#default_value']) ? $element['#default_value'] : 0;
|
| 99 |
break;
|
| 100 |
case 'checkbox':
|
| 101 |
case 'radio':
|
| 102 |
// TBD: Why doesn't passing values work for checkbox elements?
|
| 103 |
//$value = isset($element['#default_value']) ? $element['#default_value'] : $element['#return_value'];
|
| 104 |
//break;
|
| 105 |
// For now, pass them as hidden elements.
|
| 106 |
$element['#type'] = 'hidden';
|
| 107 |
$element['#value'] = isset($element['#default_value']) ? $element['#default_value'] : $element['#return_value'];
|
| 108 |
return;
|
| 109 |
case 'textfield':
|
| 110 |
case 'textarea':
|
| 111 |
$value = isset($element['#default_value']) ? $element['#default_value'] : NULL;
|
| 112 |
if (!$value && $element['#required']) {
|
| 113 |
return;
|
| 114 |
}
|
| 115 |
break;
|
| 116 |
}
|
| 117 |
// Unset unneeded keys. We don't simply redefine the arrays as they may have
|
| 118 |
// nested form elements (element_children).
|
| 119 |
foreach (element_properties($element) as $key) {
|
| 120 |
switch ($key) {
|
| 121 |
case '#tree':
|
| 122 |
continue;
|
| 123 |
default:
|
| 124 |
unset($element[$key]);
|
| 125 |
}
|
| 126 |
}
|
| 127 |
// Set final form of array.
|
| 128 |
if ($value) {
|
| 129 |
$element += array(
|
| 130 |
'#type' => 'value',
|
| 131 |
'#value' => $value,
|
| 132 |
);
|
| 133 |
}
|
| 134 |
// Convert child elements.
|
| 135 |
if ($recurse) {
|
| 136 |
foreach (element_children($element) as $key) {
|
| 137 |
_formfilter_filter_element($element[$key]);
|
| 138 |
}
|
| 139 |
}
|
| 140 |
}
|