«Установить» версию field_get_items?

9

Можно извлечь элементы поля из объекта с

// Find all terms on $node in field 'field_tags'.
$terms = field_get_items('node', $node, 'field_tags');

Но есть ли удобный способ сделать обратное, Core или как-то иначе?

// Attach new term $term to $node in field 'field_tags'.
$term = taxonomy_term_load($tid);
$node = field_set_items('node', $node, 'field_tags', 'taxonomy_term', $term);
node_save($node);

Я хотел бы избежать хлопот, связанных с ручным назначением $ term, посмотрите в devel, как выглядит структура массива, а затем создайте массив вручную, поскольку это иногда бывает нетривиально.

Единственная проблема в основной очереди, которую я мог найти, которая выглядела немного похожей, была о языке интерфейса API DX .

Letharion
источник

Ответы:

6

Нет, такой функции нет.

Смотрите мой комментарий в разделе Поддержка языков для полей сущностей .

Berdir
источник
1
Спасибо Бердир. Я надеялся, что ты придешь;) и я также боялся, что ты так скажешь. Проблема с кодом в вашем комментарии заключается в том, что для многих полей значение может быть недостаточным или просто неправильным.
Летарион
field_get_items () также не поможет вам, он возвращает массив элементов, которые содержат значение. Или что бы ни определял тип поля. Нет способа абстрагировать это.
Бердир
Например, field_get_items () возвращает массив (array ('tid' => 123)). Ваш код должен знать, что field_tags является ссылкой на термин таксономии и что он имеет установленный ключ tid и что это ссылка на термин таксономии.
Бердир
Комментарии больше не видны на этой странице по данной ссылке.
Junaid
Комментарии на странице обсуждения сейчас: drupal.org/node/1500308/discuss
Бердир
2

Чтобы такая функция существовала, field_set_items()необходимо иметь возможность идентифицировать stdClassобъект как термин термина таксономии, а также сопоставить его с функцией, которая может декодировать объект и создать из него массив полей.

Поскольку для этого нет основной функции, я не думаю, что это будет легко.

Клайв
источник
Это ужасно раздражает, что нет свойства $ entity-> entity_type (пока) , но независимо от того, что можно легко добавить в мой пример обратного вызова. Я обновил вопрос, чтобы отразить это.
Летарион
1
На entity_typeсамом деле проблема не в отсутствии ИМХО ... проблема именно в том, что вы добавили в свой вопрос: «иногда это нетривиально». Поскольку данные нетривиальны, для того, field_set_itemsчтобы работать по вашему желанию, каждый тип поля в системе должен был бы реализовать своего рода интерфейс, описывающий, как выполнить обратный инжиниринг массива данных из объекта / произвольной переменной.
Клайв
2

Хотя это не помогает в создании иногда сложной структуры массива, я вижу, что то, что я ищу, в некоторой степени было представлено в Drupal 8. Возможно, оно будет расширено в будущем. :)

Доступен новый более простой API для доступа к полям, свойствам и языковой информации .

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

<?php
// Change a field value.
$body = $comment->get('comment_body');
$body[0]['value'] = 'This is actually a perverted tango';
$comment->set('comment_body', $body);
Letharion
источник