View source
<?php
function workbench_moderation_views_api() {
return array(
'api' => 2.0,
);
}
function workbench_moderation_menu() {
$items = array();
$items["node/%workbench_moderation_node_current_draft/draft"] = array(
'title' => 'View draft',
'page callback' => 'workbench_moderation_node_view_draft',
'page arguments' => array(
1,
),
'access callback' => '_workbench_moderation_access_current_draft',
'access arguments' => array(
1,
),
'file' => 'workbench_moderation.node.inc',
'type' => MENU_LOCAL_TASK,
'weight' => -9,
'tab_parent' => 'node/%',
'tab_root' => 'node/%',
);
return $items;
}
function workbench_moderation_node_current_draft_load($nid) {
$node = node_load($nid);
$draft_node = state_flow_entity_get_active_revision($node, 'node');
return $draft_node;
}
function _workbench_moderation_access_current_draft($node) {
$active_id = state_flow_entity_get_active_revision_id($node, 'node');
$machine = state_flow_entity_load_state_machine($node, 'node');
if (empty($active_id) || $machine
->isActivePublishedRevision()) {
return FALSE;
}
return state_flow_menu_node_access($node);
}
function workbench_moderation_menu_alter(&$items) {
$items['node/%node/workflow']['access callback'] = FALSE;
$items['node/%node/revisions']['page callback'] = 'workbench_moderation_node_revisions_redirect';
$items['node/%node/revisions']['page arguments'] = array(
1,
);
$items['node/%node/revisions']['type'] = MENU_NORMAL_ITEM;
$items['node/%node/revisions/%/view']['page callback'] = 'workbench_moderation_node_view_revision';
$items['node/%node/revisions/%/view']['file path'] = drupal_get_path('module', 'workbench_moderation');
$items['node/%node/revisions/%/view']['file'] = 'workbench_moderation.node.inc';
$items['node/%node/revisions/%/view']['access callback'] = 'workbench_moderation_revision_access';
if (isset($items['node/%node/revisions/%state_flow_revision_node'])) {
$items['node/%node/revisions/%state_flow_revision_node']['access callback'] = 'workbench_moderation_revision_access';
}
if (!empty($items['node/%node/workflow']) && $items['node/%node/workflow']['module'] === 'state_flow') {
}
}
function workbench_moderation_permission() {
$permissions = array();
$permissions['view moderation messages'] = array(
'title' => t('View the moderation messages on a node'),
);
$permissions['view all unpublished content'] = array(
'title' => t('View all unpublished content'),
);
$permissions['bypass workbench moderation'] = array(
'title' => t('Bypass moderation restrictions'),
'restrict access' => TRUE,
);
$permissions['use workbench_moderation my drafts tab'] = array(
'title' => t('Use "My Drafts" workbench tab'),
);
$permissions['use workbench_moderation needs review tab'] = array(
'title' => t('Use "Needs Review" workbench tab'),
);
$states = workbench_workflows_load_all();
foreach ($states as $state => $info) {
$permission = 'view all content in state ' . $state;
$permissions[$permission] = array(
'title' => t('View all content in state "!state"', array(
'!state' => $info->title,
)),
);
if ($info->entity_state_change < 1) {
$permissions[$permission]['warning'] = t('This permission will give users access to probably unpublished content.');
}
}
return $permissions;
}
function workbench_moderation_node_access($node, $op, $account) {
if ($op == 'view') {
if (!$node->status && user_access('view all unpublished content', $account)) {
return NODE_ACCESS_ALLOW;
}
$machine = state_flow_entity_load_state_machine($node, 'node');
if ($machine && !$machine
->ignore()) {
if (($state = $machine
->get_current_state()) && user_access('view all content in state ' . $state, $account)) {
return NODE_ACCESS_ALLOW;
}
if ($node->status && !$machine
->isActivePublishedRevision()) {
return NODE_ACCESS_DENY;
}
}
}
return NODE_ACCESS_IGNORE;
}
function workbench_moderation_revision_access($node, $op = 'view', $account = NULL) {
if (state_flow_entity_load_state_machine($node, 'node')
->ignore()) {
return _node_revision_access($node, $op);
}
if ($op == 'view') {
return node_access('view', $node, $account);
}
return state_flow_menu_node_access($node, $account);
}
function workbench_moderation_state_flow_menu_node_access_alter(&$access, $node, $account) {
$access = node_access('update', $node, $account);
}
function workbench_moderation_form_node_form_alter(&$form, &$form_state, $form_id) {
if (!empty($form['options']['state_flow'])) {
$form['options']['status']['#access'] = FALSE;
if (!isset($form['#node']->nid) && isset($form['revision_information']['revision'])) {
$form['revision_information']['revision']['#default_value'] = TRUE;
$form['revision_information']['revision']['#disabled'] = TRUE;
$form['revision_information']['revision']['#description'] = t('A new revision must always be created when Workbench Moderation and State Flow are enabled.');
}
$form['revision_information']['#access'] = TRUE;
$node = $form_state['node'];
workbench_moderation_messages('edit', $node);
drupal_add_library('system', 'drupal.form');
drupal_add_js(drupal_get_path('module', 'workbench_moderation') . '/js/workbench_moderation.js', array(
'weight' => 90,
));
if (!empty($form['options']['#title'])) {
$form['options']['#title'] = t('Additional options');
}
}
}
function workbench_moderation_node_presave($node) {
if ($node->is_new) {
$node->revision = 1;
}
}
function workbench_moderation_node_revisions_redirect($node) {
drupal_goto('node/' . $node->nid . '/moderation');
}
function workbench_moderation_node_view($node, $view_mode = 'full') {
if (node_is_page($node) && $view_mode == 'full' && empty($node->in_preview)) {
workbench_moderation_messages('view', $node);
}
}
function workbench_moderation_workbench_block() {
$output = array();
foreach (workbench_moderation_set_message() as $message) {
$output[] = t('!label: <em>!message</em>', array(
'!label' => $message['label'],
'!message' => $message['message'],
));
}
return $output;
}
function workbench_moderation_set_message($new_messages = array()) {
static $messages = array();
$messages = array_merge($messages, $new_messages);
return $messages;
}
function workbench_moderation_messages($context, $node = NULL) {
$info_block_messages = array();
if (!user_access('view moderation messages') || !$node && !($node = menu_get_object())) {
return;
}
$msgid = 'node:' . (isset($node->nid) ? $node->nid : $node->created);
if (($state_machine = state_flow_entity_load_state_machine($node, 'node')) && !empty($node->current_state)) {
$any_published_vid = !empty($node->published_revision_id);
$published = $any_published_vid && $node->published_revision_id == $node->vid && $node->status == '1';
$active_revision_id = $state_machine
->get_active_revision();
$info_block_messages[$msgid . ':state:' . $node->current_state] = array(
'label' => t('Revision state'),
'message' => check_plain(workbench_workflows_load_label('states', $node->current_state)),
);
$info_block_messages[$msgid . ':active_revision'] = array(
'label' => t('Active revision'),
'message' => $active_revision_id == $node->vid ? t('Yes') : t('No'),
);
$info_block_messages[$msgid . ':published:' . (int) $published] = array(
'label' => t('Public'),
'message' => $published ? t('Yes') : t('No'),
);
if ($any_published_vid && !$published) {
$info_block_messages[$msgid . ':public_rev'] = array(
'label' => t('Public revision'),
'message' => l(t('Public version'), 'node/' . $node->nid),
);
}
if (!$published) {
$info_block_messages[$msgid . ':publish'] = array(
'label' => t('Moderate'),
'message' => l(t('Change state'), 'node/' . $node->nid . '/revisions-state-flow-states'),
);
}
workbench_moderation_set_message($info_block_messages);
}
}
function workbench_moderation_preprocess_state_flow_history_entity(&$variables) {
$states = workbench_workflows_options('states');
if (!empty($variables['state']) && array_key_exists($variables['state'], $states)) {
$variables['state'] = $states[$variables['state']];
}
if (!empty($variables['from_state']) && array_key_exists($variables['from_state'], $states)) {
$variables['from_state'] = $states[$variables['from_state']];
}
}