Score: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;
ใช้ Drupal\Core\Form\ConfigFormBase;
ใช้ Drupal\Core\Form\FormStateInterface;

/**
 * กำหนดการตั้งค่า commerce_product_quantity สำหรับไซต์นี้
 */
คลาส SettingsForm ขยาย ConfigFormBase {

  /**
   * {@inheritdoc}
   */
  ฟังก์ชันสาธารณะ getFormId(): สตริง
  {
    ส่งคืน 'commerce_product_quantity_settings';
  }

  /**
   * {@inheritdoc}
   */
  ฟังก์ชันที่ได้รับการป้องกัน getEditableConfigNames(): อาร์เรย์
  {
    ส่งคืน ['commerce_product_quantity.settings'];
  }

  /**
   * {@inheritdoc}
   */
  ฟังก์ชันสาธารณะ buildForm (อาร์เรย์ $form, FormStateInterface $form_state): อาร์เรย์
  {
    /* ดึงข้อมูลสินค้าทั้งหมด */
    $result = Drupal::entityQuery('commerce_product')
      ->ดำเนินการ ();
    $titles = array('ไม่มี' => "- เลือก -");

    foreach (ผลลัพธ์ $ เป็น $ product_id) {
      $entity_manager = \Drupal::entityTypeManager();
      $product = $entity_manager->getStorage('commerce_product')->โหลด($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' => 'ชุดฟิลด์',
      '#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']['ผลิตภัณฑ์'.$i] = [
        '#type' => 'เลือก',
        '#title' => t('เพิ่มสินค้า'),
        '#options' => $ชื่อ,
      ];

      $configName = "commerce_product_quantity.settings.".$i;
      $form['product_quantity_fieldset']['quantity'.$i] = [
        '#type' => 'หมายเลข',
        '#title' => $this->t('ปริมาณ'),
        '#default_value' => $this->config($configName)->get('ปริมาณ'),
      ];
    }
    $แบบฟอร์ม['การกระทำ'] = [
      '#type' => 'การกระทำ',
    ];
    $form['product_quantity_fieldset']['actions']['add_name'] = [
      '#type' => 'ส่ง',
      '#value' => $this->t('เพิ่มสินค้า'),
      '#submit' => อาร์เรย์('::addOne'),
      '#อาแจ็กซ์' => [
        'callback' => '::addmoreCallback',
        'wrapper' => 'product-fieldset-wrapper',
      ]
    ];
    ถ้า ($field_count > 1) {
      $form['product_quantity_fieldset']['actions']['remove_name'] = [
        '#type' => 'ส่ง',
        '#value' => $this->t('ลบหนึ่งรายการ'),
        '#submit' => อาร์เรย์('::removeOne'),
        '#อาแจ็กซ์' => [
          'callback' => '::removeCallback',
          'wrapper' => 'product-fieldset-wrapper',
        ]
      ];
    }
    $form_state->setCached(เท็จ);
    $form['actions']['submit'] = [
      '#type' => 'ส่ง',
      '#value' => $this->t('ส่ง'),
    ];

    คืนฟอร์ม $;
  }

  ฟังก์ชันสาธารณะ addOne (อาร์เรย์ &$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();
  }

  ฟังก์ชันสาธารณะ removeOne (อาร์เรย์ &$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(จริง);
  }

  ฟังก์ชันสาธารณะ addmoreCallback (อาร์เรย์ &$form, 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 (อาร์เรย์ &$form, FormStateInterface $form_state) {

  }

  ฟังก์ชันสาธารณะ submitForm (อาร์เรย์ &$form, FormStateInterface $form_state) {
   
  }
}
Jaypan avatar
de flag
คุณได้ตั้งค่าฟอร์มของคุณไม่ให้แคชด้วย `$form_state->setCached(FALSE);` ฉันเชื่อว่าสิ่งนี้จะทำให้ #ajax ทำงานไม่ถูกต้อง
Harshit Thakore avatar
cn flag
รหัสเดียวกันที่โพสต์ในคำถามของฉันใช้งานได้ดี ในระหว่างการพัฒนา ฉันใช้ print_r เพื่อจุดประสงค์ในการดีบักที่ทำให้เกิดปัญหา และป้องกันไม่ให้สร้างแบบฟอร์มใหม่ ฉันเพิ่งลบ print_r ทั้งหมดออกจากโค้ดของฉัน และมันก็ใช้ได้ดี

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา