From c644bb32b82a15616dfd06c2b6351cf6c56223c3 Mon Sep 17 00:00:00 2001
From: idebr <idebr@1879760.no-reply.drupal.org>
Date: Mon, 22 Dec 2014 14:01:40 +0100
Subject: [PATCH] Issue #2050857 by jacob.embree, idebr: Fix
 registration_date_repeat EntityMalformedException

---
 .../registration_date_repeat.module                | 434 ++++++++++-----------
 1 file changed, 217 insertions(+), 217 deletions(-)

diff --git a/registration_date_repeat/registration_date_repeat.module b/registration_date_repeat/registration_date_repeat.module
index 07bf117..7bf5847 100644
--- a/registration_date_repeat/registration_date_repeat.module
+++ b/registration_date_repeat/registration_date_repeat.module
@@ -1,217 +1,217 @@
-<?php
-/**
- * @file
- * Date repeat field integration.
- */
-
-/**
- * Drupal variable name which holds settings for date field instances.
- *
- * [date_instance_id][entity_type][bundle] = date_repeat_instance_id
- *
- *  date_instance_id: instance ID of date field.
- *  date_repeat_instance_id: instance ID of date repeat field.
- */
-define('REGISTRATION_DATE_REPEAT_FIELD', 'registration_date_repeat_field');
-
-function registration_date_repeat_field_widget_info() {
-  return array(
-    'registration_date_repeat_host_repeat' => array(
-      'label' => t('Date Repeat for Registrations'),
-      'description' => t('Provides a widget limiting registration field data to values found on a host entity with registrations.'),
-      'field types' => _registration_date_date_types(),
-    )
-  );
-}
-
-function registration_date_repeat_field_widget_form(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $element) {
-  $field_name = $element['#field_name'];
-  $options = array();
-  $tz = array();
-
-  if ($instance['entity_type'] == 'registration') {
-    if (!isset($form_state['registration'])) {
-      // On field settings pages.
-      return array($field_name => $element);
-    }
-
-    $registration = $form_state['registration'];
-
-    list( , , $host_bundle) = entity_extract_ids($registration->entity_type, $registration->entity);
-    $host_entity_field_name = _registration_date_repeat_date_repeat_instance($instance['id'], $registration->entity_type, $host_bundle);
-
-    if (!$host_entity_field_name || !isset($registration->entity->{$host_entity_field_name})) {
-      return array($field_name => $element);
-    }
-
-    $host_field = field_info_field($host_entity_field_name);
-    $host_date_format = date_type_format($host_field['type']);
-    $registration_date_format = date_type_format($field['type']);
-    $timezone_db = date_get_timezone_db($field['settings']['tz_handling']);
-
-    // set default timezone, used if no repeat values are found.
-    $tz = array(
-      '#type' => 'value',
-      '#value' => date_get_timezone($field['settings']['tz_handling']),
-    );
-
-    switch ($instance['widget']['type']) {
-      case 'registration_date_repeat_host_repeat':
-        foreach ($registration->entity->{$host_entity_field_name} as $lang => $field_items) {
-          foreach ($field_items as $item) {
-            $dates = date_repeat_build_dates($item['rrule'], NULL, $host_field, $item);
-            $first = reset($dates);
-
-            if (!empty($dates)) {
-              foreach ($dates as $item) {
-                $value = $item['value'];
-                $date = new DateObject($value, $timezone_db, $host_date_format);
-
-                $timezone_item = isset($item['timezone']) ? $item['timezone'] : '';
-                $timezone_item = date_get_timezone($field['settings']['tz_handling'], $timezone_item);
-                date_timezone_set($date, timezone_open($timezone_item));
-
-                if ($registration_date_format != $host_date_format) {
-                  $value = date_format_date($date, 'custom', $registration_date_format);
-                }
-
-                $options[$value] = date_format_date($date);
-              }
-
-              $tz = array(
-                '#type' => 'value',
-                '#value' => $first['timezone']
-              );
-            }
-          }
-        }
-
-        $element += array(
-          '#type' => 'select',
-          '#options' => $options,
-          '#default_value' => isset($items[$delta]['value']) ? $items[$delta]['value'] : '',
-          '#empty_option' => count($options) ? t('- Select Date -') : t('No valid dates found'),
-        );
-
-        return array(
-          'value' => $element,
-          'timezone' => $tz,
-        );
-
-        break;
-
-    }
-  }
-  else {
-    form_set_error($field_name, t("'registration_date_repeat_host_repeat' widget can only attach to 'registration' entities. '%entity_type' (%bundle) is not an acceptable entity type.", array(
-      '%entity_type' => $instance['entity_type'],
-      '%bundle' => $instance['bundle'],
-    )));
-  }
-
-  return array($field_name => $element);
-}
-
-/**
- * Implements hook_form_FORM_ID_alter().
- * 
- * Add field to change settings for date on field UI settings page.
- */
-function registration_date_repeat_form_field_ui_field_edit_form_alter(&$form, &$form_state, $form_id) {
-  $date_field_types = _registration_date_date_types();
-  $instance_id = $form['#instance']['id'];
-  $entity_type = $form['#instance']['entity_type'];
-  $bundle = $form['#instance']['bundle'];
-
-  $settings = variable_get(REGISTRATION_DATE_REPEAT_FIELD, array());
-
-  if (!in_array($form['#field']['type'], $date_field_types)) {
-    return;
-  }
-
-  $form['registration_date_repeat'] = array(
-    '#type' => 'fieldset',
-    '#title' => t('Registration Date Repeat'),
-    '#tree' => TRUE,
-  );
-
-  $form['registration_date_repeat']['date_repeat'] = array(
-    '#tree' => TRUE,
-  );
-
-  $form['registration_date_repeat']['date_repeat']['help'] = array(
-    '#prefix' => '<p>',
-    '#markup' => t('Which date repeat field should be used depending on which entity type the registration is associated with.'),
-    '#suffix' => '</p>',
-  );
-
-  // Get all date fields which have a repeat.{
-  $settings = variable_get(REGISTRATION_DATE_REPEAT_FIELD, array());
-
-  $date_fields = field_read_fields(array(
-    'type' => $date_field_types,
-  ));
-
-  $date_repeat_fields = array();
-  foreach ($date_fields as $field_name => $field) {
-    if (!empty($field['settings']['repeat'])) {
-      $field = field_info_field($field_name);
-      foreach ($field['bundles'] as $field_entity_type => $field_bundles) {
-        foreach ($field_bundles as $field_bundle) {
-          $instance = field_info_instance($field_entity_type, $field_name, $field_bundle);
-          $date_repeat_fields[$field_entity_type][$field_bundle][$field_name] = $instance['label'];
-        }
-      }
-    }
-  }
-
-  foreach ($date_repeat_fields as $instance_entity_type => $instance_bundles) {
-    foreach ($instance_bundles as $instance_bundle => $instance_options) {
-      $form['registration_date_repeat']['date_repeat'][$instance_entity_type][$instance_bundle] = array(
-        '#type' => 'select',
-        '#title' => t('@entity_type: @bundle', array(
-          '@entity_type' => $instance_entity_type,
-          '@bundle' => $instance_bundle,
-        )), 
-        '#options' => $instance_options,
-        '#empty_option' => t('-- None --'),
-        '#default_value' => isset($settings[$instance_id][$instance_entity_type][$instance_bundle]) ? $settings[$instance_id][$instance_entity_type][$instance_bundle] : '',
-      );
-    }
-  }
-
-  $form['#submit'][] = 'registration_date_repeat_field_ui_submit';
-}
-
-/**
- * Process submission for form elements in 
- * registration_date_repeat_form_field_ui_field_edit_form_alter().
- */
-function registration_date_repeat_field_ui_submit(&$form, &$form_state) {
-  $instance_id = $form['#instance']['id'];
-  $settings = variable_get(REGISTRATION_DATE_REPEAT_FIELD, array());
-
-  // Field default form will not have values][registration_date_repeat defined.
-  if (!isset($form_state['values']['registration_date_repeat'])) {
-    foreach ($form_state['values']['registration_date_repeat']['date_repeat'] as $entity_type => $bundles) {
-      foreach ($bundles as $bundle => $date_repeat_field_name) {
-        $settings[$instance_id][$entity_type][$bundle] = $date_repeat_field_name;
-      }
-    }
-  }
-
-  variable_set(REGISTRATION_DATE_REPEAT_FIELD, $settings);
-}
-
-/**
- * Get date repeat instance ID for a date field.
- */
-function _registration_date_repeat_date_repeat_instance($date_instance_id, $entity_type, $bundle) {
-  $settings = variable_get(REGISTRATION_DATE_REPEAT_FIELD, array());
-
-  if (isset($settings[$date_instance_id][$entity_type][$bundle])) {
-    return $settings[$date_instance_id][$entity_type][$bundle];
-  }
-
-  return FALSE;
-}
\ No newline at end of file
+<?php
+/**
+ * @file
+ * Date repeat field integration.
+ */
+
+/**
+ * Drupal variable name which holds settings for date field instances.
+ *
+ * [date_instance_id][entity_type][bundle] = date_repeat_instance_id
+ *
+ *  date_instance_id: instance ID of date field.
+ *  date_repeat_instance_id: instance ID of date repeat field.
+ */
+define('REGISTRATION_DATE_REPEAT_FIELD', 'registration_date_repeat_field');
+
+function registration_date_repeat_field_widget_info() {
+  return array(
+    'registration_date_repeat_host_repeat' => array(
+      'label' => t('Date Repeat for Registrations'),
+      'description' => t('Provides a widget limiting registration field data to values found on a host entity with registrations.'),
+      'field types' => _registration_date_date_types(),
+    )
+  );
+}
+
+function registration_date_repeat_field_widget_form(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $element) {
+  $field_name = $element['#field_name'];
+  $options = array();
+  $tz = array();
+
+  if ($instance['entity_type'] == 'registration') {
+    if (!isset($form_state['registration'])) {
+      // On field settings pages.
+      return array($field_name => $element);
+    }
+
+    $registration = $form_state['registration'];
+    $wrapper = entity_metadata_wrapper('registration', $registration);
+
+    list( , , $host_bundle) = entity_extract_ids($registration->entity_type, $wrapper->entity->value());
+    $host_entity_field_name = _registration_date_repeat_date_repeat_instance($instance['id'], $registration->entity_type, $host_bundle);
+
+    if (!$host_entity_field_name || !isset($wrapper->entity->{$host_entity_field_name})) {
+      return array($field_name => $element);
+    }
+
+    $host_field = field_info_field($host_entity_field_name);
+    $host_date_format = date_type_format($host_field['type']);
+    $registration_date_format = date_type_format($field['type']);
+    $timezone_db = date_get_timezone_db($field['settings']['tz_handling']);
+
+    // set default timezone, used if no repeat values are found.
+    $tz = array(
+      '#type' => 'value',
+      '#value' => date_get_timezone($field['settings']['tz_handling']),
+    );
+
+    switch ($instance['widget']['type']) {
+      case 'registration_date_repeat_host_repeat':
+        $field_items = field_get_items($registration->entity_type, $wrapper->entity->value(), $host_entity_field_name);
+        foreach ($field_items as $item) {
+          $dates = date_repeat_build_dates($item['rrule'], NULL, $host_field, $item);
+          $first = reset($dates);
+
+          if (!empty($dates)) {
+            foreach ($dates as $item) {
+              $value = $item['value'];
+              $date = new DateObject($value, $timezone_db, $host_date_format);
+
+              $timezone_item = isset($item['timezone']) ? $item['timezone'] : '';
+              $timezone_item = date_get_timezone($field['settings']['tz_handling'], $timezone_item);
+              date_timezone_set($date, timezone_open($timezone_item));
+
+              if ($registration_date_format != $host_date_format) {
+                $value = date_format_date($date, 'custom', $registration_date_format);
+              }
+
+              $options[$value] = date_format_date($date);
+            }
+
+            $tz = array(
+              '#type' => 'value',
+              '#value' => $first['timezone'],
+            );
+          }
+        }
+
+        $element += array(
+          '#type' => 'select',
+          '#options' => $options,
+          '#default_value' => isset($items[$delta]['value']) ? $items[$delta]['value'] : '',
+          '#empty_option' => count($options) ? t('- Select Date -') : t('No valid dates found'),
+        );
+
+        return array(
+          'value' => $element,
+          'timezone' => $tz,
+        );
+
+        break;
+
+    }
+  }
+  else {
+    form_set_error($field_name, t("'registration_date_repeat_host_repeat' widget can only attach to 'registration' entities. '%entity_type' (%bundle) is not an acceptable entity type.", array(
+      '%entity_type' => $instance['entity_type'],
+      '%bundle' => $instance['bundle'],
+    )));
+  }
+
+  return array($field_name => $element);
+}
+
+/**
+ * Implements hook_form_FORM_ID_alter().
+ *
+ * Add field to change settings for date on field UI settings page.
+ */
+function registration_date_repeat_form_field_ui_field_edit_form_alter(&$form, &$form_state, $form_id) {
+  $date_field_types = _registration_date_date_types();
+  $instance_id = $form['#instance']['id'];
+  $entity_type = $form['#instance']['entity_type'];
+  $bundle = $form['#instance']['bundle'];
+
+  $settings = variable_get(REGISTRATION_DATE_REPEAT_FIELD, array());
+
+  if (!in_array($form['#field']['type'], $date_field_types)) {
+    return;
+  }
+
+  $form['registration_date_repeat'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Registration Date Repeat'),
+    '#tree' => TRUE,
+  );
+
+  $form['registration_date_repeat']['date_repeat'] = array(
+    '#tree' => TRUE,
+  );
+
+  $form['registration_date_repeat']['date_repeat']['help'] = array(
+    '#prefix' => '<p>',
+    '#markup' => t('Which date repeat field should be used depending on which entity type the registration is associated with.'),
+    '#suffix' => '</p>',
+  );
+
+  // Get all date fields which have a repeat.{
+  $settings = variable_get(REGISTRATION_DATE_REPEAT_FIELD, array());
+
+  $date_fields = field_read_fields(array(
+    'type' => $date_field_types,
+  ));
+
+  $date_repeat_fields = array();
+  foreach ($date_fields as $field_name => $field) {
+    if (!empty($field['settings']['repeat'])) {
+      $field = field_info_field($field_name);
+      foreach ($field['bundles'] as $field_entity_type => $field_bundles) {
+        foreach ($field_bundles as $field_bundle) {
+          $instance = field_info_instance($field_entity_type, $field_name, $field_bundle);
+          $date_repeat_fields[$field_entity_type][$field_bundle][$field_name] = $instance['label'];
+        }
+      }
+    }
+  }
+
+  foreach ($date_repeat_fields as $instance_entity_type => $instance_bundles) {
+    foreach ($instance_bundles as $instance_bundle => $instance_options) {
+      $form['registration_date_repeat']['date_repeat'][$instance_entity_type][$instance_bundle] = array(
+        '#type' => 'select',
+        '#title' => t('@entity_type: @bundle', array(
+          '@entity_type' => $instance_entity_type,
+          '@bundle' => $instance_bundle,
+        )),
+        '#options' => $instance_options,
+        '#empty_option' => t('-- None --'),
+        '#default_value' => isset($settings[$instance_id][$instance_entity_type][$instance_bundle]) ? $settings[$instance_id][$instance_entity_type][$instance_bundle] : '',
+      );
+    }
+  }
+
+  $form['#submit'][] = 'registration_date_repeat_field_ui_submit';
+}
+
+/**
+ * Process submission for form elements in
+ * registration_date_repeat_form_field_ui_field_edit_form_alter().
+ */
+function registration_date_repeat_field_ui_submit(&$form, &$form_state) {
+  $instance_id = $form['#instance']['id'];
+  $settings = variable_get(REGISTRATION_DATE_REPEAT_FIELD, array());
+
+  // Field default form will not have values][registration_date_repeat defined.
+  if (isset($form_state['values']['registration_date_repeat'])) {
+    foreach ($form_state['values']['registration_date_repeat']['date_repeat'] as $entity_type => $bundles) {
+      foreach ($bundles as $bundle => $date_repeat_field_name) {
+        $settings[$instance_id][$entity_type][$bundle] = $date_repeat_field_name;
+      }
+    }
+  }
+
+  variable_set(REGISTRATION_DATE_REPEAT_FIELD, $settings);
+}
+
+/**
+ * Get date repeat instance ID for a date field.
+ */
+function _registration_date_repeat_date_repeat_instance($date_instance_id, $entity_type, $bundle) {
+  $settings = variable_get(REGISTRATION_DATE_REPEAT_FIELD, array());
+
+  if (isset($settings[$date_instance_id][$entity_type][$bundle])) {
+    return $settings[$date_instance_id][$entity_type][$bundle];
+  }
+
+  return FALSE;
+}
-- 
2.1.0

