array( 'title' => t('Administer content type defaults'), 'description' => t('Set the default settings to use on content types that are not overridden.'), ), CONTENT_TYPE_EXTRAS_NODE_DISPLAY_PERM => array( 'title' => t('Override content type title display'), 'description' => t('Allow the default node title display setting to be overridden on a per-node basis.'), ), ); } /** * Implements hook_preprocess_page(). */ function content_type_extras_preprocess_page(&$vars) { // We have to check for the front page first since it's setting take precedence // over the node type setting. if (drupal_is_front_page()) { $hide_title_front = content_type_extras_get_default('content_type_extras_title_hide_front'); if ($hide_title_front) { $hide_title_css = content_type_extras_get_default('content_type_extras_title_hide_css'); if ($hide_title_css) { $vars['title_prefix']['content_type_extras'] = array( '#prefix' => '
', ); $vars['title_suffix']['content_type_extras'] = array( '#suffix' => '
', ); } else { $vars['title'] = ''; } } } elseif (!empty($vars['node'])) { // Ran into an issue when using the Print module where the node type isn't set, throwing an error // so we are checking to see if the node type is set first $hide_title = isset($vars['node']->type) ? content_type_extras_get_setting('content_type_extras_title_hide', $vars['node']->type) : ''; if ($hide_title) { $hide_title_css = content_type_extras_get_default('content_type_extras_title_hide_css'); if ($hide_title_css) { $vars['title_prefix']['content_type_extras'] = array( '#prefix' => '
', ); $vars['title_suffix']['content_type_extras'] = array( '#suffix' => '
', ); } else { $vars['title'] = ''; } } } } /** * Implements hook_menu(). */ function content_type_extras_menu() { $items['admin/structure/types/defaults'] = array( 'title' => 'Default settings', 'page callback' => 'drupal_get_form', 'page arguments' => array('content_type_extras_settings'), 'access arguments' => array(CONTENT_TYPE_EXTRAS_ADMIN_DEFAULTS), 'type' => MENU_LOCAL_TASK, 'file' => 'content_type_extras.admin.inc', 'file path' => drupal_get_path('module', 'content_type_extras') . '/includes', 'weight' => 10, ); return $items; } /** * Implements hook_form_alter(). */ function content_type_extras_form_alter(&$form, &$form_state, $form_id) { // This is a list of node form ids to omit from being processed, since they don't // play nice with content_type_extras. $exclude_node_form = content_type_extras_get_setting('content_type_extras_excluded_node_forms', ''); // These forms are known to cause issues so always include them in the excluded forms. $exclude_node_form[] = 'subscriptions_ui_node_form'; $exclude_node_form[] = 'field_collection_item_form'; // node_type_form = Content type edit forms. if ($form_id == 'node_type_form') { module_load_include('inc', 'content_type_extras', 'includes/content_type_extras.node_type_form'); content_type_extras_node_type_form($form); } // Viewing a specific node edit form elseif (strpos($form_id, '_node_form') && !in_array($form_id, $exclude_node_form)) { $type = $form['type']['#value']; // We need to check to see if auto_nodetitle module is hiding the title field - checking for $form['title']['#value'] != 'ant' // Also, for compatibility with auto_entitytitle module we check for $form['title']['#value'] != '%AutoEntityLabel%' if (user_access(CONTENT_TYPE_EXTRAS_NODE_DISPLAY_PERM) && (isset($form['title']['#value']) && $form['title']['#value'] != 'ant' && $form['title']['#value'] != '%AutoEntityLabel%')) { $hide = content_type_extras_get_setting('content_type_extras_title_hide', $type); if (!empty($form['nid']['#value'])) { $hide = _content_type_extras_get_node_display($form['nid']['#value']); } $form['title_hide'] = array( '#type' => 'checkbox', '#title' => t("Exclude this node's title from display"), '#default_value' => $hide, '#weight' => 0, ); if (variable_get('site_frontpage', '') . '/edit' == current_path()) { // We need to get the default settings since that is the only place that // the hide_title_front setting is stored. $defaults = content_type_extras_get_default(); if (!empty($defaults['extras']['title_hide_front'])) { $form['title_hide']['#disabled'] = TRUE; $form['title_hide']['#description'] = t('You cannot edit this option as it is set as the front page and the front page title is set to be hidden by the administrator.'); } } } $title_label = content_type_extras_get_setting('title_label', $type); if (isset($title_label) && $title_label != t('Title')) { $form['title']['#title'] = $title_label; } $form['actions']['submit']['#value'] = content_type_extras_get_setting('content_type_extras_save_button', $type); $save_and_new = content_type_extras_get_setting('content_type_extras_save_and_new', $type); if (!empty($save_and_new)) { $form['actions']['save_and_new'] = array( '#type' => 'submit', '#value' => content_type_extras_get_setting('content_type_extras_save_and_new_button', $type), '#weight' => $form['actions']['submit']['#weight'] + 1, '#submit' => array( 'node_form_submit', 'content_type_extras_node_form_new_submit', ), ); } $save_and_edit = content_type_extras_get_setting('content_type_extras_save_and_edit', $type); if (!empty($save_and_edit)) { $form['actions']['save_and_edit'] = array( '#type' => 'submit', '#value' => content_type_extras_get_setting('content_type_extras_save_and_edit_button', $type), '#weight' => $form['actions']['submit']['#weight'] + 2, '#submit' => array( 'node_form_submit', 'content_type_extras_node_form_edit_submit', ), ); } $preview = content_type_extras_get_setting('node_preview', $type); if (!empty($preview)) { $form['actions']['preview']['#value'] = content_type_extras_get_setting('content_type_extras_preview_button', $type); } elseif (isset($form['actions']['preview'])) { unset($form['actions']['preview']); } $cancel = content_type_extras_get_setting('content_type_extras_cancel', $type); if (!empty($cancel)) { $cancel_hide_warning = content_type_extras_get_setting('content_type_extras_cancel_hide_warning', $type); $cancel_location = content_type_extras_get_setting('content_type_extras_cancel_button_location', $type); $location_path = content_type_extras_get_setting('content_type_extras_cancel_button_location_path', $type); $form['#attached']['js'][] = drupal_get_path('module', 'content_type_extras') . '/js/content_type_extras.cancel_button.js'; $form['#attached']['js'][] = array( 'data' => array('content_type_extras' => array( 'hide_warning' => $cancel_hide_warning, 'cancel_location' => $cancel_location, 'location_path' => $location_path, )), 'type' => 'setting', ); $form['actions']['cancel'] = array( '#type' => 'button', '#value' => t('Cancel'), '#weight' => 100, // We want this at the end of whatever buttons are showing '#post_render' => array('content_type_extras_change_button_type'), ); } // Add the form buttons to the top of the page // Based on: http://blog.urbaninsight.com/2011/09/20/editors-perspective-creating-content-drupal $top_buttons = content_type_extras_get_setting('content_type_extras_top_buttons', $type); if (!empty($top_buttons['node_edit']) && in_array('node_edit', $top_buttons)) { $form['pre_actions'] = $form['actions']; $form['pre_actions']['#weight'] = -100; } $form['#submit'][] = 'content_type_extras_node_form_submit'; } // Content type field machine names can only be a maximum of 32 characters (including 'field_') // but the user can enter a name any length, getting an error message if the name is too long // That drives me crazy!! This fixes that! elseif ($form_id == 'field_ui_field_overview_form') { $type = arg(4); drupal_add_js(drupal_get_path('module', 'content_type_extras') . '/js/content_type_extras.manage_fields.js'); $top_buttons = content_type_extras_get_setting('content_type_extras_top_buttons', $type); if (!empty($top_buttons['manage_fields']) || in_array('manage_fields', $top_buttons)) { $form['pre_actions'] = $form['actions']; $form['pre_actions']['#weight'] = -100; } if (isset($form['fields']['_add_new_field'])) { $form['fields']['_add_new_field']['field_name']['#maxlength'] = 26; $form['fields']['_add_new_field']['field_name']['#description'] .= t(' - 26 characters max.'); } // The field_group module does the same thing, so if that is enabled, handle it the same way if (module_exists('field_group')) { $form['fields']['_add_new_group']['group_name']['#maxlength'] = 26; $form['fields']['_add_new_group']['group_name']['#description'] .= t(' - 26 characters max.'); } } } /** * Form submission handler for $form_id *_node_form */ function content_type_extras_node_form_submit(&$form, &$form_state) { if (!empty($form_state['values']['title_hide'])) { _content_type_extras_set_node_display($form_state['values']['nid'], $form_state['values']['title_hide']); } } /** * Form submission for $form_id *_node_form */ function content_type_extras_node_form_new_submit(&$form, &$form_state) { unset($_GET['destination']); $form_state['redirect'] = 'node/add/' . str_replace('_', '-', $form_state['node']->type); } /** * Form submission for $form_id *_node_form */ function content_type_extras_node_form_edit_submit(&$form, &$form_state) { $query_string = array(); // Allow compatibility with content lock module. if (isset($_REQUEST['content_lock_token'])) { $query_string['content_lock_token'] = $_REQUEST['content_lock_token']; } // Allow compatibility with additional query parameters. $query_parameters = drupal_get_query_parameters(); if (!empty($query_parameters)) { foreach ($query_parameters as $key => $value) { $query_string[$key] = $value; } } if (!empty($query_string)) { $form_state['redirect'] = url('node/' . $form_state['values']['nid'] . '/edit', array( 'query' => $query_string, 'absolute' => TRUE, ) ); } else { $form_state['redirect'] = 'node/' . $form_state['values']['nid'] . '/edit'; } unset($_GET['destination']); } /** * Implements hook_node_type_delete(). */ function content_type_extras_node_type_delete($info) { db_delete('variable') ->condition('name', 'content_type_extras_%_' . $info->type, 'LIKE') ->execute(); } /** * Function to change the type of button from 'submit' to 'button. * -- From http://drupal.org/node/133861#comment-4002698 */ function content_type_extras_change_button_type($markup, $element) { $markup = str_replace('type="submit', 'type="button', $markup); return $markup; } /** * Function to set values for node title display */ function _content_type_extras_set_node_display($nid, $hide) { $settings = variable_get('content_type_extras_node_display', array()); $settings[$nid] = $hide; variable_set('content_type_extras_node_display', $settings); } /** * Function to get values for node title display */ function _content_type_extras_get_node_display($nid) { $settings = variable_get('content_type_extras_node_display', array()); if (isset($settings[$nid])) { return $settings[$nid]; } return FALSE; } /** * Function to get values based on node type. * * @param $setting * Retrieve a specific setting from $type. * @param $type * The type of content to get $setting from. * * @return * Returns the requested setting for the given content type. */ function content_type_extras_get_setting($setting, $type) { // We have to handle title_label differently because it is stored in the node_type // table, not in variables if ($setting == 'title_label') { $result = db_query("SELECT title_label FROM {node_type} WHERE module = 'node' AND type = :type", array(':type' => $type))->fetchField(); if ($result) { return $result; } } return variable_get($setting . '_' . $type, content_type_extras_get_default($setting)); } /** * Function to get default setting(s), when settings for content type do not exist. * * @param $setting * Retrieve a specific default setting. * * @return * Returns the requested setting or, if NULL, returns all default settings. */ function content_type_extras_get_default($setting = NULL) { // This has to be unserialized as it will crash the default settings page. $defaults = variable_get('content_type_extras_default_settings', array()) + content_type_extras_get_initial(); // Return all default settings. if ($setting == NULL) { return $defaults; } // Return specific default setting. else if (isset($defaults[$setting])) { return $defaults[$setting]; } } /** * Function to retrieve intial (module default) settings when no other settings exist. * This will primarily be used when the module is first installed. * * @param $setting * Retrieve a specific initial setting. * * @return * Returns the requested setting or, if NULL, returns all initial settings. */ function content_type_extras_get_initial($setting = NULL) { $initial_values = array( // Values set by Drupal Core (node.module) 'title_label' => t('Title'), 'node_preview' => 1, 'node_options' => array( 'status' => 'status', 'promote' => 'promote', 'sticky' => 0, 'revision' => 0, ), 'node_submitted' => 1, // Values set by content_type_extras.module 'content_type_extras_save_button' => t('Save'), 'content_type_extras_preview_button' => t('Preview'), 'content_type_extras_save_and_new' => 0, 'content_type_extras_save_and_new_button' => t('Save and New'), 'content_type_extras_save_and_edit' => 0, 'content_type_extras_save_and_edit_button' => t('Save and Edit'), 'content_type_extras_cancel' => 0, 'content_type_extras_cancel_hide_warning' => 0, 'content_type_extras_title_hide' => 0, 'content_type_extras_title_hide_css' => 0, 'content_type_extras_title_hide_front' => 0, 'content_type_extras_top_buttons' => array(), 'content_type_extras_remove_body' => 0, 'content_type_extras_disable_token_display' => 0, 'content_type_extras_cancel_button_location' => 'previous', 'content_type_extras_cancel_button_location_path' => '', 'content_type_extras_descriptions_required' => 0, 'content_type_extras_user_permissions_select' => 'cte', 'content_type_extras_excluded_node_forms' => array(), // Values set by comment.module 'comment' => array( 'comment' => 2, 'default_mode' => 1, 'default_per_page' => 50, 'anonymous' => 0, 'subject_field' => 1, 'form_location' => 1, 'preview' => 1, ), // Values set by pathauto module 'pathauto_node' => '', // Values set by xmlsitemap.module 'xmlsitemap_settings' => array( 'status' => 1, 'priority' => '0.5', ), // Values set by scheduler.module 'scheduler_settings' => array( 'publish_enable' => 0, 'publish_touch' => 0, 'publish_require' => 0, 'publish_revision' => 0, 'unpublish_enable' => 0, 'unpublish_require' => 0, 'unpublish_revision' => 0, ), ); $admin_role = variable_get('user_admin_role', ''); $initial_values['user_permissions'] = array( 'create_roles' => array($admin_role => $admin_role), 'edit_roles' => array($admin_role => $admin_role), 'delete_roles' => array($admin_role => $admin_role), 'edit_own_roles' => array($admin_role => $admin_role), 'delete_own_roles' => array($admin_role => $admin_role), ); if ($setting == NULL) { return $initial_values; } return $initial_values[$setting]; } /** * Redirect function to content_type_extras_node_type_form_submit(). * * We use this method because when other modules are enabled, like Location, * that modify node_type_form an error is thrown saying that * content_type_extras_node_type_form_submit() is not declared. This is a * workaround to keep the actual function in * content_type_extras.node_type_form.inc for organization, but keep the * submission form from throwing an error. * @TODO: I'd like to find a better way to handle this, if one exists! */ function content_type_extras_node_type_form_submit_redirect(&$form, &$form_state) { include_once(drupal_get_path('module', 'content_type_extras') . '/includes/content_type_extras.node_type_form.inc'); content_type_extras_node_type_form_submit($form, $form_state); }