У меня в пользователе есть кастомное множественное поле, в котором можно выбрать различные веб-формы. В определенный момент мне нужно программно одно значение удалить (либо поменять статус конкретной веб-формы).
Код:
<?php
$clientId = \Drupal\user\Entity\User::load('28');
$clientId->field_checklist_forms = [
['target_id' => 'asd', 'status' => 'closed'],
];
$clientId->save();?>
Но в этом случае мне нужно всегда перечислять все значения уже прикрепленных форм. Нет решения попроще?
Комментарии
<?php
...
$clientId->field_checklist_forms['status'] = 'closed';
$clientId->save();
...
?>
Так не канает?
InvalidArgumentException: Unable to set a value with a non-numeric delta in a list.
И я так подозреваю, что в данном примере статус поменяется у всех вебформ, а мне нужно только у одной
Да, всё правильно, тут уже я промухал. Ну укажите дельту ему, если ругается. Что-то вроде:
<?php
...
$clientId->field_checklist_forms[0]['status'] = 'closed';
...
?>
Мне тогда непонятно, как мог работать приведённый ранее вами код:
<?php
$clientId = \Drupal\user\Entity\User::load('28');
$clientId->field_checklist_forms = [
['target_id' => 'asd', 'status' => 'closed'],
];
$clientId->save();
?>
Попробуйте ещё как-то так, что ли:
<?php
...
$clientId->field_checklist_forms[0]->status = 'closed';
// ...или:
$clientId->field_checklist_forms[0]->set('status', 'closed');
...
?>
А вообще - здесь
dpm()
- самый подходящий инструмент.Да, этот код меняет статус, но меняет только у первого элемента, а нужная мне форма не всегда будет первой. Поэтому я в своем примере указывал target_id:
['target_id' => 'asd', 'status' => 'closed']
Для этого мы и используем дельта-значение. В моём примере это 0 (первый элемент). Но можете поставить и любое другое, если оно уже есть, например:
<?php
//... для 3-го элемента (zero-based).
$clientId->field_checklist_forms[2]->status = 'closed';
...
?>
На самом деле, это "ни о чём". Вы таким образом всегда меняли значение только для первого элемента. И то - для меня по-прежнему непонятно, как это вообще могло работать.