Категория:
Опубликовано:

Программно вывести поле Field Collection

Если нужно вывести отдельное поле из коллекции полей в шаблоне материала.

Легенда

  • Есть тип содержимого, с полем Field Collection.
  • Машинное имя поля field_field_collecttion
  • В коллекции полей 2 поля: field_fc_text и field_fc_number
  • Будем выводить поле field_fc_text в ноде с коллекцией полей

Если поле не выводится в дисплее

Способ вывода поля коллекции полей зависит от его присутствия в дисплее, а точнее в переменной $content ноды. Включить или выключить вывод полей в дисплее можно в настройках материала, во вкладке "Управление отображением", настраивая нужный тип, он же "дисплей" (Анонс, Содержимое полностью и т.п.).

Т.к. поле Field Collection представляет из себя отдельную сущность, если поле не выводится в дисплее - обратится к одному из его полей не получится.

У нас есть доступ только к ID элемента Field Collection:

$fcid = $node->field_field_collecttion['und'][0]['value'];

Нужно загрузить список сущностей-колекций полей, и к нему уже обращаться. Делаем это стандартной функцией по загрузке сущности - entity_load. Название сущности Field Collection: field_collection_item:

$fcid = $node->field_field_collecttion['und'][0]['value'];
$field_collecttion = entity_load('field_collection_item', array($fcid));

Таким образом, мы получим массив с объектами коллекций полей, к которым сможем обращаться и "добывать" значения нужных полей.

Получаем нужное нам поле:

$val = $field_collecttion[1]->field_fc_text['und'][0]['value'];

Если поле выводится в дисплее

Если выводить значение Field Collection в дисплей - немного проще, можно обращаться к переменной $content. Но есть особенности.

При стандартном форматтере вывода - "Ссылки на элементы коллекций полей" поля коллекции все еще будут недоступны. ID поля можно получить так:

$fcid = $content['field_field_collecttion']['#items'][0]['value'];

Дальше по предыдущему примеру.

Форматтер "Элементы коллекции полей" и "Только поля" уже выводят информацию о полях. Получить значение можно вот такой конструкцией:

$val = $content['field_field_collecttion'][0]['entity']['field_collection_item'][1]['field_fc_text']['#items'][0]['value'];

Как по мне - слишком уж мудренно.

P.S. Все вышесказанное тестировалось на стандартных настройках и выводах Field Collection.

Если у Вас возникли вопросы, замечания, предложения или просто благодарность - пишите в комментариях.
Делитесь полезными материалами в социальных сетях.
Добавить комментарий