Drupal 10 Layout Builder встроенный блок формы пользовательского обратного вызова проверки не срабатываетPhp

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Drupal 10 Layout Builder встроенный блок формы пользовательского обратного вызова проверки не срабатывает

Сообщение Anonymous »

Я пытаюсь добавить пользовательскую проверку для пользовательского типа встроенного блока в Drupal 10 Layout Builder.
Логика пользовательского интерфейса () работает правильно, но мой пользовательский обратный вызов #validate никогда не выполняется внутри модальной формы Layout Builder.
Я уже потратил много времени на отладку этого и буду признателен за рекомендации по правильному подходу Drupal для проверки встроенных блочных форм в Layout Builder.
Контекст:
Тип пользовательского блока:

Код: Выделить всё

v2_banner
Требования: [*]Если field_v2_is_full_clickable = FALSE [*]

Код: Выделить всё

field_v2_title
OR body требуется


Изначально я реализовал это с помощью Entity Constraints + Constraint Validators, но формы AJAX Layout Builder аварийно завершали работу:

Код: Выделить всё

Undefined array key "#parents"
из-за использования ->atPath() во время перестроений AJAX.
Поэтому я переместил проверку в проверку Form API.

Хуки в .module

Код: Выделить всё

function my_custom_blocks_v2_banner_form_block_content_form_alter(
&$form,
FormStateInterface $form_state,
$form_id
) {
\Drupal::service(FormAlterHooks::class)
->bannerBlockFormAlter($form, $form_state, $form_id);
}

function my_custom_blocks_v2_banner_form_layout_builder_add_block_alter(
&$form,
FormStateInterface $form_state,
$form_id
) {
\Drupal::service(FormAlterHooks::class)
->bannerBlockFormAlter($form, $form_state, $form_id);
}

function my_custom_blocks_v2_banner_form_layout_builder_update_block_alter(
&$form,
FormStateInterface $form_state,
$form_id
) {
\Drupal::service(FormAlterHooks::class)
->bannerBlockFormAlter($form, $form_state, $form_id);
}
FormAlterHooks.php

Код: Выделить всё

final class FormAlterHooks {

private function getFormEntityType(array $form, FormStateInterface $form_state): ?string {
$form_object = $form_state->getFormObject();

if ($form_object instanceof EntityFormInterface) {
$entity = $form_object->getEntity();
return "{$entity->getEntityType()->id()}:{$entity->bundle()}";
}
elseif ($form_object instanceof LayoutBuilderForm) {

if (empty($form['#block'])) {
return NULL;
}

$block = $form['#block'];

return "{$block->getEntityType()->id()}:{$block->bundle()}";
}

return NULL;
}

public function bannerBlockFormAlter(
&$form,
FormStateInterface $form_state,
$form_id
): void {

if ($this->getFormEntityType($form, $form_state) !== 'block_content:v2_banner') {
return;
}

// Validation callback.
if (!empty($form['settings']['block_form'])) {
$form['settings']['block_form']['#validate'][] = [
self::class,
'validateBannerForm'
];
}
else {
$form['#validate'][] = [
self::class,
'validateBannerForm'
];
}

// States logic works correctly.
$form['field_v2_link']['#states']['visible'] = [
':input[name="field_v2_is_fully_clickable[value]"]' => ['checked' => TRUE],
];

$form['field_v2_buttons_x2']['#states']['visible'] = [
':input[name="field_v2_is_fully_clickable[value]"]' => ['checked' =>  FALSE],
];
}

public static function validateBannerForm(
array &$form,
FormStateInterface $form_state
): void {

throw new \Exception('VALIDATION RUNNING');
}

}
Что работает
  • Код: Выделить всё

    hook_form_layout_builder_add_block_alter()
    выполняется
  • Код: Выделить всё

    hook_form_layout_builder_update_block_alter()
    выполняется
  • логика работает правильно
  • form alter определенно работает
  • Модальное окно Layout Builder загружается правильно
Что НЕ работает
Обратный вызов проверки никогда не выполняется.
Даже это никогда не срабатывает:

Код: Выделить всё

throw new \Exception('VALIDATION RUNNING');
Никаких исключений нигде не появляется:
  • нет ошибок AJAX
  • нет журналов
  • нет страницы исключений
Дополнительные примечания
Я также ранее пробовал: но формы AJAX Layout Builder стали нестабильными.
Каков правильный подход Drupal 10 для прикрепления пользовательской проверки к встроенным блочным формам Layout Builder?
Будем признательны за любые рекомендации или примеры.>
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»