'admin/settings/filterbynodetype', 'title' => t('Input filter node types'), 'callback' => 'drupal_get_form', 'callback arguments' => array('filterbynodetype_settings'), 'weight' => 2, 'access' => user_access('administer filters'), ); } return $items; } /** * Implementation of hook_form_alter */ function filterbynodetype_form_alter($form_id, &$form) { if (isset($form['type']) && 'node-form' == $form['#id']) { $type = $form['type']['#value']; // process body if (isset($form['body_filter'])) { _filterbynodetype_form_alter_helper($type, $form['body_filter']['format'], 'body_filter'); } // process cck text fields if (module_exists('content') && module_exists('text')) { $fields = db_query("SELECT field_name FROM {node_field_instance} WHERE type_name = '$type' AND widget_type = 'text';"); while($field = db_fetch_object($fields)) { foreach (element_children($form[$field->field_name]) as $element) { if (isset($form[$field->field_name][$element]['format'])) { _filterbynodetype_form_alter_helper($type, $form[$field->field_name][$element]['format'], $field->field_name); } } } } } } // helper function for filterbynodetype_form_alter() function _filterbynodetype_form_alter_helper($type, &$formats, $form_elt_name) { foreach (element_children($formats) as $element) { if (! variable_get('filterbynodetype_' . $formats[$element]['#return_value'] . '_' . $type, 1)) { unset($formats[$element]); } } if (2 == count(element_children($formats))) { // 1 format and 1 extra item for the link // We don't know what the IDs are of the two fields, so we have to iterate to get them. foreach (element_children($formats) as $element) { if (isset($formats[$element]['#title'])) { $formats['#access'] = false; $formats[$element]['#default_value'] = $element; } } } elseif (1 == count(element_children($formats))) { // 1 extra item for the link, which means there's no filters left // Do nothing. The form becomes unsubmittable all on its own. } else { // check if the default input format has not been removed, and then set the first one as default $default_filter = variable_get('filter_default_format',0); if (!isset($formats[$default_filter])) { $num = false; foreach (element_children($formats) as $element) { if (isset($formats[$element]['#title'])) { if (!$num) $num = $element; $formats[$element]['#default_value'] = $num; } } } } } function filterbynodetype_settings() { $form = array(); $types = node_get_types(); $formats = filter_formats(); // Switch around to be filter-first. Row-major order foreach ($formats as $format) { $form['format_' . $format->format] = array( '#type' => 'fieldset', '#title' => t($format->name), '#collapsible' => TRUE, '#collapsed' => FALSE, '#tree' => FALSE, ); foreach ($types as $type) { $form['format_' . $format->format]['filterbynodetype_' . $format->format . '_' . $type->type] = array( '#type' => 'checkbox', '#title' => t($type->name), '#default_value' => variable_get('filterbynodetype_' . $format->format . '_' . $type->type, 1), ); } } return system_settings_form($form); } function theme_filterbynodetype_settings($form) { $output = ''; $header = array(''); $rows = array(); $first = TRUE; foreach (element_children($form) as $fieldset) { if ('fieldset' != $form[$fieldset]['#type']) continue; // Skip non-fieldset elements $row = array($form[$fieldset]['#title']); // The fieldset titles become row labels foreach (element_children($form[$fieldset]) as $element) { if ($first) { $header[] = $form[$fieldset][$element]['#title']; } $form[$fieldset][$element]['#title'] = ''; // It's already in the header, so we don't need it here $row[] = drupal_render($form[$fieldset][$element]); } $rows[] = $row; $first = FALSE; unset($form[$fieldset]); // Ensure that we don't render the empty fieldset } $output = theme('table', $header, $rows); $output .= drupal_render($form); return $output; }