Как загрузить коллекцию полей из узла?

72

У меня есть узел с несколькими коллекциями полей.

Когда я смотрю на node_load()вывод, я вижу:

[field_rich_text_group] => Array
        (
            [und] => Array
                (
                    [0] => Array
                        (
                            [value] => 6
                        )

                    [1] => Array
                        (
                            [value] => 7
                        )

                    [2] => Array
                        (
                            [value] => 8
                        )

                )

        )

Какую функцию API можно использовать для фактической загрузки данных полей, содержащихся в коллекции, для которой entity_id равен 6, 7, 8 и т. Д.

Джастин
источник

Ответы:

88

Doh! Я должен был посмотреть в модуле сбора полей:

entity_load('field_collection_item', array($item_id))
Джастин
источник
1
Я ищу подобное решение. Как вы пишете вывод и помещаете их в рендеринг массив? Спасибо
лебедь
Я написал кучу пользовательских функций для создания макета для этих элементов. К сожалению, они возвращают HTML, а не воспроизводимые массивы. Было бы неплохо использовать рендеринг массивов, но я не совсем уверен по этому вопросу (я уверен, что есть веская причина для этого, я просто не нашел объяснения, которое резонирует).
Джастин
Благодарю. Сбор полей действительно полезен для упрощения форм и вывода, но когда дело доходит до пользовательских запросов, мне, кажется, приходится погружаться во вложенные массивы, даже используя entity_metadata_wrapper.
лебедь
О да, я написал обертки, которые просто превращают плотные массивы в то, что мне нужно.
Джастин
entity_load () возвращает набор узлов, специфичных для «entity», и вместе с ними мы получаем также определенные пользователем поля. Как мы отличаем пользовательские поля от полей сущности? Есть какие-нибудь подсказки?
Радж Паван Гумдал
38

Есть также функция-обертка, которая делает то же самое:

field_collection_item_load($id, $reset = FALSE)

или согласно комментарию, используйте:

field_collection_item_load_multiple($ids = array(), $conditions = array(), $reset = FALSE)

загрузить несколько коллекций (например, если у вас есть кнопки Добавить еще ).

Василий Гротов
источник
5
Согласно приведенному выше ответу @ vasiliy-grotov, вы также можете использовать field_collection_item_load_multiple($ids = array(), $conditions = array(), $reset = FALSE)для загрузки нескольких коллекций (например, если у вас есть «Добавить больше»).
медиаашлей
21

field_collection_field_get_entity () следует использовать для загрузки правильной ревизии.

Пример использования:

$node = node_load(1);
$items = field_get_items('node', $node, 'field_fc');
foreach ($items as $item) {
 $fc = field_collection_field_get_entity($item);
 // Do something.
}
jonhattan
источник
1
как получить поля даты, назначенные в коллекции полей? Я использовал следующую вещь: $ item = field_collection_field_get_entity ($ itemid); print $ item-> field_course_starts_on ['und'] [0] ['safe_value']; .Но никакие значения не печатают для этого.
Харикрис
Спасибо за это. Я получаю константу. Предупреждение: array_flip (): Может переворачивать только значения STRING и INTEGER! с ... item_load (), и это решило проблему.
Найдим
11

Вы можете использовать entity_metadata_wrapperиз модуля Entity API :

$node_wrapper = entity_metadata_wrapper('node', $node);
$field_collection = $node_wrapper->field_rich_text_group[0]->value();
dpm($field_collection);

Вы также можете зациклить все коллекции:

$node_wrapper = entity_metadata_wrapper('node', $node);
foreach ($node_wrapper->field_rich_text_group as $field_collection_wrapper) {
  $field_collection = $field_collection_wrapper->value();
  dpm($field_collection);
}
Мильковский
источник