ユーザーが自分のプロフィールのアバターとして画像をアップロードできるフォームを作成しました。選択した画像がまったく認識されないため、問題があります。
私は 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;
}
_
documentation で説明されているように、file()
関数を使用しようとしていますが、_$form_state['values']['picture']
_は常にNULL
のようです。
_function my_edit_form_submit($form, &$form_state) {
dpm($form_state);
}
_
それがどのようにして可能かはわかりませんが、ここでは少し迷っています。他に私が何を試すことができますか?
わかりました、これはトリッキーです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']
_に表示されます。
これが私が探していたもので、今では必要な場所にファイルを保存し、fid
をエンティティにリンクするために利用できます。
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());
}
}