Điểm:0

FormAPI - Giá trị của các trường được thêm AJAX bị thiếu trong mảng giá trị khi gửi

lá cờ vn

Tôi đang sử dụng API biểu mẫu để tạo biểu mẫu trong đó tôi có nhiều phiên bản của bộ trường. Mỗi bộ trường chứa các trường giống nhau, một trường để lưu trữ địa chỉ email và một trường khác để lưu trữ một chút thông tin khác. Nhưng về cơ bản, cả hai trường văn bản đều sử dụng tính năng tự động hoàn thành, hoạt động tốt. Nhưng tôi đang gặp sự cố trong trình xử lý gửi, được mô tả bên dưới mã của tôi bên dưới.

$form['authors_container']['authors_fieldset'][$i] = [
    '#type' => 'bộ trường',
    '#thuộc tính' => [
      'lớp' => ['bộ trường tác giả']
    ],
    'thư điện tử' => [
      '#type' => 'trường văn bản',
      '#title' => 'Email tác giả',
      '#value' => $emailValue,
      '#autocomplete_route_name' => 'discussion_papers.contact_email_lookup',
      '#thuộc tính' => [
        'lớp' => ['email tác giả']
      ]
    ],
    'liên kết' => [
      '#type' => 'trường văn bản',
      '#title' => 'Chi nhánh',
      '#value' => $affiliationValue,
      '#thuộc tính' => [
        'lớp' => ['liên kết tác giả']
      ]
    ]
  ];

Sau đó, tôi có một nút AJAX để thêm nhiều phiên bản khác của bộ trường trên với trình xử lý tương ứng của nó:

$form['authors_container']['add_author'] = [
  '#type' => 'gửi',
  '#value' => 'Thêm tác giả khác',
  '#submit' => ['::AddAuthor'],
  '#limit_validation_errors' => [],
  '#ajax' => [
    'gọi lại' => '::getAuthorsFields',
    'trình bao bọc' => 'bộ chứa tác giả',
    'phương pháp' => 'thay thế',
    'vô hiệu hóa lấy nét lại' => đúng,
  ]
];

chức năng công cộng addAuthor($form, FormStateInterface &$form_state) {

    $storage = $form_state->getStorage();

    nếu (trống($storage['numOfAuthors'])) 
        $storage['numOfAuthors'] = 1;

    $storage['numOfAuthors']++;
    $form_state->setStorage($storage);

    $form_state->setLimitValidationErrors([]);
    $form_state->setRebuild();
}

Tất cả điều này hoạt động tốt, tôi có thể thêm bao nhiêu phiên bản của bộ trường nếu tôi cần.Vấn đề của tôi là khi tôi gửi biểu mẫu, các giá trị của chỉ bộ trường cuối cùng luôn trống trong $form_state['values'] mảng, nhưng tôi có thể thấy các giá trị trong $form_state['đầu vào'] mảng. Tôi hiểu rằng mảng đầu vào là đầu vào thô, chưa được xác thực và mảng giá trị đã được xác thực, vì vậy câu hỏi của tôi là tại sao chỉ tập hợp trường văn bản cuối cùng không được xác thực? Trình xử lý xác thực của tôi không xóa bất kỳ giá trị nào.

Điểm:0
lá cờ de

Hai khả năng:

  1. Bạn đã thêm các trường bổ sung vào chức năng gọi lại #ajax. Vì bạn không chỉ ra chức năng nào mà các trường của bạn được xác định, nên không thể nhìn thấy điều này từ mã của bạn. Drupal lưu trữ biểu mẫu khi xây dựng biểu mẫu, sau đó khi biểu mẫu được gửi, nó sẽ loại bỏ bất kỳ giá trị nào không phải là một phần của định nghĩa biểu mẫu ban đầu vì mục đích bảo mật. Vấn đề với việc thêm các trường trong hàm gọi lại #ajax là biểu mẫu được lưu trong bộ nhớ cache trước hàm gọi lại và do đó Drupal loại bỏ các giá trị đã gửi của các trường.

  2. Nếu trên thực tế, các khai báo phần tử biểu mẫu nằm trong hàm trình tạo biểu mẫu và không phải là một phần của hàm gọi lại #ajax, bạn có thể cần thêm #cây vào bộ trường, để tạo một mảng giá trị:

    $form['authors_container']['authors_fieldset'][$i] = [
      '#cây' => ĐÚNG,
      '#type' => 'bộ trường',
      ...
    

    Thao tác này sẽ lưu từng giá trị đã gửi vào một phần tử riêng biệt của mảng giá trị.

AlbionBrown avatar
lá cờ vn
Cảm ơn bạn đã trả lời, tôi sẽ cố gắng chỉnh sửa câu hỏi của mình để bao gồm nhiều mã hơn. Các trường bổ sung chỉ được thêm vào trong phương thức buildForm, lệnh gọi lại AJAX chỉ làm tăng số sẽ hiển thị và sau đó khi xây dựng lại biểu mẫu, nó sẽ thêm vào tuy nhiên nhiều trường được lưu trữ trong bộ lưu trữ trạng thái biểu mẫu. Tôi đã thử thêm khóa cây và cũng vô hiệu hóa bộ đệm nhưng không được. Khóa cây cũng được sử dụng trong vùng chứa cha của các bộ trường. Tôi nghĩ rằng tôi cần gỡ lỗi ngay từ khi bắt đầu gửi yêu cầu để tìm ra lý do tại sao Drupal loại bỏ chúng.
Jaypan avatar
lá cờ de
Nếu bạn đang thay đổi các giá trị ở trạng thái biểu mẫu trong một cuộc gọi lại ajax, chúng sẽ bị mất. Trạng thái biểu mẫu đã được lưu vào bộ đệm trước khi gọi lại ajax. Bạn sẽ cần thực hiện phần tăng của mình trong trình xử lý gửi, không phải gọi lại ajax, nếu bạn muốn nó tiếp tục. Các cuộc gọi lại Ajax là _only_ để xác định phần tử nào sẽ trả về, không phải để "làm" bất cứ điều gì với dữ liệu.

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