'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 = '%s' AND widget_type = '%s'",$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_add_filter($type, $form[$field->field_name][$element]['format'], $field->field_name, $form); } } } } } } /** * Adds the input filter chooser to a CCK text field */ function _filterbynodetype_form_alter_add_filter($type, &$formats, $form_elt_name, &$form) { 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; } else { // It's the guidelines text. $form['body_filter']['format']['guidelines_link'] = array( '#value' => $formats[$element]['#value'], ); } } } 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; } else { // It's the guidelines text. $form['body_filter']['format']['guidelines_link'] = array( '#value' => $formats[$element]['#value'], ); } } } } } 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; }