aboutsummaryrefslogtreecommitdiff
path: root/actions/avatar
diff options
context:
space:
mode:
Diffstat (limited to 'actions/avatar')
-rw-r--r--actions/avatar/crop.php72
-rw-r--r--actions/avatar/remove.php36
-rw-r--r--actions/avatar/upload.php62
3 files changed, 170 insertions, 0 deletions
diff --git a/actions/avatar/crop.php b/actions/avatar/crop.php
new file mode 100644
index 000000000..b9a80f331
--- /dev/null
+++ b/actions/avatar/crop.php
@@ -0,0 +1,72 @@
+<?php
+/**
+ * Avatar crop action
+ *
+ */
+
+$guid = get_input('guid');
+$owner = get_entity($guid);
+
+if (!$owner || !($owner instanceof ElggUser) || !$owner->canEdit()) {
+ register_error(elgg_echo('avatar:crop:fail'));
+ forward(REFERER);
+}
+
+$x1 = (int) get_input('x1', 0);
+$y1 = (int) get_input('y1', 0);
+$x2 = (int) get_input('x2', 0);
+$y2 = (int) get_input('y2', 0);
+
+$filehandler = new ElggFile();
+$filehandler->owner_guid = $owner->getGUID();
+$filehandler->setFilename("profile/" . $owner->guid . "master" . ".jpg");
+$filename = $filehandler->getFilenameOnFilestore();
+
+// ensuring the avatar image exists in the first place
+if (!file_exists($filename)) {
+ register_error(elgg_echo('avatar:crop:fail'));
+ forward(REFERER);
+}
+
+$icon_sizes = elgg_get_config('icon_sizes');
+unset($icon_sizes['master']);
+
+// get the images and save their file handlers into an array
+// so we can do clean up if one fails.
+$files = array();
+foreach ($icon_sizes as $name => $size_info) {
+ $resized = get_resized_image_from_existing_file($filename, $size_info['w'], $size_info['h'], $size_info['square'], $x1, $y1, $x2, $y2, $size_info['upscale']);
+
+ if ($resized) {
+ //@todo Make these actual entities. See exts #348.
+ $file = new ElggFile();
+ $file->owner_guid = $guid;
+ $file->setFilename("profile/{$guid}{$name}.jpg");
+ $file->open('write');
+ $file->write($resized);
+ $file->close();
+ $files[] = $file;
+ } else {
+ // cleanup on fail
+ foreach ($files as $file) {
+ $file->delete();
+ }
+
+ register_error(elgg_echo('avatar:resize:fail'));
+ forward(REFERER);
+ }
+}
+
+$owner->icontime = time();
+
+$owner->x1 = $x1;
+$owner->x2 = $x2;
+$owner->y1 = $y1;
+$owner->y2 = $y2;
+
+system_message(elgg_echo('avatar:crop:success'));
+$view = 'river/user/default/profileiconupdate';
+elgg_delete_river(array('subject_guid' => $owner->guid, 'view' => $view));
+add_to_river($view, 'update', $owner->guid, $owner->guid);
+
+forward(REFERER);
diff --git a/actions/avatar/remove.php b/actions/avatar/remove.php
new file mode 100644
index 000000000..9cb40a760
--- /dev/null
+++ b/actions/avatar/remove.php
@@ -0,0 +1,36 @@
+<?php
+/**
+ * Avatar remove action
+ */
+
+$user_guid = get_input('guid');
+$user = get_user($user_guid);
+
+if (!$user || !$user->canEdit()) {
+ register_error(elgg_echo('avatar:remove:fail'));
+ forward(REFERER);
+}
+
+// Delete all icons from diskspace
+$icon_sizes = elgg_get_config('icon_sizes');
+foreach ($icon_sizes as $name => $size_info) {
+ $file = new ElggFile();
+ $file->owner_guid = $user_guid;
+ $file->setFilename("profile/{$user_guid}{$name}.jpg");
+ $filepath = $file->getFilenameOnFilestore();
+ if (!$file->delete()) {
+ elgg_log("Avatar file remove failed. Remove $filepath manually, please.", 'WARNING');
+ }
+}
+
+// Remove crop coords
+unset($user->x1);
+unset($user->x2);
+unset($user->y1);
+unset($user->y2);
+
+// Remove icon
+unset($user->icontime);
+
+system_message(elgg_echo('avatar:remove:success'));
+forward(REFERER);
diff --git a/actions/avatar/upload.php b/actions/avatar/upload.php
new file mode 100644
index 000000000..0752615e0
--- /dev/null
+++ b/actions/avatar/upload.php
@@ -0,0 +1,62 @@
+<?php
+/**
+ * Avatar upload action
+ */
+
+$guid = get_input('guid');
+$owner = get_entity($guid);
+
+if (!$owner || !($owner instanceof ElggUser) || !$owner->canEdit()) {
+ register_error(elgg_echo('avatar:upload:fail'));
+ forward(REFERER);
+}
+
+if ($_FILES['avatar']['error'] != 0) {
+ register_error(elgg_echo('avatar:upload:fail'));
+ forward(REFERER);
+}
+
+$icon_sizes = elgg_get_config('icon_sizes');
+
+// get the images and save their file handlers into an array
+// so we can do clean up if one fails.
+$files = array();
+foreach ($icon_sizes as $name => $size_info) {
+ $resized = get_resized_image_from_uploaded_file('avatar', $size_info['w'], $size_info['h'], $size_info['square'], $size_info['upscale']);
+
+ if ($resized) {
+ //@todo Make these actual entities. See exts #348.
+ $file = new ElggFile();
+ $file->owner_guid = $guid;
+ $file->setFilename("profile/{$guid}{$name}.jpg");
+ $file->open('write');
+ $file->write($resized);
+ $file->close();
+ $files[] = $file;
+ } else {
+ // cleanup on fail
+ foreach ($files as $file) {
+ $file->delete();
+ }
+
+ register_error(elgg_echo('avatar:resize:fail'));
+ forward(REFERER);
+ }
+}
+
+// reset crop coordinates
+$owner->x1 = 0;
+$owner->x2 = 0;
+$owner->y1 = 0;
+$owner->y2 = 0;
+
+$owner->icontime = time();
+if (elgg_trigger_event('profileiconupdate', $owner->type, $owner)) {
+ system_message(elgg_echo("avatar:upload:success"));
+
+ $view = 'river/user/default/profileiconupdate';
+ elgg_delete_river(array('subject_guid' => $owner->guid, 'view' => $view));
+ add_to_river($view, 'update', $owner->guid, $owner->guid);
+}
+
+forward(REFERER);