Drupal 8:如何基于Ajax回调生成选项

问题描述 投票:0回答:1

在Drupal 8中,我想基于第一个选择框的Ajax调用来生成第二个选择框的选项。结果将生成第三个新的选择框,但我不需要生成一个新的选择框。我要替换第二个选择框的选项。请在下面查看我的代码:

public function buildForm(array $form, FormStateInterface $form_state) {
$form['example_select'] = [
  '#type' => 'select',
  '#title' => $this->t('Select element'),
  'wrapper' => 'first',
  '#options' => [
    '1' => $this->t('One'),
    '2' => $this->t('Two'),
    '3' => $this->t('Three'),
    '4' => $this->t('From New York to Ger-ma-ny!'),
  ],
  '#ajax' => [
    'callback' => '::myAjaxCallback', 
    'disable-refocus' => FALSE, 
    'event' => 'change',
    'wrapper' => 'edit-output', 
    'progress' => [
      'type' => 'throbber',
      'message' => $this->t('Verifying entry...'),
    ],
  ]
];


$form['example_select2'] = [
  '#type' => 'select',
  '#title' => $this->t('Select element'),
  '#prefix' => '<div id="first">',
  '#suffix' => '</div>',
  '#options' => [
  ],
  '#ajax' => [
    'callback' => '::myAjaxCallback2', 
    'disable-refocus' => FALSE,
    'event' => 'change',
    'wrapper' => 'edit-output', 
    'progress' => [
      'type' => 'throbber',
      'message' => $this->t('Verifying entry...'),
    ],
  ]
];
return $form;
}

public function myAjaxCallback(array &$form, FormStateInterface $form_state) {
  if ($selectedValue = $form_state->getValue('example_select')) {
    $arr = array('1' => 'Nice way', '2' => 'Good way');
    $form['example_select2']['#options'] = $arr;
  }
  return $form['example_select2'];
}
drupal drupal-8
1个回答
0
投票

下面的代码很不错。

public function myAjaxCallback(array &$form, FormStateInterface $form_state) {
  if ($selectedValue = $form_state->getValue('example_select')) {
    $arr = array('1' => 'Nice way', '2' => 'Good way');
    $form['example_select2']['#options'] = $arr;
  }
  $form_state->setRebuild(TRUE);
  $response = new AjaxResponse();
  $response->addCommand(new ReplaceCommand("#first", ($form['example_select2'])));
  return $response;
}
© www.soinside.com 2019 - 2024. All rights reserved.