web-dev-qa-db-ja.com

$ form_stateでファイルのアップロードが常にNULLになるのはなぜですか?

ユーザーが自分のプロフィールのアバターとして画像をアップロードできるフォームを作成しました。選択した画像がまったく認識されないため、問題があります。

私は drupal.orgからの画像の例 を使用しました。これは、最小限のコードがまったく機能しないことです。

_function my_edit_form($form, $form_state, $entity) {

  $form['picture']['picture_upload'] = array(
    '#type' => 'file',
    '#title' => t("Upload picture"),
    '#description' => t("Your virtual face or picture. Pictures larger than 150x150 pixels will be scaled down."),
    '#upload_location' => 'public://pictures/',
    '#size' => 48,
  );

  return $form;
}
_

upload picture form

documentation で説明されているように、file()関数を使用しようとしていますが、_$form_state['values']['picture']_は常にNULLのようです。

_function my_edit_form_submit($form, &$form_state) {
  dpm($form_state);
}
_

devel form state values output

それがどのようにして可能かはわかりませんが、ここでは少し迷っています。他に私が何を試すことができますか?

3
Afr

わかりました、これはトリッキーですDrupalがファイルのアップロードを処理し、理解するのに少し時間がかかりました。

_$form_state_は、ファイルのアップロードで実際にNULLまたは空の文字列または空の配列を表示します適切なアップロード関数を追加しない限り。ファイルは存在しますが、まだアップロードされていません。

user_validate_picture() を見てみる価値があります。

_function user_validate_picture(&$form, &$form_state) {
  // If required, validate the uploaded picture.
  $validators = array(
    'file_validate_is_image' => array(),
    'file_validate_image_resolution' => array(variable_get('user_picture_dimensions', '85x85')),
    'file_validate_size' => array(variable_get('user_picture_file_size', '30') * 1024),
  );

  // Save the file as a temporary file.
  $file = file_save_upload('picture_upload', $validators);
  if ($file === FALSE) {
    form_set_error('picture_upload', t("Failed to upload the picture image; the %directory directory doesn't exist or is not writable.", array('%directory' => variable_get('user_picture_path', 'pictures'))));
  }
  elseif ($file !== NULL) {
    $form_state['values']['picture_upload'] = $file;
  }
}
_

独自の検証関数内からこの関数を呼び出すと、ファイルが_temporary://What-is-Sustainability_0.png_にアップロードされ、_$form_state['values']_に表示されます。

form state including picture

これが私が探していたもので、今では必要な場所にファイルを保存し、fidをエンティティにリンクするために利用できます。

5
Afr

Drupal 8の場合:

public function validateForm(array &$form, FormStateInterface $form_state){

    parent::validateForm($form, $form_state);

    $validators = array(
        'file_validate_extensions' => array("pdf"),
        'file_validate_size' => array(file_upload_max_size()),
    );

    // Save the file as a temporary file.
    $file = file_save_upload('field_upload', $validators, FALSE, 0, FILE_EXISTS_REPLACE);
    if ($file === FALSE) {
        $form_state->setError($form["field_upload"], "Failed to upload the file");
    }
    elseif ($file !== NULL) {

        $form_state->setValue("field_upload", $file->toArray());
    }



}
4
Mike