AvatarSettings more aligned to FormAction

TODO: Make classes called AvatarCropForm and AvatarUploadForm
This commit is contained in:
Mikael Nordfeldth 2015-07-16 19:21:12 +02:00
parent 2d44400cfc
commit fd2efbc6f8
2 changed files with 31 additions and 79 deletions

View File

@ -76,11 +76,11 @@ class AvatarsettingsAction extends SettingsAction
/** /**
* Content area of the page * Content area of the page
* *
* Shows a form for uploading an avatar. * Shows a form for uploading an avatar. Currently overrides FormAction's showContent
* since we haven't made classes out of AvatarCropForm and AvatarUploadForm.
* *
* @return void * @return void
*/ */
function showContent() function showContent()
{ {
if ($this->mode == 'crop') { if ($this->mode == 'crop') {
@ -243,52 +243,19 @@ class AvatarsettingsAction extends SettingsAction
$this->elementEnd('form'); $this->elementEnd('form');
} }
/** protected function doPost()
* Handle a post
*
* We mux on the button name to figure out what the user actually wanted.
*
* @return void
*/
function handlePost()
{ {
// Workaround for PHP returning empty $_POST and $_FILES when POST
// length > post_max_size in php.ini
if (empty($_FILES)
&& empty($_POST)
&& ($_SERVER['CONTENT_LENGTH'] > 0)
) {
// TRANS: Client error displayed when the number of bytes in a POST request exceeds a limit.
// TRANS: %s is the number of bytes of the CONTENT_LENGTH.
$msg = _m('The server was unable to handle that much POST data (%s byte) due to its current configuration.',
'The server was unable to handle that much POST data (%s bytes) due to its current configuration.',
intval($_SERVER['CONTENT_LENGTH']));
$this->showForm(sprintf($msg, $_SERVER['CONTENT_LENGTH']));
return;
}
// CSRF protection
$token = $this->trimmed('token');
if (!$token || $token != common_session_token()) {
// TRANS: Client error displayed when the session token does not match or is not given.
$this->showForm(_('There was a problem with your session token. '.
'Try again, please.'));
return;
}
if (Event::handle('StartAvatarSaveForm', array($this))) { if (Event::handle('StartAvatarSaveForm', array($this))) {
if ($this->arg('upload')) { if ($this->trimmed('upload')) {
$this->uploadAvatar(); return $this->uploadAvatar();
} else if ($this->arg('crop')) { } else if ($this->trimmed('crop')) {
$this->cropAvatar(); return $this->cropAvatar();
} else if ($this->arg('delete')) { } else if ($this->trimmed('delete')) {
$this->deleteAvatar(); return $this->deleteAvatar();
} else { } else {
// TRANS: Unexpected validation error on avatar upload form. // TRANS: Unexpected validation error on avatar upload form.
$this->showForm(_('Unexpected form submission.')); throw new ClientException(_('Unexpected form submission.'));
} }
Event::handle('EndAvatarSaveForm', array($this)); Event::handle('EndAvatarSaveForm', array($this));
} }
} }
@ -303,21 +270,12 @@ class AvatarsettingsAction extends SettingsAction
*/ */
function uploadAvatar() function uploadAvatar()
{ {
try { // ImageFile throws exception if something goes wrong, which we'll
$imagefile = ImageFile::fromUpload('avatarfile'); // pick up and show as an error message above the form.
} catch (Exception $e) { $imagefile = ImageFile::fromUpload('avatarfile');
$this->showForm($e->getMessage());
return;
}
if ($imagefile === null) {
// TRANS: Validation error on avatar upload form when no file was uploaded.
$this->showForm(_('No file uploaded.'));
return;
}
$cur = common_current_user();
$type = $imagefile->preferredType(); $type = $imagefile->preferredType();
$filename = Avatar::filename($cur->id, $filename = Avatar::filename($this->scoped->getID(),
image_type_to_extension($type), image_type_to_extension($type),
null, null,
'tmp'.common_timestamp()); 'tmp'.common_timestamp());
@ -338,8 +296,7 @@ class AvatarsettingsAction extends SettingsAction
$this->mode = 'crop'; $this->mode = 'crop';
// TRANS: Avatar upload form instruction after uploading a file. // TRANS: Avatar upload form instruction after uploading a file.
$this->showForm(_('Pick a square area of the image to be your avatar.'), return _('Pick a square area of the image to be your avatar.');
true);
} }
/** /**
@ -351,13 +308,12 @@ class AvatarsettingsAction extends SettingsAction
{ {
$filedata = $_SESSION['FILEDATA']; $filedata = $_SESSION['FILEDATA'];
if (!$filedata) { if (empty($filedata)) {
// TRANS: Server error displayed if an avatar upload went wrong somehow server side. // TRANS: Server error displayed if an avatar upload went wrong somehow server side.
$this->serverError(_('Lost our file data.')); throw new ServerException(_('Lost our file data.'));
} }
$file_d = ($filedata['width'] > $filedata['height']) $file_d = min($filedata['width'], $filedata['height']);
? $filedata['height'] : $filedata['width'];
$dest_x = $this->arg('avatar_crop_x') ? $this->arg('avatar_crop_x'):0; $dest_x = $this->arg('avatar_crop_x') ? $this->arg('avatar_crop_x'):0;
$dest_y = $this->arg('avatar_crop_y') ? $this->arg('avatar_crop_y'):0; $dest_y = $this->arg('avatar_crop_y') ? $this->arg('avatar_crop_y'):0;
@ -369,11 +325,8 @@ class AvatarsettingsAction extends SettingsAction
'x' => $dest_x, 'y' => $dest_y, 'x' => $dest_x, 'y' => $dest_y,
'w' => $dest_w, 'h' => $dest_h); 'w' => $dest_w, 'h' => $dest_h);
$user = common_current_user();
$profile = $user->getProfile();
$imagefile = new ImageFile(null, $filedata['filepath']); $imagefile = new ImageFile(null, $filedata['filepath']);
$filename = Avatar::filename($profile->getID(), image_type_to_extension($imagefile->preferredType()), $filename = Avatar::filename($this->scoped->getID(), image_type_to_extension($imagefile->preferredType()),
$size, common_timestamp()); $size, common_timestamp());
try { try {
$imagefile->resizeTo(Avatar::path($filename), $box); $imagefile->resizeTo(Avatar::path($filename), $box);
@ -385,16 +338,16 @@ class AvatarsettingsAction extends SettingsAction
} }
} }
if ($profile->setOriginal($filename)) { if ($this->scoped->setOriginal($filename)) {
@unlink($filedata['filepath']); @unlink($filedata['filepath']);
unset($_SESSION['FILEDATA']); unset($_SESSION['FILEDATA']);
$this->mode = 'upload'; $this->mode = 'upload';
// TRANS: Success message for having updated a user avatar. // TRANS: Success message for having updated a user avatar.
$this->showForm(_('Avatar updated.'), true); return _('Avatar updated.');
} else {
// TRANS: Error displayed on the avatar upload page if the avatar could not be updated for an unknown reason.
$this->showForm(_('Failed updating avatar.'));
} }
// TRANS: Error displayed on the avatar upload page if the avatar could not be updated for an unknown reason.
throw new ServerException(_('Failed updating avatar.'));
} }
/** /**
@ -404,13 +357,10 @@ class AvatarsettingsAction extends SettingsAction
*/ */
function deleteAvatar() function deleteAvatar()
{ {
$user = common_current_user(); Avatar::deleteFromProfile($this->scoped);
$profile = $user->getProfile();
Avatar::deleteFromProfile($profile);
// TRANS: Success message for deleting a user avatar. // TRANS: Success message for deleting a user avatar.
$this->showForm(_('Avatar deleted.'), true); return _('Avatar deleted.');
} }
/** /**

View File

@ -189,6 +189,8 @@ class ImageFile
case UPLOAD_ERR_NO_FILE: case UPLOAD_ERR_NO_FILE:
// No file; probably just a non-AJAX submission. // No file; probably just a non-AJAX submission.
throw new ClientException(_('No file uploaded.'));
default: default:
common_log(LOG_ERR, __METHOD__ . ": Unknown upload error " . $_FILES[$param]['error']); common_log(LOG_ERR, __METHOD__ . ": Unknown upload error " . $_FILES[$param]['error']);
// TRANS: Exception thrown when uploading an image fails for an unknown reason. // TRANS: Exception thrown when uploading an image fails for an unknown reason.