From 6940fcb34c56b53122b060eaccf73961a192849e Mon Sep 17 00:00:00 2001
From: Jonathan Jordan <jojonaloha@1579186.no-reply.drupal.org>
Date: Sat, 9 May 2015 23:54:43 -0700
Subject: [PATCH] Issue #2383903 by stmh: Cannot save queues with entities user
 doesn't have access to

---
 entityqueue.module                                 | 37 ++++++++++++++++++++--
 ...eference_SelectionHandler_EntityQueue.class.php | 31 ++++++++++++++++++
 2 files changed, 66 insertions(+), 2 deletions(-)

diff --git a/entityqueue.module b/entityqueue.module
index 6845744..f96f77b 100644
--- a/entityqueue.module
+++ b/entityqueue.module
@@ -1033,7 +1033,7 @@ function entityqueue_field_widget_form(&$form, &$form_state, $field, $instance,
         '#default_value' => '',
         '#autocomplete_path' => $autocomplete_path,
         '#size' => $instance['widget']['settings']['size'],
-        '#element_validate' => array('_entityreference_autocomplete_validate'),
+        '#element_validate' => array('_entityreference_autocomplete_validate', 'entityqueue_autocomplete_validate'),
         '#attributes' => array(
           'id' => $table_id . '-add',
         ),
@@ -1064,6 +1064,39 @@ function entityqueue_field_widget_form(&$form, &$form_state, $field, $instance,
 
 /**
  * Element validate callback.
+ * @see entityqueue_field_widget_form().
+ */
+function entityqueue_autocomplete_validate($element, &$form_state, $form) {
+  // If a value was entered into the autocomplete...
+  $value = drupal_array_get_nested_value($form_state['values'], $element['#parents']);
+
+  $entity_type = $form['#entity_type'];
+  $entity = $form_state[$entity_type];
+  $field_name = $form_state['field_name'];
+  $langcode = $form[$field_name]['#language'];
+  $field = $form_state['field'][$field_name][$langcode]['field'];
+  $instance = $form_state['field'][$field_name][$langcode]['instance'];
+
+  $items = array(array('target_id' => $value));
+  $errors = array();
+  entityreference_field_validate($entity_type, $entity, $field, $instance, $langcode, $items, $errors);
+
+  if ($errors) {
+    foreach ($errors as $error) {
+      foreach ($error as $field_name => $field_errors) {
+        foreach ($field_errors as $langcode => $lang_errors) {
+          form_error($element, $lang_errors[0]['message']);
+        }
+      }
+    }
+    $value = NULL;
+    // Update the value.
+    form_set_value($element, $value, $form_state);
+  }
+}
+
+/**
+ * Element validate callback.
  * @see entityqueue_field_widget_form()
  */
 function entityqueue_widget_dragtable_element_validate($element, &$form_state) {
@@ -1117,7 +1150,7 @@ function entityqueue_field_widget_ajax_callback($form, $form_state) {
   $lang = $form[$field_name]['#language'];
   $form_state['rebuild'] = TRUE;
   $form[$field_name][$lang]['add']['#value'] = '';
-  $markup = drupal_render($form[$field_name]);
+  $markup = theme('status_messages') . drupal_render($form[$field_name]);
 
   $commands[] = ajax_command_replace('.' . drupal_clean_css_identifier('field-name-' . $field_name) , $markup);
 
diff --git a/plugins/entityreference/selection/EntityReference_SelectionHandler_EntityQueue.class.php b/plugins/entityreference/selection/EntityReference_SelectionHandler_EntityQueue.class.php
index e83815d..0269762 100644
--- a/plugins/entityreference/selection/EntityReference_SelectionHandler_EntityQueue.class.php
+++ b/plugins/entityreference/selection/EntityReference_SelectionHandler_EntityQueue.class.php
@@ -51,4 +51,35 @@ class EntityReference_SelectionHandler_EntityQueue extends EntityReference_Selec
 
     return $query;
   }
+
+  /**
+   * Implements EntityReferenceHandler::validateReferencableEntities().
+   */
+  public function validateReferencableEntities(array $ids) {
+    $referencable = parent::validateReferencableEntities($ids);
+    // Allow users to save the queue even if they don't have access to an
+    // existing entity in the queue. See https://www.drupal.org/node/2383903
+    $existing = $this->getCurrentlyReferencedEntityIds();
+
+    return array_unique(array_merge($referencable, $existing));
+  }
+
+  /**
+   * Gets ids of existing entities in the queue.
+   *
+   * @return array
+   *   Entity ids that are currently referenced by the entity.
+   */
+  public function getCurrentlyReferencedEntityIds() {
+    $ret = array();
+    if (isset($this->entity) && isset($this->field)) {
+      $entity_type = $this->entity_type;
+      $field_name = $this->field['field_name'];
+      $wrapper = entity_metadata_wrapper($entity_type, $this->entity);
+      $ret = $wrapper->{$field_name}->raw();
+    }
+
+    return $ret;
+  }
+
 }
-- 
2.3.2 (Apple Git-55)

