function workbench_scheduler_form_node_form_alter in Workbench Scheduler 7.2
Same name and namespace in other branches
- 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';
}
}