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)); }
/** * 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; }