Điểm:0

Làm cách nào để tôi tự động (AJAX) hiển thị radio ở dạng API?

lá cờ au

Một biểu mẫu như sau sẽ hiển thị các trường bổ sung khi người dùng chọn "Có" trong nút radio "Hiển thị thêm". Khi được hiển thị, phần khác có trường văn bản "Tên" và bộ radio "Giới tính".

Nhưng nó không bao giờ hoạt động như mong đợi. Nhãn "Giới tính" sẽ ở đó nhưng các nút radio không bao giờ được hiển thị. Tôi biết việc thay đổi "Giới tính" thành radio sẽ hiệu quả, nhưng vì lý do nào đó, tôi cần sử dụng nhiều nút radio. Có cách nào tôi có thể làm cho công việc này?

<?php

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

sử dụng Drupal\Core\Form\FormBase;

lớp DonationPrepareForm mở rộng FormBase {

  /**
   * {@inheritdoc}
   */
  hàm công khai getFormId() {
    trả về 'my_form';
  }

  /**
   * {@inheritdoc}
   */
  hàm công khai buildForm(
    mảng $form,
    FormStateInterface $form_state
  ) {
    $form['show_more'] = [
      '#type' => 'radio',
      '#title' => 'Hiển thị thêm',
      '#options' => [
        'Y' => 'Có',
        'N' => 'Không',
      ],
      '#ajax' => [
        'gọi lại' => '::ajaxBuildForm',
        'trình bao bọc' => 'chỉnh sửa thêm trình bao bọc',
        'tiến độ' => [
          'gõ' => 'đập',
          'tin nhắn' => $this->t('Đang tải...'),
        ],
      ],
    ];
    $form['more'] = [
      '#type' => 'thùng chứa',
      '#prefix' => '<div id="edit-more-wrapper">',
      '#suffix' => '</div>',
    ];

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

  hàm công khai ajaxBuildForm(mảng &$form, FormStateInterface $form_state)
  {
    if ($form_state->getValue('show_more') === 'Y') {
      $form['more']['name'] = [
        '#type' => 'trường văn bản',
        '#title' => 'Tên',
        '#required' => ĐÚNG,
      ];
      $form['more']['giới tính'] = [
        '#type' => 'radio',
        '#title' => 'Giới tính',
        '#options' => [
          'M' => 'Nam',
          'F' => 'Nữ',
        ],
        '#required' => ĐÚNG,
      ];
    }
    trả về $form['more'];
  }
}

Câu hỏi tương tự mở rộng cho các phần tử biểu mẫu tổng hợp khác (ví dụ:hộp kiểm). Có cách nào để AJAX hoạt động cho họ không?

Điểm:2
lá cờ cn

Trên thực tế, việc sử dụng thuộc tính #states của phần tử biểu mẫu để làm cho phần tử hiển thị, ẩn, bật, tắt, bắt buộc hoặc ... dễ dàng hơn nhiều so với sử dụng ajax

Một mã như thế này sẽ thực hiện công việc:

<?php

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

sử dụng Drupal\Core\Form\FormBase;

lớp DonationPrepareForm mở rộng FormBase {

  /**
   * {@inheritdoc}
   */
  hàm công khai getFormId() {
    trả về 'my_form';
  }

  /**
   * {@inheritdoc}
   */
  chức năng công khai buildForm (
    mảng $form,
    FormStateInterface $form_state
  ) {
    $form['show_more'] = [
      '#type' => 'radio',
      '#title' => 'Hiển thị thêm',
      '#options' => [
        'Y' => 'Có',
        'N' => 'Không',
      ],
    ];


    $form['more']['name'] = [
      '#type' => 'trường văn bản',
      '#title' => 'Tên',
      '#states' => mảng (
        'hiển thị' => mảng (
          ':input[name="show_more"]' => mảng('giá trị' => 'Y'),
        ),
        'bắt buộc' => mảng (
          ':input[name="show_more"]' => mảng('giá trị' => 'Y'),
        )
      ),
    ];
    $form['more']['giới tính'] = [
      '#type' => 'radio',
      '#title' => 'Giới tính',
      '#options' => [
        'M' => 'Nam',
        'F' => 'Nữ',
      ],
      '#states' => mảng (
        'hiển thị' => mảng (
          ':input[name="show_more"]' => mảng('giá trị' => 'Y'),
        ),
        'bắt buộc' => mảng (
          ':input[name="show_more"]' => mảng('giá trị' => 'Y'),
        )
      ),
    ];

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

}

lá cờ au
Điều này không hiệu quả đối với trường hợp của tôi vì tôi muốn các trường xuất hiện là các trường bắt buộc.
lá cờ in
Điều này không hoạt động chính xác là gì? Trạng thái bắt buộc cũng phụ thuộc vào đầu vào trong câu trả lời?
Điểm:1
lá cờ cn

Di chuyển xây dựng biểu mẫu sang buildForm(). Bạn không thể xây dựng các phần tử biểu mẫu trong hàm gọi lại Ajax (Tôi cũng đã đổi tên phương thức gọi lại để làm rõ điều này):

<?php

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

sử dụng Drupal\Core\Form\FormBase;

lớp DonationPrepareForm mở rộng FormBase {

  /**
   * {@inheritdoc}
   */
  hàm công khai getFormId() {
    trả về 'my_form';
  }

  /**
   * {@inheritdoc}
   */
  chức năng công khai buildForm(mảng $form, FormStateInterface $form_state) {
     $form['show_more'] = [
      '#type' => 'radio',
      '#title' => 'Hiển thị thêm',
      '#options' => [
        'Y' => 'Có',
        'N' => 'Không',
      ],
      '#ajax' => [
        'gọi lại' => '::ajaxCallback',
        'trình bao bọc' => 'chỉnh sửa thêm trình bao bọc',
        'tiến độ' => [
          'gõ' => 'đập',
          'tin nhắn' => $this->t('Đang tải...'),
        ],
      ],
    ];
    $form['more'] = [
      '#type' => 'thùng chứa',
      '#prefix' => '<div id="edit-more-wrapper">',
      '#suffix' => '</div>',
    ];

    if ($form_state->getValue('show_more') === 'Y') {
      $form['more']['name'] = [
        '#type' => 'trường văn bản',
        '#title' => 'Tên',
        '#required' => ĐÚNG,
      ];
      $form['more']['giới tính'] = [
        '#type' => 'radio',
        '#title' => 'Giới tính',
        '#options' => [
          'M' => 'Nam',
          'F' => 'Nữ',
        ],
        '#required' => ĐÚNG,
      ];
    }

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

  hàm công khai ajaxCallback(mảng &$form, FormStateInterface $form_state) {
    trả về $form['more'];
  }
}
lá cờ au
Cảm ơn rất nhiều. Nó hoạt động!

Đă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.