Mục tiêu là đặt bộ đếm mặc định, nhưng để mọi người ghi đè lên nó. Bộ đếm phải là giá trị lớn nhất của trường cộng với 1.
Sử dụng một người đăng ký sự kiện, sự kiện FORM ALTER.
hàm tĩnh công khai getSubscribeEvents(): mảng {
trở lại [
HookEventDispatcherInterface::FORM_ALTER => 'setDefaultCbid',
HookEventDispatcherInterface::ENTITY_PRE_SAVE => 'checkCbiRaceCondition'
];
}
chức năng công khai setDefaultCbid(FormAlterEvent $event) {
$form_id = $event->getFormId();
if ($form_id !== 'node_bond_edit_form') {
trở lại;
}
$result = \Drupal::database()
-> truy vấn ('chọn giá trị tối đa (trường_bond_cbid_value) từ {node__field_bond_cbid}')
->fetchField();
nếu ($kết quả) {
$cbid = $result + 1;
}
khác {
$cbid = 1;
}
$form = &$event->getForm();
$form_already_alterered = sai;
if (array_key_exists('field_bond_cbid_default', $form)) {
$form_already_alterered = TRUE;
}
$form['field_bond_cbid_default'] = [
'#title' => $this->t('cbid mặc định'),
'#type' => 'số',
'#value' => $cbid,
];
nếu (!$form_already_alterered) {
$form['field_bond_cbid']['widget'][0]['value']['#default_value'] = $cbid;
}
}
Điều này hoạt động tốt. Giá trị được đặt và trường "mặc định" hiển thị trong biểu mẫu đã điều chỉnh
Điều gì xảy ra nếu một người thứ hai chỉnh sửa một nút khác và tăng bộ đếm khiINCORRECTCODEile biểu mẫu được hiển thị? Đây là đâu field_bond_cbid_default không có sẵn trên thực thể
kiểm tra chức năng công khaiCbiRaceCondition(EntityPresaveEvent $event) {
$bond = $event->getEntity();
if ($bond->bundle() !== 'bond') {
trở lại;
}
$enteredValue = $bond->get('field_bond_cbid')->getString();
$defaultCbid = $bond->get('field_bond_cbid_default')->getString();
if ($enteredValue != $defaultCbid) {
Làm cách nào để truy cập giá trị mặc định?