Изменение/удаления значения в множественном поле

Главные вкладки

Аватар пользователя thwipthwipx thwipthwipx 7 июня 2022 в 14:57

У меня в пользователе есть кастомное множественное поле, в котором можно выбрать различные веб-формы. В определенный момент мне нужно программно одно значение удалить (либо поменять статус конкретной веб-формы).

Таблица выглядит так:

Код:

<?php
$clientId 
= \Drupal\user\Entity\User::load('28');
$clientId->field_checklist_forms = [
  [
'target_id' => 'asd''status' => 'closed'],
];
$clientId->save();?>

Но в этом случае мне нужно всегда перечислять все значения уже прикрепленных форм. Нет решения попроще?

Комментарии

Аватар пользователя thwipthwipx thwipthwipx 7 июня 2022 в 16:12

OldWarrior wrote:

<?php
...
$clientId->field_checklist_forms['status'] = 'closed';
$clientId->save();
...
?>

Так не канает?

InvalidArgumentException: Unable to set a value with a non-numeric delta in a list.

И я так подозреваю, что в данном примере статус поменяется у всех вебформ, а мне нужно только у одной

Аватар пользователя OldWarrior OldWarrior 7 июня 2022 в 16:34

thwipthwipx wrote: InvalidArgumentException: Unable to set a value with a non-numeric delta in a list.

Да, всё правильно, тут уже я промухал. Ну укажите дельту ему, если ругается. Что-то вроде:

<?php
...
$clientId->field_checklist_forms[0]['status'] = 'closed';
...
?>
Аватар пользователя thwipthwipx thwipthwipx 7 июня 2022 в 18:13

OldWarrior wrote:

thwipthwipx wrote: InvalidArgumentException: Unable to set a value with a non-numeric delta in a list.

Да, всё правильно, тут уже я промухал. Ну укажите дельту ему, если ругается. Что-то вроде:

<?php
...
$clientId->field_checklist_forms[0]['status'] = 'clos</blockquote><p><br/></p>?>

Error: Cannot use object of type Drupal\webform\Plugin\Field\FieldType\WebformEntityReferenceItem as array в include_once()

Аватар пользователя OldWarrior OldWarrior 7 июня 2022 в 18:23

Мне тогда непонятно, как мог работать приведённый ранее вами код:

<?php
$clientId 
= \Drupal\user\Entity\User::load('28');
$clientId->field_checklist_forms = [
  [
'target_id' => 'asd''status' => 'closed'],
];
$clientId->save();
?>
Аватар пользователя OldWarrior OldWarrior 7 июня 2022 в 18:38

Попробуйте ещё как-то так, что ли:

<?php
...
$clientId->field_checklist_forms[0]->status 'closed';
// ...или:
$clientId->field_checklist_forms[0]->set('status''closed');
...
?>

А вообще - здесь dpm() - самый подходящий инструмент.

Аватар пользователя thwipthwipx thwipthwipx 7 июня 2022 в 19:29

Да, этот код меняет статус, но меняет только у первого элемента, а нужная мне форма не всегда будет первой. Поэтому я в своем примере указывал target_id:
['target_id' => 'asd', 'status' => 'closed']

Аватар пользователя OldWarrior OldWarrior 7 июня 2022 в 19:48

Для этого мы и используем дельта-значение. В моём примере это 0 (первый элемент). Но можете поставить и любое другое, если оно уже есть, например:

<?php
//... для 3-го элемента (zero-based).
$clientId->field_checklist_forms[2]->status 'closed';
...
?>
Аватар пользователя OldWarrior OldWarrior 7 июня 2022 в 20:00

thwipthwipx wrote: Поэтому я в своем примере указывал target_id:
['target_id' => 'asd', 'status' => 'closed']

На самом деле, это "ни о чём". Вы таким образом всегда меняли значение только для первого элемента. И то - для меня по-прежнему непонятно, как это вообще могло работать.