Рейтинг:0

Пользовательская форма конфигурации администратора добавить больше проблем с полем

флаг cn

Я создал ниже пользовательскую форму конфигурации администратора, взяв ссылку на приведенные ниже примеры:

  1. https://git.drupalcode.org/project/examples/-/blob/8.x-1.x/form_api_example/src/Form/AjaxAddMore.php
  2. Как добавить кнопку «Добавить еще»?

Моя пользовательская форма отображается правильно при первой загрузке, но когда я нажимаю кнопку «Добавить продукт», ничего не происходит. Например, форма должна быть перестроена снова и добавлена ​​к полям. Я предполагаю, что это могло быть возможно из-за того, что в Drupal 9 есть что-то устаревшее, поскольку все приведенные выше примеры отлично работают в Drupal 8.

Как я могу правильно добавить кнопку «Добавить еще»?

<?php

пространство имен Drupal\commerce_product_quantity\Form;

использовать Друпал;
используйте Drupal\Core\Form\ConfigFormBase;
используйте Drupal\Core\Form\FormStateInterface;

/**
 * Настройте параметры commerce_product_quantity для этого сайта.
 */
класс SettingsForm расширяет ConfigFormBase {

  /**
   * {@inheritdoc}
   */
  публичная функция getFormId(): строка
  {
    вернуть 'commerce_product_quantity_settings';
  }

  /**
   * {@inheritdoc}
   */
  защищенная функция getEditableConfigNames(): массив
  {
    return ['commerce_product_quantity.settings'];
  }

  /**
   * {@inheritdoc}
   */
  общедоступная функция buildForm (массив $ form, FormStateInterface $ form_state): массив
  {
    /* Получить все продукты */
    $result = Drupal::entityQuery('commerce_product')
      ->выполнить();
    $titles = array('none' => "- Выберите -");

    foreach ($ результат как $ product_id) {
      $entity_manager = \Drupal::entityTypeManager();
      $product = $entity_manager->getStorage('commerce_product')->load($product_id);
      $titles[$product->product_id->value] = $product->get('title')->value;
    }

    $field_count = $form_state->get('fields_count');
    $form['#дерево'] = ИСТИНА;
    $form['product_quantity_fieldset'] = [
      '#тип' => 'набор полей',
      '#title' => $this->t('Товары с максимально допустимым количеством'),
      '#attributes' => ['id' => 'product-fieldset-wrapper'],
    ];

    если (пусто($field_count)) {
      $form_state->set('fields_count', 1);
      $field_count = 1;
    }

    для ($i = 0; $i < $field_count; $i++) {
      $form['product_quantity_fieldset']['product'.$i] = [
        '#тип' => 'выбрать',
        '#title' => t('Добавить товар'),
        '#options' => $названия,
      ];

      $configName = "commerce_product_quantity.settings.".$i;
      $form['product_quantity_fieldset']['количество'.$i] = [
        '#тип' => 'число',
        '#title' => $this->t('Количество'),
        '#default_value' => $this->config($configName)->get('количество'),
      ];
    }
    $ форма ['действия'] = [
      '#type' => 'действия',
    ];
    $form['product_quantity_fieldset']['actions']['add_name'] = [
      '#type' => 'отправить',
      '#value' => $this->t('Добавить товар'),
      '#submit' => массив('::addOne'),
      '#ajax' => [
        'обратный вызов' => '::addmoreCallback',
        'обертка' => 'продукт-поле-обертка',
      ],
    ];
    если ($field_count > 1) {
      $form['product_quantity_fieldset']['actions']['remove_name'] = [
        '#type' => 'отправить',
        '#value' => $this->t('Удалить один'),
        '#submit' => массив('::removeOne'),
        '#ajax' => [
          'обратный вызов' => '::removeCallback',
          'обертка' => 'продукт-поле-обертка',
        ]
      ];
    }
    $form_state->setCached(FALSE);
    $form['действия']['отправить'] = [
      '#type' => 'отправить',
      '#value' => $this->t('Отправить'),
    ];

    вернуть $ форму;
  }

  публичная функция addOne (массив и $ форма, FormStateInterface $ form_state) {
    $field_count = $form_state->get('fields_count');
    $add_button = $field_count + 1;

    \Drupal::messenger()->addStatus($add_button);
    $form_state->set('fields_count', $add_button);
    $form_state->setRebuild();
  }

  публичная функция removeOne (массив и $ форма, FormStateInterface $ form_state) {
    $field_count = $form_state->get('num_names');
    $add_button = $field_count + 1;
    $form_state->set('num_names', $add_button);
    $form_state->setRebuild(ИСТИНА);
  }

  общедоступная функция addmoreCallback (массив и $ форма, FormStateInterface $ form_state) {
    $add_button = $form_state->get('fields_count');
    возврат $form['product_quantity_fieldset'];
  }

  общедоступная функция removeCallback (массив и $ форма, FormStateInterface $ form_state) {
    $field_count = $form_state->get('fields_count');
    если ($field_count > 1) {
      $remove_button = $field_count - 1;
      $form_state->set('fields_count', $remove_button);
    }
    $form_state->setRebuild(ИСТИНА);
  }

  общедоступная функция validateForm (массив и $ форма, FormStateInterface $ form_state) {

  }

  публичная функция submitForm (массив и $ форма, FormStateInterface $ form_state) {
   
  }
}
Jaypan avatar
флаг de
Вы установили, что ваша форма не кэшируется с помощью `$form_state->setCached(FALSE);`, я считаю, что это помешает правильной работе #ajax.
Harshit Thakore avatar
флаг cn
Тот же код, опубликованный в моем вопросе, работает нормально. Во время разработки я использовал print_r для целей отладки, которые вызывают проблему и не позволяют перестроить форму. Я только что удалил все print_r из своего кода, и он работает нормально.

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

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