X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=classes%2FAvatar.php;h=1722b85b6b926be5a1041b9f2ef981f2ac34e53c;hb=5c768d7ef71ce08e505056c6f3fbdd092cd3649d;hp=3eada14c97f15014bbf11771a9ac4c84a187af87;hpb=e1b5798ba42a858d4438b80d851890d422722707;p=quix0rs-gnu-social.git diff --git a/classes/Avatar.php b/classes/Avatar.php index 3eada14c97..1722b85b6b 100644 --- a/classes/Avatar.php +++ b/classes/Avatar.php @@ -15,8 +15,8 @@ class Avatar extends Managed_DataObject public $width; // int(4) primary_key not_null public $height; // int(4) primary_key not_null public $mediatype; // varchar(32) not_null - public $filename; // varchar(255) - public $url; // varchar(255) unique_key + public $filename; // varchar(191) not 255 because utf8mb4 takes more space + public $url; // varchar(191) unique_key not 255 because utf8mb4 takes more space public $created; // datetime() not_null public $modified; // timestamp() not_null default_CURRENT_TIMESTAMP @@ -32,14 +32,14 @@ class Avatar extends Managed_DataObject 'width' => array('type' => 'int', 'not null' => true, 'description' => 'image width'), 'height' => array('type' => 'int', 'not null' => true, 'description' => 'image height'), 'mediatype' => array('type' => 'varchar', 'length' => 32, 'not null' => true, 'description' => 'file type'), - 'filename' => array('type' => 'varchar', 'length' => 255, 'description' => 'local filename, if local'), - 'url' => array('type' => 'varchar', 'length' => 255, 'description' => 'avatar location'), + 'filename' => array('type' => 'varchar', 'length' => 191, 'description' => 'local filename, if local'), + 'url' => array('type' => 'text', 'description' => 'avatar location, not indexed - do not use in WHERE statement'), 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), ), 'primary key' => array('profile_id', 'width', 'height'), 'unique keys' => array( - 'avatar_url_key' => array('url'), +// 'avatar_filename_key' => array('filename'), ), 'foreign keys' => array( 'avatar_profile_id_fkey' => array('profile', array('profile_id' => 'id')), @@ -51,12 +51,14 @@ class Avatar extends Managed_DataObject } // We clean up the file, too - function delete() + function delete($useWhere=false) { $filename = $this->filename; - if (parent::delete() && file_exists(Avatar::path($filename))) { + if (file_exists(Avatar::path($filename))) { @unlink(Avatar::path($filename)); } + + return parent::delete($useWhere); } /* @@ -74,26 +76,69 @@ class Avatar extends Managed_DataObject } $avatar->delete(); } - } catch (NoResultException $e) { + } catch (NoAvatarException $e) { // There are no avatars to delete, a sort of success. } return true; } + 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) + { + $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 NoResultException($avatar); + 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 FileNotFoundException(Avatar::path($avatar->filename)); + throw new NoAvatarException($target, $avatar); } return $avatar; } @@ -102,7 +147,7 @@ class Avatar extends Managed_DataObject $avatar = new Avatar(); $avatar->profile_id = $target->id; if (!$avatar->find()) { - throw new NoResultException($avatar); + throw new NoAvatarException($target, $avatar); } return $avatar->fetchAll(); } @@ -174,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', @@ -182,22 +235,27 @@ class Avatar extends Managed_DataObject return Theme::path('default-avatar-'.$sizenames[$size].'.png'); } - static function newSize(Profile $target, $size) { - $size = floor($size); - if ($size < 1 || $size > common_config('avatar', 'maxsize')) { + 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')); } + // So far we only have square avatars and I don't have time to + // rewrite support for non-square ones right now ;) + $height = $width; $original = Avatar::getUploaded($target); - $imagefile = new ImageFile($target->id, Avatar::path($original->filename)); - $filename = $imagefile->resize($size); + $imagefile = new ImageFile(null, Avatar::path($original->filename)); + $filename = Avatar::filename($target->getID(), image_type_to_extension($imagefile->preferredType()), + $width, common_timestamp()); + $imagefile->resizeTo(Avatar::path($filename), array('width'=>$width, 'height'=>$height)); $scaled = clone($original); $scaled->original = false; - $scaled->width = $size; - $scaled->height = $size; + $scaled->width = $width; + $scaled->height = $height; $scaled->url = Avatar::url($filename); $scaled->filename = $filename; $scaled->created = common_sql_now();