123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217 |
- <?php
- /**
- * @file
- * Rules integration for the rules scheduler module.
- *
- * @addtogroup rules
- *
- * @{
- */
- /**
- * Implements hook_rules_action_info().
- */
- function rules_scheduler_rules_action_info() {
- $items['schedule'] = array(
- 'label' => t('Schedule component evaluation'),
- 'group' => t('Rules scheduler'),
- 'base' => 'rules_scheduler_action_schedule',
- 'named parameter' => TRUE,
- 'parameter' => array(
- 'component' => array(
- 'type' => 'text',
- 'label' => t('Component'),
- 'options list' => 'rules_scheduler_component_options_list',
- 'restriction' => 'input',
- 'description' => 'Select the component to schedule. Only components containing actions are available – no condition sets.',
- ),
- 'date' => array(
- 'type' => 'date',
- 'label' => t('Scheduled evaluation date'),
- ),
- 'identifier' => array(
- 'type' => 'text',
- 'label' => t('Identifier'),
- 'description' => t('A string used for identifying this task. Any existing tasks for this component with the same identifier will be replaced.'),
- 'optional' => TRUE,
- ),
- // Further needed parameter by the component are added during processing.
- ),
- );
- // Add action to delete scheduled tasks.
- $items['schedule_delete'] = array(
- 'label' => t('Delete scheduled tasks'),
- 'group' => t('Rules scheduler'),
- 'base' => 'rules_scheduler_action_delete',
- 'parameter' => array(
- 'component' => array(
- 'type' => 'text',
- 'label' => t('Component'),
- 'options list' => 'rules_scheduler_component_options_list',
- 'description' => t('The component for which scheduled tasks will be deleted.'),
- 'optional' => TRUE,
- ),
- 'task' => array(
- 'type' => 'text',
- 'label' => t('Task identifier'),
- 'description' => t('All tasks that are annotated with the given identifier will be deleted.'),
- 'optional' => TRUE,
- ),
- ),
- );
- return $items;
- }
- /**
- * Options list callback returning a list of action components.
- */
- function rules_scheduler_component_options_list() {
- return rules_get_components(TRUE, 'action');
- }
- /**
- * Base action implementation for scheduling components.
- */
- function rules_scheduler_action_schedule($args, $element) {
- $state = $args['state'];
- if ($component = rules_get_cache('comp_' . $args['component'])) {
- // Manually create a new evaluation state for scheduling the evaluation.
- $new_state = new RulesState();
- // Register all parameters as variables.
- foreach ($element->pluginParameterInfo() as $name => $info) {
- if (strpos($name, 'param_') === 0) {
- // Remove the parameter name prefix 'param_'.
- $var_name = substr($name, 6);
- $new_state->addVariable($var_name, $state->currentArguments[$name], $info);
- }
- }
- rules_scheduler_schedule_task(array(
- 'date' => $args['date'],
- 'config' => $args['component'],
- 'data' => $new_state,
- 'identifier' => $args['identifier'],
- ));
- }
- else {
- throw new RulesEvaluationException('Unable to get the component %name', array('%name' => $args['component']), $element, RulesLog::ERROR);
- }
- }
- /**
- * Info alteration callback for the schedule action.
- */
- function rules_scheduler_action_schedule_info_alter(&$element_info, RulesPlugin $element) {
- if (isset($element->settings['component'])) {
- // If run during a cache rebuild the cache might not be instantiated yet,
- // so fail back to loading the component from database.
- if (($component = rules_get_cache('comp_' . $element->settings['component'])) || $component = rules_config_load($element->settings['component'])) {
- // Add in the needed parameters.
- foreach ($component->parameterInfo() as $name => $info) {
- $element_info['parameter']['param_' . $name] = $info;
- }
- }
- }
- }
- /**
- * Validate callback for the schedule action.
- *
- * Makes sure the component exists and is not dirty.
- *
- * @see rules_element_invoke_component_validate()
- */
- function rules_scheduler_action_schedule_validate(RulesPlugin $element) {
- $info = $element->info();
- $component = rules_config_load($element->settings['component']);
- if (!$component) {
- throw new RulesIntegrityException(t('The component %config does not exist.', array('%config' => $element->settings['component'])), $element);
- }
- // Check if the component is marked as dirty.
- rules_config_update_dirty_flag($component);
- if (!empty($component->dirty)) {
- throw new RulesIntegrityException(t('The utilized component %config fails the integrity check.', array('%config' => $element->settings['component'])), $element);
- }
- }
- /**
- * Help for the schedule action.
- */
- function rules_scheduler_action_schedule_help() {
- return t("Note that component evaluation is triggered by <em>cron</em> – make sure cron is configured correctly by checking your site's !status. The scheduling time accuracy depends on your configured cron interval. See <a href='@url'>the online documentation</a> for more information on how to schedule evaluation of components.",
- array('!status' => l(t('Status report'), 'admin/reports/status'),
- '@url' => rules_external_help('scheduler')));
- }
- /**
- * Form alter callback for the schedule action.
- */
- function rules_scheduler_action_schedule_form_alter(&$form, &$form_state, $options, RulesAbstractPlugin $element) {
- $first_step = empty($element->settings['component']);
- $form['reload'] = array(
- '#weight' => 5,
- '#type' => 'submit',
- '#name' => 'reload',
- '#value' => $first_step ? t('Continue') : t('Reload form'),
- '#limit_validation_errors' => array(array('parameter', 'component')),
- '#submit' => array('rules_action_type_form_submit_rebuild'),
- '#ajax' => rules_ui_form_default_ajax(),
- );
- // Use ajax and trigger as the reload button.
- $form['parameter']['component']['settings']['type']['#ajax'] = $form['reload']['#ajax'] + array(
- 'event' => 'change',
- 'trigger_as' => array('name' => 'reload'),
- );
- if ($first_step) {
- // In the first step show only the component select.
- foreach (element_children($form['parameter']) as $key) {
- if ($key != 'component') {
- unset($form['parameter'][$key]);
- }
- }
- unset($form['submit']);
- unset($form['provides']);
- }
- else {
- // Hide the reload button in case js is enabled and it's not the first step.
- $form['reload']['#attributes'] = array('class' => array('rules-hide-js'));
- }
- }
- /**
- * Action: Delete scheduled tasks.
- */
- function rules_scheduler_action_delete($component_name = NULL, $task_identifier = NULL) {
- $query = db_delete('rules_scheduler');
- if (!empty($component_name)) {
- $query->condition('config', $component_name);
- }
- if (!empty($task_identifier)) {
- $query->condition('identifier', $task_identifier);
- }
- $query->execute();
- }
- /**
- * Cancels scheduled task action validation callback.
- */
- function rules_scheduler_action_delete_validate($element) {
- if (empty($element->settings['task']) && empty($element->settings['task:select']) &&
- empty($element->settings['component']) && empty($element->settings['component:select'])) {
- throw new RulesIntegrityException(t('You have to specify at least either a component or a task identifier.'), $element);
- }
- }
- /**
- * Help for the cancel action.
- */
- function rules_scheduler_action_delete_help() {
- return t('This action allows you to delete scheduled tasks that are waiting for future execution.') . ' ' . t('They can be addressed by an identifier or by the component name, whereas if both are specified only tasks fulfilling both requirements will be deleted.');
- }
- /**
- * @}
- */
|