0

I have a form which provides select2 when the select1 is changed. However I would like select2 to be a multi-select. I can't seem to get this to work. It populates a single select input just fine, but not the multi-select. Any tips would be appreciated.

public function buildForm(array $form, FormStateInterface $form_state, $options = NULL) {
  $form['expeditions'] = [
    '#type' => 'select',
    '#title' => $this->t('Choose Project'),
    '#empty_option' => $this->t('Select a project'),
    '#default_value' => '',
    '#options' => $options,
    '#ajax' => [
      'callback' => '::getDeployments',
      'wrapper' => 'deployment-wrapper',
    ],
  ];

  // Disable caching on this form.
  $form_state->setCached(FALSE);

  $form['deployment_wrapper'] = [
    '#type' => 'container',
    '#attributes' => ['id' => 'deployment-wrapper'],
  ];

  return parent::buildForm($form, $form_state);
}

public function getDeployments(array &$form, FormStateInterface $form_state) {
  $expedition_id = $form_state->getValue('expeditions');
  if ($expedition_id != "") {
    $arms_config = \Drupal::config('arms.settings');
    $rest_root = $arms_config->get("arms_rest_uri");

    $client = \Drupal::service('http_client');
    try {
      $result = $client->get(
        $rest_root . 'arms/projects/' . $expedition_id,
        ['Accept' => 'application/json']
      );
      $expedition = json_decode($result->getBody());
    }
    catch (RequestException $e) {
      watchdog_exception('arms', $e);
      drupal_set_message('Error fetching project.', 'error');
    }
  }

  $options = [];

  foreach ($expedition->{'deployments'} as $deployment_id) {
    array_push($options, $deployment_id);
  }

  $form['deployment_wrapper']['deployments'] = [
    '#type' => 'select',
    '#title' => $this->t('Choose Deployment(s)'),
    '#options' => $options,
    '#multiple' => TRUE,
  ];

  return $form['deployment_wrapper'];
}
0

It is not possible to create a select element in an ajax callback, because the form builder needs to know about it.

Move all code from ajax callback to buildFrom(). Make this code conditional on form_state.

Your callback contains only:

return $form['deployment_wrapper'];

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.