You are here

function workbench_scheduler_form_node_form_alter in Workbench Scheduler 7

Same name and namespace in other branches
  1. 7.2 workbench_scheduler.module \workbench_scheduler_form_node_form_alter()

Implements hook_form_FORM_ID_alter().

File

./workbench_scheduler.module, line 247
Content scheduling for Workbench.

Code

function workbench_scheduler_form_node_form_alter(&$form, &$form_state, $form_id) {

  // Does the user have permission to set schedules?
  $user_permission = user_access('set workbench schedule');

  // And are there any schedules for this node type?
  $type_schedules = workbench_scheduler_load_type_schedules($form['#node']->type);
  if ($user_permission && $type_schedules) {

    // Add a scheduler section.
    $form['workbench_scheduler'] = array(
      '#type' => 'fieldset',
      '#title' => t('Workbench Schedule'),
      '#description' => t('Select a schedule for changing moderation states.'),
      '#collapsible' => TRUE,
      '#collapsed' => TRUE,
      '#group' => 'additional_settings',
      '#access' => user_access('set workbench schedule'),
      '#attached' => array(
        'js' => array(
          drupal_get_path('module', 'workbench_scheduler') . '/js/workbench_scheduler.js',
        ),
      ),
    );

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

    // Add default option of no schedule.
    $schedule_options[] = array(
      'label' => t('No Schedule'),
      'start_state' => '',
      'end_state' => '',
    );

    // Retrieve a list of human safe moderation state names.
    $moderation_states = workbench_scheduler_state_labels();

    // Add each type schedule to the options array.
    foreach ($type_schedules as $schedule) {
      if (user_access('set any workbench schedule') || user_access('set workbench schedule for ' . $schedule->name)) {
        $schedule_options[$schedule->sid] = array(
          'label' => $schedule->label,
          'start_state' => !empty($schedule->start_state) ? $moderation_states[$schedule->start_state] : '',
          'end_state' => !empty($schedule->end_state) ? $moderation_states[$schedule->end_state] : '',
        );
      }
    }

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

    // Create table select for selecting schedule.
    $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' => FALSE,
      '#header' => array(
        'label' => t('Name'),
        'start_state' => t('Start State'),
        'end_state' => t('End State'),
      ),
    );

    // Fieldset for collecting schedule dates.
    $form['workbench_scheduler']['dates'] = array(
      '#type' => 'fieldset',
      '#title' => t('Schedule Dates'),
      '#description' => t('Select the start and/or end dates to trigger states changes for this node.'),
      '#states' => array(
        'invisible' => array(
          ':input[name=workbench_scheduler_sid]' => array(
            'value' => '0',
          ),
        ),
      ),
    );

    // Start date.
    $form['workbench_scheduler']['dates']['workbench_scheduler_start_date'] = array(
      '#type' => 'date_popup',
      '#date_format' => 'Y-m-d H:i',
      '#title' => t('Start date'),
      '#description' => t('Select the date to switch this node to the scheduled "start state"'),
    );

    // End date.
    $form['workbench_scheduler']['dates']['workbench_scheduler_end_date'] = array(
      '#type' => 'date_popup',
      '#date_format' => 'Y-m-d H:i',
      '#title' => t('End date'),
      '#description' => t('Select the date to switch this node to the scheduled "end state"'),
    );
    $node_schedule = isset($form['#node']->workbench_schedule) ? $form['#node']->workbench_schedule : FALSE;

    // Have a node schedule(editing a node)? Use for defaults.
    if ($node_schedule) {
      $form['workbench_scheduler']['workbench_scheduler_sid']['#default_value'] = $node_schedule->sid;
      if ($node_schedule->start_date) {

        // Format date for field.
        $start_date = format_date($node_schedule->start_date, 'custom', 'Y-m-d H:i:s');
        $form['workbench_scheduler']['dates']['workbench_scheduler_start_date']['#default_value'] = $start_date;
      }
      if ($node_schedule->end_date) {

        // Format date for field.
        $end_date = format_date($node_schedule->end_date, 'custom', 'Y-m-d H:i:s');
        $form['workbench_scheduler']['dates']['workbench_scheduler_end_date']['#default_value'] = $end_date;
      }
    }

    // Display message depending on schedule settings.
    $msg = '';
    $type_settings = variable_get('workbench_scheduler_' . $form['#node']->type, array());

    // Check if only process latest revision.
    if (in_array('workbench_scheduler_limit_current_revision', $type_settings)) {
      $msg = t('Only the schedule for the most recent revision will be run.');
    }
    elseif (isset($form['#node']->nid)) {

      // Check if there are existing active schedules.
      $active_schedules = workbench_scheduler_count_node_schedules($form['#node']->nid, 'active');

      // Schedules set?
      if ($active_schedules > 0) {

        // Display message about active schedules.
        $msg = format_plural($active_schedules, 'There is still 1 active schedule for a previous revision. !link', 'There are still @count active schedules for previous revisions. !link', array(
          '!link' => l(t('Review Schedules'), 'node/' . $form['#node']->nid . '/manage_schedules'),
        ));
      }
    }
    if ($msg) {
      $form['workbench_scheduler']['note'] = array(
        '#type' => 'item',
        '#title' => t('Note'),
        '#markup' => $msg,
      );
    }

    // Add custom validation and submission hooks.
    $form['#validate'][] = 'workbench_scheduler_node_form_validate';

    // Add to submit button action so that will have access to the new,
    // Nid & vid values.
    $form['actions']['submit']['#submit'][] = 'workbench_scheduler_node_form_submit';
  }
}