Обрезка аватаров 1.10

Возможности: заливка аватаров в отдельный альбом, выбор области для аватара профиля после заливки её в альбом, а затем выбор квадратной аватарки для других мест из основного (при чём это можно производить снова и снова, не загружая аватар ещё раз), редактирование аватаров, а также выбор из коллекции админом.
1. Скачиваем архивчег.
2. Заливаем содержимое папки "upload" из архива на сервер.
3. Выполним запросы к мускулу:
Код SQL:
  1. ALTER TABLE `cms_user_albums` ADD `it_avs` TINYINT NOT NULL DEFAULT '0' AFTER `user_id`;
  2. ALTER TABLE `cms_user_photos` ADD `it_ava` TINYINT NOT NULL DEFAULT '0' AFTER `album_id`
4. Для задания размеров аватаров в галерее, а также размеров изображений для пользовательских галерей (странно почему этого не было сразу предусмотрено), производим в файле "/admin/components/users/backend.php" следующее:
После:
Код PHP:
  1. 65 $cfg['medw'] = cmsCore::request('medw', 'int', 200);
  2. 66 $cfg['medh'] = cmsCore::request('medh', 'int', 200);
Вставляем:
Код PHP:
  1. $cfg['sw_photo_w'] = cmsCore::request('sw_photo_w', 'int', 600);
  2. $cfg['sw_photo_h'] = cmsCore::request('sw_photo_h', 'int', 800);
После:
Код PHP:
  1. 295 <tr>
  2. <td>
  3. <strong>Наносить водяной знак:</strong> <br />
  4. <span class="hinttext">Если включено, то на все загружаемые фотографии будет наносится изображение из файла &quot;<a href="/images/watermark.png" target="_blank">/images/watermark.png</a>&quot;</span>
  5. </td>
  6. <td valign="top">
  7. <label><input name="watermark" type="radio" value="1" <?php if ($model->config['watermark']) { echo 'checked="checked"'; } ?>/> Вкл</label>
  8. <label><input name="watermark" type="radio" value="0" <?php if (!$model->config['watermark']) { echo 'checked="checked"'; } ?>/> Выкл</label>
  9. </td>
  10. 304 </tr>
Вставляем:
Код PHP:
  1. <tr>
  2. <td><strong>Ширина: </strong></td>
  3. <td><input name="sw_photo_w" type="text" id="sw_photo_w" size="5" value="<?php echo $model->config['sw_photo_w'];?>"/> пикс.</td>
  4. </tr>
  5. <tr>
  6. <td><strong>Высота: </strong></td>
  7. <td><input name="sw_photo_h" type="text" id="sw_photo_h" size="5" value="<?php echo $model->config['sw_photo_h'];?>"/> пикс.</td>
  8. </tr>
В файле /components/users/photos.php заменить:
Код PHP:
  1. 98 @img_resize($uploadphoto, $uploadthumb['medium'], 600, 600, false, false);
На:
Код PHP:
  1. @img_resize($uploadphoto, $uploadthumb['medium'], $model->config['sw_photo_w'], $model->config['sw_photo_h'], false, false);
Выше находится строка, отвечающая за превьюшки, можете поменять там значения 96 на требуемые вам.

5. Заменить:
Код PHP:
  1. //============================================================================//
  2. //============================= Загрузка аватара ============================//
  3. //============================================================================//
  4. От сих
  5.  
  6. До сих:
  7. //============================================================================//
  8. //======================== Работа с фотографиями ============================//
  9. //============================================================================//
Этим:
Код PHP:
  1. if($do == 'avatar'){
  2.  
  3. if((!$inUser->id || ($inUser->id && $inUser->id != $id)) && !$inUser->is_admin){
  4. cmsCore::error404();
  5. }
  6.  
  7. $user = $inUser->loadUser($id);
  8.  
  9. $inPage->setTitle($_LANG['LOAD_AVATAR']);
  10. $inPage->addPathway($user['nickname'], cmsUser::getProfileURL($user['login']));
  11. $inPage->addPathway($_LANG['LOAD_AVATAR']);
  12.  
  13. $step = cmsCore::request('step', 'int', 0);
  14.  
  15. if(!$step){
  16. if(cmsCore::inRequest('upload')){
  17.  
  18. cmsCore::includeGraphics();
  19.  
  20. $uploaddir = PATH . '/images/users/avatars/';
  21. $realfile = $inDB->escape_string($_FILES['picture']['name']);
  22.  
  23. $path_parts = pathinfo($realfile);
  24.  
  25. $realfile = mb_substr($realfile, 0, mb_strrpos($realfile, '.'));
  26.  
  27. $ext = mb_strtolower($path_parts['extension']);
  28. if($ext != 'jpg' && $ext != 'jpeg' && $ext != 'gif' && $ext != 'png' && $ext != 'bmp'){
  29. exit(0);
  30. }
  31.  
  32. $lid = $inDB->get_fields('cms_user_photos', 'id>0', 'id', 'id DESC');
  33. $lastid = $lid['id'] + 1;
  34. $filename = md5($lastid . $realfile) . '.' . $ext;
  35.  
  36. $uploadfile = $uploaddir . $realfile . '.' . $ext;
  37. $uploadphoto = PATH.'/images/users/photos/medium/'.$filename;
  38. $uploadthumb['small'] = $uploaddir . 'small/' . $filename;
  39. $uploadthumb['medium'] = $uploaddir . $filename;
  40.  
  41. $source = $_FILES['picture']['tmp_name'];
  42. $errorCode = $_FILES['picture']['error'];
  43.  
  44. if($inCore->moveUploadedFile($source, $uploadfile, $errorCode)){
  45.  
  46. @img_resize($uploadfile, $uploadthumb['small'], $model->config['smallw'], $model->config['smallw'], true);
  47. @img_resize($uploadfile, $uploadthumb['medium'], $model->config['medw'], $model->config['medh'], false, false);
  48. @img_resize($uploadfile, $uploadphoto, $model->config['sw_photo_w'], $model->config['sw_photo_h'], false, false);
  49.  
  50. @img_resize($uploadfile, PATH.'/images/users/photos/small/'.$filename, 96, 96, true);
  51.  
  52. @unlink($uploadfile);
  53.  
  54. $album = $inDB->get_fields('cms_user_albums', "user_id='{$id}' AND it_avs=1", 'id');
  55. if(!$album){
  56. $sql = "INSERT INTO cms_user_albums (user_id, title, pubdate, allow_who, description, it_avs)
  57. VALUES ({$id}, 'Изображения профиля', NOW(), 'registered', '', '1')";
  58. $inDB->query($sql);
  59. $album['id'] = $inDB->get_last_id('cms_user_albums');
  60. }
  61.  
  62. $sql = "INSERT INTO cms_user_photos (user_id, album_id, pubdate, title, description, allow_who, hits, imageurl, it_ava)
  63. VALUES('{$id}', '{$album['id']}', NOW(), '$realfile', '', 'registered', 0, '$filename', '1')";
  64.  
  65. $inDB->query($sql);
  66. }else{
  67.  
  68. cmsCore::addSessionMessage('<strong>' . $_LANG['ERROR'] . ':</strong> ' . cmsCore::uploadError() . '!', 'error');
  69. cmsCore::redirect('/users/' . $id . '/avatar.html');
  70. }
  71.  
  72. $sql = "UPDATE cms_user_profiles SET imageurl = '$filename' WHERE user_id = '$id' LIMIT 1";
  73. $inDB->query($sql);
  74. // очищаем предыдущую запись о смене аватара
  75. cmsActions::removeObjectLog('add_avatar', $id);
  76. // выводим сообщение в ленту
  77. cmsActions::log('add_avatar', array(
  78. 'object' => '',
  79. 'object_url' => '',
  80. 'object_id' => $id,
  81. 'user_id' => $id,
  82. 'target' => '',
  83. 'target_url' => '',
  84. 'description' => '<a href="' . cmsUser::getProfileURL($user['login']) . '" class="act_usr_ava">
  85. <img border="0" src="/images/users/avatars/small/' . $filename . '">
  86. </a>'
  87. ));
  88.  
  89. $size = getimagesize($uploadphoto);
  90. if($size[0] > $model->config['medw'] && $size[1] > $model->config['medw']){
  91. cmsCore::redirect('/users/' . $id . '/avatar.html?step=2');
  92. }
  93.  
  94. cmsCore::redirect(cmsUser::getProfileURL($user['login']));
  95. }else{
  96.  
  97. $smarty = $inCore->initSmarty('components', 'com_users_avatar_upload.tpl');
  98. $smarty->assign('id', $id);
  99. $smarty->assign('step', false);
  100. $smarty->display('com_users_avatar_upload.tpl');
  101. }
  102. }elseif($step == 2){
  103. if(cmsCore::inRequest('submit')){
  104. cmsCore::includeGraphics();
  105. $th_path = PATH . '/images/users/avatars/' . $user['orig_imageurl'];
  106. $img_path = PATH . '/images/users/photos/medium/' . $user['orig_imageurl'];
  107. $x1 = $inCore->request('x1', 'int', 0);
  108. $y1 = $inCore->request('y1', 'int', 0);
  109. $w = $inCore->request('w', 'int', $model->config['medw']);
  110. $h = $inCore->request('h', 'int', $model->config['medw']);
  111. $scale = $model->config['medw'] / $w;
  112. if(@resizeThumbnailImage($th_path, $img_path, $w, $h, $x1, $y1, $scale)){
  113. cmsCore::redirect('/users/' . $id . '/avatar.html?step=3');
  114. }else{
  115. cmsCore::addSessionMessage('<strong>' . $_LANG['ERROR'] . ':</strong> Возникла ошибка!', 'error');
  116. cmsCore::redirect('/users/' . $id . '/avatar.html?step=2');
  117. };
  118. }else{
  119. $size = getimagesize(PATH . '/images/users/photos/medium/' . $user['orig_imageurl']);
  120. if(!($size[0] > $model->config['medw'] && $size[1] > $model->config['medw'])){
  121. cmsCore::addSessionMessage('<strong>' . $_LANG['ERROR'] . ':</strong> Ваш аватар слишком мал для обрезки!', 'error');
  122. cmsCore::redirect('/users/' . $id . '/avatar.html');
  123. }
  124. $smarty = $inCore->initSmarty('components', 'com_users_avatar_upload.tpl');
  125. $smarty->assign('id', $id);
  126. $smarty->assign('step', 2);
  127. $smarty->assign('img', $user['orig_imageurl']);
  128. $smarty->assign('width', $model->config['medw']);
  129. $smarty->assign('height', $model->config['medh']);
  130. $smarty->display('com_users_avatar_upload.tpl');
  131. }
  132. }elseif($step == 3){
  133. if(cmsCore::inRequest('submit')){
  134. cmsCore::includeGraphics();
  135. $th_path = PATH . '/images/users/avatars/small/' . $user['orig_imageurl'];
  136. $img_path = PATH . '/images/users/avatars/' . $user['orig_imageurl'];
  137. $x1 = $inCore->request('x1', 'int', 0);
  138. $y1 = $inCore->request('y1', 'int', 0);
  139. $w = $inCore->request('w', 'int', $model->config['smallw']);
  140. $h = $inCore->request('h', 'int', $model->config['smallw']);
  141. $scale = $model->config['smallw'] / $w;
  142. if(@resizeThumbnailImage($th_path, $img_path, $w, $h, $x1, $y1, $scale)){
  143. // очищаем предыдущую запись о смене аватара
  144. cmsActions::removeObjectLog('add_avatar', $id);
  145. // выводим сообщение в ленту
  146. cmsActions::log('add_avatar', array(
  147. 'object' => '',
  148. 'object_url' => '',
  149. 'object_id' => $id,
  150. 'user_id' => $id,
  151. 'target' => '',
  152. 'target_url' => '',
  153. 'description' => '<a href="' . cmsUser::getProfileURL($user['login']) . '" class="act_usr_ava">
  154. <img border="0" src="/images/users/avatars/small/' . $user['orig_imageurl'] . '">
  155. </a>'
  156. ));
  157. cmsCore::redirect(cmsUser::getProfileURL($user['login']));
  158. }else{
  159. cmsCore::addSessionMessage('<strong>' . $_LANG['ERROR'] . ':</strong> Возникла ошибка!', 'error');
  160. cmsCore::redirect('/users/' . $id . '/avatar.html?step=3');
  161. };
  162. }else{
  163. $smarty = $inCore->initSmarty('components', 'com_users_avatar_upload.tpl');
  164. $smarty->assign('id', $id);
  165. $smarty->assign('step', 3);
  166. $smarty->assign('img', $user['orig_imageurl']);
  167. $smarty->assign('width', $model->config['smallw']);
  168. $smarty->assign('height', $model->config['smallw']);
  169. $smarty->display('com_users_avatar_upload.tpl');
  170. }
  171. }
  172. }
  173. //============================================================================//
  174. //============================= Библиотека аватаров =========================//
  175. //============================================================================//
  176. if($do == 'select_avatar'){
  177.  
  178. if((!$inUser->id || ($inUser->id && $inUser->id != $id)) && !$inUser->is_admin){
  179. cmsCore::error404();
  180. }
  181.  
  182. $user = $inUser->loadUser($id);
  183.  
  184. $avatars_dir = PATH . "/images/users/avatars/library";
  185. $avatars_dir_rel = "/images/users/avatars/library";
  186.  
  187. $avatars_dir_handle = opendir($avatars_dir);
  188. $avatars = array();
  189.  
  190. while($nextfile = readdir($avatars_dir_handle)){
  191. if(($nextfile != '.') && ($nextfile != '..') && ( mb_strstr($nextfile, '.gif') || mb_strstr($nextfile, '.jpg') || mb_strstr($nextfile, '.jpeg') || mb_strstr($nextfile, '.png') )){
  192. $avatars[] = $nextfile;
  193. }
  194. }
  195.  
  196. closedir($avatars_dir_handle);
  197.  
  198. if(!cmsCore::inRequest('set_avatar')){
  199.  
  200. $inPage->setTitle($_LANG['SELECT_AVATAR']);
  201. $inPage->addPathway($user['nickname'], cmsUser::getProfileURL($user['login']));
  202. $inPage->addPathway($_LANG['SELECT_AVATAR']);
  203.  
  204. $perpage = 20;
  205.  
  206. $total = sizeof($avatars);
  207. $avatars = array_slice($avatars, ($page - 1) * $perpage, $perpage);
  208.  
  209. $smarty = $inCore->initSmarty('components', 'com_users_avatars.tpl');
  210. $smarty->assign('userid', $id);
  211. $smarty->assign('avatars', $avatars);
  212. $smarty->assign('avatars_dir', $avatars_dir_rel);
  213. $smarty->assign('page', $page);
  214. $smarty->assign('perpage', $perpage);
  215. $smarty->assign('pagebar', cmsPage::getPagebar($total, $page, $perpage, '/users/%user_id%/select-avatar-%page%.html', array('user_id' => $id)));
  216. $smarty->display('com_users_avatars.tpl');
  217. }else{
  218.  
  219. $avatar_id = cmsCore::request('avatar_id', 'int', 0);
  220. $file = $avatars[$avatar_id];
  221.  
  222. if(file_exists($avatars_dir . '/' . $file)){
  223.  
  224. $uploaddir = PATH . '/images/users/avatars/';
  225. $realfile = $file;
  226. $filename = md5($realfile . '-' . $id . '-' . time()) . '.jpg';
  227. $uploadfile = $avatars_dir . '/' . $realfile;
  228. $uploadavatar = $uploaddir . $filename;
  229. $uploadthumb = $uploaddir . 'small/' . $filename;
  230.  
  231. if($user['orig_imageurl'] && $user['orig_imageurl'] != 'nopic.jpg'){
  232. @unlink(PATH . '/images/users/avatars/' . $user['orig_imageurl']);
  233. @unlink(PATH . '/images/users/avatars/small/' . $user['orig_imageurl']);
  234. }
  235.  
  236. cmsCore::includeGraphics();
  237. copy($uploadfile, $uploadavatar);
  238. @img_resize($uploadfile, $uploadthumb, $model->config['smallw'], $model->config['smallw']);
  239.  
  240. $sql = "UPDATE cms_user_profiles SET imageurl = '$filename' WHERE user_id = '$id' LIMIT 1";
  241. $inDB->query($sql);
  242.  
  243. // очищаем предыдущую запись о смене аватара
  244. cmsActions::removeObjectLog('add_avatar', $id);
  245. // выводим сообщение в ленту
  246. cmsActions::log('add_avatar', array(
  247. 'object' => '',
  248. 'object_url' => '',
  249. 'object_id' => $id,
  250. 'user_id' => $id,
  251. 'target' => '',
  252. 'target_url' => '',
  253. 'description' => '<a href="' . cmsUser::getProfileURL($user['login']) . '" class="act_usr_ava">
  254. <img border="0" src="/images/users/avatars/small/' . $filename . '">
  255. </a>'
  256. ));
  257. }
  258.  
  259. cmsCore::redirect(cmsUser::getProfileURL($user['login']));
  260. }
  261. }
6. Файл /components/users/model.php :
Меняем строку:
Код PHP:
  1. 720 $album = $this->inDB->get_fields('cms_user_albums', "id='{$id}'", 'id, user_id, title, allow_who, description');
На:
Код PHP:
  1. $album = $this->inDB->get_fields('cms_user_albums', "id='{$id}'", '*');
Меняем строку:
Код PHP:
  1. 766 $private_sql = "SELECT id, pubdate, imageurl as file, hits, title
На:
Код PHP:
  1. $private_sql = "SELECT id, pubdate, imageurl as file, hits, title, it_ava
После:
Код PHP:
  1. 827 $sql = "SELECT a.id as id,
  2. a.title as title,
  3. a.pubdate as pubdate,
  4. a.allow_who as allow_who,
  5. 'private' as type,
  6. p.imageurl as imageurl,
Вставляем:
Код PHP:
  1. a.it_avs as it_avs,
7. В com_users_profile.tpl вашего шаблона меняем:
Код PHP:
  1. 108 <tr>
  2. <td><img src="/templates/{template}/images/icons/profile/avatar.png" border="0"/></td>
  3. <td><a href="/users/{$usr.id}/avatar.html" title="{$LANG.SET_AVATAR}">{$LANG.SET_AVATAR}</a></td>
  4. </tr>
На:
Код PHP:
  1. {/if}
  2. {if $is_admin || $myprofile}
  3. <tr>
  4. <td><img src="/templates/{template}/images/icons/profile/avatar.png" border="0"/></td>
  5. <td><a href="/users/{$usr.id}/avatar.html" title="{$LANG.SET_AVATAR}">{$LANG.SET_AVATAR}</a></td>
  6. </tr>
  7. {/if}
  8. {if $myprofile}
8. В com_users_photos.tpl вашего шаблона меняем строки:
Код PHP:
  1. 5 и 18 {if ($my_profile || $is_admin) && $album_type == 'private'}
На:
Код PHP:
  1. {if ($my_profile || $is_admin) && $album_type == 'private' && !$album.it_avs}
9. В com_users_photo_submit.tpl вашего шаблона:
Меняем строку:
Код PHP:
  1. 32 <option value="{$album.id}" {if $album_id == $album.id} selected="selected"{/if}>{$album.title}</option>
На:
Код PHP:
  1. {if !$album.it_avs}<option value="{$album.id}" {if $album_id == $album.id} selected="selected"{/if}>{$album.title}</option>{/if}
10. Заходим в настройки пользовательских профилей и задаём значения размеров фотографий (если вы хотите, чтобы всё происходило как и до этого, то задаёте значения: 600).