Php Drupal8Ajax忘记表单更改

Php Drupal8Ajax忘记表单更改,php,ajax,drupal,widget,drupal-8,Php,Ajax,Drupal,Widget,Drupal 8,我在Drupal8中遇到了多个AJAX请求修改表单的问题 让我解释一下——我一直在尝试在drupal中构建一个测验模块,并决定使用一个小部件来创建数量可变的测验问题,在这个问题小部件中有一个可能的答案列表。 我已经在我的问题小部件中创建了一个AJAX按钮,它允许删除答案,并且在第一次提交答案时就可以使用,但是由于某种原因,第二次运行AJAX调用时,表单被重置(比如没有做任何更改,也没有删除任何答案)。在取消设置答案之后,以及在第二次运行ajax回调时,我调试了表单数组 启用ajax的按钮使用默认

我在Drupal8中遇到了多个AJAX请求修改表单的问题

让我解释一下——我一直在尝试在drupal中构建一个测验模块,并决定使用一个小部件来创建数量可变的测验问题,在这个问题小部件中有一个可能的答案列表。 我已经在我的问题小部件中创建了一个AJAX按钮,它允许删除答案,并且在第一次提交答案时就可以使用,但是由于某种原因,第二次运行AJAX调用时,表单被重置(比如没有做任何更改,也没有删除任何答案)。在取消设置答案之后,以及在第二次运行ajax回调时,我调试了表单数组

启用ajax的按钮使用默认的ajax替换方法,我在ajax回调中尝试了不同的返回表单(减去答案)的方法,包括简单地取消设置所选表单元素并返回表单,以及使用AjaxResponse和HtmlCommand类。我也试着重建这两种形式,通过,并没有喜悦。 此外,每个按钮和答案都有唯一的名称/id

以下是我的小部件代码(包括按钮定义):


Ajax第二次不生效的一个可能原因是在Ajax回调中重新生成表单。当您使用以下命令重建表单时—

$form_state->setRebuild()
重新生成表单时,所有字段和表单ID都以随机生成号作为后缀。因此,在DOM中找不到选择器,也不会替换响应


尝试删除表单重建。

你找到答案了吗?多亏了你,我找到了如何让ajax提交没有值的重建表单。你能告诉我整个构建/重建过程吗?我是说从哪里开始到哪里结束。其余的我都知道了。
<?php

/**
 * @file
 * Contains \Drupal\pp_quiz\Ajax\AjaxHandler.
 */

namespace Drupal\pp_quiz\Ajax;

use \Drupal\pp_quiz\Controller\QuizController;
use \Drupal\pp_quiz\Entities\QuizResults;
use \Drupal\Core\Form\FormStateInterface;
use \Drupal\Core\Ajax\AjaxResponse;
use \Drupal\Core\Ajax\HtmlCommand;

class AjaxHandler {

    public function removeAnswerAjax(&$form, FormStateInterface $form_state) {
        $questionno = $form_state->getTriggeringElement()['#questionno'];

        $response = new AjaxResponse();

        //find selected answer for question number (questionno)
        foreach($form['field_quiz_questions']['widget'][$questionno]['answers']['#value'] as $answer_key=>$answer) {
            unset($form['field_quiz_questions']['widget'][$questionno]['answers']['#options'][$answer]);
            unset($form['field_quiz_questions']['widget'][$questionno]['answers']['#default_value'][$answer]);
            unset($form['field_quiz_questions']['widget'][$questionno]['answers'][$answer]);
        }

        $response->addCommand(new HtmlCommand('#edit-field-quiz-questions-wrapper', $form['field_quiz_questions']['widget']));

        $form_state->setRebuild();

        return $response;
    }
}
$form_state->setRebuild()