]> git.mxchange.org Git - quix0rs-gnu-social.git/blob - classes/Avatar.php
Properly unlink all old avatars when deleting/uploading a new
[quix0rs-gnu-social.git] / classes / Avatar.php
1 <?php
2 /**
3  * Table Definition for avatar
4  */
5 require_once INSTALLDIR.'/classes/Memcached_DataObject.php';
6
7 class Avatar extends Managed_DataObject
8 {
9     ###START_AUTOCODE
10     /* the code below is auto generated do not remove the above tag */
11
12     public $__table = 'avatar';                          // table name
13     public $profile_id;                      // int(4)  primary_key not_null
14     public $original;                        // tinyint(1)
15     public $width;                           // int(4)  primary_key not_null
16     public $height;                          // int(4)  primary_key not_null
17     public $mediatype;                       // varchar(32)   not_null
18     public $filename;                        // varchar(255)
19     public $url;                             // varchar(255)  unique_key
20     public $created;                         // datetime()   not_null
21     public $modified;                        // timestamp()   not_null default_CURRENT_TIMESTAMP
22
23     /* the code above is auto generated do not remove the tag below */
24     ###END_AUTOCODE
25         
26     public static function schemaDef()
27     {
28         return array(
29             'fields' => array(
30                 'profile_id' => array('type' => 'int', 'not null' => true, 'description' => 'foreign key to profile table'),
31                 'original' => array('type' => 'int', 'size' => 'tiny', 'default' => 0, 'description' => 'uploaded by user or generated?'),
32                 'width' => array('type' => 'int', 'not null' => true, 'description' => 'image width'),
33                 'height' => array('type' => 'int', 'not null' => true, 'description' => 'image height'),
34                 'mediatype' => array('type' => 'varchar', 'length' => 32, 'not null' => true, 'description' => 'file type'),
35                 'filename' => array('type' => 'varchar', 'length' => 255, 'description' => 'local filename, if local'),
36                 'url' => array('type' => 'varchar', 'length' => 255, 'description' => 'avatar location'),
37                 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'),
38                 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'),
39             ),
40             'primary key' => array('profile_id', 'width', 'height'),
41             'unique keys' => array(
42                 'avatar_url_key' => array('url'),
43             ),
44             'foreign keys' => array(
45                 'avatar_profile_id_fkey' => array('profile', array('profile_id' => 'id')),
46             ),
47             'indexes' => array(
48                 'avatar_profile_id_idx' => array('profile_id'),
49             ),
50         );
51     }
52
53     // We clean up the file, too
54     function delete()
55     {
56         $filename = $this->filename;
57         if (parent::delete()) {
58             @unlink(Avatar::path($filename));
59         }
60     }
61
62     /*
63      * Deletes all avatars (but may spare the original) from a profile.
64      * 
65      * @param   Profile $target     The profile we're deleting avatars of.
66      * @param   boolean $original   Whether original should be removed or not.
67      */
68     public static function deleteFromProfile(Profile $target, $original=true) {
69         try {
70             $avatars = self::getProfileAvatars($target);
71             foreach ($avatars as $avatar) {
72                 if ($avatar->original && !$original) {
73                     continue;
74                 }
75                 $avatar->delete();
76             }
77         } catch (NoResultException $e) {
78             // There are no avatars to delete, a sort of success.
79         }
80
81         return true;
82     }
83
84     public static function getOriginal(Profile $target)
85     {
86         $avatar = new Avatar();
87         $avatar->profile_id = $target->id;
88         $avatar->original = true;
89         if (!$avatar->find(true)) {
90             throw new NoResultException($avatar);
91         }
92         return $avatar;
93     }
94
95     public static function hasOriginal($profile) {
96         try {
97             $avatar = Avatar::getOriginal($profile);
98         } catch (NoResultException $e) {
99             return false;
100         }
101         return !file_exists(Avatar::path($avatar->filename));
102     }
103
104     public static function getProfileAvatars(Profile $target) {
105         $avatar = new Avatar();
106         $avatar->profile_id = $target->id;
107         if (!$avatar->find()) {
108             throw new NoResultException($avatar);
109         }
110         return $avatar->fetchAll();
111     }
112
113     /**
114      * Where should the avatar go for this user?
115      */
116     static function filename($id, $extension, $size=null, $extra=null)
117     {
118         if ($size) {
119             return $id . '-' . $size . (($extra) ? ('-' . $extra) : '') . $extension;
120         } else {
121             return $id . '-original' . (($extra) ? ('-' . $extra) : '') . $extension;
122         }
123     }
124
125     static function path($filename)
126     {
127         $dir = common_config('avatar', 'dir');
128
129         if ($dir[strlen($dir)-1] != '/') {
130             $dir .= '/';
131         }
132
133         return $dir . $filename;
134     }
135
136     static function url($filename)
137     {
138         $path = common_config('avatar', 'path');
139
140         if ($path[strlen($path)-1] != '/') {
141             $path .= '/';
142         }
143
144         if ($path[0] != '/') {
145             $path = '/'.$path;
146         }
147
148         $server = common_config('avatar', 'server');
149
150         if (empty($server)) {
151             $server = common_config('site', 'server');
152         }
153
154         $ssl = common_config('avatar', 'ssl');
155
156         if (is_null($ssl)) { // null -> guess
157             if (common_config('site', 'ssl') == 'always' &&
158                 !common_config('avatar', 'server')) {
159                 $ssl = true;
160             } else {
161                 $ssl = false;
162             }
163         }
164
165         $protocol = ($ssl) ? 'https' : 'http';
166
167         return $protocol.'://'.$server.$path.$filename;
168     }
169
170     function displayUrl()
171     {
172         $server = common_config('avatar', 'server');
173         if ($server && !empty($this->filename)) {
174             return Avatar::url($this->filename);
175         } else {
176             return $this->url;
177         }
178     }
179
180     static function defaultImage($size)
181     {
182         static $sizenames = array(AVATAR_PROFILE_SIZE => 'profile',
183                                   AVATAR_STREAM_SIZE => 'stream',
184                                   AVATAR_MINI_SIZE => 'mini');
185         return Theme::path('default-avatar-'.$sizenames[$size].'.png');
186     }
187
188     static function newSize(Profile $target, $size) {
189         $size = floor($size);
190         if ($size < 1 || $size > common_config('avatar', 'maxsize')) {
191             // TRANS: An error message when avatar size is unreasonable
192             throw new Exception(_m('Avatar size too large'));
193         }
194
195         $original = Avatar::getOriginal($target);
196
197         $imagefile = new ImageFile($target->id, Avatar::path($original->filename));
198         $filename = $imagefile->resize($size);
199
200         $scaled = clone($original);
201         $scaled->original = false;
202         $scaled->width = $size;
203         $scaled->height = $size;
204         $scaled->url = Avatar::url($filename);
205         $scaled->filename = $filename;
206         $scaled->created = common_sql_now();
207
208         if (!$scaled->insert()) {
209             // TRANS: An error message when unable to insert avatar data into the db
210             throw new Exception(_m('Could not insert new avatar data to database'));
211         }
212
213         // Return the new avatar object
214         return $scaled;
215     }
216 }