123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238 |
- <?php
- /**
- * @file
- * Allows hiding of the node title field and automatic title creation.
- */
- define('AUTO_NODETITLE_DISABLED', 0);
- define('AUTO_NODETITLE_ENABLED', 1);
- define('AUTO_NODETITLE_OPTIONAL', 2);
- /**
- * Implements hook_permission().
- */
- function auto_nodetitle_permission() {
- return array(
- 'use PHP for title patterns' => array(
- 'title' => t('Use PHP for title patterns'),
- 'description' => t('Use PHP for title patterns.'),
- 'restrict access' => TRUE,
- ),
- );
- }
- /**
- * Implements hook_form_FORM_ID_alter() for the node form.
- */
- function auto_nodetitle_form_node_form_alter(&$form, &$form_state, $form_id) {
- if (auto_nodetitle_get_setting($form['#node']->type) == AUTO_NODETITLE_ENABLED) {
- // We will autogenerate the title later, just hide the title field in the
- // meanwhile.
- $form['title']['#value'] = 'ant';
- $form['title']['#type'] = 'value';
- $form['title']['#required'] = FALSE;
- }
- elseif (auto_nodetitle_get_setting($form['#node']->type) == AUTO_NODETITLE_OPTIONAL) {
- $form['title']['#required'] = FALSE;
- }
- }
- /**
- * Implements hook_node_submit().
- *
- * Generate the node title as soon as the form has been submitted. That way
- * the node preview is shown right too.
- */
- function auto_nodetitle_node_submit($node, $form, &$form_state) {
- $setting = auto_nodetitle_get_setting($node->type);
- if ($setting == AUTO_NODETITLE_ENABLED || ($setting == AUTO_NODETITLE_OPTIONAL && empty($form_state['values']['title']))) {
- auto_nodetitle_set_title($node);
- }
- }
- /**
- * Implements hook_node_presave().
- */
- function auto_nodetitle_node_presave($node) {
- // If not yet done, generate the title now.
- if (auto_nodetitle_is_needed($node)) {
- auto_nodetitle_set_title($node);
- }
- }
- /**
- * Returns whether the auto nodetitle has to be set.
- */
- function auto_nodetitle_is_needed($node) {
- return empty($node->auto_nodetitle_applied) && ($setting = auto_nodetitle_get_setting($node->type)) && !($setting == AUTO_NODETITLE_OPTIONAL && !empty($node->title));
- }
- /**
- * Sets the automatically generated nodetitle for the node
- */
- function auto_nodetitle_set_title(&$node) {
- $types = node_type_get_types();
- $pattern = variable_get('ant_pattern_' . $node->type, '');
- if (trim($pattern)) {
- $node->changed = REQUEST_TIME;
- $node->title = _auto_nodetitle_patternprocessor($pattern, $node);
- }
- elseif ($node->nid) {
- $node->title = t('@type @node-id', array('@type' => $types[$node->type]->name, '@node-id' => $node->nid));
- }
- else {
- $node->title = t('@type', array('@type' => $types[$node->type]->name));
- }
- // Ensure the generated title isn't too long.
- $node->title = substr($node->title, 0, 255);
- // With that flag we ensure we don't apply the title two times to the same
- // node. See auto_nodetitle_is_needed().
- $node->auto_nodetitle_applied = TRUE;
- }
- /**
- * Implements hook_node_operations().
- */
- function auto_nodetitle_node_operations() {
- $operations = array(
- 'nodetitle_update' => array(
- 'label' => t('Update automatic nodetitles'),
- 'callback' => 'auto_nodetitle_operations_update',
- ),
- );
- return $operations;
- }
- /**
- * Callback function for updating node titles.
- */
- function auto_nodetitle_operations_update($nodes) {
- foreach ($nodes as $nid) {
- $node = node_load($nid);
- if ($node && auto_nodetitle_is_needed($node)) {
- $previous_title = $node->title;
- auto_nodetitle_set_title($node);
- // Only save if the title has actually changed.
- if ($node->title != $previous_title) {
- node_save($node);
- }
- }
- }
- }
- /**
- * Helper function to generate the title according to the settings.
- *
- * @return a title string
- */
- function _auto_nodetitle_patternprocessor($pattern, $node) {
- // Replace tokens.
- $output = token_replace($pattern, array('node' => $node), array('sanitize' => FALSE));
- // Evalute PHP.
- if (variable_get('ant_php_' . $node->type, 0)) {
- $output = auto_nodetitle_eval($output, $node);
- }
- // Strip tags.
- $output = preg_replace('/[\t\n\r\0\x0B]/', '', strip_tags($output));
- return $output;
- }
- /**
- * Implements hook_form_FORM_ID_alter() for the node type form.
- */
- function auto_nodetitle_form_node_type_form_alter(&$form, &$form_state) {
- $default_value = auto_nodetitle_get_setting($form['#node_type']->type);
- $form['auto_nodetitle'] = array(
- '#type' => 'fieldset',
- '#title' => t('Automatic title generation'),
- '#weight' => 0,
- '#collapsible' => TRUE,
- '#collapsed' => !$default_value,
- '#group' => 'additional_settings',
- '#attached' => array(
- 'js' => array(
- 'auto-nodetitle' => drupal_get_path('module', 'auto_nodetitle') . '/auto_nodetitle.js',
- ),
- ),
- );
- $form['auto_nodetitle']['ant'] = array(
- '#type' => 'radios',
- '#default_value' => $default_value,
- '#options' => array(
- t('Disabled'),
- t('Automatically generate the title and hide the title field'),
- t('Automatically generate the title if the title field is left empty'),
- )
- );
- $form['auto_nodetitle']['ant_pattern'] = array(
- '#type' => 'textarea',
- '#title' => t('Pattern for the title'),
- '#description' => t('Leave blank for using the per default generated title. Otherwise this string will be used as title. Use the syntax [token] if you want to insert a replacement pattern.'),
- '#default_value' => variable_get('ant_pattern_' . $form['#node_type']->type, ''),
- );
- // Don't allow editing of the pattern if PHP is used, but the users lacks
- // permission for PHP.
- if (variable_get('ant_php_' . $form['#node_type']->type, '') && !user_access('use PHP for title patterns')) {
- $form['auto_nodetitle']['ant_pattern']['#disabled'] = TRUE;
- $form['auto_nodetitle']['ant_pattern']['#description'] = t('You are not allow the configure the pattern for the title, as you lack the %permission permission.', array('%permission' => t('Use PHP for title patterns')));
- }
- // Display the list of available placeholders if token module is installed.
- if (module_exists('token')) {
- $form['auto_nodetitle']['token_help'] = array(
- '#theme' => 'token_tree',
- '#token_types' => array('node'),
- );
- }
- $form['auto_nodetitle']['ant_php'] = array(
- '#access' => user_access('use PHP for title patterns'),
- '#type' => 'checkbox',
- '#title' => t('Evaluate PHP in pattern.'),
- '#description' => t('Put PHP code above that returns your string, but make sure you surround code in <?php and ?>. Note that $node is available and can be used by your code.'),
- '#default_value' => variable_get('ant_php_' . $form['#node_type']->type, ''),
- );
- }
- /**
- * Gets the auto node title setting associated with the given content type.
- */
- function auto_nodetitle_get_setting($type) {
- return variable_get('ant_' . $type, AUTO_NODETITLE_DISABLED);
- }
- /**
- * Evaluates php code and passes $node to it.
- */
- function auto_nodetitle_eval($code, $node) {
- ob_start();
- print eval('?>' . $code);
- $output = ob_get_contents();
- ob_end_clean();
- return $output;
- }
- /**
- * Implements hook_node_type().
- */
- function auto_nodetitle_node_type($op, $info) {
- switch ($op) {
- case 'delete':
- variable_del('ant_' . $info->type);
- variable_del('ant_pattern_' . $info->type);
- variable_del('ant_php_' . $info->type);
- break;
- case 'update':
- if (!empty($info->old_type) && $info->old_type != $info->type) {
- variable_set('ant_' . $info->type, auto_nodetitle_get_setting($info->old_type));
- variable_set('ant_pattern_' . $info->type, variable_get('ant_pattern_' . $info->old_type, ''));
- variable_set('ant_php_' . $info->type, variable_get('ant_php_' . $info->old_type, ''));
- variable_del('ant_' . $info->old_type);
- variable_del('ant_pattern_' . $info->old_type);
- variable_del('ant_php_' . $info->old_type);
- }
- break;
- }
- }
|