View source
<?php
function formfilter_menu($may_cache) {
$items = array();
if ($may_cache) {
$items[] = array(
'path' => 'admin/settings/formfilter',
'title' => t('Form Filter'),
'description' => t('Select what filtering to apply.'),
'callback' => 'drupal_get_form',
'callback arguments' => array(
'formfilter_admin_settings',
),
'access' => user_access('administer site configuration'),
);
}
return $items;
}
function formfilter_perm() {
return array(
'administer form filters',
'view forms without filtering',
);
}
function formfilter_admin_settings() {
$form = array();
$form['formfilter_ui'] = array(
'#type' => 'checkbox',
'#title' => t('Filtering UI'),
'#description' => t('Check this option to provide a link, <em>Filter this form</em> at the bottom of every form (for users with the <em>administer form filters</em> permission). Clicking the link will bring up a version of the form with checkboxes for filtering (hiding) unwanted elements.'),
'#default_value' => variable_get('formfilter_ui', 1),
);
$form['formfilter_simplify_node'] = array(
'#type' => 'radios',
'#title' => t('Simplify node form'),
'#default_value' => variable_get('formfilter_simplify_node', 0),
'#options' => array(
t('Disabled'),
t('Enabled'),
),
'#description' => t('Simplify the node form by pulling the <em>Promote</em> and <em>Sticky</em> options out of fieldsets and then putting all the fieldsets in one <em>Advanced options</em> fieldset.'),
);
return system_settings_form($form);
}
function formfilter_form_alter($form_id, &$form) {
global $user;
$filters = variable_get('formfilter', array());
if (variable_get('formfilter_ui', 1) && user_access('administer form filters')) {
if ($form_id == 'comment_form' && variable_get('comment_preview', COMMENT_PREVIEW_REQUIRED) == COMMENT_PREVIEW_REQUIRED) {
return;
}
if ($form_id == $_REQUEST['formfilter_id']) {
$form['formfilter'] = array(
'#type' => 'tree',
);
_formfilter_add_selectors($form, array_key_exists($form_id, $filters) ? $filters[$form_id] : NULL);
$form['#formfilter_id'] = $form_id;
$form['#validate']['formfilter_form_validate'] = array();
}
else {
$form['#suffix'] .= '<div>' . l(t('Filter this form'), $_GET['q'], array(), 'formfilter_id=' . $form_id) . '</div>';
if (array_key_exists($form_id, $filters) && user_access('view forms without filtering') && !$_REQUEST['formfilter_preview']) {
$form['#suffix'] .= '<div>' . l(t('Preview a filtered version of this form'), $_GET['q'], array(), 'formfilter_preview=1') . '</div>';
}
}
}
if (!$_REQUEST['formfilter_id'] && array_key_exists($form_id, $filters) && (!user_access('view forms without filtering') || $_REQUEST['formfilter_preview'])) {
$form_filters = array();
foreach (array_keys($filters[$form_id]) as $filter) {
$form_filters[] = explode('|', $filter);
}
if ($_REQUEST['formfilter_preview']) {
drupal_set_message(t('Previewing filtered version of form.'));
}
formfilter_filter_form($form, $form_filters);
}
if (variable_get('formfilter_simplify_node', 0) && isset($form['type']) && $form['type']['#value'] . '_node_form' == $form_id) {
if ($form['body_filter']) {
if ($form['options']) {
foreach (array(
'promote',
'sticky',
) as $key) {
if ($form['options'][$key]) {
$form['body_filter'][$key] = $form['options'][$key];
unset($form['options'][$key]);
}
}
}
}
$form['advanced'] = array(
'#type' => 'fieldset',
'#title' => t('Advanced options'),
'#collapsible' => TRUE,
'#collapsed' => TRUE,
);
foreach (element_children($form) as $key) {
if (!in_array($key, array(
'advanced',
'taxonomy',
)) && $form[$key]['#type'] && $form[$key]['#type'] == 'fieldset') {
$form['advanced'][$key] = $form[$key];
unset($form[$key]);
}
}
if (!count(element_children($form['advanced']))) {
unset($form['advanced']);
}
}
}
function formfilter_form_validate($form_id, $form_values, $form) {
$filters = variable_get('formfilter', array());
$filters[$form_id] = array_filter($_REQUEST['edit']['formfilter']);
variable_set('formfilter', $filters);
drupal_set_message(t('Form filtering registered.'));
drupal_goto($_GET['q']);
}
function _formfilter_add_selectors(&$form, $filters = NULL, $keys = array()) {
foreach (element_children($form) as $key) {
$keys[] = $key;
unset($form[$key]['#required']);
if (isset($form[$key]['#type']) && in_array($form[$key]['#type'], formfilter_supported_types())) {
$form[$key]['#suffix'] .= '<div>' . t('Hide %title:', array(
'%title' => isset($form[$key]['#title']) ? $form[$key]['#title'] : $key,
)) . ' <input type="checkbox" name="edit[formfilter][' . implode('|', $keys) . ']" value="1"' . ($filters && $filters[implode('|', $keys)] ? ' checked="checked" ' : ' ') . '/></div>';
}
_formfilter_add_selectors($form[$key], $filters, $keys);
unset($keys[array_search($key, $keys)]);
}
}
function formfilter_supported_types() {
return array(
'button',
'fieldset',
'select',
'textfield',
'checkbox',
'checkboxes',
'radio',
'radios',
'textarea',
'item',
'file',
'weight',
'markup',
);
}
function formfilter_filter_form(&$form, $filters, $inverse = FALSE) {
$filtered = array();
foreach ($filters as $filter) {
_formfilter_filter_form($form, $filter, $inverse);
$filtered[] = $filter[0];
}
if ($inverse) {
foreach (element_children($form) as $key) {
if (!in_array($key, $filtered)) {
_formfilter_filter_element($form[$key]);
}
}
}
}
function _formfilter_filter_form(&$form, $filter, $inverse) {
foreach (element_children($form) as $key) {
if ($filter[0] == $key) {
if (count($filter) == 1) {
if ($inverse) {
continue;
}
else {
_formfilter_filter_element($form[$key]);
}
}
else {
if ($inverse) {
_formfilter_filter_element($form[$key], FALSE);
}
array_shift($filter);
_formfilter_filter_form($form[$key], $filter, $inverse);
}
break;
}
elseif ($inverse) {
_formfilter_filter_element($form[$key]);
}
}
}
function _formfilter_filter_element(&$element, $recurse = TRUE) {
if ($element['#type'] && !in_array($element['#type'], formfilter_supported_types())) {
return;
}
switch ($element['#type']) {
case 'fieldset':
case 'button':
case 'item':
case 'file':
case 'markup':
break;
case 'select':
case 'checkboxes':
case 'radios':
$value = isset($element['#default_value']) ? $element['#default_value'] : key($element['#options']);
break;
case 'weight':
$value = isset($element['#default_value']) ? $element['#default_value'] : 0;
break;
case 'checkbox':
case 'radio':
$element['#type'] = 'hidden';
$element['#value'] = isset($element['#default_value']) ? $element['#default_value'] : $element['#return_value'];
return;
case 'textfield':
case 'textarea':
$value = isset($element['#default_value']) ? $element['#default_value'] : NULL;
if (!$value && $element['#required']) {
return;
}
break;
}
foreach (element_properties($element) as $key) {
switch ($key) {
case '#tree':
continue;
default:
unset($element[$key]);
}
}
if ($value) {
$element += array(
'#type' => 'value',
'#value' => $value,
);
}
if ($recurse) {
foreach (element_children($element) as $key) {
_formfilter_filter_element($element[$key]);
}
}
}