override_node_options.module 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. <?php
  2. /**
  3. * @file
  4. * Allow users to override the default publishing options for nodes they can
  5. * edit without giving them the 'administer nodes' permission.
  6. */
  7. /**
  8. * Implements hook_permisson().
  9. */
  10. function override_node_options_permission() {
  11. $permissions = array();
  12. // Generate override node permissions for all applicable node types.
  13. foreach (node_permissions_get_configured_types() as $type) {
  14. $permissions += override_node_options_list_permissions($type);
  15. }
  16. return $permissions;
  17. }
  18. /**
  19. * Helper function to generate override node permission list for a given type.
  20. *
  21. * @param $type
  22. * The machine-readable name of the node type.
  23. * @return
  24. * An array of permission names and description.
  25. */
  26. function override_node_options_list_permissions($type) {
  27. $name = node_type_get_name($type);
  28. $type = check_plain($type);
  29. $permissions = array(
  30. "override $type published option" => array(
  31. 'title' => t('Override %type_name published option.', array('%type_name' => $name)),
  32. ),
  33. "override $type promote to front page option" => array(
  34. 'title' => t('Override %type_name promote to front page option.', array('%type_name' => $name)),
  35. ),
  36. "override $type sticky option" => array(
  37. 'title' => t('Override %type_name sticky option.', array('%type_name' => $name)),
  38. ),
  39. "override $type revision option" => array(
  40. 'title' => t('Override %type_name revision option.', array('%type_name' => $name)),
  41. ),
  42. "enter $type revision log entry" => array(
  43. 'title' => t('Enter %type_name revision log entry.', array('%type_name' => $name)),
  44. ),
  45. "override $type authored on option" => array(
  46. 'title' => t('Override %type_name authored on option.', array('%type_name' => $name)),
  47. ),
  48. "override $type authored by option" => array(
  49. 'title' => t('Override %type_name authored by option.', array('%type_name' => $name)),
  50. ),
  51. );
  52. return $permissions;
  53. }
  54. /**
  55. * Implements hook_form_alter().
  56. */
  57. function override_node_options_form_alter(&$form, $form_state, $form_id) {
  58. if (!empty($form['#node_edit_form']) && !user_access('administer nodes')) {
  59. // Get a copy of the current node object.
  60. $node = $form['#node'];
  61. // Add access to the 'Revision information: log message' field
  62. $form['revision_information']['log']['#access'] = user_access('enter ' . $node->type . ' revision log entry');
  63. // Add access to the 'Revision information' fieldset.
  64. $form['revision_information']['revision']['#access'] = user_access('override ' . $node->type . ' revision option');
  65. $form['revision_information']['#access'] = element_get_visible_children($form['revision_information']);
  66. // Add access to the 'Authoring information' fieldset.
  67. $form['author']['name']['#access'] = user_access('override ' . $node->type . ' authored by option');
  68. $form['author']['date']['#access'] = user_access('override ' . $node->type . ' authored on option');
  69. if (key_exists('#access', $form['author'])) {
  70. $form['author']['#access'] |= element_get_visible_children($form['author']);
  71. }
  72. else {
  73. $form['author']['#access'] = element_get_visible_children($form['author']);
  74. }
  75. // Add access to the 'Publishing options' fieldset.
  76. $form['options']['status']['#access'] = user_access('override ' . $node->type . ' published option');
  77. $form['options']['promote']['#access'] = user_access('override ' . $node->type . ' promote to front page option');
  78. $form['options']['sticky']['#access'] = user_access('override ' . $node->type . ' sticky option');
  79. if (key_exists('#access', $form['options'])) {
  80. $form['options']['#access'] |= element_get_visible_children($form['options']);
  81. }
  82. else {
  83. $form['options']['#access'] = element_get_visible_children($form['options']);
  84. }
  85. // @todo Remove when http://drupal.org/node/683630 is fixed.
  86. if ($form['author']['name']['#access']) {
  87. $form['#submit'][] = 'override_node_options_submit_node';
  88. }
  89. }
  90. }
  91. /**
  92. * Perform additional node form submission processing normally skipped by core.
  93. *
  94. * @todo Remove when http://drupal.org/node/683630 is fixed.
  95. */
  96. function override_node_options_submit_node($form, &$form_state) {
  97. // Populate the "authored by" field.
  98. if ($account = user_load_by_name($form_state['values']['name'])) {
  99. $form_state['values']['uid'] = $account->uid;
  100. }
  101. else {
  102. $form_state['values']['uid'] = 0;
  103. }
  104. }