"Встановлена" версія 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);

Я хотів би уникнути клопоту привласнення вручну $ терміна, перегляньте детально, як виглядає структура масиву, а потім побудуйте масив вручну, як це іноді нетривіально.

Єдине питання в основній черзі, яке я міг знайти, що виглядало неоднаково схожим, стосувався мови мови поля api DX .

Відповіді:


6

Ні, такої функції немає.

Дивіться мій коментар у розділі Мовна підтримка полів особи .


1
Дякую Бердіру. Я сподівався, що ти з’явиться;), і я також боявся, що ти так скажеш. Проблема з кодом у вашому коментарі полягає в тому, що для багатьох полів значення "може" бути недостатньою або просто помилковою.
Летаріон

field_get_items () не допомагає вам і в цьому, він повертає масив елементів, що містять значення. Або все, що визначає тип поля. Неможливо цього абстрагувати.
Бердір

Наприклад, field_get_items () повертає масив (array ('tid' => 123)). У вашому коді потрібно знати, що field_tags є посиланням на термін таксономії, і що він має набір ключів tid і що це терент на термін таксономії.
Бердір

Коментарі на цій сторінці більше не відображаються за даним посиланням.
Джунайд

Коментарі знаходяться на сторінці обговорення в даний час: drupal.org/node/1500308/discuss
Berdir

2

Для існування такої функції field_set_items()необхідно мати можливість ідентифікувати stdClassоб'єкт як термін таксономії, а також відобразити його на функцію, яка може декодувати об'єкт та створити з нього масив поля.

Оскільки для цього немає основної функції, я не думаю, що це буде просто.


Мені страшенно дратує те, що ще немає властивості $ entit-> entit_type (але) , але незалежно, це можна легко додати до мого прикладу зворотного виклику. Я оновив питання, щоб це відобразити.
Летаріон

1
Відсутність entity_typeнасправді не проблема IMHO ... проблема саме в тому, що ви додали до свого питання: "іноді це нетривіально". Оскільки дані нетривіальні, для того, 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);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.