Puncte:0

Cum adaug un câmp la un formular de nod?

drapel km

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ă

Câmp nou este aici

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) {

Câmpul nu este disponibil

Cum accesez valoarea implicită?

Puncte:2
drapel km

Evenimentul de modificare a formularului este un eveniment greșit pentru verificarea datelor. În loc să încercați să tratați formularul, utilizați entitatea de suport.

La evenimentul de modificare a formularului, adăugați un handler de trimitere

$form['actions']['submit']['#submit'][] = [$this, 'checkCbid'];

Verificați dacă valoarea este cea mai recentă la trimitere

funcția publică checkCbiRaceCondition(&$form, FormState &$form_state) {
  $enteredValue = $form_state->getValue('field_bond_cbid')[0]['value'];
  $defaultCbid = $form['field_bond_cbid']['widget'][0]['value']['#default_value'];
  if (intval($enteredValue) != $defaultCbid) {
    întoarcere;
  }

  $rezultat = \Drupal::database()
    ->query('select max(field_bond_cbid_value) din {node__field_bond_cbid}')
    ->fetchField();

  dacă ($rezultat) {
    $cbid = $rezultat +1;
  } altfel {
    $cbid = 1;
  }

  $form_state->set('field_bond_cbid', $cbid);
}

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.