Цель состоит в том, чтобы установить счетчик по умолчанию, но позволить людям переопределить его. Счетчик должен быть наибольшим значением поля плюс 1.
Используя подписчика событий, событие FORM ALTER.
общедоступная статическая функция getSubscribedEvents(): массив {
возвращаться [
HookEventDispatcherInterface::FORM_ALTER => 'setDefaultCbid',
HookEventDispatcherInterface::ENTITY_PRE_SAVE => 'checkCbiRaceCondition'
];
}
общедоступная функция setDefaultCbid (FormAlterEvent $event) {
$form_id = $event->getFormId();
если ($form_id !== 'node_bond_edit_form') {
возвращаться;
}
$результат = \Drupal::database()
->query('выбрать максимальное значение(field_bond_cbid_value) из {node__field_bond_cbid}')
->fetchField();
если ($результат) {
$cbid = $результат + 1;
}
еще {
$кбид = 1;
}
$form = &$event->getForm();
$form_already_alterered = ложь;
если (array_key_exists('field_bond_cbid_default', $form)) {
$form_already_alterered = ИСТИНА;
}
$form['field_bond_cbid_default'] = [
'#title' => $this->t('cbid по умолчанию'),
'#тип' => 'число',
'#значение' => $cbid,
];
если (!$form_already_alterered) {
$form['field_bond_cbid']['widget'][0]['value']['#default_value'] = $cbid;
}
}
Это прекрасно работает. Значение установлено, и поле «по умолчанию» видно в скорректированной форме.
Что произойдет, если второй человек редактирует другой узел и увеличивает значение счетчика при отображении формы? Это где field_bond_cbid_default недоступен на объекте
общедоступная функция checkCbiRaceCondition (EntityPresaveEvent $event) {
$bond = $event->getEntity();
если ($ облигация->комплект() !== 'облигация') {
возвращаться;
}
$enteredValue = $bond->get('field_bond_cbid')->getString();
$defaultCbid = $bond->get('field_bond_cbid_default')->getString();
если ($enteredValue != $defaultCbid) {
Как получить доступ к значению по умолчанию?