Điểm:0

Biểu mẫu cấu hình tùy chỉnh của quản trị viên thêm vấn đề về trường

lá cờ cn

Tôi đã tạo biểu mẫu cấu hình tùy chỉnh dành cho quản trị viên bên dưới bằng cách tham khảo các ví dụ bên dưới:

  1. https://git.drupalcode.org/project/examples/-/blob/8.x-1.x/form_api_example/src/Form/AjaxAddMore.php
  2. Làm cách nào để thêm nút "Thêm nhiều hơn"?

Biểu mẫu tùy chỉnh của tôi được hiển thị chính xác trong lần tải đầu tiên nhưng khi tôi nhấp vào nút "Thêm sản phẩm" thì không có gì xảy ra. Theo ví dụ, biểu mẫu sẽ được xây dựng lại và thêm vào trước các trường. Tôi cho rằng ở đây có thể là do một số thứ không được dùng nữa trong Drupal 9 vì tất cả các ví dụ trên đều hoạt động tốt trong Drupal 8.

Làm cách nào tôi có thể thêm chính xác nút Thêm nữa?

<?php

không gian tên Drupal\commerce_product_quantity\Form;

sử dụng Drupal;
sử dụng Drupal\Core\Form\ConfigFormBase;
sử dụng Drupal\Core\Form\FormStateInterface;

/**
 * Định cấu hình cài đặt commerce_product_quantity cho trang web này.
 */
lớp SettingsForm mở rộng ConfigFormBase {

  /**
   * {@inheritdoc}
   */
  hàm công khai getFormId(): chuỗi
  {
    trả về 'cài đặt_sản_phẩm_quantity_thương_mại';
  }

  /**
   * {@inheritdoc}
   */
  hàm được bảo vệ getEditableConfigNames(): mảng
  {
    return ['commerce_product_quantity.settings'];
  }

  /**
   * {@inheritdoc}
   */
  hàm công khai buildForm(mảng $form, FormStateInterface $form_state): mảng
  {
    /* Lấy tất cả sản phẩm */
    $result = Drupal::entityQuery('commerce_product')
      ->thực thi();
    $titles = array('none' => "- Chọn -");

    foreach ($kết quả là $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['#tree'] = TRUE;
    $form['product_quantity_fieldset'] = [
      '#type' => 'bộ trường',
      '#title' => $this->t('Sản phẩm có tổng số lượng cho phép'),
      '#attributes' => ['id' => 'product-fieldset-wrapper'],
    ];

    nếu (trống ($field_count)) {
      $form_state->set('fields_count', 1);
      $field_count = 1;
    }

    for ($i = 0; $i < $field_count; $i++) {
      $form['product_quantity_fieldset']['product'.$i] = [
        '#type' => 'chọn',
        '#title' => t('Thêm sản phẩm'),
        '#options' => $titles,
      ];

      $configName = "commerce_product_quantity.settings.".$i;
      $form['product_quantity_fieldset']['quantity'.$i] = [
        '#type' => 'số',
        '#title' => $this->t('Số lượng'),
        '#default_value' => $this->config($configName)->get('số lượng'),
      ];
    }
    $form['hành động'] = [
      '#type' => 'hành động',
    ];
    $form['product_quantity_fieldset']['actions']['add_name'] = [
      '#type' => 'gửi',
      '#value' => $this->t('Thêm Sản phẩm'),
      '#submit' => mảng('::addOne'),
      '#ajax' => [
        'gọi lại' => '::addmoreCallback',
        'trình bao bọc' => 'trình bao bọc bộ trường sản phẩm',
      ],
    ];
    nếu ($field_count > 1) {
      $form['product_quantity_fieldset']['actions']['remove_name'] = [
        '#type' => 'gửi',
        '#value' => $this->t('Xóa một'),
        '#submit' => mảng('::removeOne'),
        '#ajax' => [
          'gọi lại' => '::removeCallback',
          'trình bao bọc' => 'trình bao bọc bộ trường sản phẩm',
        ]
      ];
    }
    $form_state->setCached(FALSE);
    $form['actions']['submit'] = [
      '#type' => 'gửi',
      '#value' => $this->t('Gửi'),
    ];

    trả về biểu mẫu $;
  }

  hàm công cộng addOne(mảng &$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();
  }

  hàm công khai removeOne(mảng &$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);
  }

  chức năng công cộng addmoreCallback(mảng &$form, FormStateInterface $form_state) {
    $add_button = $form_state->get('fields_count');
    trả về $form['product_quantity_fieldset'];
  }

  hàm công khai removeCallback(mảng &$form, FormStateInterface $form_state) {
    $field_count = $form_state->get('fields_count');
    nếu ($field_count > 1) {
      $remove_button = $field_count - 1;
      $form_state->set('fields_count', $remove_button);
    }
    $form_state->setRebuild(TRUE);
  }

  hàm công khai validateForm(mảng &$form, FormStateInterface $form_state) {

  }

  hàm công khai submitForm(mảng &$form, FormStateInterface $form_state) {
   
  }
}
Jaypan avatar
lá cờ de
Bạn đã đặt biểu mẫu của mình không được lưu trong bộ nhớ cache với `$form_state->setCached(FALSE);`, tôi tin rằng điều này sẽ ngăn #ajax hoạt động bình thường.
Harshit Thakore avatar
lá cờ cn
Cùng một mã được đăng trong câu hỏi của tôi đang hoạt động tốt. Trong quá trình phát triển, tôi đã sử dụng print_r cho mục đích gỡ lỗi gây ra sự cố và điều đó ngăn cản việc xây dựng lại biểu mẫu. Tôi vừa xóa tất cả print_r khỏi mã của mình và nó vẫn hoạt động tốt.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.