Puncte:0

Formularul de configurare personalizată de administrator adaugă mai multe probleme de câmp

drapel cn

Am creat mai jos formularul de configurare personalizată admin, luând o referință la exemplele de mai jos:

  1. https://git.drupalcode.org/project/examples/-/blob/8.x-1.x/form_api_example/src/Form/AjaxAddMore.php
  2. Cum adaug un buton „Adăugați mai multe”?

Formularul meu personalizat este redat corect la prima încărcare, dar când fac clic pe butonul „Adăugați produs” nu se întâmplă nimic. Ca exemplu, formularul ar trebui să se reconstruiască din nou și să prevadă câmpurile. Presupun că aici ar putea fi posibil din cauza a ceva depreciat în Drupal 9, deoarece toate exemplele de mai sus funcționează bine în Drupal 8.

Cum pot adăuga corect butonul Adăugați mai multe?

<?php

namespace Drupal\commerce_product_quantity\Form;

utilizați Drupal;
utilizați Drupal\Core\Form\ConfigFormBase;
utilizați Drupal\Core\Form\FormStateInterface;

/**
 * Configurați setările commerce_product_quantity pentru acest site.
 */
clasa SettingsForm extinde ConfigFormBase {

  /**
   * {@inheritdoc}
   */
  funcția publică getFormId(): șir
  {
    returnează „comerț_produs_cantitate_setări”;
  }

  /**
   * {@inheritdoc}
   */
  funcția protejată getEditableConfigNames(): matrice
  {
    returnează ['commerce_product_quantity.settings'];
  }

  /**
   * {@inheritdoc}
   */
  funcția publică buildForm(array $form, FormStateInterface $form_state): matrice
  {
    /* Preluați toate produsele */
    $rezultat = Drupal::entityQuery('produs_comerț')
      ->execute();
    $titles = array('none' => "- Selectați -");

    foreach ($rezultat ca $product_id) {
      $entity_manager = \Drupal::entityTypeManager();
      $produs = $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['#tree'] = TRUE;
    $form['product_quantity_fieldset'] = [
      '#type' => 'set de câmpuri',
      '#title' => $this->t('Produse cu cantitatea totală permisă'),
      '#attributes' => ['id' => 'product-fieldset-wrapper'],
    ];

    dacă (gol ($field_count)) {
      $form_state->set('fields_count', 1);
      $field_count = 1;
    }

    pentru ($i = 0; $i < $field_count; $i++) {
      $form['product_quantity_fieldset']['produs'.$i] = [
        '#type' => 'selectați',
        '#title' => t('Adăugați produs'),
        '#options' => $titluri,
      ];

      $configName = "commerce_product_quantity.settings.".$i;
      $form['product_quantity_fieldset']['cantity'.$i] = [
        '#type' => 'număr',
        '#title' => $this->t('Cantitate'),
        '#default_value' => $this->config($configName)->get('cantity'),
      ];
    }
    $form['actions'] = [
      '#type' => 'acțiuni',
    ];
    $form['product_quantity_fieldset']['actions']['add_name'] = [
      '#type' => 'trimite',
      '#value' => $this->t('Adăugați produs'),
      '#submit' => array('::addOne'),
      '#ajax' => [
        'callback' => '::addmoreCallback',
        'wrapper' => 'product-fieldset-wrapper',
      ],
    ];
    dacă ($field_count > 1) {
      $form['product_quantity_fieldset']['actions']['remove_name'] = [
        '#type' => 'trimite',
        '#value' => $this->t('Eliminați unul'),
        '#submit' => array('::removeOne'),
        '#ajax' => [
          'callback' => '::removeCallback',
          'wrapper' => 'product-fieldset-wrapper',
        ]
      ];
    }
    $form_state->setCached(FALSE);
    $form['actions']['submit'] = [
      '#type' => 'trimite',
      '#value' => $this->t('Trimite'),
    ];

    returnează $form;
  }

  funcția publică addOne(matrice &$form, 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();
  }

  funcția publică removeOne(matrice &$form, 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(TRUE);
  }

  funcția publică addmoreCallback(matrice &$form, FormStateInterface $form_state) {
    $add_button = $form_state->get('fields_count');
    returnează $form['product_quantity_fieldset'];
  }

  funcția publică removeCallback(matrice &$form, FormStateInterface $form_state) {
    $field_count = $form_state->get('fields_count');
    dacă ($field_count > 1) {
      $remove_button = $field_count - 1;
      $form_state->set('fields_count', $remove_button);
    }
    $form_state->setRebuild(TRUE);
  }

  funcția publică validateForm(matrice &$form, FormStateInterface $form_state) {

  }

  funcția publică submitForm(matrice &$form, FormStateInterface $form_state) {
   
  }
}
Jaypan avatar
drapel de
Ați setat formularul să nu fie stocat în cache cu `$form_state->setCached(FALSE);`, cred că acest lucru va împiedica #ajax să funcționeze corect.
Harshit Thakore avatar
drapel cn
Același cod postat în întrebarea mea funcționează bine. În timpul dezvoltării, am folosit print_r în scop de depanare care provoacă o problemă și împiedică reconstruirea formularului. Tocmai am eliminat tot print_r din codul meu și funcționează bine.

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.