X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=classes%2FAvatar.php;h=55abc81b33b3850891b6c3ca6ca80ceddd3efdfd;hb=99b1a6f57622099f322b0977c3632924c4df7507;hp=d871d360b680a2211bcd27397a08b0161192bcb4;hpb=12588b1cf73fad7d0a76a29a46ec355150eaa54e;p=quix0rs-gnu-social.git diff --git a/classes/Avatar.php b/classes/Avatar.php index d871d360b6..55abc81b33 100644 --- a/classes/Avatar.php +++ b/classes/Avatar.php @@ -20,17 +20,8 @@ class Avatar extends Managed_DataObject public $created; // datetime() not_null public $modified; // timestamp() not_null default_CURRENT_TIMESTAMP - /* Static get */ - function staticGet($k,$v=null) - { return Memcached_DataObject::staticGet('Avatar',$k,$v); } - /* the code above is auto generated do not remove the tag below */ ###END_AUTOCODE - - static function pivotGet($keyCol, $keyVals, $otherCols) - { - return Memcached_DataObject::pivotGet('Avatar', $keyCol, $keyVals, $otherCols); - } public static function schemaDef() { @@ -58,19 +49,107 @@ class Avatar extends Managed_DataObject ), ); } - // We clean up the file, too - function delete() + // We clean up the file, too + function delete($useWhere=false) { $filename = $this->filename; - if (parent::delete()) { + if (file_exists(Avatar::path($filename))) { @unlink(Avatar::path($filename)); } + + return parent::delete($useWhere); + } + + /* + * Deletes all avatars (but may spare the original) from a profile. + * + * @param Profile $target The profile we're deleting avatars of. + * @param boolean $original Whether original should be removed or not. + */ + public static function deleteFromProfile(Profile $target, $original=true) { + try { + $avatars = self::getProfileAvatars($target); + foreach ($avatars as $avatar) { + if ($avatar->original && !$original) { + continue; + } + $avatar->delete(); + } + } catch (NoAvatarException $e) { + // There are no avatars to delete, a sort of success. + } + + return true; } - function pkeyGet($kv) + static protected $_avatars = array(); + + /* + * Get an avatar by profile. Currently can't call newSize with $height + */ + public static function byProfile(Profile $target, $width=null, $height=null) { - return Memcached_DataObject::pkeyGet('Avatar', $kv); + $width = intval($width); + $height = !is_null($height) ? intval($height) : null; + if (is_null($height)) { + $height = $width; + } + + $size = "{$width}x{$height}"; + if (!isset(self::$_avatars[$target->id])) { + self::$_avatars[$target->id] = array(); + } elseif (isset(self::$_avatars[$target->id][$size])){ + return self::$_avatars[$target->id][$size]; + } + + $avatar = null; + if (Event::handle('StartProfileGetAvatar', array($target, $width, &$avatar))) { + $avatar = self::pkeyGet( + array( + 'profile_id' => $target->id, + 'width' => $width, + 'height' => $height, + ) + ); + Event::handle('EndProfileGetAvatar', array($target, $width, &$avatar)); + } + + if (is_null($avatar)) { + // Obviously we can't find an avatar, so let's resize the original! + $avatar = Avatar::newSize($target, $width); + } elseif (!($avatar instanceof Avatar)) { + throw new NoAvatarException($target, $avatar); + } + + self::$_avatars[$target->id]["{$avatar->width}x{$avatar->height}"] = $avatar; + return $avatar; + } + + public static function getUploaded(Profile $target) + { + $avatar = new Avatar(); + $avatar->profile_id = $target->id; + $avatar->original = true; + if (!$avatar->find(true)) { + throw new NoAvatarException($target, $avatar); + } + if (!file_exists(Avatar::path($avatar->filename))) { + // The delete call may be odd for, say, unmounted filesystems + // that cause a file to currently not exist, but actually it does... + $avatar->delete(); + throw new NoAvatarException($target, $avatar); + } + return $avatar; + } + + public static function getProfileAvatars(Profile $target) { + $avatar = new Avatar(); + $avatar->profile_id = $target->id; + if (!$avatar->find()) { + throw new NoAvatarException($target, $avatar); + } + return $avatar->fetchAll(); } /** @@ -140,6 +219,14 @@ class Avatar extends Managed_DataObject } } + static function urlByProfile(Profile $target, $width=null, $height=null) { + try { + return self::byProfile($target, $width, $height)->displayUrl(); + } catch (Exception $e) { + return self::defaultImage($width); + } + } + static function defaultImage($size) { static $sizenames = array(AVATAR_PROFILE_SIZE => 'profile', @@ -147,4 +234,33 @@ class Avatar extends Managed_DataObject AVATAR_MINI_SIZE => 'mini'); return Theme::path('default-avatar-'.$sizenames[$size].'.png'); } + + static function newSize(Profile $target, $width) { + $width = intval($width); + if ($width < 1 || $width > common_config('avatar', 'maxsize')) { + // TRANS: An error message when avatar size is unreasonable + throw new Exception(_m('Avatar size too large')); + } + + $original = Avatar::getUploaded($target); + + $imagefile = new ImageFile($target->id, Avatar::path($original->filename)); + $filename = $imagefile->resize($width); + + $scaled = clone($original); + $scaled->original = false; + $scaled->width = $width; + $scaled->height = $width; + $scaled->url = Avatar::url($filename); + $scaled->filename = $filename; + $scaled->created = common_sql_now(); + + if (!$scaled->insert()) { + // TRANS: An error message when unable to insert avatar data into the db + throw new Exception(_m('Could not insert new avatar data to database')); + } + + // Return the new avatar object + return $scaled; + } }