You are here

function workbench_scheduler_admin_edit_revision_schedule in Workbench Scheduler 7.2

Same name and namespace in other branches
  1. 7 workbench_scheduler.admin.inc \workbench_scheduler_admin_edit_revision_schedule()

Form to edit the schedule for an existing node revision.

1 string reference to 'workbench_scheduler_admin_edit_revision_schedule'
workbench_scheduler_menu in ./workbench_scheduler.module
Implements hook_menu().

File

./workbench_scheduler.admin.inc, line 557
Provides admin functions for Workbench Scheduler.

Code

function workbench_scheduler_admin_edit_revision_schedule($form, &$form_state, $node, $vid) {
  $form['nid'] = array(
    '#type' => 'hidden',
    '#value' => $node->nid,
  );
  $form['vid'] = array(
    '#type' => 'hidden',
    '#value' => $vid,
  );
  $type_schedules = workbench_scheduler_type_schedules_load($node->type);
  $moderation_states = workbench_scheduler_state_labels();
  $transitions = workbench_moderation_transitions();
  $revision = node_load($node->nid, $vid);

  // Getting language (for date formats).
  global $language;

  // Build array of data being passed to settings in javascript.
  $schedule_data = array();

  // Build an options array for which schedules to choose.
  $schedule_options = array();

  // Load workbench schedule by vid
  $node_schedules = workbench_scheduler_load_node_schedule($node->nid, $vid);

  // Setting selected schedules.
  $selected_schedules = array();
  if (!empty($node_schedules)) {
    foreach ($node_schedules as $node_schedule) {
      $selected_schedules[$node_schedule->sid] = TRUE;
    }
  }

  // Add each type schedule to the options array.
  if (!empty($type_schedules)) {
    foreach ($type_schedules as $sid => $schedule) {

      // TODO: These new permission refactoring needs testing.
      // If no set permissions check view permissions.
      if (!workbench_scheduler_node_schedule_access('set', $revision, $schedule)) {

        // If no view permissions then skip.
        if (!workbench_scheduler_node_schedule_access('view', $revision, $schedule)) {
          continue;
        }
        elseif (workbench_scheduler_node_schedule_access('view', $revision, $schedule) && empty($selected_schedules[$sid])) {
          continue;
        }
      }

      // Get transition states.
      unset($transition);
      if (!empty($schedule->transition)) {
        foreach ($transitions as $transition) {
          if ($transition->id == $schedule->transition) {
            break;
          }
        }
      }

      // Final array for rendering schedule fieldsets and their dates.
      $schedule_data[] = array(
        'sid' => $schedule->sid,
        'label' => $schedule->label,
        'name' => $schedule->name,
        'transition' => !empty($transition) ? $transition->id : '',
        'from_name' => !empty($transition) && !empty($moderation_states[$transition->from_name]) ? $moderation_states[$transition->from_name] : '',
        'to_name' => !empty($transition) && !empty($moderation_states[$transition->to_name]) ? $moderation_states[$transition->to_name] : '',
      );

      // Checking permissions for setting schedules.
      // Added to schedules table.
      if (workbench_scheduler_node_schedule_access('set', $revision, $schedule)) {
        $schedule_options[$schedule->sid] = array(
          'label' => $schedule->label,
          'from_name' => !empty($transition) && !empty($moderation_states[$transition->from_name]) ? $moderation_states[$transition->from_name] : '',
          'to_name' => !empty($transition) && !empty($moderation_states[$transition->to_name]) ? $moderation_states[$transition->to_name] : '',
        );
      }
    }
  }

  // Add schedules to JavaScript settings.
  $form['workbench_scheduler']['#attached']['js'][] = drupal_get_path('module', 'workbench_scheduler') . '/js/workbench_scheduler.js';
  $form['workbench_scheduler']['#attached']['js'][] = array(
    'data' => array(
      'workbench_scheduler' => array(
        'schedules' => $schedule_data,
      ),
    ),
    'type' => 'setting',
  );

  // Create table select for selecting schedule.
  if (!empty($schedule_options)) {
    $form['workbench_scheduler']['workbench_scheduler_sid'] = array(
      '#type' => 'tableselect',
      '#title' => t('Select Schedule'),
      '#description' => t('Select the schedule to use for this node.'),
      '#options' => $schedule_options,
      '#multiple' => TRUE,
      '#header' => array(
        'label' => t('Name'),
        'from_name' => t('When content state is. . .'),
        'to_name' => t('Set content state to . . .'),
      ),
      '#attributes' => array(
        'class' => array(
          'workbench-schedule-sid',
        ),
      ),
    );
  }
  foreach ($schedule_data as $schedule) {
    $sid = $schedule['sid'];

    // Fieldset for collecting schedule dates.
    $form['workbench_scheduler']['dates'][$sid] = array(
      '#type' => 'fieldset',
      '#title' => $schedule['label'],
      '#states' => array(
        'visible' => array(
          ':input[name="workbench_scheduler_sid[' . $sid . ']"]' => array(
            'checked' => TRUE,
          ),
        ),
      ),
    );
    $form['workbench_scheduler']['dates'][$sid]['workbench_scheduler_date']['#tree'] = TRUE;

    // Start date.
    $form['workbench_scheduler']['dates'][$sid]['workbench_scheduler_date'][$sid] = array(
      '#type' => 'date_popup',
      '#date_format' => workbench_scheduler_date_format(),
      '#title' => t('Set content to ') . $schedule['to_name'] . t(' after . . .'),
      '#description' => t('Note: This schedule will only run when the current moderation state is') . ' <strong>' . $schedule['from_name'] . '</strong>.',
    );

    // if user does not have set access but has view access.
    $schedule_obj = workbench_scheduler_schedules_load($schedule['sid']);
    if (!workbench_scheduler_node_schedule_access('set', $revision, $schedule_obj) && workbench_scheduler_node_schedule_access('view', $revision, $schedule_obj)) {
      unset($form['workbench_scheduler']['dates'][$sid]['#states']);
      $form['workbench_scheduler']['dates'][$sid]['workbench_scheduler_date'][$sid]['#disabled'] = TRUE;
    }

    // Have a node schedule(editing a node)? Use for defaults.
    if (!empty($node_schedules)) {
      foreach ($node_schedules as $node_schedule) {
        if ($node_schedule) {
          if ($node_schedule->sid == $sid && $node_schedule->date) {

            // Format date for field.
            $date = format_date($node_schedule->date, 'custom', DATE_FORMAT_DATETIME);
            $form['workbench_scheduler']['dates'][$sid]['workbench_scheduler_date'][$sid]['#default_value'] = $date;

            // Disable schedule after it has been run.
            if ($node_schedule->completed) {
              if (!empty($form['workbench_scheduler']['workbench_scheduler_sid'][$sid])) {
                $form['workbench_scheduler']['workbench_scheduler_sid'][$sid]['#attributes']['disabled'] = TRUE;
              }
              $form['workbench_scheduler']['dates'][$sid]['workbench_scheduler_date'][$sid]['#disabled'] = TRUE;
              $form['workbench_scheduler']['dates'][$sid]['workbench_scheduler_date'][$sid]['#description'] = t('Note: This schedule has completed and cannot be changed for this revision.');
            }
          }
        }
      }
      $form['workbench_scheduler']['workbench_scheduler_sid']['#default_value'] = $selected_schedules;
    }
  }
  if (workbench_scheduler_node_schedule_access('set', $revision)) {
    $form['actions'] = array(
      '#type' => 'actions',
    );
    $form['actions']['submit'] = array(
      '#type' => 'submit',
      '#value' => t('Update'),
      '#validate' => array(
        'workbench_scheduler_node_form_validate',
      ),
    );
  }
  return $form;
}