View source
<?php
define('RULES_FORMS_ADMIN_PATH', 'admin/config/workflow/rules/forms');
function rules_forms_help($path, $arg) {
switch ($path) {
case 'admin/help#rules_forms':
return '<p>' . t('Rules Forms Support provides Rules events, conditions, and actions for any form built with the Drupal form API. To activate events for a form you must first visit <a href="!admin">Rules Forms settings</a> and enable activation messages.', array(
'!admin' => url(RULES_FORMS_ADMIN_PATH),
)) . '</p>';
case RULES_FORMS_ADMIN_PATH:
return '<p>' . t('Settings and overview of form events and active elements.') . '</p>';
}
}
function rules_forms_permission() {
return array(
'administer rules forms rules' => array(
'title' => t('Administer Rules Forms rules'),
'description' => t('Grants access to building rules for forms.'),
),
'administer rules forms' => array(
'title' => t('Administer Rules Forms'),
'description' => t('Grants access to Rules Forms settings and activating or deactivating rules for forms.'),
),
);
}
function rules_forms_menu() {
$arguments_offset = count(explode('/', RULES_FORMS_ADMIN_PATH)) - 1;
$items = array();
$items[RULES_FORMS_ADMIN_PATH] = array(
'title' => 'Forms Support',
'description' => 'Manage Rules Forms events, forms, and form element information.',
'page callback' => 'drupal_get_form',
'page arguments' => array(
'rules_forms_admin_events',
),
'access arguments' => array(
'administer rules forms',
),
'type' => MENU_LOCAL_TASK,
'weight' => 1,
'file' => 'includes/rules_forms.admin.inc',
);
$items[RULES_FORMS_ADMIN_PATH . '/%/activate/%'] = array(
'title' => 'Activate events for a form',
'type' => MENU_CALLBACK,
'page callback' => 'rules_forms_activate',
'page arguments' => array(
$arguments_offset + 1,
$arguments_offset + 3,
),
'access arguments' => array(
'administer rules forms',
),
'file' => 'includes/rules_forms.admin.inc',
);
return $items;
}
function rules_forms_hook_info() {
$hooks['rules_forms_element_info'] = array(
'group' => 'info',
);
$hooks['rules_forms_element_info_alter'] = array(
'group' => 'info',
);
return $hooks;
}
function &rules_forms_get_cache($cid) {
static $cache;
if (!isset($cache)) {
$cache =& drupal_static(__FUNCTION__, array());
}
if (!isset($cache[$cid])) {
if ($cache_data = cache_get($cid)) {
$cache[$cid] = $cache_data->data;
}
else {
$cache[$cid] = FALSE;
}
}
return $cache[$cid];
}
function rules_forms_set_cache($cid, $data) {
$cache =& drupal_static('rules_forms_get_cache', array());
$cache[$cid] = $data;
cache_set($cid, $cache[$cid]);
}
function rules_forms_clear_cache() {
cache_clear_all('rules_forms', 'cache', TRUE);
rules_clear_cache();
drupal_static_reset('rules_forms_get_cache');
}
function rules_forms_flush_caches() {
db_update('rules_forms')
->fields(array(
'rebuild' => 1,
))
->execute();
}
function rules_forms_create_structure() {
return array();
}
function rules_forms_form_alter(&$form, &$form_state, $form_id) {
if (rules_forms_get_form_info($form_id)) {
rules_forms_event_build($form, $form_state, $form_id);
$form['#validate'][] = 'rules_forms_event_validate';
$form['#submit'][] = 'rules_forms_event_submit';
$form['#after_build'][] = 'rules_forms_after_build';
}
elseif (!empty($_SESSION['rules_forms_message'])) {
$uri = drupal_get_destination();
$link = l($form_id, RULES_FORMS_ADMIN_PATH . '/' . $form_id . '/activate/' . urlencode(trim($uri['destination'], '/')));
$msg = t('Activate events for !form.', array(
'!form' => $link,
));
drupal_set_message($msg, 'status', FALSE);
}
}
function rules_forms_event_build(&$form, &$form_state, $form_id) {
rules_forms_invoke_event('form_built', $form, $form_state, $form_id);
}
function rules_forms_event_validate(&$form, &$form_state) {
rules_forms_invoke_event('form_validate', $form, $form_state);
}
function rules_forms_event_submit(&$form, &$form_state) {
rules_forms_invoke_event('form_submit', $form, $form_state);
}
function rules_forms_invoke_event($event_type, &$form, &$form_state, $form_id = NULL) {
if (empty($form_id)) {
$form_id = $form['form_id']['#value'];
}
rules_invoke_event("rules_forms_{$form_id}_{$event_type}", new EntityMetadataArrayObject($form), new EntityMetadataArrayObject($form_state));
}
function rules_forms_after_build($form, &$form_state) {
$form_id = $form['form_id']['#value'];
$form_info = rules_forms_get_form_info($form_id);
if ($form_info !== FALSE && !empty($form_info['rebuild'])) {
$evaluator = new RulesFormsFormEvaluator();
$property_info = $evaluator
->evaluate($form);
drupal_alter('rules_forms_form_property_info', $property_info, $form, $form_id);
$form_info['properties'] = $property_info['properties'];
$form_info['rebuild'] = FALSE;
rules_forms_update_form_info($form_info);
rules_forms_clear_cache();
drupal_set_message(t('Form elements for %form have been built.', array(
'%form' => $form_info['label'],
)));
}
return $form;
}
function rules_forms_activate_form(array $info) {
$info += array(
'properties' => array(
'form' => array(),
'form_state' => array(),
),
'rebuild' => TRUE,
);
$fields = array(
'form_id' => $info['form_id'],
'label' => $info['label'],
'properties' => serialize($info['properties']),
'rebuild' => $info['rebuild'] == TRUE ? 1 : 0,
);
db_insert('rules_forms')
->fields($fields)
->execute();
return SAVED_NEW;
}
function rules_forms_update_form_info(array $info) {
$fields = array(
'form_id' => $info['form_id'],
'label' => $info['label'],
'properties' => serialize($info['properties']),
'rebuild' => $info['rebuild'] == TRUE ? 1 : 0,
);
db_update('rules_forms')
->fields($fields)
->condition('form_id', $fields['form_id'])
->execute();
return SAVED_UPDATED;
}
function rules_forms_get_form_info($form_id = NULL) {
if ($data = rules_forms_get_cache('rules_forms_info')) {
$form_info = $data;
}
else {
$form_info = array();
if (!db_table_exists('rules_forms')) {
return $form_info;
}
$results = db_select('rules_forms', 'rf')
->fields('rf')
->execute();
foreach ($results as $info) {
$info = (array) $info;
$info['properties'] = unserialize($info['properties']);
$info['rebuild'] = $info['rebuild'] == TRUE;
$form_info[$info['form_id']] = $info;
}
rules_forms_set_cache('rules_forms_info', $form_info);
}
if (isset($form_id)) {
return isset($form_info[$form_id]) ? $form_info[$form_id] : FALSE;
}
return $form_info;
}
function rules_forms_deactivate_form($form_id) {
db_delete('rules_forms')
->condition('form_id', $form_id)
->execute();
return SAVED_DELETED;
}
function rules_forms_get_element_info($name = NULL) {
$elements =& drupal_static(__FUNCTION__, array());
if (empty($elements)) {
if ($cache = rules_forms_get_cache('element_info')) {
$elements = $cache;
}
else {
foreach (module_invoke_all('rules_forms_element_info') as $key => $value) {
$value += array(
'element info' => array(),
);
$value['element info'] += array(
'data type' => 'text',
);
$elements[$key] = $value;
}
drupal_alter('rules_forms_element_info', $elements);
rules_forms_set_cache('element_info', $elements);
}
}
if (isset($name) && isset($elements[$name])) {
return $elements[$name];
}
return $elements;
}