Рейтинг:0

Как добавить поле в форму узла?

флаг km

Цель состоит в том, чтобы установить счетчик по умолчанию, но позволить людям переопределить его. Счетчик должен быть наибольшим значением поля плюс 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) {

Поле недоступно

Как получить доступ к значению по умолчанию?

Рейтинг:2
флаг km

Событие изменения формы — неправильное событие для проверки данных. Вместо того, чтобы пытаться иметь дело с формой, используйте вспомогательную сущность.

В событии изменения формы добавьте обработчик отправки

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

Убедитесь, что значение является последним при отправке

публичная функция checkCbiRaceCondition(&$form, FormState &$form_state) {
  $enteredValue = $form_state->getValue('field_bond_cbid')[0]['value'];
  $defaultCbid = $form['field_bond_cbid']['widget'][0]['value']['#default_value'];
  если (intval($enteredValue) != $defaultCbid) {
    возвращаться;
  }

  $результат = \Drupal::database()
    ->query('выбрать максимальное значение(field_bond_cbid_value) из {node__field_bond_cbid}')
    ->fetchField();

  если ($результат) {
    $cbid = $результат +1;
  } еще {
    $кбид = 1;
  }

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

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.