View source
<?php
const HOST_ENTITY_KEY = 'date_restrictions_host_entity';
function date_restrictions_host_entity_hook_info() {
$group = array(
'group' => 'date_restrictions',
);
return array(
'date_restrictions_host_entity_source_fields' => $group,
'host_entity_after_build' => $group,
);
}
function date_restrictions_host_entity_allowed_values_remitter_pack($type, $element, $form_state, $context) {
$instance = $element['#instance'];
$remitter[] = $instance['entity_type'];
$remitter[] = $instance['bundle'];
$remitter[] = $instance['field_id'];
$remitter[] = $form_state['complete form']['#build_id'];
return implode(':', $remitter);
}
function date_restrictions_host_entity_allowed_values_remitter_unpack($type, $remitter) {
list($entity_type, $bundle, $field_id, $form_build_id) = explode(':', $remitter);
$field = field_info_field_by_id($field_id);
$instance = field_info_instance($entity_type, $field['field_name'], $bundle);
$form_state = form_state_defaults();
$form = form_get_cache($form_build_id, $form_state);
return array(
'values' => $form_state[HOST_ENTITY_KEY]['values'],
'settings' => $instance['settings']['restrictions']['allowed_values'][$type],
);
}
function date_restrictions_host_entity_form_alter(&$form, &$form_state, $form_id) {
if (isset($form['#entity_type'], $form['#entity'])) {
if (!isset($form_state[HOST_ENTITY_KEY]['sources'])) {
$sources = $targets = array();
$bundles[$form['#entity_type']] = array(
$form['#bundle'],
);
$instances = date_restrictions_get_bundle_instances($bundles);
foreach ($instances as $key => $instance) {
if (isset($form[$instance['field_name']])) {
date_restrictions_host_entity_inspect($instance, $sources, $targets);
}
}
$context = array(
'form' => $form,
'form_state' => $form_state,
);
drupal_alter('date_restrictions_host_entity_fields', $sources, $targets, $context);
foreach (array_keys($sources) as $field_name) {
if (!isset($form[$field_name])) {
unset($sources[$field_name]);
}
}
foreach (array_keys($targets) as $field_name) {
if (!isset($form[$field_name])) {
unset($targets[$field_name]);
}
}
$form_state[HOST_ENTITY_KEY]['sources'] = $sources;
$form_state[HOST_ENTITY_KEY]['targets'] = $targets;
}
$sources = $form_state[HOST_ENTITY_KEY]['sources'];
foreach ($sources as $source_field_name => $source) {
if ($source['ajax']) {
$leaves = date_restrictions_element_leaf_children($form[$source_field_name]);
foreach ($leaves as &$leaf) {
$leaf['#ajax'] = array(
'triggering_field_name' => $source_field_name,
'callback' => 'date_restrictions_host_entity_source_field_change_callback',
);
$leaf['#limit_validation_errors'] = array();
$leaf['#limit_validation_errors'][] = array(
$source_field_name,
);
foreach ($source['targets'] as $target_field_name) {
$leaf['#limit_validation_errors'][] = array(
$target_field_name,
);
}
}
}
}
$targets = $form_state[HOST_ENTITY_KEY]['targets'];
foreach (array_keys($targets) as $target_field_name) {
if (!isset($form[$target_field_name]['#prefix'])) {
$wrapper = $target_field_name . '-' . HOST_ENTITY_KEY;
$form[$target_field_name]['#prefix'] = '<div id="' . $wrapper . '">';
$form[$target_field_name]['#suffix'] = '</div>';
}
}
$form['#after_build'][] = 'date_restrictions_host_entity_form_after_build';
}
}
function date_restrictions_host_entity_inspect($instance, &$sources, &$targets) {
$field = field_info_field($instance['field_name']);
foreach (array_keys($field['columns']) as $column) {
_date_restrictions_host_entity_inspect($instance, $sources, $targets, $column);
}
}
function _date_restrictions_host_entity_inspect($instance, &$sources, &$targets, $column) {
static $info = FALSE;
if (!$info) {
if (module_exists('date_restrictions_allowed_values')) {
$info['allowed_values'] = date_restrictions_allowed_values_info();
}
if (module_exists('date_restrictions_minmax')) {
$info['min'] = $info['max'] = date_restrictions_minmax_info();
}
}
$restrictions = $column == 'value' ? $instance['settings']['restrictions'] : $instance['settings']['restrictions2'];
$field_name = $instance['field_name'];
foreach ($restrictions as $type => $settings) {
$restriction = $settings['type'];
if ($restriction == 'disabled' || !isset($info[$type]) || !isset($info[$type][$restriction])) {
continue;
}
$type_info = $info[$type][$restriction];
if (in_array('date_restrictions_host_entity', $type_info['dependencies'])) {
$module = $type_info['module'];
$hook = 'date_restrictions_host_entity_source_fields';
if (module_hook($module, $hook)) {
$function = $module . '_' . $hook;
$source_fields = $function($settings[$restriction]);
}
else {
list(, , $source_field) = explode(':', $settings[$restriction]['field']);
$source_fields = array(
$source_field,
);
}
foreach ($source_fields as $sf) {
if (!isset($sources[$sf])) {
$sources[$sf] = array(
'ajax' => TRUE,
'targets' => array(),
);
}
$sources[$sf]['targets'][$field_name] = $field_name;
}
$targets[$field_name][$column][$type] = $type_info;
}
}
}
function date_restrictions_host_entity_date_combo_process_alter(&$element, $form_state, $context) {
if (isset($element['#limit_validation_errors'])) {
foreach ($element['#columns'] as $column) {
$element[$column]['#limit_validation_errors'] = $element['#limit_validation_errors'];
}
}
}
function date_restrictions_host_entity_form_after_build($form, &$form_state) {
static $validated = false;
if (!$validated) {
if (!empty($form_state['triggering_element']['#executes_submit_callback'])) {
$form_state['submitted'] = TRUE;
}
$values = array();
$sources = $form_state[HOST_ENTITY_KEY]['sources'];
foreach (array_keys($sources) as $source_field_name) {
$element =& $form[$source_field_name];
if ($form_state['process_input'] && (!isset($element['#validated']) || !$element['#validated'])) {
_form_validate($element, $form_state);
}
$fail = false;
$leaves = date_restrictions_element_leaf_children($form[$source_field_name]);
foreach ($leaves as &$leaf) {
$errors = form_get_error($leaf);
if ($errors) {
$fail = true;
break;
}
}
if (!$fail) {
$path = $form['#parents'];
$path[] = $source_field_name;
if (!empty($form[$source_field_name]['#language'])) {
$path[] = $form[$source_field_name]['#language'];
}
$value = drupal_array_get_nested_value($form_state['values'], $path);
$values[$source_field_name] = $value;
}
}
$form_state[HOST_ENTITY_KEY]['values'] = $values;
$validated = true;
}
$targets = $form_state[HOST_ENTITY_KEY]['targets'];
foreach ($targets as $field_name => $columns) {
if (!$form[$field_name]['#access']) {
continue;
}
foreach ($columns as $column => $restrictions) {
foreach ($restrictions as $restriction => $info) {
$module = $info['module'];
$hook = 'host_entity_after_build';
if (module_hook($module, $hook)) {
$function = $module . '_' . $hook;
$element =& $form[$field_name];
$function($element, $column, $restriction, $form_state);
}
}
}
}
return $form;
}
function date_restrictions_host_entity_source_field_change_callback($form, $form_state) {
$triggering_element = $form_state['triggering_element'];
$field_name = $triggering_element['#ajax']['triggering_field_name'];
$targets = $form_state[HOST_ENTITY_KEY]['sources'][$field_name]['targets'];
$form_errors = form_get_errors();
$commands = array();
foreach ($targets as $field_name) {
if (!$form[$field_name]['#access']) {
continue;
}
$wrapper = $field_name . '-' . HOST_ENTITY_KEY;
$commands[] = ajax_command_replace('#' . $wrapper, render($form[$field_name]));
if ($form_errors) {
$messages = array();
foreach ($form_errors as $key => $msg) {
if (strpos($key, $field_name) === 0) {
$messages[] = $msg;
}
}
if (count($messages)) {
$output = "<div class=\"messages error\">\n";
$output .= '<h2 class="element-invisible">' . t('Error message') . "</h2>\n";
if (count($messages) > 1) {
$output .= " <ul>\n";
foreach ($messages as $message) {
$output .= ' <li>' . $message . "</li>\n";
}
$output .= " </ul>\n";
}
else {
$output .= $messages[0];
}
$output .= "</div>\n";
$commands[] = ajax_command_prepend('#' . $wrapper, $output);
}
}
}
drupal_get_messages();
return array(
'#type' => 'ajax',
'#commands' => $commands,
);
}