diff options
-rw-r--r-- | actions/avatar/crop.php | 69 | ||||
-rw-r--r-- | actions/avatar/upload.php | 55 | ||||
-rw-r--r-- | engine/lib/users.php | 3 | ||||
-rw-r--r-- | languages/en.php | 10 | ||||
-rw-r--r-- | mod/groups/start.php | 2 | ||||
-rw-r--r-- | mod/profile/actions/cropicon.php | 73 | ||||
-rw-r--r-- | mod/profile/actions/iconupload.php | 62 | ||||
-rw-r--r-- | mod/profile/views/default/profile/editicon.php | 106 | ||||
-rw-r--r-- | views/default/forms/avatar/crop.php | 71 | ||||
-rw-r--r-- | views/default/forms/avatar/upload.php | 15 |
10 files changed, 228 insertions, 238 deletions
diff --git a/actions/avatar/crop.php b/actions/avatar/crop.php new file mode 100644 index 000000000..ed5faecfa --- /dev/null +++ b/actions/avatar/crop.php @@ -0,0 +1,69 @@ +<?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(); + +//@todo make this configurable? +$icon_sizes = array( + 'topbar' => array('w'=>16, 'h'=>16, 'square'=>TRUE, 'upscale'=>TRUE), + 'tiny' => array('w'=>25, 'h'=>25, 'square'=>TRUE, 'upscale'=>TRUE), + 'small' => array('w'=>40, 'h'=>40, 'square'=>TRUE, 'upscale'=>TRUE), + 'medium' => array('w'=>100, 'h'=>100, 'square'=>TRUE, 'upscale'=>TRUE), + 'large' => array('w'=>200, 'h'=>200, 'square'=>FALSE, 'upscale'=>FALSE) +); + +// 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(); + } + + system_message(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')); + +forward(REFERER); diff --git a/actions/avatar/upload.php b/actions/avatar/upload.php new file mode 100644 index 000000000..052212e97 --- /dev/null +++ b/actions/avatar/upload.php @@ -0,0 +1,55 @@ +<?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); +} + +//@todo make this configurable? +$icon_sizes = array( + 'topbar' => array('w'=>16, 'h'=>16, 'square'=>TRUE, 'upscale'=>TRUE), + 'tiny' => array('w'=>25, 'h'=>25, 'square'=>TRUE, 'upscale'=>TRUE), + 'small' => array('w'=>40, 'h'=>40, 'square'=>TRUE, 'upscale'=>TRUE), + 'medium' => array('w'=>100, 'h'=>100, 'square'=>TRUE, 'upscale'=>TRUE), + 'large' => array('w'=>200, 'h'=>200, 'square'=>FALSE, 'upscale'=>FALSE), + 'master' => array('w'=>550, 'h'=>550, 'square'=>FALSE, 'upscale'=>FALSE) +); + +// 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(); + } + + system_message(elgg_echo('avatar:resize:fail')); + forward(REFERER); + } +} + +$owner->icontime = time(); +if (elgg_trigger_event('profileiconupdate', $owner->type, $owner)) { + system_message(elgg_echo("avatar:upload:success")); +} + +forward(REFERER); diff --git a/engine/lib/users.php b/engine/lib/users.php index d69461c2b..b9bf2058f 100644 --- a/engine/lib/users.php +++ b/engine/lib/users.php @@ -1535,6 +1535,9 @@ function users_init() { elgg_register_action("useradd", '', 'public'); elgg_register_action("friends/add"); elgg_register_action("friends/remove"); + elgg_register_action('avatar/upload'); + elgg_register_action('avatar/crop'); + //elgg_register_action('friends/addcollection'); //elgg_register_action('friends/deletecollection'); //elgg_register_action('friends/editcollection'); diff --git a/languages/en.php b/languages/en.php index 2d406d3be..2168845b4 100644 --- a/languages/en.php +++ b/languages/en.php @@ -364,6 +364,16 @@ $english = array( 'friendspicker:chararray' => 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', + 'avatar' => 'Avatar', + 'avatar:create' => 'Create your avatar', + 'avatar:preview' => 'Preview', + 'avatar:create:instructions' => 'Click and drag a square below to match how you want your avatar cropped. A preview will appear in the box on the right. When you are happy with the preview, click \'Create your avatar\'. This cropped version will be used throughout the site as your avatar.', + 'avatar:upload:success' => 'Avatar successfully uploaded', + 'avatar:upload:fail' => 'Avatar upload failed', + 'avatar:resize:fail' => 'Resize of the avatar failed', + 'avatar:crop:success' => 'Cropping the avatar succeeded', + 'avatar:crop:fail' => 'Avatar cropping failed', + /** * Feeds */ diff --git a/mod/groups/start.php b/mod/groups/start.php index aaaaa3f45..c2b3dc35b 100644 --- a/mod/groups/start.php +++ b/mod/groups/start.php @@ -39,7 +39,7 @@ elgg_register_action("groups/invite", $CONFIG->pluginspath . "groups/actions/invite.php"); // Add a page owner handler - elgg_register_plugin_hook_handler('page_owner', 'system', 'groups_page_owner_handler'); + //elgg_register_plugin_hook_handler('page_owner', 'system', 'groups_page_owner_handler'); // Add some widgets elgg_register_widget_type('a_users_groups',elgg_echo('groups:widget:membership'), elgg_echo('groups:widgets:description')); diff --git a/mod/profile/actions/cropicon.php b/mod/profile/actions/cropicon.php deleted file mode 100644 index c65b5f56d..000000000 --- a/mod/profile/actions/cropicon.php +++ /dev/null @@ -1,73 +0,0 @@ -<?php -/** - * Elgg profile plugin upload new user icon action - * - * @package ElggProfile - */ - -$profile_username = get_input('username'); -$profile_owner = get_user_by_username($profile_username); - -if (!$profile_owner || !($profile_owner instanceof ElggUser) || !$profile_owner->canEdit()) { - register_error(elgg_echo('profile:icon:fail')); - forward(REFERER); -} - -$x1 = (int) get_input('x_1',0); -$y1 = (int) get_input('y_1',0); -$x2 = (int) get_input('x_2',0); -$y2 = (int) get_input('y_2',0); - -$filehandler = new ElggFile(); -$filehandler->owner_guid = $profile_owner->getGUID(); -$filehandler->setFilename("profile/" . $profile_owner->guid . "master" . ".jpg"); -$filename = $filehandler->getFilenameOnFilestore(); - -$topbar = get_resized_image_from_existing_file($filename, 16, 16, true, $x1, $y1, $x2, $y2, TRUE); -$tiny = get_resized_image_from_existing_file($filename, 25, 25, true, $x1, $y1, $x2, $y2, TRUE); -$small = get_resized_image_from_existing_file($filename, 40, 40, true, $x1, $y1, $x2, $y2, TRUE); -$medium = get_resized_image_from_existing_file($filename, 100, 100, true, $x1, $y1, $x2, $y2, TRUE); -$large = get_resized_image_from_existing_file($filename, 550, 550, true, $x1, $y1, $x2, $y2); - -if ($tiny !== FALSE && $small !== FALSE && $medium !== FALSE && $large !== FALSE) { - $filehandler = new ElggFile(); - $filehandler->owner_guid = $profile_owner->getGUID(); - $filehandler->setFilename("profile/" . $profile_owner->guid . "large.jpg"); - $filehandler->open("write"); - $filehandler->write($large); - $filehandler->close(); - $filehandler->setFilename("profile/" . $profile_owner->guid . "medium.jpg"); - $filehandler->open("write"); - $filehandler->write($medium); - $filehandler->close(); - $filehandler->setFilename("profile/" . $profile_owner->guid . "small.jpg"); - $filehandler->open("write"); - $filehandler->write($small); - $filehandler->close(); - $filehandler->setFilename("profile/" . $profile_owner->guid . "tiny.jpg"); - $filehandler->open("write"); - $filehandler->write($tiny); - $filehandler->close(); - $filehandler->setFilename("profile/" . $profile_owner->guid . "topbar.jpg"); - $filehandler->open("write"); - $filehandler->write($topbar); - $filehandler->close(); - - $profile_owner->x1 = $x1; - $profile_owner->x2 = $x2; - $profile_owner->y1 = $y1; - $profile_owner->y2 = $y2; - - $profile_owner->icontime = time(); - - system_message(elgg_echo("profile:icon:uploaded")); -} else { - register_error(elgg_echo("profile:icon:notfound")); -} - -//forward the user back to the upload page to crop -$url = elgg_get_site_url()."pg/profile/{$profile_owner->username}/edit/icon"; - -if (isloggedin()) { - forward($url); -} diff --git a/mod/profile/actions/iconupload.php b/mod/profile/actions/iconupload.php deleted file mode 100644 index 546aa0e9c..000000000 --- a/mod/profile/actions/iconupload.php +++ /dev/null @@ -1,62 +0,0 @@ -<?php -/** - * Elgg profile plugin upload new user icon action - * - * @package ElggProfile - */ - -$profile_username = get_input('username'); -$profile_owner = get_user_by_username($profile_username); - -if (!$profile_owner || !($profile_owner instanceof ElggUser) || !$profile_owner->canEdit()) { - register_error(elgg_echo('profile:icon:fail')); - forward(REFERER); -} - -$profile_owner_guid = $profile_owner->getGUID(); - -//@todo make this configurable? -$icon_sizes = array( - 'topbar' => array('w'=>16, 'h'=>16, 'square'=>TRUE, 'upscale'=>TRUE), - 'tiny' => array('w'=>25, 'h'=>25, 'square'=>TRUE, 'upscale'=>TRUE), - 'small' => array('w'=>40, 'h'=>40, 'square'=>TRUE, 'upscale'=>TRUE), - 'medium' => array('w'=>100, 'h'=>100, 'square'=>TRUE, 'upscale'=>TRUE), - 'large' => array('w'=>200, 'h'=>200, 'square'=>FALSE, 'upscale'=>FALSE), - 'master' => array('w'=>550, 'h'=>550, 'square'=>FALSE, 'upscale'=>FALSE) -); - -// 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('profileicon', $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 = $profile_owner_guid; - $file->setFilename("profile/{$profile_owner_guid}{$name}.jpg"); - $file->open('write'); - $file->write($resized); - $file->close(); - $files[] = $file; - } else { - // cleanup on fail - foreach ($files as $file) { - $file->delete(); - } - - system_message(elgg_echo('profile:icon:notfound')); - forward(REFERER); - } -} - -$profile_owner->icontime = time(); -if (elgg_trigger_event('profileiconupdate', $profile_owner->type, $profile_owner)) { - // pull this out into the river plugin. - //add_to_river('river/user/default/profileiconupdate','update',$user->guid,$user->guid); - system_message(elgg_echo("profile:icon:uploaded")); -} - -//forward the user back to the upload page to crop -forward(REFERER); diff --git a/mod/profile/views/default/profile/editicon.php b/mod/profile/views/default/profile/editicon.php index 9eeaecb4a..878ec504b 100644 --- a/mod/profile/views/default/profile/editicon.php +++ b/mod/profile/views/default/profile/editicon.php @@ -12,8 +12,6 @@ $currentuser = get_loggedin_user(); ?> <div id="edit_profile_avatar"> -<!-- grab the required js for icon cropping --> -<script type="text/javascript" src="<?php echo elgg_get_site_url(); ?>mod/profile/views/default/js/jquery.imgareaselect-0.8.min.js"></script> <p class="margin-top"><?php echo elgg_echo('profile:profilepictureinstructions'); ?></p> @@ -30,112 +28,16 @@ $currentuser = get_loggedin_user(); </div> <div id="avatar_upload"> - <form action="<?php echo elgg_get_site_url(); ?>action/profile/iconupload" method="post" enctype="multipart/form-data"> - <?php echo elgg_view('input/securitytoken'); ?> - <input type="hidden" name="username" value="<?php echo $currentuser->username; ?>" /> - <p><label><?php echo elgg_echo("profile:editicon"); ?></label><br /> - - <?php - - echo elgg_view("input/file",array('internalname' => 'profileicon')); - ?> - <br /><input type="submit" class="submit-button" value="<?php echo elgg_echo("upload"); ?>" /> - </p> - </form> +<?php + echo elgg_view_form('avatar/upload', array('enctype' => 'multipart/form-data'), array('entity' => $currentuser)); +?> </div> <div id="avatar_croppingtool"> <label><?php echo elgg_echo('profile:profilepicturecroppingtool'); ?></label><br /> -<p> -<?php - echo elgg_echo("profile:createicon:instructions"); - - //display the current user photo - - $user_master_image = $currentuser->getIcon('master'); - +<?php echo elgg_view_form('avatar/crop', array(), array('entity' => get_loggedin_user())); ?> -</p> -<script type="text/javascript"> - - //function to display a preview of the users cropped section - function preview(img, selection) { - // catch for the first click on the image - if (selection.width == 0 || selection.height == 0) { - return; - } - - var origWidth = $("#user_avatar").width(); //get the width of the users master photo - var origHeight = $("#user_avatar").height(); //get the height of the users master photo - var scaleX = 100 / selection.width; - var scaleY = 100 / selection.height; - $('#user_avatar_preview > img').css({ - width: Math.round(scaleX * origWidth) + 'px', - height: Math.round(scaleY * origHeight) + 'px', - marginLeft: '-' + Math.round(scaleX * selection.x1) + 'px', - marginTop: '-' + Math.round(scaleY * selection.y1) + 'px' - }); - } - - //variables for the newly cropped avatar - //var $x1, $y1, $x2, $y2, $w, $h; - - function selectChange(img, selection){ - - //populate the form with the correct coordinates once a user has cropped their image - $('#x_1').val(selection.x1); - $('#x_2').val(selection.x2); - $('#y_1').val(selection.y1); - $('#y_2').val(selection.y2); - - } - - $(document).ready(function () { - - //get the coordinates from the form - /* - var x_1 = $('#x_1').val(); - var x_2 = $('#x_2').val(); - var y_1 = $('#y_1').val(); - var y_2 = $('#y_2').val(); - var w = x_2 - x_1; - var h = y_2 - y_1; - selection = { x1: x_1, y1: y_1, x2: x_2, y2: y_2, width: w, height: h }; - */ - - $('<div id="user_avatar_preview"><img src="<?php echo $user_master_image; ?>" /></div>') - .insertAfter($('#user_avatar')); - - $('<div id="user_avatar_preview_title"><label><?php echo elgg_echo('profile:preview'); ?></label></div>').insertBefore($('#user_avatar_preview')); - }); - - $(window).load(function () { - - //this produces the coordinates - $('#user_avatar').imgAreaSelect({ selectionOpacity: 0, onSelectEnd: selectChange }); - //show the preview - $('#user_avatar').imgAreaSelect({ aspectRatio: '1:1', onSelectChange: preview }); - - }); - -</script> - -<p> -<img id="user_avatar" src="<?php echo $user_master_image; ?>" alt="<?php echo elgg_echo("profile:icon"); ?>" /> -</p> - -<div class="clearfloat"></div> - -<form action="<?php echo elgg_get_site_url(); ?>action/profile/cropicon" method="post" /> - <?php echo elgg_view('input/securitytoken'); ?> - <input type="hidden" name="username" value="<?php echo get_loggedin_user()->username; ?>" /> - <input type="hidden" name="x_1" value="<?php echo get_loggedin_user()->x1; ?>" id="x_1" /> - <input type="hidden" name="x_2" value="<?php echo get_loggedin_user()->x2; ?>" id="x_2" /> - <input type="hidden" name="y_1" value="<?php echo get_loggedin_user()->y1; ?>" id="y_1" /> - <input type="hidden" name="y_2" value="<?php echo get_loggedin_user()->y2; ?>" id="y_2" /> - <input type="submit" name="submit" value="<?php echo elgg_echo("profile:createicon"); ?>" /> -</form> </div> </div> diff --git a/views/default/forms/avatar/crop.php b/views/default/forms/avatar/crop.php new file mode 100644 index 000000000..1082ab803 --- /dev/null +++ b/views/default/forms/avatar/crop.php @@ -0,0 +1,71 @@ +<?php +/** + * Avatar crop form + * + * @uses $vars['entity'] + */ + +$master_image = $vars['entity']->getIcon('master'); + +?> +<p> + <?php echo elgg_echo("avatar:create:instructions"); ?> +</p> +<p> + <img id="user_avatar" src="<?php echo $master_image; ?>" alt="<?php echo elgg_echo('avatar'); ?>" /> +</p> + +<div class="clearfloat"></div> +<?php +$coords = array('x1', 'x2', 'y1', 'y2'); +foreach ($coords as $coord) { + echo elgg_view('input/hidden', array('internalname' => $coord, 'value' => $vars['entity']->$coord)); +} + +echo elgg_view('input/hidden', array('internalname' => 'guid', 'value' => $vars['entity']->guid)); + +echo elgg_view('input/submit', array('value' => elgg_echo('avatar:create'))); + +?> +<!-- grab the required js for icon cropping --> +<script type="text/javascript" src="<?php echo elgg_get_site_url(); ?>mod/profile/views/default/js/jquery.imgareaselect-0.8.min.js"></script> + +<script type="text/javascript"> + + // display a preview of the users cropped section + function preview(img, selection) { + // catch for the first click on the image + if (selection.width == 0 || selection.height == 0) { + return; + } + + var origWidth = $("#user_avatar").width(); //get the width of the users master photo + var origHeight = $("#user_avatar").height(); //get the height of the users master photo + var scaleX = 100 / selection.width; + var scaleY = 100 / selection.height; + $('#user_avatar_preview > img').css({ + width: Math.round(scaleX * origWidth) + 'px', + height: Math.round(scaleY * origHeight) + 'px', + marginLeft: '-' + Math.round(scaleX * selection.x1) + 'px', + marginTop: '-' + Math.round(scaleY * selection.y1) + 'px' + }); + } + + function selectChange(img, selection) { + // populate the form with the correct coordinates once a user has cropped their image + $('input[name=x1]').val(selection.x1); + $('input[name=x2]').val(selection.x2); + $('input[name=y1]').val(selection.y1); + $('input[name=y2]').val(selection.y2); + } + + $(document).ready(function() { + $('<div id="user_avatar_preview"><img src="<?php echo $master_image; ?>" /></div>').insertAfter($('#user_avatar')); + $('<div id="user_avatar_preview_title"><label><?php echo elgg_echo('avatar:preview'); ?></label></div>').insertBefore($('#user_avatar_preview')); + + // this produces the coordinates + $('#user_avatar').imgAreaSelect({ selectionOpacity: 0, onSelectEnd: selectChange }); + // show the preview + $('#user_avatar').imgAreaSelect({ aspectRatio: '1:1', onSelectChange: preview }); + }); +</script> diff --git a/views/default/forms/avatar/upload.php b/views/default/forms/avatar/upload.php new file mode 100644 index 000000000..733e2996c --- /dev/null +++ b/views/default/forms/avatar/upload.php @@ -0,0 +1,15 @@ +<?php +/** + * Avatar upload form + * + * @uses $vars['entity'] + */ + +echo elgg_view('input/hidden', array('internalname' => 'guid', 'value' => $vars['entity']->guid)); +?> +<p> + <label><?php echo elgg_echo("profile:editicon"); ?></label><br /> + <?php echo elgg_view("input/file",array('internalname' => 'avatar')); ?> +<br /> + <?php echo elgg_view('input/submit', array('value' => elgg_echo('upload'))); ?> +</p> |