View source
<?php
define('RULES_SCHEDULER_PATH', 'admin/config/workflow/rules/schedule');
function rules_scheduler_cron() {
if (rules_scheduler_queue_tasks()) {
drupal_register_shutdown_function('rules_exit');
RulesLog::logger()
->clear();
}
}
function rules_scheduler_cron_queue_info() {
$queues['rules_scheduler_tasks'] = array(
'worker callback' => 'rules_scheduler_run_task',
'time' => 15,
);
return $queues;
}
function rules_scheduler_run_task(array $task) {
try {
if (isset($task['state'])) {
$task['data'] = $task['state'];
}
rules_scheduler_task_handler($task)
->runTask();
} catch (RulesEvaluationException $e) {
rules_log($e->msg, $e->args, $e->severity);
rules_log('Unable to execute task with identifier %id scheduled on date %date.', array(
'%id' => $task['identifier'],
'%date' => format_date($task['date']),
), RulesLog::ERROR);
}
}
function rules_scheduler_task_handler(array $task) {
$class = !empty($task['handler']) ? $task['handler'] : 'RulesSchedulerDefaultTaskHandler';
if (!class_exists($class)) {
throw new RulesEvaluationException('Missing task handler implementation %class.', array(
'%class' => $class,
), NULL, RulesLog::ERROR);
}
return new $class($task);
}
function rules_scheduler_rules_ui_menu_alter(&$items, $base_path, $base_count) {
$items[$base_path . '/manage/%rules_config/schedule'] = array(
'title callback' => 'rules_get_title',
'title arguments' => array(
'Schedule !plugin "!label"',
$base_count + 1,
),
'page callback' => 'drupal_get_form',
'page arguments' => array(
'rules_scheduler_schedule_form',
$base_count + 1,
$base_path,
),
'access callback' => 'rules_config_access',
'access arguments' => array(
'update',
$base_count + 1,
),
'file' => 'rules_scheduler.admin.inc',
'file path' => drupal_get_path('module', 'rules_scheduler'),
);
}
function rules_scheduler_menu() {
$items = array();
$items[RULES_SCHEDULER_PATH] = array(
'title' => 'Schedule',
'type' => MENU_LOCAL_TASK,
'page callback' => 'rules_scheduler_schedule_page',
'access arguments' => array(
'administer rules',
),
'file' => 'rules_scheduler.admin.inc',
);
$items[RULES_SCHEDULER_PATH . '/%rules_scheduler_task/delete'] = array(
'title' => 'Delete a scheduled task',
'type' => MENU_CALLBACK,
'page callback' => 'drupal_get_form',
'page arguments' => array(
'rules_scheduler_delete_task',
5,
),
'access arguments' => array(
'administer rules',
),
'file' => 'rules_scheduler.admin.inc',
);
return $items;
}
function rules_scheduler_task_load($tid) {
$result = db_select('rules_scheduler', 'r')
->fields('r')
->condition('tid', (int) $tid)
->execute();
return $result
->fetchAssoc();
}
function rules_scheduler_task_delete($tid) {
db_delete('rules_scheduler')
->condition('tid', $tid)
->execute();
}
function rules_scheduler_schedule_task($task) {
if (isset($task['state'])) {
$task['data'] = $task['state'];
unset($task['state']);
}
if (!empty($task['identifier'])) {
db_delete('rules_scheduler')
->condition('config', $task['config'])
->condition('identifier', $task['identifier'])
->execute();
}
drupal_write_record('rules_scheduler', $task);
}
function rules_scheduler_queue_tasks() {
$items_created = FALSE;
$result = db_select('rules_scheduler', 'r', array(
'fetch' => PDO::FETCH_ASSOC,
))
->fields('r')
->condition('date', time(), '<=')
->orderBy('date')
->range(0, 1000)
->execute();
$queue = DrupalQueue::get('rules_scheduler_tasks');
foreach ($result as $task) {
if ($queue
->createItem($task)) {
$items_created = TRUE;
rules_scheduler_task_handler($task)
->afterTaskQueued();
}
}
return $items_created;
}
function rules_scheduler_rules_config_delete($rules_config) {
if (!$rules_config
->hasStatus(ENTITY_IN_CODE)) {
db_delete('rules_scheduler')
->condition('config', $rules_config->name)
->execute();
}
}
function rules_scheduler_views_api() {
return array(
'api' => '3.0-alpha1',
'path' => drupal_get_path('module', 'rules_scheduler') . '/includes',
);
}