Scopul este de a seta un contor implicit, dar lăsați oamenii să îl înlocuiască. Contorul ar trebui să fie cea mai mare valoare a câmpului plus 1.
Folosind un abonat la eveniment, eveniment FORM ALTER.
funcție publică statică getSubscribedEvents(): matrice {
întoarcere [
HookEventDispatcherInterface::FORM_ALTER => 'setDefaultCbid',
HookEventDispatcherInterface::ENTITY_PRE_SAVE => „verificațiCbiRaceCondition”
];
}
funcția publică setDefaultCbid(FormAlterEvent $event) {
$form_id = $event->getFormId();
dacă ($form_id !== 'node_bond_edit_form') {
întoarcere;
}
$rezultat = \Drupal::database()
->query('select max(field_bond_cbid_value) din {node__field_bond_cbid}')
->fetchField();
dacă ($rezultat) {
$cbid = $rezultat + 1;
}
else {
$cbid = 1;
}
$form = &$event->getForm();
$form_already_altered = fals;
dacă (array_key_exists('field_bond_cbid_default', $form)) {
$form_already_altered = TRUE;
}
$form['field_bond_cbid_default'] = [
'#title' => $this->t('cbid implicit'),
'#type' => 'număr',
'#value' => $cbid,
];
dacă (!$form_already_altered) {
$form['field_bond_cbid']['widget'][0]['value']['#default_value'] = $cbid;
}
}
Acest lucru funcționează bine. Valoarea este setată și câmpul „implicit” este vizibil în forma ajustată
Ce se întâmplă dacă o a doua persoană editează un alt nod și incrementează contorul WHINCORRECTCODEîn care este afișat formularul? Aici e locul field_bond_cbid_default nu este disponibil pe entitate
funcția publică checkCbiRaceCondition(EntityPresaveEvent $event) {
$bond = $event->getEntity();
if ($bond->bundle() !== 'bond') {
întoarcere;
}
$enteredValue = $bond->get('field_bond_cbid')->getString();
$defaultCbid = $bond->get('field_bond_cbid_default')->getString();
if ($enteredValue != $defaultCbid) {
Cum accesez valoarea implicită?