View source
<?php
define('DATE_REPEAT_ENTITY_FIELD_MASTER_UUID', 'field_master_uuid');
define('DATE_REPEAT_ENTITY_FIELD_CLONE_STATE', 'field_clone_state');
define('DATE_REPEAT_ENTITY_BUTTON_NAME_PREFIX', 'update_');
function date_repeat_entity_menu() {
$items = array();
$items['admin/config/date/date_repeat_entity'] = array(
'title' => 'Date Repeat Entity',
'description' => 'Date repeat entity administration.',
'page callback' => 'drupal_get_form',
'page arguments' => array(
'date_repeat_entity_admin_settings',
),
'access callback' => 'user_access',
'access arguments' => array(
'administer site configuration',
),
);
return $items;
}
function date_repeat_entity_admin_settings() {
$form = array();
$form['#prefix'] = '<h2>Date Repeat Entity Administration</h2>';
$bundles = node_type_get_names();
$defaults = array_keys($bundles);
$form['date_repeat_entity_bundles_available'] = array(
'#title' => t('Bundles available to date repeat entity'),
'#type' => 'checkboxes',
'#options' => $bundles,
'#default_value' => variable_get('date_repeat_entity_bundles_available', $defaults),
'#description' => t("Select the bundles (content types) that date repeat entity should work with."),
);
return system_settings_form($form);
}
function date_repeat_entity_form_alter(&$form, &$form_state, $form_id) {
if (!empty($form['#node_edit_form'])) {
$entity_type = $form['#entity_type'];
$bundle = $form['#bundle'];
module_load_include('inc', 'date_repeat_entity', 'includes/date_repeat_entity.utility');
$repeating_date_field = date_repeat_entity_get_repeating_date_field($entity_type, $bundle);
$master_uuid_field = date_repeat_entity_get_field($entity_type, $bundle, DATE_REPEAT_ENTITY_FIELD_MASTER_UUID);
$clone_state_field = date_repeat_entity_get_field($entity_type, $bundle, DATE_REPEAT_ENTITY_FIELD_CLONE_STATE);
if ($repeating_date_field != NULL && $master_uuid_field != NULL && $clone_state_field != NULL) {
if (isset($form['field_clone_state'])) {
$form['field_clone_state']['#access'] = FALSE;
}
if (isset($form['field_master_uuid'])) {
$form['field_master_uuid']['#access'] = FALSE;
}
if (isset($form['nid']['#value'])) {
array_unshift($form['actions']['preview']['#submit'], 'date_repeat_entity_preview_handler');
if (isset($form['actions']['preview_changes'])) {
array_unshift($form['actions']['preview_changes']['#submit'], 'date_repeat_entity_preview_handler');
}
if (!isset($form_state['default_update_callbacks'])) {
$form_state['default_update_callbacks'] = $form['actions']['submit']['#submit'];
}
$form['actions']['submit']['#submit'] = array(
'date_repeat_entity_update_submit_handler',
);
if (!isset($form_state['default_delete_callbacks'])) {
$form_state['default_delete_callbacks'] = array();
}
$form['actions']['delete']['#submit'] = array(
'date_repeat_entity_delete_submit_handler',
);
if (isset($form_state['node_confirmation_action'])) {
date_repeat_entity_add_confirmation_buttons($form, $form_state);
}
}
}
}
}
function date_repeat_entity_add_confirmation_buttons(&$form, $form_state) {
$action = $form_state['node_confirmation_action'];
$submit_callbacks = $form_state['default_' . $action . '_callbacks'];
array_unshift($submit_callbacks, 'date_repeat_entity_' . $action . '_dates_callback');
$title_field_weight = $form['title']['#weight'];
$fieldset_weight = $title_field_weight - 10;
$form['update-buttons'] = array(
'#type' => 'fieldset',
'#title' => t('Confirm @action', array(
'@action' => $action,
)),
'#weight' => $fieldset_weight,
);
$update_buttons_element_weight = 0;
$referenced_entities = date_repeat_entity_get_referenced_entities($form, $form_state);
if (!empty($referenced_entities)) {
$referenced_entities_message = "";
foreach ($referenced_entities as $referenced_entity) {
$number_of_reference_entities = $referenced_entity['number_of_referenced_entities'];
$entity_label = $referenced_entity['entity_label'];
$referenced_entities_message .= '<p>There ';
$referenced_entities_message .= $number_of_reference_entities > 1 ? 'are ' : 'is ';
$referenced_entities_message .= t('@number_of_referenced_entities referenced @entity_label that may be affected by this update', array(
'@number_of_referenced_entities' => $number_of_reference_entities,
'@entity_label' => $entity_label,
));
$referenced_entities_message .= '.</p>';
}
$update_buttons_element_weight++;
$form['update-buttons']['update-text'] = array(
'#markup' => $referenced_entities_message,
);
}
$update_buttons_element_weight++;
$form['update-buttons']['update-current'] = array(
'#type' => 'submit',
'#value' => $action,
'#name' => DATE_REPEAT_ENTITY_BUTTON_NAME_PREFIX . 'current',
'#submit' => $submit_callbacks,
'#validate' => array(),
'#weight' => $update_buttons_element_weight,
);
$entity_type = $form['#entity_type'];
$bundle = $form['#bundle'];
$entity = $form['#entity'];
$wrapper = entity_metadata_wrapper($entity_type, $entity);
$master_uuid = $wrapper->field_master_uuid
->value();
$related_entity_ids = date_repeat_entity_get_related_entity_ids($entity_type, $bundle, $master_uuid);
if (count($related_entity_ids) > 1) {
$form['update-buttons']['update-current']['#value'] = t('@action current', array(
'@action' => $action,
));
$update_buttons_element_weight++;
$form['update-buttons']['update-future'] = array(
'#type' => 'submit',
'#value' => t('@action all following', array(
'@action' => $action,
)),
'#name' => DATE_REPEAT_ENTITY_BUTTON_NAME_PREFIX . 'future',
'#submit' => $submit_callbacks,
'#validate' => array(),
'#weight' => $update_buttons_element_weight,
);
$update_buttons_element_weight++;
$form['update-buttons']['update-all'] = array(
'#type' => 'submit',
'#value' => t('@action all dates in the series', array(
'@action' => $action,
)),
'#name' => DATE_REPEAT_ENTITY_BUTTON_NAME_PREFIX . 'all',
'#submit' => $submit_callbacks,
'#validate' => array(),
'#weight' => $update_buttons_element_weight,
);
}
$update_buttons_element_weight++;
$form['update-buttons']['update-cancel'] = array(
'#type' => 'submit',
'#value' => t('cancel @action', array(
'@action' => $action,
)),
'#name' => DATE_REPEAT_ENTITY_BUTTON_NAME_PREFIX . 'cancel',
'#submit' => array(
'date_repeat_entity_dates_cancel_callback',
),
'#validate' => array(),
'#weight' => $update_buttons_element_weight,
);
}
function date_repeat_entity_update_submit_handler($form, &$form_state) {
date_repeat_entity_submit_handler($form, $form_state, 'update');
}
function date_repeat_entity_delete_submit_handler($form, &$form_state) {
date_repeat_entity_submit_handler($form, $form_state, 'delete');
}
function date_repeat_entity_submit_handler($form, &$form_state, $action) {
if (isset($form_state['node_preview'])) {
unset($form['#prefix']);
unset($form_state['node_preview']);
unset($form['#node']->in_preview);
}
$form_state['node_confirmation_action'] = $action;
$form_state['rebuild'] = TRUE;
}
function date_repeat_entity_preview_handler($form, &$form_state) {
if (isset($form_state['node_confirmation_action'])) {
unset($form_state['node_confirmation_action']);
}
}
function date_repeat_entity_update_dates_callback($form, &$form_state) {
$form_state['values']['date_repeat_entity']['action'] = $form_state['node_confirmation_action'];
unset($form_state['node_confirmation_action']);
$scope = str_replace(DATE_REPEAT_ENTITY_BUTTON_NAME_PREFIX, '', $form_state['triggering_element']['#name']);
$form_state['values']['date_repeat_entity']['scope'] = $scope;
}
function date_repeat_entity_delete_dates_callback($form, &$form_state) {
unset($form_state['node_confirmation_action']);
$scope = str_replace(DATE_REPEAT_ENTITY_BUTTON_NAME_PREFIX, '', $form_state['triggering_element']['#name']);
$entity_type = $form['#entity_type'];
$bundle = $form['#bundle'];
$entity = $form['#entity'];
$entity_wrapper = entity_metadata_wrapper($entity_type, $entity);
module_load_include('inc', 'date_repeat_entity', 'includes/date_repeat_entity.delete');
date_repeat_entity_delete_dates($entity_wrapper, $entity_type, $bundle, $scope);
drupal_goto('<front>');
}
function date_repeat_entity_dates_cancel_callback(&$form, &$form_state) {
unset($form['update-buttons']);
unset($form_state['node_confirmation_action']);
$form_state['rebuild'] = TRUE;
}
function date_repeat_entity_entity_presave($entity, $entity_type) {
module_load_include('inc', 'date_repeat_entity', 'includes/date_repeat_entity.utility');
module_load_include('inc', 'date_repeat_entity', 'includes/date_repeat_entity.create');
module_load_include('inc', 'date_repeat_entity', 'includes/date_repeat_entity.update');
$wrapper = entity_metadata_wrapper($entity_type, $entity);
$bundle = $wrapper
->getBundle();
$repeating_date_field = date_repeat_entity_get_repeating_date_field($entity_type, $bundle);
$master_uuid_field = date_repeat_entity_get_field($entity_type, $bundle, DATE_REPEAT_ENTITY_FIELD_MASTER_UUID);
$clone_state_field = date_repeat_entity_get_field($entity_type, $bundle, DATE_REPEAT_ENTITY_FIELD_CLONE_STATE);
if ($repeating_date_field != NULL && $master_uuid_field != NULL && $clone_state_field != NULL) {
if ($entity->is_new) {
date_repeat_entity_create_dates($entity, $entity_type);
}
else {
date_repeat_entity_update_dates($entity, $entity_type);
}
}
}
function date_repeat_entity_get_referenced_entities($form, $form_state) {
$referenced_entities = array();
module_load_include('inc', 'date_repeat_entity', 'includes/date_repeat_entity.utility');
$entity_type = $form['#entity_type'];
$bundle = $form['#bundle'];
$entity_reference_fields = date_repeat_entity_get_entity_reference_fields($entity_type, $bundle);
foreach ($entity_reference_fields as $field) {
$field_name = $field['field_name'];
$info = field_info_instance($entity_type, $field_name, $bundle);
$number_of_referenced_entities = 0;
switch ($info['widget']['type']) {
case 'inline_entity_form':
$ief_id = $info['id'];
$number_of_referenced_entities = count($form_state['inline_entity_form'][$ief_id]['entities']);
break;
default:
foreach ($form_state['values'][$field_name][LANGUAGE_NONE] as $target_entity) {
if (!is_null($target_entity['target_id'])) {
$number_of_referenced_entities++;
}
}
}
if ($number_of_referenced_entities > 0) {
$referenced_entities[] = array(
'entity_label' => $info['label'],
'number_of_referenced_entities' => $number_of_referenced_entities,
);
}
}
return $referenced_entities;
}