t('Drupal user'), '#type' => 'object', '#load' => 'user_load', '#save' => 'user_save', ); $entities['node'] = array( '#title' => t('Node'), '#type' => 'object', '#load' => 'node_load', '#save' => 'node_save', ); $entities['arguments'] = array( '#title' => t('Trigger arguments'), '#type' => 'array', ); return $entities; } /** * Implement hook_ca_condition(). */ function ca_ca_condition() { $conditions = array(); $conditions['ca_condition_date'] = array( '#title' => t('Check the current date'), '#description' => t('Used to determine if the action should be performed on the current date.'), '#category' => t('Drupal'), '#callback' => 'ca_condition_date', '#arguments' => array(), ); $conditions['node_field_comparison'] = array( '#title' => t('Compare a node field value'), '#description' => t('Returns TRUE if the node field selected below compares to the value entered as specified by the operator.'), '#category' => t('Node'), '#callback' => 'ca_condition_node_field_comparison', '#arguments' => array( 'node' => array('#entity' => 'node'), ), ); $conditions['ca_condition_custom_php'] = array( '#title' => t('Execute custom PHP code'), '#description' => t('Returns whatever your custom PHP code returns.'), '#category' => t('System'), '#callback' => 'ca_condition_custom_php', '#arguments' => array( 'arguments' => array('#entity' => 'arguments', '#title' => t('Arguments')), ), ); $conditions['ca_condition_user_roles'] = array( '#title' => t("Check the user's roles"), '#category' => t('User'), '#description' => t('Returns TRUE if the user roles match your settings.'), '#callback' => 'ca_condition_user_roles', '#arguments' => array( 'account' => array('#entity' => 'user', '#title' => t('User')), ), ); return $conditions; } /** * Implement hook_ca_action(). * * Demonstrates defining an action for predicates to use; primarily specifies a * callback function to perform the action and an array that specifies arguments * and their data types. */ function ca_ca_action() { $actions['ca_drupal_set_message'] = array( '#title' => t('Display a message to the user'), '#category' => t('Drupal'), '#callback' => 'ca_action_drupal_set_message', '#arguments' => array(), ); $actions['ca_action_custom_php'] = array( '#title' => t('Execute custom PHP code'), '#category' => t('System'), '#callback' => 'ca_action_custom_php', '#arguments' => array( 'arguments' => array('#entity' => 'arguments', '#title' => t('Arguments')), ), ); return $actions; } /** * Check that the current time is within a specified range. * * @see ca_condition_date_form() */ function ca_condition_date($settings) { $set_date_start = gmmktime(0, 0, 0, $settings['date']['month'], $settings['date']['day'], $settings['date']['year']); $set_date_end = gmmktime(23, 59, 59, $settings['date']['month'], $settings['date']['day'], $settings['date']['year']); switch ($settings['operator']) { case 'before': return REQUEST_TIME < $set_date_start; case 'only': return ($set_date_start < REQUEST_TIME) && (REQUEST_TIME < $set_date_end); case 'after': return $set_date_end < REQUEST_TIME; default: return FALSE; } } /** * @see ca_condition_date() */ function ca_condition_date_form($form_state, $settings = array()) { $form = array(); $form['operator'] = array( '#type' => 'radios', '#title' => t('Comparison'), '#options' => array( 'before' => t('Before'), 'only' => t('Only'), 'after' => t('After'), ), '#default_value' => $settings['operator'], '#description' => t('Example: "The current date is before the date below."'), ); $form['date'] = array( '#type' => 'date', '#title' => t('Date'), '#default_value' => $settings['date'], '#description' => t('When the predicate is evaluated, the current date is compared to this date.'), ); return $form; } /** * Compare a node field to a specified value using an operator list. * * @see ca_condition_node_field_comparison_form() */ function ca_condition_node_field_comparison($node, $settings) { // Convert the node to an array. $node_array = (array) $node; // Store the value of the field we're comparing. $field_value = $node_array[$settings['field']]; // Return the result based on the operator. switch ($settings['operator']) { case 'equal': if ($field_value == $settings['value']) { return TRUE; } break; case 'not': if ($field_value != $settings['value']) { return TRUE; } break; case 'greater': if ($field_value > $settings['value']) { return TRUE; } break; case 'less': if ($field_value < $settings['value']) { return TRUE; } break; case 'greater_equal': if ($field_value >= $settings['value']) { return TRUE; } break; case 'less_equal': if ($field_value <= $settings['value']) { return TRUE; } break; case 'begins': if (strpos($field_value, $settings['value']) === 0) { return TRUE; } break; case 'ends': if (substr($field_value, -1 * strlen($settings['value'])) === $settings['value']) { return TRUE; } break; case 'contains': if (strpos($field_value, $settings['value']) !== FALSE) { return TRUE; } break; case 'yes': if ($field_value) { return TRUE; } break; case 'no': if (!$field_value) { return TRUE; } break; } return FALSE; } /** * @see ca_condition_node_field_comparision() */ function ca_condition_node_field_comparison_form($form_state, $settings = array()) { $form = array(); // Define the fields this works for. $options = array( t('Core node fields') => array( 'nid' => t('Node ID'), 'vid' => t('Node revision ID'), 'type' => t('Node type'), 'title' => t('Title'), 'uid' => t("Author's user ID"), 'status' => t('Node is published?'), 'promote' => t('Node is promoted?'), 'sticky' => t('Node is sticky?'), ), ); $form['field'] = array( '#type' => 'select', '#title' => t('Node field'), '#options' => $options, '#default_value' => $settings['field'], ); // Define the operators for the fields. $options = array( t('Simple comparison') => array( 'equal' => t('is equal to'), 'not' => t('is not equal to'), 'greater' => t('is greater than'), 'less' => t('is less than'), 'greater_equal' => t('is greater than or equal to'), 'less_equal' => t('is less than or equal to'), ), t('Text matching') => array( 'begins' => t('begins with'), 'contains' => t('contains'), 'ends' => t('ends with'), ), t('Yes/No') => array( 'yes' => t('yes'), 'no' => t('no'), ), ); $form['operator'] = array( '#type' => 'select', '#title' => t('Operator'), '#description' => t('Please note that not every operator makes sense for every field.'), '#options' => $options, '#default_value' => $settings['operator'], ); $form['value'] = array( '#type' => 'textfield', '#title' => t('Comparison value'), '#description' => t('You do not need to specify a value if your operator is in the Yes/No category.'), '#default_value' => $settings['value'], ); return $form; } /** * Display a message to the user. * * @see ca_action_drupal_set_message_form() */ function ca_action_drupal_set_message($settings) { // Filter the text using the default format. $message = check_markup($settings['message_text'], $settings['message_text_format']); // Return if there's nothing to display. if (empty($message) || empty($settings['message_text'])) { return; } // Make sure we have a valid message type. if ($settings['message_type'] == 'error') { $type = $settings['message_type']; } else { $type = 'status'; } // Output the message using the Drupal message API. drupal_set_message($message, $type); } /** * @see ca_action_drupal_set_message() */ function ca_action_drupal_set_message_form($form_state, $settings = array()) { $form = array(); $form['message_text'] = array( '#type' => 'textarea', '#title' => t('Message text'), '#default_value' => $settings['message_text'], '#text_format' => filter_default_format(), ); $form['message_type'] = array( '#type' => 'radios', '#title' => t('Message type'), '#options' => array( 'status' => t('Status'), 'error' => t('Error'), ), '#default_value' => isset($settings['message_type']) ? $settings['message_type'] : 'status', ); return $form; } /** * Evaluate a custom PHP condition. * * @see ca_condition_custom_php_form() */ function ca_condition_custom_php($arguments, $settings) { return _ca_custom_php_eval($settings['php'], $arguments); } /** * @see ca_condition_custom_php() */ function ca_condition_custom_php_form($form_state, $settings = array(), $arguments = array()) { $form['variables'] = _ca_custom_php_variables_table($arguments); $form['php'] = array( '#type' => 'textarea', '#title' => t('Custom PHP'), '#description' => t('Enter the custom PHP to be evaluated when this condition is executed. Should not include <?php ?> delimiters.'), '#default_value' => isset($settings['php']) ? $settings['php'] : '', ); return $form; } /** * Check a user's roles. * * @see ca_condition_user_roles_form() */ function ca_condition_user_roles($account, $settings) { $settings['roles'] = array_filter($settings['roles']); if ($settings['operator'] == 'AND') { foreach ($settings['roles'] as $key) { if (!isset($account->roles[$key])) { return FALSE; } } return TRUE; } else { foreach ($settings['roles'] as $key) { if (isset($account->roles[$key])) { return TRUE; } } return FALSE; } } /** * @see ca_condition_user_roles() */ function ca_condition_user_roles_form($form_state, $settings = array()) { $form['operator'] = array( '#type' => 'radios', '#title' => t('Operator'), '#description' => t('If you specify AND and want to check a custom role, remember to specify authenticated user where applicable.'), '#options' => array( 'OR' => t('OR: If the user has any of these roles.'), 'AND' => t('AND: If the user has all of these roles.'), ), '#default_value' => isset($settings['operator']) ? $settings['operator'] : 'OR', ); $form['roles'] = array( '#type' => 'checkboxes', '#title' => t('Roles'), '#options' => user_roles(), '#default_value' => isset($settings['roles']) ? $settings['roles'] : array(), ); return $form; } /** * Perform a custom PHP action. * * @see ca_action_custom_php_form() */ function ca_action_custom_php($arguments, $settings) { _ca_custom_php_eval($settings['php'], $arguments); } /** * @see ca_action_custom_php() */ function ca_action_custom_php_form($form_state, $settings = array(), $arguments = array()) { $form['variables'] = _ca_custom_php_variables_table($arguments); $form['php'] = array( '#type' => 'textarea', '#title' => t('Custom PHP'), '#description' => t('Enter the custom PHP to be evaluated when this action is executed. Should not include <?php ?> delimiters.'), '#default_value' => isset($settings['php']) ? $settings['php'] : '', ); return $form; } /** * Return a fieldset used to display available variables for custom PHP * conditions and actions. */ function _ca_custom_php_variables_table($arguments) { $rows = array(); $header = array(t('Variable'), t('Type'), t('Description')); // Translate the arguments into descriptive rows. foreach ($arguments as $key => $value) { $rows[] = array(check_plain('$' . $key), check_plain($value['#entity']), $value['#title']); } if (empty($rows)) { $rows[] = array(array('data' => t('No variables available.'), 'colspan' => 3)); } $fieldset = array( '#type' => 'fieldset', '#title' => t('Available PHP variables'), '#description' => t('You may use these variables in your custom PHP.') . theme('table', array('header' => $header, 'rows' => $rows)), '#collapsible' => TRUE, ); return $fieldset; } /** * Evaluate a custom PHP condition or action with trigger arguments available * as variables. */ function _ca_custom_php_eval($php, $arguments) { $argument_data = array(); // Convert the arguments to an array of data that we can extract. foreach ($arguments as $key => $value) { $argument_data[$key] = $value['#data']; } extract($argument_data); return eval($php); }