View source
<?php
define('SCHEDULER_DATE_FORMAT', 'Y-m-d H:i:s');
function scheduler_perm() {
return array(
'schedule (un)publishing of nodes',
'administer scheduler',
);
}
function scheduler_menu() {
$items = array();
$items['scheduler/cron'] = array(
'title' => 'Light weight cron handler',
'description' => 'A light weight cron handler to allow more frequent runs of Schedulers internal cron system',
'page callback' => '_scheduler_run_cron',
'access callback' => TRUE,
'type' => MENU_CALLBACK,
);
$items['scheduler/timecheck'] = array(
'title' => 'Test your servers UTC clock',
'description' => 'Allows site admin to check their servers internal clock',
'page callback' => '_scheduler_timecheck',
'access arguments' => array(
'access administration pages',
),
'type' => MENU_CALLBACK,
);
$items['admin/settings/scheduler'] = array(
'title' => 'Scheduler module settings',
'description' => 'Allows site admins to configure scheduler.',
'page callback' => 'drupal_get_form',
'page arguments' => array(
'scheduler_admin',
),
'access arguments' => array(
'administer scheduler',
),
'type' => MENU_NORMAL_ITEM,
);
$items['admin/settings/scheduler/default'] = array(
'title' => 'Settings',
'type' => MENU_DEFAULT_LOCAL_TASK,
'weight' => 5,
);
$items['admin/content/node/scheduler'] = array(
'type' => MENU_LOCAL_TASK,
'title' => 'Scheduled',
'page callback' => 'scheduler_list',
'page arguments' => array(
NULL,
NULL,
),
'access callback' => 'scheduler_list_access_callback',
'access arguments' => array(
NULL,
NULL,
),
'description' => 'Display a list of scheduled nodes',
'file' => NULL,
);
$items['user/%/scheduler'] = array(
'type' => MENU_LOCAL_TASK,
'title' => 'Scheduled',
'page callback' => 'scheduler_list',
'page arguments' => array(
'user_only',
1,
),
'access callback' => 'scheduler_list_access_callback',
'access arguments' => array(
'user_only',
1,
),
'description' => 'Display a list of scheduled nodes',
'file' => NULL,
);
$items['admin/settings/scheduler/cron'] = array(
'title' => 'Lightweight Cron',
'description' => 'A lightweight cron handler to allow more frequent runs of Schedulers internal cron system.',
'page callback' => 'drupal_get_form',
'page arguments' => array(
'_scheduler_lightweight_cron',
),
'access arguments' => array(
'administer scheduler',
),
'type' => MENU_LOCAL_TASK,
'weight' => 10,
);
$items['admin/settings/scheduler/timecheck'] = array(
'title' => 'Time Check',
'description' => 'Allows site admin to check their servers internal clock',
'page callback' => '_scheduler_timecheck',
'access arguments' => array(
'access administration pages',
),
'type' => MENU_LOCAL_TASK,
'weight' => 15,
);
return $items;
}
function scheduler_list_access_callback() {
$args = func_get_args();
global $user;
return (user_access('administer nodes') || $args[0] == 'user_only' && $args[1] == $user->uid) && user_access('schedule (un)publishing of nodes');
}
function scheduler_help($section) {
$output = '';
switch ($section) {
case 'admin/settings/scheduler':
$output = '<p>' . t('Adjust the settings for the scheduler module.') . '</p>';
break;
case 'admin/settings/scheduler/cron':
$output = '<p>' . t("When you have set up Drupal's standard crontab job cron.php then Scheduler will be executed during each cron run. " . "However, if you would like finer granularity to scheduler, but don't want to run Drupal's cron more often then you can use the " . "lightweight cron handler provided by Scheduler. This is an independent cron job which only runs the scheduler process and does not " . "execute any cron tasks defined by Drupal core or any other modules.") . '</p>' . '<p>' . t("Scheduler's cron is at /scheduler/cron and a sample crontab entry to run scheduler every minute might look like:") . '</p>' . '<code>* * * * * /usr/bin/wget -O - -q "http://example.com/scheduler/cron"</code>' . '<p>' . t('or') . '</p>' . '<code>* * * * * curl "http://example.com/scheduler/cron" > /dev/null 2>&1</code>';
break;
case 'admin/modules#description':
case 'admin/help#scheduler':
$output = '<p>' . t('The Scheduler module is used to automate the publishing and unpublishing of nodes.') . '</p>';
break;
default:
}
return $output;
}
function scheduler_admin() {
$form['scheduler_date_format'] = array(
'#type' => 'textfield',
'#title' => t('Date format'),
'#default_value' => variable_get('scheduler_date_format', SCHEDULER_DATE_FORMAT),
'#size' => 20,
'#maxlength' => 20,
'#description' => t('The input format for the (un)scheduling time/date. See the date() function for formatting options: http://www.php.net/manual/en/function.date.php (only the following format characters are supported (don\'t use \'G\', \'a\' or \'A\' with Date Popup): djmnyYhHgGisaA)'),
);
$form['scheduler_field_type'] = array(
'#type' => 'radios',
'#title' => t('Field type'),
'#default_value' => variable_get('scheduler_field_type', 'date_popup'),
'#options' => array(
'textfield' => t('Standard text field'),
'date_popup' => t('Date Popup field'),
),
'#description' => t("If the Date module's Date Popup module is enabled you may use the popup calendar for your field type."),
);
if (!module_exists('date_popup')) {
$form['scheduler_field_type']['#default_value'] = 'textfield';
$form['scheduler_field_type']['#disabled'] = TRUE;
}
else {
$acceptable = implode(date_popup_time_formats(), ', ');
$form['scheduler_date_format']['#description'] .= t('If you are using Date Popup, the following time formats are supported: !formats', array(
'!formats' => $acceptable,
));
}
$form['scheduler_extra_info'] = array(
'#type' => 'textarea',
'#title' => t('Extra Info'),
'#default_value' => variable_get('scheduler_extra_info', ''),
'#description' => t('The text entered into this field will be displayed above the scheduling fields in the node edit form.'),
);
return system_settings_form($form);
}
function scheduler_admin_validate($form, &$form_state) {
$form_state['values']['scheduler_date_format'] = trim(preg_replace('/\\s+/', ' ', $form_state['values']['scheduler_date_format']));
if ($form_state['values']['scheduler_field_type'] == 'date_popup') {
$format = $form_state['values']['scheduler_date_format'];
$time_format = date_limit_format($format, array(
'hour',
'minute',
'second',
));
$acceptable = date_popup_time_formats();
if (!in_array($time_format, $acceptable)) {
form_set_error('scheduler_date_format', t('The Date Popup module only accepts the following formats: !formats', array(
'!formats' => implode($acceptable, ', '),
)));
}
}
}
function _scheduler_use_date_popup() {
return module_exists('date_popup') && variable_get('scheduler_field_type', 'date_popup') == 'date_popup';
}
function scheduler_date_api_fields($field) {
$values = array(
'sql_type' => DATE_UNIX,
'tz_handling' => 'site',
'timezone_field' => '',
'offset_field' => '',
'related_fields' => array(),
'granularity' => array(
'year',
'month',
'day',
'hour',
'minute',
'second',
),
);
switch ($field) {
case 'scheduler.publish_on':
case 'scheduler.unpublish_on':
return $values;
}
}
function scheduler_form_alter(&$form, $form_state, $form_id) {
if ('node_type_form' == $form_id) {
$form['scheduler'] = array(
'#type' => 'fieldset',
'#title' => t('Scheduler settings'),
'#collapsible' => TRUE,
'#collapsed' => TRUE,
'#weight' => 35,
'#group' => 'additional_settings',
);
$form['scheduler']['publish'] = array(
'#type' => 'fieldset',
'#title' => t('Publishing settings'),
'#collapsible' => TRUE,
'#collapsed' => TRUE,
'#weight' => 1,
'#group' => 'additional_settings',
);
$form['scheduler']['publish']['scheduler_publish_enable'] = array(
'#type' => 'checkbox',
'#title' => t('Enable scheduled publishing'),
'#default_value' => variable_get('scheduler_publish_enable_' . $form['#node_type']->type, 0),
'#description' => t('Check this box to enable scheduled publishing for this node type.'),
);
$form['scheduler']['publish']['scheduler_publish_touch'] = array(
'#type' => 'checkbox',
'#title' => t('Alter published on time'),
'#default_value' => variable_get('scheduler_publish_touch_' . $form['#node_type']->type, 0),
'#description' => t('Check this box to alter the published on time to match the scheduled time ("touch feature").'),
);
$form['scheduler']['publish']['scheduler_publish_required'] = array(
'#type' => 'checkbox',
'#title' => t('Publishing date/time is required.'),
'#default_value' => variable_get('scheduler_publish_required_' . $form['#node_type']->type, 0),
'#description' => t('Check this box to if scheduled publishing is required (e.g. the user must enter a date/time).'),
);
$form['scheduler']['publish']['scheduler_publish_revision'] = array(
'#type' => 'checkbox',
'#title' => t('Create a new revision on publishing'),
'#default_value' => variable_get('scheduler_publish_revision_' . $form['#node_type']->type, 0),
'#description' => t('Check this box if you want a new revision created when publishing.'),
);
$form['scheduler']['unpublish'] = array(
'#type' => 'fieldset',
'#title' => t('Unpublishing settings'),
'#collapsible' => TRUE,
'#collapsed' => TRUE,
'#weight' => 2,
'#group' => 'additional_settings',
);
$form['scheduler']['unpublish']['scheduler_unpublish_enable'] = array(
'#type' => 'checkbox',
'#title' => t('Enable scheduled unpublishing'),
'#default_value' => variable_get('scheduler_unpublish_enable_' . $form['#node_type']->type, 0),
'#description' => t('Check this box to enable scheduled unpublishing for this node type.'),
);
$form['scheduler']['unpublish']['scheduler_unpublish_required'] = array(
'#type' => 'checkbox',
'#title' => t('Unpublishing date/time is required.'),
'#default_value' => variable_get('scheduler_unpublish_required_' . $form['#node_type']->type, 0),
'#description' => t('Check this box to if scheduled unpublishing is required (e.g. the user must enter a date/time).'),
);
$form['scheduler']['unpublish']['scheduler_unpublish_revision'] = array(
'#type' => 'checkbox',
'#title' => t('Create a new revision on unpublishing'),
'#default_value' => variable_get('scheduler_unpublish_revision_' . $form['#node_type']->type, 0),
'#description' => t('Check this box if you want a new revision created when unpublishing.'),
);
}
elseif (isset($form['type']['#value']) && $form['type']['#value'] . '_node_form' == $form_id) {
if (user_access('schedule (un)publishing of nodes')) {
$publishing_enabled = variable_get('scheduler_publish_enable_' . $form['type']['#value'], 0) == 1;
$unpublishing_enabled = variable_get('scheduler_unpublish_enable_' . $form['type']['#value'], 0) == 1;
if ($publishing_enabled || $unpublishing_enabled) {
$node = $form['#node'];
$date_format = variable_get('scheduler_date_format', SCHEDULER_DATE_FORMAT);
$use_date_popup = _scheduler_use_date_popup();
$internal_date_format = $use_date_popup ? SCHEDULER_DATE_FORMAT : $date_format;
if (isset($form_state['values']['op']) && $form_state['values']['op'] == t('Preview')) {
$defaults = new StdClass();
$defaults->publish_on = $form_state['values']['publish_on'];
$defaults->unpublish_on = $form_state['values']['unpublish_on'];
}
elseif (isset($node->nid) && $node->nid > 0) {
$defaults = db_fetch_object(db_query('SELECT publish_on, unpublish_on FROM {scheduler} WHERE nid = %d', $node->nid));
}
else {
$defaults = new StdClass();
$defaults->publish_on = $defaults->unpublish_on = NULL;
}
if (isset($defaults->publish_on) && $defaults->publish_on && !is_numeric($defaults->publish_on)) {
$defaults->publish_on = _scheduler_strtotime($defaults->publish_on);
}
if (isset($defaults->unpublish_on) && $defaults->unpublish_on && !is_numeric($defaults->unpublish_on)) {
$defaults->unpublish_on = _scheduler_strtotime($defaults->unpublish_on);
}
$publishing_required = variable_get('scheduler_publish_required_' . $form['type']['#value'], 0) == 1;
$unpublishing_required = variable_get('scheduler_unpublish_required_' . $form['type']['#value'], 0) == 1;
$fieldset_extended = isset($defaults->publish_on) && $defaults->publish_on != 0 || isset($defaults->unpublish_on) && $defaults->unpublish_on != 0 || $publishing_required || $unpublishing_required;
$form['scheduler_settings'] = array(
'#type' => 'fieldset',
'#title' => t('Scheduling options'),
'#collapsible' => TRUE,
'#collapsed' => !$fieldset_extended,
'#weight' => 35,
'#group' => 'additional_settings',
'#attached' => array(
'js' => array(
'vertical-tabs' => drupal_get_path('module', 'scheduler') . "/scheduler_vertical_tabs.js",
),
),
);
$extra_info = variable_get('scheduler_extra_info', '');
if ($extra_info && $extra_info != '') {
$form['scheduler_settings']['extra_info'] = array(
'#type' => 'item',
'#value' => filter_xss_admin($extra_info),
);
}
$description_format = t('Format: %time.', array(
'%time' => format_date(time(), 'custom', $date_format),
));
if ($publishing_enabled) {
$description_blank = '';
if (!$publishing_required) {
$description_blank .= ' ' . t('Leave blank to disable scheduled publishing.');
}
$form['scheduler_settings']['publish_on'] = array(
'#type' => 'textfield',
'#title' => t('Publish on'),
'#maxlength' => 25,
'#required' => $publishing_required,
'#default_value' => isset($defaults->publish_on) && $defaults->publish_on ? format_date($defaults->publish_on, 'custom', $internal_date_format) : '',
'#description' => $description_format . $description_blank,
);
}
if ($unpublishing_enabled) {
$description_blank = '';
if (!$unpublishing_required) {
$description_blank .= ' ' . t('Leave blank to disable scheduled unpublishing.');
}
$form['scheduler_settings']['unpublish_on'] = array(
'#type' => 'textfield',
'#title' => t('Unpublish on'),
'#maxlength' => 25,
'#required' => $unpublishing_required,
'#default_value' => isset($defaults->unpublish_on) && $defaults->unpublish_on ? format_date($defaults->unpublish_on, 'custom', $internal_date_format) : '',
'#description' => $description_format . $description_blank,
);
}
if ($use_date_popup) {
if ($publishing_enabled) {
$form['scheduler_settings']['publish_on']['#type'] = 'date_popup';
$form['scheduler_settings']['publish_on']['#date_format'] = $date_format;
$form['scheduler_settings']['publish_on']['#date_year_range'] = '0:+10';
if (!$publishing_required) {
$form['scheduler_settings']['publish_on']['#description'] = t('Leave blank to disable scheduled publishing.');
}
unset($form['scheduler_settings']['publish_on']['#maxlength']);
}
if ($unpublishing_enabled) {
$form['scheduler_settings']['unpublish_on']['#type'] = 'date_popup';
$form['scheduler_settings']['unpublish_on']['#date_format'] = $date_format;
$form['scheduler_settings']['unpublish_on']['#date_year_range'] = '0:+10';
if (!$unpublishing_required) {
$form['scheduler_settings']['unpublish_on']['#description'] = t('Leave blank to disable scheduled unpublishing.');
}
unset($form['scheduler_settings']['unpublish_on']['#maxlength']);
}
}
}
}
}
}
function scheduler_list() {
$header = array(
array(
'data' => t('Title'),
'field' => 'n.title',
),
array(
'data' => t('Author'),
'field' => 'u.name',
),
array(
'data' => t('Publish on'),
'field' => 's.publish_on',
),
array(
'data' => t('Unpublish on'),
'field' => 's.unpublish_on',
),
array(
'data' => t('Operations'),
),
);
if (!isset($_GET['order']) && !isset($_GET['sort'])) {
$_GET['order'] = t('Publish on');
$_GET['sort'] = 'ASC';
}
$sql = 'SELECT n.nid, n.uid, n.status, u.name, n.title, s.publish_on, s.unpublish_on FROM {scheduler} s LEFT JOIN {node} n ON s.nid = n.nid LEFT JOIN {users} u ON n.uid = u.uid ';
$args = func_get_args();
if ($args[0] == 'user_only') {
$sql .= ' WHERE n.uid = ' . $args[1];
}
$sql .= tablesort_sql($header);
$result = pager_query($sql, 50);
$rows = array();
while ($node = db_fetch_object($result)) {
$rows[] = array(
l($node->title, "node/{$node->nid}"),
theme('username', $node),
$node->publish_on ? format_date($node->publish_on) : ' ',
$node->unpublish_on ? format_date($node->unpublish_on) : ' ',
l(t('edit'), 'node/' . $node->nid . '/edit', array(), 'destination=admin/content/node/scheduler'),
);
}
if (count($rows)) {
if ($pager = theme('pager', NULL, 50, 0)) {
$rows[] = array(
array(
'data' => $pager,
'colspan' => 6,
),
);
}
print theme('page', theme('table', $header, $rows));
}
else {
print theme('page', t('There are no scheduled nodes.'));
}
}
function _scheduler_strtotime($str) {
if ($str && trim($str) != "") {
$date_format = variable_get('scheduler_date_format', SCHEDULER_DATE_FORMAT);
if (_scheduler_use_date_popup()) {
$date_format = SCHEDULER_DATE_FORMAT;
}
$str = trim(preg_replace('/\\s+/', ' ', $str));
$time = _scheduler_strptime($str, $date_format);
if ($time !== FALSE) {
$time -= _scheduler_get_user_timezone();
}
}
else {
$time = NULL;
}
return $time;
}
function _scheduler_strptime($date, $format) {
$date_entities = array(
'd',
'H',
'h',
'm',
'i',
'a',
'A',
's',
'y',
'Y',
'n',
'j',
'g',
'G',
);
$date_regex_replacements = array(
'(\\d{2})',
'(\\d{2})',
'(\\d{2})',
'(\\d{2})',
'(\\d{2})',
'([ap]m)',
'([AP]M)',
'(\\d{2})',
'(\\d{2})',
'(\\d{4})',
'(\\d{1,2})',
'(\\d{1,2})',
'(\\d{1,2})',
'(\\d{1,2})',
);
$custom_pattern = str_replace($date_entities, $date_regex_replacements, $format);
if (!preg_match("#{$custom_pattern}#", $date, $value_matches)) {
return FALSE;
}
if (!preg_match_all("/(\\w)/", $format, $entity_matches)) {
return FALSE;
}
$results = array(
'day' => 0,
'hour' => 0,
'month' => 0,
'minute' => 0,
'meridiem' => NULL,
'second' => 0,
'year' => 0,
);
$index = 1;
foreach ($entity_matches[1] as $entity) {
$value = intval($value_matches[$index]);
switch ($entity) {
case 'd':
case 'j':
$results['day'] = $value;
break;
case 'H':
case 'h':
case 'g':
case 'G':
$results['hour'] = $value;
break;
case 'm':
case 'n':
$results['month'] = $value;
break;
case 'i':
$results['minute'] = $value;
break;
case 'a':
case 'A':
$results['meridiem'] = $value_matches[$index];
break;
case 's':
$results['second'] = $value;
break;
case 'y':
case 'Y':
$results['year'] = $value;
break;
}
$index++;
}
if (strncasecmp($results['meridiem'], "pm", 2) == 0 && $results['hour'] < 12) {
$results['hour'] += 12;
}
if (strncasecmp($results['meridiem'], "am", 2) == 0 && $results['hour'] == 12) {
$results['hour'] = 0;
}
$time = gmmktime($results['hour'], $results['minute'], $results['second'], $results['month'], $results['day'], $results['year']);
return $time;
}
function _scheduler_get_user_timezone() {
global $user;
$timezone = variable_get('date_default_timezone', 0);
if (variable_get('configurable_timezones', 1) == 1 && strlen($user->timezone)) {
$timezone = $user->timezone;
}
return $timezone;
}
function scheduler_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {
if ($op == 'load') {
$publishing_enabled = variable_get('scheduler_publish_enable_' . $node->type, 0) == 1;
$unpublishing_enabled = variable_get('scheduler_unpublish_enable_' . $node->type, 0) == 1;
if (isset($node->nid) && $node->nid && ($publishing_enabled || $unpublishing_enabled)) {
$result = db_query('SELECT * FROM {scheduler} WHERE nid = %d', $node->nid);
if ($result) {
$row = db_fetch_array($result);
if (isset($row['nid'])) {
unset($row['nid']);
$node->publish_on = $row['publish_on'];
$node->unpublish_on = $row['unpublish_on'];
$row['published'] = $row['publish_on'] ? date(variable_get('date_format_long', 'l, F j, Y - H:i'), $row['publish_on']) : NULL;
$row['unpublished'] = $row['unpublish_on'] ? date(variable_get('date_format_long', 'l, F j, Y - H:i'), $row['unpublish_on']) : NULL;
$node->scheduler = $row;
}
}
}
}
elseif ($op == 'view') {
if (isset($a4) && $a4 && isset($node->unpublish_on) && $node->unpublish_on) {
$unavailable_after = date("d-M-Y H:i:s T", $node->unpublish_on);
drupal_set_html_head('<meta name="googlebot" content="unavailable_after: ' . $unavailable_after . '" />');
}
}
elseif (user_access('schedule (un)publishing of nodes')) {
switch ($op) {
case 'validate':
case 'presave':
$date_format = variable_get('scheduler_date_format', SCHEDULER_DATE_FORMAT);
if (isset($node->publish_on) && $node->publish_on && !is_numeric($node->publish_on)) {
$publishtime = _scheduler_strtotime($node->publish_on);
if ($publishtime === FALSE) {
form_set_error('publish_on', t("The 'publish on' value does not match the expected format of %time", array(
'%time' => format_date(time(), 'custom', $date_format),
)));
}
elseif ($publishtime && $publishtime < time()) {
form_set_error('publish_on', t("The 'publish on' date must be in the future"));
}
else {
$node->publish_on = $publishtime;
}
}
if (isset($node->unpublish_on) && $node->unpublish_on && !is_numeric($node->unpublish_on)) {
$unpublishtime = _scheduler_strtotime($node->unpublish_on);
if ($unpublishtime === FALSE) {
form_set_error('unpublish_on', t("The 'unpublish on' value does not match the expected format of %time", array(
'%time' => format_date(time(), 'custom', $date_format),
)));
}
elseif ($unpublishtime && $unpublishtime < time()) {
form_set_error('unpublish_on', t("The 'unpublish on' date must be in the future"));
}
else {
$node->unpublish_on = $unpublishtime;
}
}
if (isset($publishtime) && isset($unpublishtime) && $unpublishtime < $publishtime) {
form_set_error('unpublish_on', t("The 'unpublish on' date must be later than the 'publish on' date."));
}
if (isset($node->publish_on) && $node->publish_on != '' && is_numeric($node->publish_on) && $node->publish_on > time()) {
$node->status = 0;
drupal_set_message(t('This post is unpublished and will be published @publish_time.', array(
'@publish_time' => format_date($node->publish_on, 'custom', $date_format),
)), 'status', FALSE);
}
break;
case 'insert':
if (isset($node->nid) && $node->nid && (isset($node->publish_on) && $node->publish_on != NULL) || isset($node->unpublish_on) && $node->unpublish_on != NULL) {
db_query('INSERT INTO {scheduler} (nid, publish_on, unpublish_on) VALUES (%d, %d, %d)', $node->nid, $node->publish_on, $node->unpublish_on);
}
break;
case 'update':
if (isset($node->nid) && $node->nid) {
$exists = db_result(db_query('SELECT nid FROM {scheduler} WHERE nid = %d', $node->nid));
$publish_on = isset($node->publish_on) ? $node->publish_on : NULL;
$unpublish_on = isset($node->unpublish_on) ? $node->unpublish_on : NULL;
if ($exists) {
if ($node->status == 0 && $publish_on || $unpublish_on) {
db_query('UPDATE {scheduler} SET publish_on = %d, unpublish_on = %d WHERE nid = %d', $publish_on, $unpublish_on, $node->nid);
}
else {
db_query('DELETE FROM {scheduler} WHERE nid = %d', $node->nid);
}
}
elseif ($publish_on || $unpublish_on) {
db_query('INSERT INTO {scheduler} (nid, publish_on, unpublish_on) VALUES (%d, %d, %d)', $node->nid, $publish_on, $unpublish_on);
}
}
break;
case 'delete':
if (isset($node->nid) && $node->nid) {
db_query('DELETE FROM {scheduler} WHERE nid = %d', $node->nid);
}
break;
}
}
}
function scheduler_node_type($op, $info) {
switch ($op) {
case 'delete':
$variables = array();
$variables[] = "scheduler_publish_enable_" . $info->type;
$variables[] = "scheduler_publish_touch_" . $info->type;
$variables[] = "scheduler_publish_required_" . $info->type;
$variables[] = "scheduler_publish_revision_" . $info->type;
$variables[] = "scheduler_unpublish_enable_" . $info->type;
$variables[] = "scheduler_unpublish_required_" . $info->type;
$variables[] = "scheduler_unpublish_revision_" . $info->type;
foreach ($variables as $variable) {
variable_del($variable);
}
break;
}
}
function scheduler_cron() {
$clear_cache = FALSE;
$clear_cache |= _scheduler_publish();
$clear_cache |= _scheduler_unpublish();
if ($clear_cache) {
cache_clear_all();
}
}
function _scheduler_publish() {
$result = FALSE;
$date_format = variable_get('scheduler_date_format', SCHEDULER_DATE_FORMAT);
$query_result = db_query('SELECT s.nid AS nid FROM {scheduler} s LEFT JOIN {node} n ON s.nid = n.nid WHERE n.status = 0 AND s.publish_on > 0 AND s.publish_on < %d ', time());
$nids = array();
while ($node = db_fetch_object($query_result)) {
$nids[] = $node->nid;
}
$nids = array_unique(array_merge($nids, _scheduler_scheduler_nid_list('publish')));
foreach ($nids as $nid) {
$n = node_load($nid);
$n->changed = $n->publish_on;
$old_creation_date = $n->created;
if (variable_get('scheduler_publish_touch_' . $n->type, 0) == 1) {
$n->created = $n->publish_on;
}
$create_publishing_revision = variable_get('scheduler_publish_revision_' . $n->type, 0) == 1;
if ($create_publishing_revision) {
$n->revision = TRUE;
$n->log = "Node published by scheduler module. Original creation date was " . format_date($old_creation_date, 'custom', $date_format) . ".";
}
watchdog('scheduler', '@type: scheduled publishing of %title.', array(
'@type' => $n->type,
'%title' => $n->title,
), WATCHDOG_NOTICE, l(t('view'), 'node/' . $n->nid));
$actions = array(
'node_publish_action',
'node_save_action',
);
$context['node'] = $n;
actions_do($actions, $n, $context, NULL, NULL);
if (isset($n->unpublish_on) && $n->unpublish_on == 0) {
db_query('DELETE FROM {scheduler} WHERE nid = %d', $n->nid);
}
else {
db_query('UPDATE {scheduler} SET publish_on = 0 WHERE nid = %d', $n->nid);
}
_scheduler_scheduler_api($n, 'publish');
$result = TRUE;
}
return $result;
}
function _scheduler_unpublish() {
$result = FALSE;
$date_format = variable_get('scheduler_date_format', SCHEDULER_DATE_FORMAT);
$query_result = db_query('SELECT s.nid AS nid FROM {scheduler} s LEFT JOIN {node} n ON s.nid = n.nid WHERE s.unpublish_on > 0 AND s.unpublish_on < %d', time());
$nids = array();
while ($node = db_fetch_object($query_result)) {
$nids[] = $node->nid;
}
$nids = array_unique(array_merge($nids, _scheduler_scheduler_nid_list('unpublish')));
foreach ($nids as $nid) {
$n = node_load($nid);
$old_change_date = $n->changed;
$n->changed = $n->unpublish_on;
if ($n->status == 1) {
$create_unpublishing_revision = variable_get('scheduler_unpublish_revision_' . $n->type, 0) == 1;
if ($create_unpublishing_revision) {
$n->revision = TRUE;
$n->log = "Node unpublished by scheduler module. Original change date was " . format_date($old_change_date, 'custom', $date_format) . ".";
}
watchdog('scheduler', '@type: scheduled unpublishing of %title.', array(
'@type' => $n->type,
'%title' => $n->title,
), WATCHDOG_NOTICE, l(t('view'), 'node/' . $n->nid));
$actions = array(
'node_unpublish_action',
'node_save_action',
);
$context['node'] = $n;
actions_do($actions, $n, $context, NULL, NULL);
}
db_query('DELETE FROM {scheduler} WHERE nid = %d', $n->nid);
_scheduler_scheduler_api($n, 'unpublish');
$result = TRUE;
}
return $result;
}
function _scheduler_scheduler_nid_list($action) {
$nids = array();
foreach (module_implements('scheduler_nid_list') as $module) {
$function = $module . '_scheduler_nid_list';
$nids = array_merge($nids, $function($action));
}
return $nids;
}
function scheduler_theme() {
return array(
'scheduler_timecheck' => array(
'arguments' => array(
'now' => NULL,
),
),
);
}
function _scheduler_run_cron() {
watchdog('scheduler', 'Internal scheduler cron run activated', array(), WATCHDOG_NOTICE);
scheduler_cron();
if (ob_get_level() > 0) {
$handlers = ob_list_handlers();
if (isset($handlers[0]) && $handlers[0] == 'default output handler') {
ob_clean();
}
}
watchdog('scheduler', 'Internal scheduler cron run completed', array(), WATCHDOG_NOTICE, l('settings', 'admin/settings/scheduler'));
drupal_set_message(t("Scheduler's lightweight cron completed. See !log for details.", array(
'!log' => l('admin/reports/dblog', 'admin/reports/dblog'),
)));
return ' ';
exit;
}
function _scheduler_lightweight_cron() {
$form = array();
$form['scheduler_cron'] = array(
'#type' => 'submit',
'#prefix' => t("You can test Scheduler's lightweight cron process interactively") . ':<div>',
'#value' => t("Run Scheduler's cron now"),
'#submit' => array(
'_scheduler_run_cron',
),
'#suffix' => "</div>\n",
);
return $form;
}
function _scheduler_scheduler_api($node, $action) {
foreach (module_implements('scheduler_api') as $module) {
$function = $module . '_scheduler_api';
$function($node, $action);
}
}
function _scheduler_timecheck() {
$now = time();
return theme('scheduler_timecheck', $now);
}
function theme_scheduler_timecheck($now) {
drupal_set_title(t('Scheduler OS time check'));
$t_options = array(
'%time' => gmdate("Y-m-d H:i:s", $now),
'%lt' => date("Y-m-d H:i:s P", $now),
);
return t('Your server reports the UTC time as %time and "localtime" as %lt.', $t_options) . '<p />' . t('If all is well with your server\'s time configuration UTC should match <a target="_blank" href="http://wwp.greenwichmeantime.com/">UTC London Time</a> and the localtime should be the time where you are.') . '<p />' . t('If this is not the case please have your Unix System Administrator fix your servers time/date configuration.');
}
function scheduler_views_api() {
$info['api'] = 2;
return $info;
}
function scheduler_content_extra_fields($type_name) {
$fields = array();
$publishing_enabled = variable_get('scheduler_publish_enable_' . $type_name, 0) == 1;
$unpublishing_enabled = variable_get('scheduler_unpublish_enable_' . $type_name, 0) == 1;
if ($publishing_enabled || $unpublishing_enabled) {
$fields['scheduler_settings'] = array(
'label' => t('Scheduler'),
'description' => t('Scheduler module form.'),
'weight' => 10,
);
}
return $fields;
}
function scheduler_preprocess_node(&$variables, $hook) {
$node = $variables['node'];
$date_format = variable_get('scheduler_date_format', SCHEDULER_DATE_FORMAT);
if (!empty($node->publish_on)) {
$variables['publish_on'] = format_date($node->publish_on, 'custom', $date_format);
}
if (!empty($node->unpublish_on)) {
$variables['unpublish_on'] = format_date($node->unpublish_on, 'custom', $date_format);
}
}
function scheduler_feeds_node_processor_targets_alter(&$targets, $content_type) {
$target = array();
$publishing_enabled = variable_get('scheduler_publish_enable_' . $content_type, 0) == 1;
$unpublishing_enabled = variable_get('scheduler_unpublish_enable_' . $content_type, 0) == 1;
if ($publishing_enabled) {
$targets['publish_on'] = array(
'name' => t('Scheduler: publish on'),
'description' => t('The date, when scheduler module should publish node.'),
'callback' => 'scheduler_set_target',
);
}
if ($unpublishing_enabled) {
$targets['unpublish_on'] = array(
'name' => t('Scheduler: unpublish on'),
'description' => t('The date, when scheduler module should unpublish node.'),
'callback' => 'scheduler_set_target',
);
}
return $targets;
}
function scheduler_set_target($node, $target, $value) {
if (!is_array($value)) {
$timestamp = strtotime($value);
if ($timestamp !== FALSE && $timestamp != -1) {
$node->{$target} = $timestamp;
}
}
}
function scheduler_token_values($type, $object = NULL, $options = array()) {
if (!function_exists("token_get_date_token_values") || !function_exists("token_get_date_token_info")) {
return array();
}
if ($type == 'node') {
$tokens = array();
$node = $object;
if (isset($node->publish_on)) {
$tokens += token_get_date_token_values($node->publish_on, 'scheduler-publish-');
}
if (isset($node->unpublish_on)) {
$tokens += token_get_date_token_values($node->unpublish_on, 'scheduler-unpublish-');
}
return $tokens;
}
}
function scheduler_token_list($type = 'all') {
if (!function_exists("token_get_date_token_values") || !function_exists("token_get_date_token_info")) {
return array();
}
$tokens = array();
$tokens['node'] = array();
if ($type == 'node' || $type == 'all') {
$tokens['node'] += token_get_date_token_info(t('Publish on'), 'scheduler-publish-');
$tokens['node'] += token_get_date_token_info(t('Unpublish on'), 'scheduler-unpublish-');
}
return $tokens;
}