'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']; $formats =& $form['body_filter']['format']; foreach (element_children($formats) as $element) { if (! variable_get('filterbynodetype_' . $formats[$element]['#return_value'] . '_' . $type, 1)) { unset($formats[$element]); } } if (count(element_children($formats)) <= 2) { // 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'])) { // This is a filter, so we assign it to the filter set as the only option. $formats[$element] = array( '#type' => 'value', '#value' => $element, '#parents' => $formats[$element]['#parents'], ); $formats['format'] = array( // I have no idea why it uses this structure, but this is what filter.module does. '#type' => 'item', '#description' => $formats[$element]['#description'], ); foreach (element_properties($formats) as $element) { unset($formats[$element]); } } } } if (module_exists('content') && module_exists('text')) { $fields = db_query("SELECT field_name FROM {node_field_instance} WHERE type_name = '%s' AND widget_type = 'text';",$type); while($field = db_fetch_object($fields)) { foreach (element_children($form[$field->field_name]) as $element) { if (isset($form[$field->field_name][$element]['format'])) { $form[$field->field_name][$element]['format'] = $formats; } } } } } } 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; }