Програмно оновити довідкове поле сутності


23

Я знаю, що можу оновити (або встановити значення) для довідкового поля сутності в Drupal 7 з кодом, подібним до наступного.

 $node['field_code_used_by'][LANGUAGE_NONE][0]['target_id'] = $id;

Я хочу програмно встановити значення для мого довідкового поля суб’єкта користувача в Drupal 8.

Я спробував з $node->field_code_used_by->setValue(1);і , $node->field_code_used_by->entity->value = 1;але ні один з них не працював.

Як я можу встановити значення для еталонного поля сутності?

Відповіді:


31

Потрібно використовувати код, подібний до наступного.

    $node = Node::load($nid);     
    $node->field_code_used_by->target_id = $user_id;
    $node->save();

Для поля з багатозначним значенням, щоб додати значення до кінця списку, використовуйте наступний код.

$node->field_code_used_by[] = ['target_id' => $user_id];

Інший спосіб - встановлення entityвластивості з об'єктом сутності, як у наступному коді.

    $node = Node::load($nid);
    $user = \Drupal\user\Entity\User::load(1);
    $node->field_code_used_by->entity = $user;
    $node->save();

2
Здається, це не працює, якщо вже не існує батьківського вузла. При призначенні властивості target_id або entity новому, не збереженому батьківському вузлу відносини не зберігаються. (Можливо, також не працює під час присвоєння рефлексу поля NULL, але я цього не перевіряв.) Хтось знає, як вирішити цю справу?
aaronbauman

@aaronbauman Чи було у вас якесь рішення?
відлуння

@echo я не пам'ятаю, як чи якщо я працював над цим. Якщо мій опис поведінки є точним, це помилка. Якщо на drupal.org для цього немає відкритого питання, це повинно бути
aaronbauman

@aaronbauman drupal.org/project/paragraphs/issues/2707017#comment-11872624 допоміг мені зробити цю роботу з новим вузлом. Так, здається, це не помилка.
відлуння

11

Як і в D7, основною властивістю опорного поля в D8 все ще є target id:

$node->field_code_used_by->target_id = $user_id;

entityВластивість є обчислене значення. Якщо ви помістите об’єкт у це значення, drupal перетворить його назад у ідентифікатор, перш ніж зберегти його на базі даних.

Багатозначні поля

Додайте елемент у багатозначне поле:

$node->field_code_used_by[] = ['target_id' => $user_id];

Властивість target_idне є необхідною, оскільки вона є основною властивістю та використовується за замовчуванням. Тож для більшості полів ви можете додати значення, як у простому масиві php, яке легко запам'ятати:

$node->field_code_used_by[] = $user_id;

Як щодо референтних полів сутності, які дозволяють отримати декілька значень?
Брайан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.