Drupal 8 - Ajax表单一旦提交就不会重建

时间:2017-09-08 08:32:44

标签: php ajax forms drupal drupal-8

我在Drupal 8中使用Ajax时出现了自定义表单的问题。

让我解释一下。我有两个选择字段,当您在第一个选择一个选项时,Ajax请求将获得第二个选项。提交表单时,它会将您重定向到特定页面。所有这些都很有效。

问题在于您重定向到某个页面,然后点击了浏览器的上一页按钮。默认情况下,您获得第一个字段的第一个选项,以及第二个字段的第一个选项,但在此特定情况下,您将获得先前为第一个字段选择的选项,但第二个选项不会获得好的值,因为Ajax请求不会被触发。

例如:

当您选择"选项A"在第一个领域,你得到"价值A.1"和"价值A.2"在第二个字段中,如果您选择"选项B",您将获得"值B.1"等...

例如,如果您使用"选项C"提交表单。和#34;值C.3",您被重定向到一个页面,如果您回到浏览器中的上一页,您将拥有"选项C"已选中,但值为"选项A"在第二个字段中("值A.1","值A.2",...),如果您提交,则会收到此错误

  

检测到非法选择。请联系该网站   管理员。

我肯定会错过重建表单的内容,但我无法找到任何解决方案。

这是我的代码:

<?php

namespace Drupal\chdou_intuitive_search\Form;

use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Ajax\AjaxResponse;
use Drupal\Core\Ajax\ReplaceCommand;

/**
 * Class DefaultForm.
 *
 * @package Drupal\chdou_intuitive_search\Form
 */
class DefaultForm extends FormBase {


  /**
   * {@inheritdoc}
   */
  public function getFormId() {
    return 'default_form';
  }

  /**
   * {@inheritdoc}
   */
  public function buildForm(array $form, FormStateInterface $form_state) {

    $form['i_wish'] = [
      '#type' => 'select',
      '#title' => $this->t('Je souhaite'),
      '#options' => [
        'appointment' => $this->t('prendre rendez-vous'),
        'doctor' => $this->t('rechercher un médecin'),
        'help' => $this->t('une aide ou un soutien')
      ],
      '#default_value' => 'appointment',
      '#required' => true,
      '#multiple' => false,
      '#size' => false,
      '#ajax' => [
        'callback' => '::getOptions',
        'event' => 'change',
        'wrapper' => 'what',
      ]
    ];

    $parent = $form_state->getValue('i_wish');
    if (empty($parent)) {
      $parent = $form['i_wish']['#default_value'];
    }
    $form['what'] = [
      '#prefix' => '<div id="what">',
      '#suffix' => '</div>',
      '#type' => 'select',
      '#title' => $whatLabel,
      '#options' => $this->getOptionsBySelection($parent),
      '#default_value' => key($this->getOptionsBySelection($parent)),
      '#required' => true,
      '#multiple' => false,
      '#size' => false,
    ];

    $form['submit'] = [
      '#prefix' => '<div class="form-actions">',
      '#suffix' => '</div>',
      '#type' => 'submit',
      '#value' => $this->t('Search'),
      '#attributes' => [
        'class' => [
          'button',
        ],
      ],
    ];

    return $form;

  }

  /**
   * Ajax callback for the "Je souhaite" dropdown
   */
  public function getOptions(array &$form, FormStateInterface $form_state) {
    return $form['what'];
  }

  /**
   * Returns list of options that correspond to the "Je souhaite" selected option
   */
  public function getOptionsBySelection($parent) {
    switch ($parent) {
      case 'appointment':
        $terms = $this->getAppointmentOptions();
        break;
      case 'doctor':
        $terms = $this->getDoctorOptions();
        break;
      case 'help':
        $terms = array(
          '140' => 'Je suis patient',
          '141' => 'Je suis aidant',
          '142' => 'Pour un proche',
        );
        break;
      default:
        break;
    }
    return $terms;
  }

  /**
   * Returns list of care_sheet_consultation taxonomy tree
   */
  public function getAppointmentOptions() {
    // ...
  }

  /**
   * Returns list of :
   *   - care_sheet_consultation
   *   - care_sheet_hospitalization
   *   - care_sheet_medical_techno
   * taxonomy trees
   */
  public function getDoctorOptions() {
    // ...
  }

  /**
   * {@inheritdoc}
   */
  public function validateForm(array &$form, FormStateInterface $form_state) {
    parent::validateForm($form, $form_state);
  }

  /**
   * {@inheritdoc}
   */
  public function submitForm(array &$form, FormStateInterface $form_state) {

    // CHOIX : Je souhaite prendre rendez-vous
    if ($form_state->getValue('i_wish') == 'appointment') {
      $form_state->setRedirect('entity.taxonomy_term.canonical', [
        'taxonomy_term' => $form_state->getValue('what')
      ]);
    }

    // CHOIX : Je souhaite rechercher un médecin
    else if ($form_state->getValue('i_wish') == 'doctor') {
      $form_state->setRedirect('entity.node.canonical', [
        'node' => '29', // i.e. page Annuaire
        'service' => $form_state->getValue('what')
      ]);
    }

    // CHOIX : Je souhaite une aide ou un soutien
    else if ($form_state->getValue('i_wish') == 'help') {
      $form_state->setRedirect('entity.node.canonical', [
        'node' => $form_state->getValue('what')
      ]);
    }

  }

}

0 个答案:

没有答案