You are here

function workbench_scheduler_form_node_form_alter in Workbench Scheduler 7.2

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

Implements hook_form_FORM_ID_alter().

File

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

Code

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

  // Loading the form node.
  $node = $form['#node'];

  // Does the user have permission to set schedules?
  $user_permission = workbench_scheduler_node_schedule_access('set', $node) || workbench_scheduler_node_schedule_access('view', $node);

  // And are there any schedules for this node type?
  $type_schedules = workbench_scheduler_type_schedules_load($node->type);

  // Only allow schedule if this content type is moderated.
  $types_moderated = workbench_moderation_moderate_node_types();
  $is_moderated = in_array($node->type, $types_moderated) ? TRUE : FALSE;
  $node_schedules = !empty($node->workbench_schedule) ? $node->workbench_schedule : FALSE;
  if ($user_permission && $type_schedules && $is_moderated) {

    // 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();

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

    // Loading transitions.
    $transitions = workbench_moderation_transitions();

    // Setting selected schedules.
    $selected_schedules = array();
    if (!empty($node_schedules)) {
      foreach ($node_schedules as $node_schedule) {

        // Only render schedules that haven't elapsed.
        // This is to allow content editors to assign schedules to new drafts.
        if (!$node_schedule->completed) {
          $selected_schedules[$node_schedule->sid] = TRUE;
        }
      }
    }

    // Add a scheduler section.
    $form['workbench_scheduler'] = array(
      '#type' => 'fieldset',
      '#title' => t('Workbench Schedule'),
      '#collapsible' => TRUE,
      '#collapsed' => TRUE,
      '#group' => 'additional_settings',
      '#attached' => array(
        'js' => array(
          drupal_get_path('module', 'workbench_scheduler') . '/js/workbench_scheduler.js',
        ),
      ),
    );

    // Setting schedule arrays for table and fieldsets.
    foreach ($type_schedules as $sid => $schedule) {
      $set_schedule_permitted = workbench_scheduler_node_schedule_access('set', $node, $schedule);

      // TODO: These new permission refactoring needs testing.
      // If no set permissions check view permissions.
      if (!$set_schedule_permitted) {

        // If no view permissions then skip.
        if (!workbench_scheduler_node_schedule_access('view', $node, $schedule)) {
          continue;
        }
        elseif (workbench_scheduler_node_schedule_access('view', $node, $schedule) && empty($selected_schedules[$sid])) {
          continue;
        }
      }
      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 ($set_schedule_permitted) {
        $schedule_options[$schedule->sid] = array(
          '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] : '',
        );
      }
    }

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

    // Schedule options will have data if it exists and user has permissions.
    if (!empty($schedule_options)) {

      // Table select for choosing different schedule types.
      $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,
        '#default_value' => $selected_schedules,
        '#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,
            ),
          ),
        ),
      );

      // Date/time fields.
      $form['workbench_scheduler']['dates'][$sid]['workbench_scheduler_date']['#tree'] = TRUE;
      $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', $node, $schedule_obj) && workbench_scheduler_node_schedule_access('view', $node, $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.
      // Do not use data from completed schedules.
      if (!empty($node_schedules)) {
        foreach ($node_schedules as $node_schedule) {
          if (!empty($node_schedule) && $node_schedule->sid == $sid && $node_schedule->date && !$node_schedule->completed) {

            // 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;
          }
        }
      }
    }
    if (empty($schedule_data)) {
      $form['workbench_scheduler']['empty'] = array(
        '#type' => 'fieldset',
        '#title' => t('No Schedules Set'),
        '#description' => t('There are no upcoming scheduled transitions for this content.'),
      );
    }

    // 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 and vid values.
    $form['actions']['submit']['#submit'][] = 'workbench_scheduler_node_form_submit';
  }
}