2
votes

I am trying to create my first drupal 8 module. in this module I have to create a new form and provide user a file uploading capability in this form. here is my form controller:

class Make2d extends FormBase {

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

  /**
   * {@inheritdoc}
   */
  public function buildForm(array $form, FormStateInterface $form_state) {
    if (\Drupal::currentUser()->isAnonymous()) {
        return new RedirectResponse(\Drupal::url('user.page'));
    }

    $form['sheet_size'] = array(
      '#type' => 'radios',
      '#title' => t('Sheet Size'),
      '#options' => array(t('10 X 10(2.99$)'), t('17 X 17(4.99$)'), t('28 X 28(5.99$)')),
    );
    $form['uploaded_file'] = array(
      '#type' => 'file',
      '#title' => t('Upload your file'),
      '#required' => true
    );
    $form['actions']['#type'] = 'actions';
    $form['actions']['submit'] = array(
      '#type' => 'submit',
      '#value' => $this->t('Save to Cart'),
      '#button_type' => 'primary',
    );
    return $form;
  }

  /**
   * {@inheritdoc}
   */
  public function validateForm(array &$form, FormStateInterface $form_state) {
    echo '<pre>';
    print_r($form_state->getvalues());
    echo '</pre>';
  }

  /**
   * {@inheritdoc}
   */
  public function submitForm(array &$form, FormStateInterface $form_state) {
     print_r($form_state['values']);

  }

}

this is the result when I go to my form's page:

image of my form

then I choose a file from my computer and submit the form. but when I print_r my $form_state->getvalues() array the result is sth like this:

Array
(
    [sheet_size] => 0
    [uploaded_file] => 
    [submit] => Drupal\Core\StringTranslation\TranslatableMarkup Object
...

you can see that [uploaded_file] is empty. and there is an error on top of the form about uploading a file. what is wrong with the form controller and file uploading. thanks.

1

1 Answers

3
votes

at last! I find it. we should use '#type' = 'managed_file' so that we let drupal to manage uploaded file. in the case we use '#type' = 'file' we must transfer file ourselves by file_save_upload().