protected function queryLoad($ids)
 {
     $multifields = multifield_get_fields();
     foreach (array_keys($multifields) as $field_name) {
         $query = new EntityFieldQuery();
         if ($ids) {
             $query->fieldCondition($field_name, 'id', $ids, 'IN');
         } else {
             $query->fieldCondition($field_name, 'id', 0, '>');
         }
         if ($results = $query->execute()) {
             $pseudo_entities = array();
             $field = field_info_field($field_name);
             foreach ($results as $entity_type => $entities) {
                 // Simply doing an entity load on the entities with multifield values
                 // will cause the cacheSet() from multifield_field_load() to get
                 // invoked.
                 $entities = entity_load($entity_type, array_keys($entities));
                 foreach ($entities as $entity) {
                     if ($items = field_get_items($entity_type, $entity, $field_name)) {
                         foreach ($items as $item) {
                             $pseudo_entities[$item['id']] = _multifield_field_item_to_entity(multifield_extract_multifield_machine_name(field_info_field($field_name)), $item);
                         }
                     }
                 }
             }
             $this->cacheSet($pseudo_entities);
         }
     }
     return array_intersect_key($this->entityCache, drupal_map_assoc($ids, $ids));
 }
예제 #2
0
 /**
  * Return an array of items for the field.
  */
 function set_items($values, $row_id)
 {
     // In some cases the instance on the entity might be easy, see
     // https://drupal.org/node/1161708 and https://drupal.org/node/1461536 for
     // more information.
     if (empty($values->_field_data[$this->field_alias]) || empty($values->_field_data[$this->field_alias]['entity']) || !isset($values->_field_data[$this->field_alias]['entity']->{$this->definition['field_name']})) {
         return array();
     }
     $display = array('type' => $this->options['type'], 'settings' => $this->options['settings'], 'label' => 'hidden', 'views_view' => $this->view, 'views_field' => $this, 'views_row_id' => $row_id);
     $entity_type = $values->_field_data[$this->field_alias]['entity_type'];
     $entity = $this->get_value($values, 'entity');
     if (!$entity) {
         return array();
     }
     $langcode = $this->field_language($entity_type, $entity);
     if (empty($langcode)) {
         $langcode = LANGUAGE_NONE;
     }
     $multifield_items = field_get_items($entity_type, $entity, $this->definition['field_name'], $langcode);
     if (is_array($multifield_items)) {
         array_walk($multifield_items, 'multifield_item_unserialize', multifield_extract_multifield_machine_name($this->multifield_info));
     } else {
         $multifield_items = array();
     }
     $render_array = array();
     foreach ($multifield_items as $multifield_item) {
         $multifield = _multifield_field_item_to_entity(multifield_extract_multifield_machine_name($this->multifield_info), $multifield_item);
         $subfield_langcode = $this->field_language('multifield', $multifield);
         if (empty($render_array)) {
             $render_array = field_view_field('multifield', $multifield, $this->definition['subfield_name'], $display, $subfield_langcode);
         } else {
             $subfield_render_array = field_view_field('multifield', $multifield, $this->definition['subfield_name'], $display, $subfield_langcode);
             // Multifield subfields are always single value.
             $render_array[] = $subfield_render_array[0];
         }
     }
     $items = array();
     if ($this->options['field_api_classes']) {
         // Make a copy.
         $array = $render_array;
         return array(array('rendered' => drupal_render($render_array)));
     }
     foreach (element_children($render_array) as $count) {
         $items[$count]['rendered'] = $render_array[$count];
         // field_view_field() adds an #access property to the render array that
         // determines whether or not the current user is allowed to view the
         // field in the context of the current entity. We need to respect this
         // parameter when we pull out the children of the field array for
         // rendering.
         if (isset($render_array['#access'])) {
             $items[$count]['rendered']['#access'] = $render_array['#access'];
         }
         // Only add the raw field items (for use in tokens) if the current user
         // has access to view the field content.
         if ((!isset($items[$count]['rendered']['#access']) || $items[$count]['rendered']['#access']) && !empty($render_array['#items'][$count])) {
             $items[$count]['raw'] = $render_array['#items'][$count];
         }
     }
     return $items;
 }