Index: rules_admin/rules_admin.module =================================================================== --- rules_admin/rules_admin.module (revision 2914) +++ rules_admin/rules_admin.module (working copy) @@ -142,6 +142,7 @@ 'page arguments' => array('rules_admin_form_add', 3), 'access arguments' => array('administer rules'), 'file' => 'rules_admin.rule_forms.inc', + 'weight' => 2, ); $items[RULES_ADMIN_RULE_PATH .'/%rule/edit/%rule_element'] = array( 'title' => 'Edit', @@ -190,6 +191,7 @@ 'page arguments' => array('rules_admin_form_add_rule_set', 2), 'access arguments' => array('administer rules'), 'file' => 'rules_admin.sets.inc', + 'weight' => 2, ); $items[RULES_ADMIN_SET_PATH .'/js'] = array( Index: rules_scheduler/rules_scheduler.rules_forms.inc =================================================================== --- rules_scheduler/rules_scheduler.rules_forms.inc (revision 0) +++ rules_scheduler/rules_scheduler.rules_forms.inc (revision 0) @@ -0,0 +1,32 @@ + ''); + foreach (rules_get_configured_items('rule_sets') as $name => $set_info) { + $rule_sets[$name] = $set_info['label'] .' ('. $name .')'; + } + $form['settings']['ruleset']['#options'] = $rule_sets; + $form['settings']['ruleset']['#multiple'] = FALSE; + $form['settings']['ruleset']['#required'] = FALSE; + + $form['settings']['task_identifier']['#required'] = FALSE; +} + +/** + * Validates the parameters of the delete action, at least one must be specified. + */ +function rules_scheduler_action_delete_validate($form, $form_state) { + if ($form_state['values']['settings']['task_identifier'] === "" && empty($form_state['values']['settings']['ruleset'])) { + form_set_error('settings', t('You have specify at least one field.')); + } +} Index: rules_scheduler/includes/rules_scheduler.views_default.inc =================================================================== --- rules_scheduler/includes/rules_scheduler.views_default.inc (revision 0) +++ rules_scheduler/includes/rules_scheduler.views_default.inc (revision 0) @@ -0,0 +1,201 @@ +name = 'rules_scheduler'; + $view->description = 'Rules scheduler view'; + $view->tag = ''; + $view->view_php = ''; + $view->base_table = 'rules_scheduler'; + $view->is_cacheable = FALSE; + $view->api_version = 2; + $view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */ + $handler = $view->new_display('default', 'Defaults', 'default'); + $handler->override_option('fields', array( + 'tid' => array( + 'label' => 'Task ID', + 'alter' => array( + 'alter_text' => 0, + 'text' => '', + 'make_link' => 0, + 'path' => '', + 'link_class' => '', + 'alt' => '', + 'prefix' => '', + 'suffix' => '', + 'help' => '', + 'trim' => 0, + 'max_length' => '', + 'word_boundary' => 1, + 'ellipsis' => 1, + 'strip_tags' => 0, + 'html' => 0, + ), + 'exclude' => 0, + 'id' => 'tid', + 'table' => 'rules_scheduler', + 'field' => 'tid', + 'relationship' => 'none', + ), + 'set_name' => array( + 'label' => 'Rule set name', + 'alter' => array( + 'alter_text' => 0, + 'text' => '', + 'make_link' => 0, + 'path' => '', + 'link_class' => '', + 'alt' => '', + 'prefix' => '', + 'suffix' => '', + 'help' => '', + 'trim' => 0, + 'max_length' => '', + 'word_boundary' => 1, + 'ellipsis' => 1, + 'strip_tags' => 0, + 'html' => 0, + ), + 'exclude' => 0, + 'id' => 'set_name', + 'table' => 'rules_scheduler', + 'field' => 'set_name', + 'relationship' => 'none', + ), + 'date' => array( + 'label' => 'Scheduled date', + 'alter' => array( + 'alter_text' => 0, + 'text' => '', + 'make_link' => 0, + 'path' => '', + 'link_class' => '', + 'alt' => '', + 'prefix' => '', + 'suffix' => '', + 'help' => '', + 'trim' => 0, + 'max_length' => '', + 'word_boundary' => 1, + 'ellipsis' => 1, + 'strip_tags' => 0, + 'html' => 0, + ), + 'date_format' => 'custom', + 'custom_date_format' => 'Y-m-d H:i:s', + 'exclude' => 0, + 'id' => 'date', + 'table' => 'rules_scheduler', + 'field' => 'date', + 'relationship' => 'none', + ), + 'identifier' => array( + 'label' => 'User provided identifier', + 'alter' => array( + 'alter_text' => 0, + 'text' => '', + 'make_link' => 0, + 'path' => '', + 'link_class' => '', + 'alt' => '', + 'prefix' => '', + 'suffix' => '', + 'help' => '', + 'trim' => 0, + 'max_length' => '', + 'word_boundary' => 1, + 'ellipsis' => 1, + 'strip_tags' => 0, + 'html' => 0, + ), + 'exclude' => 0, + 'id' => 'identifier', + 'table' => 'rules_scheduler', + 'field' => 'identifier', + 'relationship' => 'none', + ), + 'nothing' => array( + 'label' => 'Operations', + 'alter' => array( + 'text' => 'delete', + 'make_link' => 1, + 'path' => 'admin/rules/rule_sets/scheduling/[tid]/delete', + 'link_class' => '', + 'alt' => 'Delete this scheduled task', + 'prefix' => '', + 'suffix' => '', + 'help' => '', + 'trim' => 0, + 'max_length' => '', + 'word_boundary' => 1, + 'ellipsis' => 1, + 'strip_tags' => 0, + 'html' => 0, + ), + 'exclude' => 0, + 'id' => 'nothing', + 'table' => 'views', + 'field' => 'nothing', + 'relationship' => 'none', + ), + )); + $handler->override_option('sorts', array( + 'date' => array( + 'order' => 'ASC', + 'id' => 'date', + 'table' => 'rules_scheduler', + 'field' => 'date', + 'relationship' => 'none', + ), + )); + $handler->override_option('access', array( + 'type' => 'perm', + 'perm' => 'administer rules', + )); + $handler->override_option('cache', array( + 'type' => 'none', + )); + $handler->override_option('empty', 'No tasks scheduled.'); + $handler->override_option('empty_format', '1'); + $handler->override_option('items_per_page', 30); + $handler->override_option('style_plugin', 'table'); + $handler->override_option('style_options', array( + 'grouping' => '', + 'override' => 1, + 'sticky' => 0, + 'order' => 'asc', + 'columns' => array( + 'set_name' => 'set_name', + 'date' => 'date', + 'tid' => 'tid', + ), + 'info' => array( + 'set_name' => array( + 'sortable' => 1, + 'separator' => '', + ), + 'date' => array( + 'sortable' => 1, + 'separator' => '', + ), + 'tid' => array( + 'sortable' => 1, + 'separator' => '', + ), + ), + 'default' => '-1', + )); + + $views = array(); + $views[$view->name] = $view; + return $views; +} Index: rules_scheduler/includes/rules_scheduler_views_handler_datetime.inc =================================================================== --- rules_scheduler/includes/rules_scheduler_views_handler_datetime.inc (revision 0) +++ rules_scheduler/includes/rules_scheduler_views_handler_datetime.inc (revision 0) @@ -0,0 +1,18 @@ +{$this->field_alias}; + // overwrite date string with timestamp + $values->{$this->field_alias} = rules_gmstrtotime($value); + // call parent method with modified values + return parent::render($values); + } +} Index: rules_scheduler/includes/rules_scheduler.views.inc =================================================================== --- rules_scheduler/includes/rules_scheduler.views.inc (revision 0) +++ rules_scheduler/includes/rules_scheduler.views.inc (revision 0) @@ -0,0 +1,98 @@ + array( + 'path' => drupal_get_path('module', 'rules_scheduler') .'/includes', + ), + // A handler for datetime + 'handlers' => array( + 'rules_scheduler_views_handler_datetime' => array( + 'parent' => 'views_handler_field_date', + ), + ), + ); +} + +/** + * Implementation of hook_views_data(). Specifies the list of future scheduled + * tasks displayed on the scheduling page. + */ +function rules_scheduler_views_data() { + $table = array( + 'rules_scheduler' => array( + 'table' => array( + 'group' => 'Rules scheduler', + 'base' => array( + 'field' => 'tid', + 'title' => t('Scheduled rule sets'), + 'help' => t("Scheduled rules that are executed based on time and cron"), + 'weight' => -10, + ), + ), + 'tid' => array( + 'title' => t('Tid'), + 'help' => t('The internal ID of the scheduled rule set'), + 'field' => array( + 'click sortable' => TRUE, + ), + 'filter' => array( + 'handler' => 'views_handler_filter_numeric', + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + ), + 'set_name' => array( + 'title' => t('Rule set name'), + 'help' => t('The name of the rule set'), + 'field' => array( + 'click sortable' => TRUE, + ), + 'filter' => array( + 'handler' => 'views_handler_filter', + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + ), + 'date' => array( + 'title' => t('Scheduled date'), + 'help' => t('Scheduled date and time stamp'), + 'field' => array( + 'handler' => 'rules_scheduler_views_handler_datetime', + 'click sortable' => TRUE, + ), + 'filter' => array( + 'handler' => 'views_handler_filter', + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + ), + 'identifier' => array( + 'title' => t('User provided identifier'), + 'help' => t('ID to recognize this specific scheduled task'), + 'field' => array( + 'click sortable' => TRUE, + ), + 'filter' => array( + 'handler' => 'views_handler_filter', + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + ), + ), + ); + return $table; +} Index: rules_scheduler/rules_scheduler.admin.inc =================================================================== --- rules_scheduler/rules_scheduler.admin.inc (revision 0) +++ rules_scheduler/rules_scheduler.admin.inc (revision 0) @@ -0,0 +1,174 @@ +Views module.'); + } + $form['task_view'] = array( + '#type' => 'markup', + '#value' => $task_list, + ); + + // form fieldset for manual scheduling + $form['manual_scheduling'] = array( + '#type' => 'fieldset', + '#title' => t('Manual scheduling of rule sets without arguments'), + '#collapsible' => TRUE, + '#collapsed' => FALSE, + ); + $rulesets = rules_scheduler_rulesets_without_arguments(); + if (empty($rulesets)) { + $form['manual_scheduling']['#description'] = t('There are currently no rule sets without arguments available.'); + } + else { + $form['manual_scheduling']['ruleset_manual'] = array( + '#title' => t('Rule set name'), + '#type' => 'select', + '#options' => $rulesets, + '#multiple' => FALSE, + ); + $form['manual_scheduling']['task_identifier'] = array( + '#title' => t('Identifier'), + '#type' => 'textfield', + '#description' => t('User provided string to identify the task.'), + ); + $rules_date = new rules_data_type_date(); + $form['manual_scheduling']['date'] = $rules_date->get_default_input_form(array('label' => 'Execution date'), NULL); + $form['manual_scheduling']['submit'] = array( + '#type' => 'submit', + '#value' => t('Schedule'), + '#submit' => array('rules_scheduler_manual_submit'), + '#validate' => array('rules_scheduler_manual_validate'), + ); + } + + // form fieldset for deleting by rule set name + $result = db_query("SELECT DISTINCT set_name FROM {rules_scheduler}"); + $ruleset_names = array(); + while ($name = db_fetch_array($result)) { + $ruleset_names[$name['set_name']] = $name['set_name']; + } + + $form['delete_by_ruleset_name'] = array( + '#type' => 'fieldset', + '#title' => t('Delete tasks by rule set name'), + '#collapsible' => TRUE, + '#collapsed' => TRUE, + ); + if (empty($ruleset_names)) { + $form['delete_by_ruleset_name']['#description'] = t('There are currently no scheduled tasks available to delete.'); + } + else { + $form['delete_by_ruleset_name']['ruleset_delete'] = array( + '#title' => t('Rule set name'), + '#type' => 'select', + '#options' => $ruleset_names, + '#multiple' => FALSE, + ); + $form['delete_by_ruleset_name']['submit'] = array( + '#type' => 'submit', + '#value' => t('Delete'), + '#submit' => array('rules_scheduler_delete_submit'), + ); + } + + return $form; +} + +/** + * Retrieves all rule sets that do not have arguments attached. + */ +function rules_scheduler_rulesets_without_arguments() { + $rule_sets = array(); + foreach (rules_get_configured_items('rule_sets') as $name => $set_info) { + if (empty($set_info['arguments'])) { + $rule_sets[$name] = $set_info['label'] .' ('. $name .')'; + } + } + return $rule_sets; +} + +/** + * Submit handler for manual scheduling of tasks. + */ +function rules_scheduler_manual_submit($form, &$form_state) { + $pack = rules_pack_variables(array(), NULL); + if ($pack === FALSE) { + rules_log(t('Packing arguments for scheduling the rule set %set failed.', array('%set' => $element['#info']['set'])), TRUE); + } + else { + $rules_date = new rules_data_type_date(); + $date = $rules_date->check_value(array('label' => 'execution date'), $form_state['values']['date']); + drupal_write_record('rules_scheduler', $task = array( + 'date' => $date, + 'set_name' => $form_state['values']['ruleset_manual'], + 'arguments' => $pack, + 'identifier' => $form_state['values']['task_identifier'], + )); + } + drupal_set_message(t('The rule set %name has been scheduled on %date.', array('%name' => $form_state['values']['ruleset_manual'], '%date' => $date))); +} + +/** + * Submit handler for deletion/cancellation of future scheduled tasks. + */ +function rules_scheduler_delete_submit($form, &$form_state) { + module_load_include('inc', 'rules_scheduler', 'rules_scheduler.rules'); + rules_scheduler_action_delete(NULL, $form_state['values']['ruleset_delete']); + drupal_set_message(t('All tasks associated with %ruleset have been deleted.', array('%ruleset' => $form_state['values']['ruleset_delete']))); +} + +/** + * Confirmation form for deleting single tasks. + */ +function rules_scheduler_delete_task(&$form_state, $task) { + $form = array(); + $form_state['task'] = $task; + + $path = array(); + $path['path'] = isset($_GET['destination']) ? $_GET['destination'] : RULES_SCHEDULER_PATH; + + $title = t('Are you sure you want to delete task %tid?', array('%tid' => $task['tid'])); + if (!empty($task['identifier'])) { + $msg = t('This task refers to the custom identifier %id and rule set %ruleset, it will be executed on %date. The delete action cannot be undone.', array( + '%ruleset' => $task['set_name'], + '%id' => $task['identifier'], + '%date' => format_date(rules_gmstrtotime($task['date'])), + )); + } + else { + $msg = t('This task refers to the rule set %ruleset and will be executed on %date. The delete action cannot be undone.', array( + '%ruleset' => $task['set_name'], + '%id' => $task['identifier'], + '%date' => $task['date'], + )); + } + return confirm_form($form, $title, $path, $msg, t('Delete'), t('Cancel')); +} + +/** + * Submit handler for deleting single tasks. + */ +function rules_scheduler_delete_task_submit($form, &$form_state) { + db_query("DELETE FROM {rules_scheduler} WHERE tid = %d", $form_state['task']['tid']); + drupal_set_message(t("Task %label has been deleted.", array('%label' => $form_state['task']['tid']))); + $form_state['redirect'] = RULES_SCHEDULER_PATH; +} Index: rules_scheduler/rules_scheduler.rules.inc =================================================================== --- rules_scheduler/rules_scheduler.rules.inc (revision 2914) +++ rules_scheduler/rules_scheduler.rules.inc (working copy) @@ -3,7 +3,8 @@ /** - * @file rules integration for the rules scheduler module + * @file + * Rules integration for the rules scheduler module. */ /** @@ -26,7 +27,32 @@ 'label' => t('Scheduled evaluation date'), )); $item['arguments'] = array_merge($date_arg, $item['arguments']); + $identifier_arg = array('task_identifier' => array( + 'type' => 'string', + 'label' => t('Identifier'), + 'description' => t('User provided string to identify the task.'), + )); + $item['arguments'] = array_merge($identifier_arg, $item['arguments']); } + + // Add action to delete scheduled rule sets + $items['rules_action_delete_scheduled_set'] = array( + 'label' => t('Delete scheduled rule sets'), + 'module' => 'Rule Scheduler', + 'base' => 'rules_scheduler_action_delete', + 'arguments' => array( + 'task_identifier' => array( + 'type' => 'string', + 'label' => t('Identifier'), + 'description' => t('All tasks that are annotated with this user provided identifier will be deleted.'), + ), + 'ruleset' => array( + 'type' => 'string', + 'label' => t('Rule set'), + 'description' => t('All tasks that execute this rule set will be deleted.'), + ), + ), + ); return $items; } @@ -35,13 +61,17 @@ */ function rules_scheduler_action() { $args = func_get_args(); + // Remove additional information from the arguments array $state = array_pop($args); $element = array_pop($args); $settings = array_pop($args); - + // Remove task ID and date arguments + $task_id = array_shift($args); $date = array_shift($args); + // Remove task ID and date from info entry array_shift($element['#info']['arguments']); - + array_shift($element['#info']['arguments']); + // Wrap the remaining rest of arguments $pack = rules_pack_variables($element['#info']['arguments'], $args); if ($pack === FALSE) { @@ -52,6 +82,7 @@ 'date' => $date, 'set_name' => $element['#info']['set'], 'arguments' => $pack, + 'identifier' => $task_id, )); } } @@ -63,3 +94,28 @@ return t("The evaluation of the rule set is going to be scheduled by cron. So make sure you have configured cron correctly by checking your site's !status.", array('!status' => l('Status report', 'admin/reports/status'))) .' '. t('Also note that the scheduling time accuracy depends on your configured cron interval.'); } +/** + * Action implementation for deleting already scheduled tasks. + */ +function rules_scheduler_action_delete($task_identifier = NULL, $rule_set_name = NULL) { + if (!empty($rule_set_name)) { + if (!empty($task_identifier)) { + db_query("DELETE FROM {rules_scheduler} WHERE set_name = '%s' AND identifier = '%s'", $rule_set_name, $task_identifier); + } + else { + db_query("DELETE FROM {rules_scheduler} WHERE set_name = '%s'", $rule_set_name); + } + } + else { + if (!empty($task_identifier)) { + db_query("DELETE FROM {rules_scheduler} WHERE identifier = '%s'", $task_identifier); + } + } +} + +/** + * Help for the delete action. + */ +function rules_scheduler_action_delete_help() { + return t('This action allows you to cancel scheduled tasks that are waiting for future execution.') .' '. t('They can be addressed by an identifier or by the rule set name, if both are specified only tasks fulfilling both requirements will be deleted.'); +} \ No newline at end of file Index: rules_scheduler/rules_scheduler.module =================================================================== --- rules_scheduler/rules_scheduler.module (revision 2914) +++ rules_scheduler/rules_scheduler.module (working copy) @@ -3,9 +3,13 @@ /** - * @file Rules scheduler module + * @file + * Rules scheduler module. */ +// Path definition for scheduling page +define('RULES_SCHEDULER_PATH', RULES_ADMIN_SET_PATH .'/scheduling'); + /** * Implementation of hook_cron(). */ @@ -28,3 +32,45 @@ } } +/** + * Implementation of hook_menu(). + */ +function rules_scheduler_menu() { + $items = array(); + $items[RULES_SCHEDULER_PATH] = array( + 'title' => 'Scheduling', + 'type' => MENU_LOCAL_TASK, + 'page callback' => 'rules_scheduler_scheduling', + 'access arguments' => array('administer rules'), + 'file' => 'rules_scheduler.admin.inc', + ); + $items[RULES_SCHEDULER_PATH .'/%rules_scheduler_tid/delete'] = array( + 'title' => 'Delete a scheduled task', + 'type' => MENU_CALLBACK, + 'page callback' => 'drupal_get_form', + 'page arguments' => array('rules_scheduler_delete_task', 4), + 'access arguments' => array('administer rules'), + 'load arguments' => array(4), + 'file' => 'rules_scheduler.admin.inc', + ); + return $items; +} + +/** + * Load a task by a given task ID. + */ +function rules_scheduler_tid_load($tid) { + $result = db_query("SELECT * FROM {rules_scheduler} WHERE tid = %d", $tid); + $task = db_fetch_array($result); + return $task; +} + +/** + * Implementation of hook_views_api(). + */ +function rules_scheduler_views_api() { + return array( + 'api' => 2.0, + 'path' => drupal_get_path('module', 'rules_scheduler') .'/includes', + ); +} \ No newline at end of file Index: rules_scheduler/rules_scheduler.install =================================================================== --- rules_scheduler/rules_scheduler.install (revision 2914) +++ rules_scheduler/rules_scheduler.install (working copy) @@ -3,7 +3,8 @@ /** - * @file Rules Scheduler - Installation file. + * @file + * Rules Scheduler - Installation file. */ /** @@ -21,7 +22,7 @@ } /** - * Implementation of hook_schema. + * Implementation of hook_schema(). */ function rules_scheduler_schema() { @@ -52,6 +53,13 @@ 'serialize' => TRUE, 'description' => t('The whole, serialized item configuration.'), ), + 'identifier' => array( + 'type' => 'varchar', + 'length' => '255', + 'default' => '', + 'not null' => FALSE, + 'description' => t('The user defined string identifying this task.'), + ), ), 'primary key' => array('tid'), 'indexes' => array('date' => array('date')), @@ -59,3 +67,20 @@ return $schema; } +/** + * Implementation of hook_update_N(). Adds an identifier field to the table. + */ +function rules_scheduler_update_6100() { + $spec = array( + 'type' => 'varchar', + 'length' => '255', + 'default' => '', + 'not null' => FALSE, + 'description' => t('The user defined string identifying this task.'), + ); + $ret = array(); + db_add_field($ret, 'rules_scheduler', 'identifier', $spec); + drupal_set_message(t('Notice: concrete scheduling dates have to be specified in GMT now, so be aware to add out your local timezone!')); + return $ret; +} + Index: rules/modules/taxonomy.rules.inc =================================================================== --- rules/modules/taxonomy.rules.inc (revision 2914) +++ rules/modules/taxonomy.rules.inc (working copy) @@ -1,5 +1,5 @@ t('Loading a taxonomy term will allow you to act on this term, for example you will be able to assign this term to a content.'), 'module' => 'Taxonomy', ); + $info['rules_action_taxonomy_add_term'] = array( + 'label' => t('Add a new term to vocabulary'), + 'arguments' => array( + 'taxonomy_vocab' => array( + 'type' => 'taxonomy_vocab', + 'label' => t('Taxonomy vocabulary'), + ), + ), + 'new variables' => array( + 'taxonomy_term' => array( + 'type' => 'taxonomy_term', + 'label' => t('Taxonomy term'), + ), + ), + 'eval input' => array('term|name', 'term|description'), + 'module' => 'Taxonomy', + ); + + $info['rules_action_taxonomy_delete_term'] = array( + 'label' => t('Delete a term'), + 'arguments' => array( + 'taxonomy_term' => array( + 'type' => 'taxonomy_term', + 'label' => t('Taxonomy term'), + ), + ), + 'module' => 'Taxonomy', + ); + $info['rules_action_taxonomy_term_assign_to_content'] = array( 'label' => t('Assign a term to content'), 'arguments' => array( @@ -123,6 +152,7 @@ 'label' => t('Taxonomy vocabulary'), ), ), + 'eval input' => array('name', 'description', 'help'), 'module' => 'Taxonomy', ); return $info; @@ -138,6 +168,26 @@ } /** + * Action: Add a new term to vocabulary. + */ +function rules_action_taxonomy_add_term($taxonomy_vocab, $settings) { + // Prepare the values to pass to taxonomy_save_term(); + $settings['term']['vid'] = $taxonomy_vocab->vid; + $form_values = $settings['term']; + taxonomy_save_term($form_values); + // Get the newly created term. + $term = taxonomy_get_term($form_values['tid']); + return array('taxonomy_term' => $term); +} + +/** + * Action: Delete a term. + */ +function rules_action_taxonomy_delete_term($taxonomy_term) { + taxonomy_del_term($taxonomy_term->tid); +} + +/** * Action: Assign or remove a term to content. */ function rules_action_taxonomy_term_assign_to_content($node, $taxonomy_term, $settings) { Index: rules/modules/taxonomy.rules_forms.inc =================================================================== --- rules/modules/taxonomy.rules_forms.inc (revision 2914) +++ rules/modules/taxonomy.rules_forms.inc (working copy) @@ -1,5 +1,5 @@ 'fieldset', + '#title' => t('Term Identification'), + '#collapsible' => TRUE, + ); + $form['settings']['term']['name'] = array( + '#type' => 'textfield', + '#title' => t('Term name'), + '#default_value' => !empty($settings['term']['name']) ? $settings['term']['name'] : '', + '#maxlength' => 255, + '#description' => t('The name of this term.'), + '#required' => TRUE, + ); + + $form['settings']['term']['description'] = array( + '#type' => 'textarea', + '#title' => t('Description'), + '#default_value' => !empty($settings['term']['description']) ? $settings['term']['description'] : '', + '#description' => t('A description of the term. To be displayed on taxonomy/term pages and RSS feeds.'), + ); +} + +/** * Action: Load a vocabulary configuration form. */ function rules_action_taxonomy_load_vocab_form($settings, &$form, $form_state) { Index: rules/modules/rules.rules.inc =================================================================== --- rules/modules/rules.rules.inc (revision 2914) +++ rules/modules/rules.rules.inc (working copy) @@ -85,8 +85,8 @@ class rules_data_type_date extends rules_data_type_string { function get_default_input_form($info, $value) { $info += array('long' => FALSE, 'required' => TRUE, 'description' => ''); - $value = isset($value) ? $value : date('Y-m-d H:i:s', time() + 86400); - $info['description'] = $info['description'] .' '. t('Format: %format or other values known by the PHP !strtotime function like "+1 day". ', array('%format' => date('Y-m-d H:i:s', time() + 86400), '!strtotime' => l('strtotime()', 'http://php.net/strtotime'))); + $value = isset($value) ? $value : gmdate('Y-m-d H:i:s', time()); + $info['description'] = $info['description'] .' '. t('Format: %format or other values in GMT known by the PHP !strtotime function like "+1 day". ', array('%format' => gmdate('Y-m-d H:i:s', time() + 86400), '!strtotime' => l('strtotime()', 'http://php.net/strtotime'))); $info['description'] .= '
'. t('You may also enter a timestamp in GMT. E.g. use !code together with the PHP input evalutor to specify a date one day after the evaluation time. ', array('!code' => '
'. check_plain('') .'
')); return array( '#type' => $info['long'] ? 'textarea' : 'textfield', @@ -102,7 +102,7 @@ $value = gmdate('Y-m-d H:i:s', $value); } else if (is_string($value)) { - $value = gmdate('Y-m-d H:i:s', strtotime($value)); + $value = gmdate('Y-m-d H:i:s', rules_gmstrtotime($value)); } if (is_string($value) && preg_match(RULES_DATE_REGEX_LOOSE, $value)) { return $value; Index: rules/rules.module =================================================================== --- rules/rules.module (revision 2914) +++ rules/rules.module (working copy) @@ -1018,3 +1018,17 @@ return $rule; } +/** + * Convert a time string to a GMT (UTC) unix timestamp + */ +function rules_gmstrtotime($time) { + // we have to rember the timezone setting + $local_timezone = date_default_timezone_get(); + // no we switch to UTC + date_default_timezone_set('UTC'); + // convert to unix timestamp + $value = strtotime($time); + // switch back to old timezone setting + date_default_timezone_set($local_timezone); + return $value; +} \ No newline at end of file