View source
<?php
define('DATE_REPEAT_ENTITY_FIELD_MASTER_UUID', 'date_repeat_entity_master_uuid');
define('DATE_REPEAT_ENTITY_FIELD_CLONE_STATE', 'date_repeat_entity_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.',
'file' => 'date_repeat_entity.admin.inc',
'page callback' => 'drupal_get_form',
'page arguments' => array(
'date_repeat_entity_admin_settings',
),
'access arguments' => array(
'administer site configuration',
),
);
return $items;
}
function date_repeat_entity_field_attach_form($entity_type, $entity, &$form, &$form_state, $langcode) {
if (!empty($form['#node_edit_form'])) {
$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['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 = '<p>';
$referenced_entities_message .= t('References to one or more entities may be affected by this action.');
$referenced_entities_message .= '</p>';
$header = array(
t('Referencing Field'),
t('Number of Entities Referenced'),
);
$referenced_entities_message .= theme('table', array(
'header' => $header,
'rows' => $referenced_entities,
));
$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_value = $wrapper->{DATE_REPEAT_ENTITY_FIELD_MASTER_UUID}
->value();
$related_entity_ids = date_repeat_entity_get_related_entity_ids($entity_type, $bundle, $master_uuid_value);
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;
}
function date_repeat_entity_field_access($op, $field, $entity_type, $entity, $account) {
if ($field['field_name'] == DATE_REPEAT_ENTITY_FIELD_MASTER_UUID && !empty($entity)) {
return FALSE;
}
if ($field['field_name'] == DATE_REPEAT_ENTITY_FIELD_CLONE_STATE && !empty($entity)) {
return FALSE;
}
return TRUE;
}
function _date_repeat_entity_create_base_fields() {
if (!field_info_field(DATE_REPEAT_ENTITY_FIELD_MASTER_UUID)) {
$definition_master_uuid = array(
'field_name' => DATE_REPEAT_ENTITY_FIELD_MASTER_UUID,
'type' => 'text',
'locked' => TRUE,
'cardinality' => 1,
);
field_create_field($definition_master_uuid);
}
if (!field_info_field(DATE_REPEAT_ENTITY_FIELD_CLONE_STATE)) {
$definition_clone_state = array(
'field_name' => DATE_REPEAT_ENTITY_FIELD_CLONE_STATE,
'type' => 'list_boolean',
'locked' => TRUE,
'cardinality' => 1,
'deleted' => 0,
'entity_types' => array(),
'foreign keys' => array(),
'indexes' => array(
'value' => array(
0 => 'value',
),
),
'module' => 'list',
'settings' => array(
'allowed_values' => array(
0 => '',
1 => '',
),
'allowed_values_function' => '',
),
'translatable' => 0,
);
field_create_field($definition_clone_state);
}
}