Выбор аватарки из личного фотоальбома

+34
2.83K
На моем сайте пользователей смущало то, что нельзя установить аватарку из личного фотоальбома. В функционале движка данного решения не нашёл (может плохо искал?).
Пришлось повозиться немного с кодом и решение было достигнуто. Работу провёл на InstantCMS 1.6.2, для 1.7 пока не проверял, но думаю работать будет.
Теперь когда пользователь открывает свою фотку из альбома, открывается вот такое:
Иллюстрация



Правим файл /components/users/frontend.php. Сразу после:
  1. if(!defined('VALID_CMS')) { die('ACCESS DENIED'); }
Вставить:

  1. function img_res($src, $dest, $width, $height, $rgb=0xFFFFFF, $quality=100)
  2. {
  3. if (!file_exists($src)) return false;
  4. $size = getimagesize($src);
  5. if ($size === false) return false;
  6.  
  7. $format = strtolower(substr($size['mime'], strpos($size['mime'], '/')+1));
  8. $icfunc = "imagecreatefrom" . $format;
  9. if (!function_exists($icfunc)) return false;
  10.  
  11. $x_ratio = $width / $size[0];
  12. $y_ratio = $height / $size[1];
  13. $ratio = min($x_ratio, $y_ratio);
  14. $use_x_ratio = ($x_ratio == $ratio);
  15. $new_width = $use_x_ratio ? $width : floor($size[0] * $ratio);
  16. $new_height = !$use_x_ratio ? $height : floor($size[1] * $ratio);
  17. $new_left = $use_x_ratio ? 0 : floor(($width - $new_width) / 2);
  18. $new_top = !$use_x_ratio ? 0 : floor(($height - $new_height) / 2);
  19. $isrc = $icfunc($src);
  20. $idest = imagecreatetruecolor($width, $height);
  21. imagefill($idest, 0, 0, $rgb);
  22. imagecopyresampled($idest, $isrc, $new_left, $new_top, 0, 0,
  23. $new_width, $new_height, $size[0], $size[1]);
  24. imagejpeg($idest, $dest, $quality);
  25. imagedestroy($isrc);
  26. imagedestroy($idest);
  27.  
  28. return true;
  29. }

Далее добавить перед разделом // VIEW PHOTO //:

  1. /////////////////////////////// Установка аватара из фотоальбома /////////////////////////////////////////////////////////////////////////////////////////
  2. if ($do=='setav'){
  3. $photoid = @intval($_REQUEST['photoid']);
  4. $sql = "SELECT imageurl FROM cms_user_photos WHERE id = $photoid AND user_id = $id";
  5. $result = $inDB->query($sql);
  6. $photo = $inDB->fetch_assoc($result);
  7. $filename=$photo['imageurl'];
  8.  
  9. $uploaddir= $_SERVER['DOCUMENT_ROOT'].'/images/users/';
  10. $uploadfile = $uploaddir .'/photos/medium/'.$filename;
  11. $uploadavatar = $uploaddir .'/avatars/'.$filename;
  12. $uploadthumb = $uploaddir . 'avatars/small/' . $filename;
  13.  
  14. if (isset($cfg['smallw'])) { $smallw = $cfg['smallw']; } else { $smallw = 64; }
  15. if (isset($cfg['medw'])) { $medw = $cfg['medw']; } else { $medw = 200; }
  16. if (isset($cfg['medh'])) { $medh = $cfg['medh']; } else { $medh = 200; }
  17.  
  18. img_res($uploadfile, $uploadavatar, $medw, $medh);
  19. img_res($uploadfile, $uploadthumb, 70, 80);
  20.  
  21.  
  22. $sql = "SELECT imageurl FROM cms_user_profiles WHERE id = $userid";
  23. $result = $inDB->query($sql) ;
  24. if ($inDB->num_rows($result)){
  25. $old = $inDB->fetch_assoc($result);
  26. };
  27.  
  28. if ($old['imageurl']=='nopic.jpg'){
  29. $sql = "UPDATE cms_users SET rating = rating + 10 WHERE id = '$id'";
  30. $inDB->query($sql);
  31. }
  32. if ($old['imageurl']==''){
  33. $sql = "UPDATE cms_users SET rating = rating + 10 WHERE id = '$id'";
  34. $inDB->query($sql);
  35. }
  36.  
  37. $sql = "UPDATE cms_user_profiles
  38. SET imageurl = '$filename'
  39. WHERE user_id = '$id'
  40. LIMIT 1";
  41. $inDB->query($sql) ;
  42. $inCore->redirect(cmsUser::getProfileURL($inUser->login));
  43. }

В разделе //VIEW PHOTO// после:
  1. if ($previd && $nextid) { echo '<td>|</td>'; }
добавить:
  1.  
  2. if ($myprofile) {
  3. echo '<td><a style="height:16px; line-height:35px;margin-right:5px; padding-left:20px; background:url(/components/users/images/male.gif) no-repeat;" href="/users/'.$usr['id'].'/setav'.$photoid.'.html">Сделать аватаром</a></td> ';
  4. }
На моем примере немного подправлен шаблон — ссылки на предыдущую и следующую фотки выведено сверху от фотки, поэтому у вас должна вывестить ссылка на установку фотки как аватара внизу между ссылками на предыдущую и следующую.


Добавить новое правило в файл /components/users/router.php
  1. //RewriteRule ^users/([0-9]*)/setav([0-9]*).html$ /index.php?view=users&do=setav&id=$1&photoid=$2
  2. $routes[] = array(
  3. '_uri' => '/^users\/([0-9]+)\/setav([0-9]+).html$/i',
  4. 'do' => 'setav',
  5. 1 => 'id',
  6. 2 => 'photoid'
  7. );
+7
InstantCMS InstantCMS 13 лет назад #
>В конец файла /.htaccess добавить

этот пункт не нужен
+3
Белгородский Бомж Белгородский Бомж 13 лет назад #
Действительно. Убрал из описания
+2
Анатолий Анатолий 13 лет назад #
Для того чтобы работало в 1.7 необходимо в файле templates/---/components/com_users_photos_view.tpl

Вставить след. строки в нужное место:
Код PHP:
<a  href="/users/{$usr.id}/setav{$photo.id}.html">Сделать аватаром</a>
Третий пункт
if ($previd && $nextid) { echo '<td>|</td>'; }
этой статьи делать ненужно!
0
Митяй Митяй 13 лет назад #
Отличная функция. А посимпатичней смотрелось бы, еслиб фото на аве не в свой формат заливались, а обрезались в квадрат. А то авы на сайте у кого горизонтальные, у кого вертикальные. Можно такое устроить?
0
Белгородский Бомж Белгородский Бомж 13 лет назад #
Обрезка идёт в файле /components/users/frontend.php в разделе /Установка аватара из фотоальбома/ в строке:
img_res($uploadfile, $uploadthumb, 70, 80);
70 - ширина, 80 - высота
Так сделал для своего проекта.
По умолчанию должно быть
img_res($uploadfile, $uploadthumb, $smallw, $smallw);
В этом случае задаётся в админке, а если не задано - 64х64
+1
Митяй Митяй 13 лет назад #
Спасибо. Еще обнаружился момент. Любой пользователь может менять аву, без ведома хозяина. Прикольно было увидеть не свой аватар поутру)
+1
Белгородский Бомж Белгородский Бомж 13 лет назад #
Добавьте код вывода ссылки Сделать аватаром между
if ($myprofile) {
и
}
0
Митяй Митяй 13 лет назад #
и верно... почемуто ента строчка не скопировалась. Все ссупер! и респект!
0
13 лет назад #
в какой файл? хотя на 1.8 не работает
есть ссылочка сделать аватаром, при нажатии выкидывает в список пользователей.
0
Female Female 13 лет назад #
штука конечно интересная.но вот вред мне нанесла ощутимый.установила значит,все отлично аватар из альбома появился!но ! мутный!в профиле он нормальный ,а вот на форуме и еще в некоторых местах мутные аватары и только те ,которые были установлены после внедрения вашей штуки.вообщем снесла я эту функцию начисто.безрезультатно! кэш почищен. обратилась к хостеру сделали бэекап. но увы!при установке нового аватара все также мутно((((
0
Анатолий Анатолий 13 лет назад #
А у меня аватарки сами по себе меняются )))))))))))))
-1
Умные Интернет Разработки Умные Интернет Разработки 13 лет назад #
ошибка выскакивает при нажатии Сделать аватаром:
Код PHP:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
0
Белгородский Бомж Белгородский Бомж 13 лет назад #
Версия движка 1.6.2?
0
Белгородский Бомж Белгородский Бомж 13 лет назад #
Я проверял только на 1.6.2. Для 1.7 нужно кое-что переделать. Я пока не проверял, но SainT.v2 видимо знает что нужно сделать
0
bondar bondar 13 лет назад #
делал все как написано, на 1.7, все сразу заработало
0
bondar bondar 13 лет назад #
могу кинуть вам файлы что описаны для редактирования, попробуете себе их залить и проверите, если хотите
+2
bondar bondar 13 лет назад #
может вы просто не там смотрите, он делает аватары из тех фотографий что отображаются у вас в профиле только в вашем личном альбоме, а не из тех что например вы залили в общий альбом сайта, они тоже отображаются у вас в профиле но из них не делает аву
+3
Иван Шкута Иван Шкута 13 лет назад #
У кого-нибудь получалось поставить это на 1.8?
+1
Black-Raven90 Black-Raven90 13 лет назад #
Действительно, может кто-нибудь под 1.8 переделать? думаю, многим бы пригодилось.
+1
vitalson9 vitalson9 13 лет назад #
в 1.8 работает только вот что происходит с авай при установки
+1
Telema93 Telema93 13 лет назад #
и решения видимо не будет
0
Telema93 Telema93 12 лет назад #
простейшее решение:
Код PHP:
if (isset($cfg['medw'])) { 	 $medw = $cfg['medw']; } else { $medw = 200; }
if (isset($cfg['medh'])) { 	 $medh = $cfg['medh']; } else { $medh = 200; }
заменить на:
Код PHP:
 $medw = 200; 
 $medh = 200; 
Естественно, высота и ширина - свои
Но лучше подгрузить яваскрипт для обрезки
0
Telema93 Telema93 12 лет назад #
в function img_res ошибка подсчета
соотношение для 1.9 должно иметь вид h2=h1*200/w1 где 200 - w2, то есть максимальная ширина аватара
что шаманится в самой функции - не совсем ясно, ведь достаточно просто "ужать" картинку без обрезания стандартными средствами html
+1
GarikKR GarikKR 12 лет назад #
Ребят подскажите пожалуйста как поправить растягивание рамки аватарки.
0
CROSS &#12484; CROSS ツ 12 лет назад #
Тема закрыта????
0
Telema93 Telema93 12 лет назад #
растягивается не рамка, а картинка...
0
CROSS &#12484; CROSS ツ 12 лет назад #
Я вот только не пойму! НАФИГА ТУТ ЭТО!!!
Код PHP:
if ($old['imageurl']=='nopic.jpg'){
				    $sql = "UPDATE cms_users SET rating = rating + 10  WHERE id = '$id'";		
					$inDB->query($sql);
				}
				if ($old['imageurl']==''){
					$sql = "UPDATE cms_users SET rating = rating + 10  WHERE id = '$id'";		
					$inDB->query($sql);
				}
добавляется 10ед рейтинга при смене авы из альбома!!!
0
boss boss 12 лет назад #
Как насчёт версии 1.9 кто нибудь уже ставил? Или у кого нибудь есть решение для 1.9?

Заранее благодарен
0
Def Def 12 лет назад #
тоже интересно, работает или нет на 1.9?
0
Bars Bars 12 лет назад #
Ставил на 1.9 Работает на ура
0
Taurus Taurus 11 лет назад #
Установил на v1.10.2, работает но только после нажатия на сделать аватаркой, пустая страничка, как испраить?

Еще от автора

Вкладка Администраторы в группах на InstantCMS 2.1.2
Привет всем. Возникла необходимость выводить отдельным списком Администраторов в группах на InstantCMS 2.1.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.