[howto] Добавление аватара в профильПоскольку разработчики Джустины не прислушались к моему
пожеланию добавить аватар в стандартный профиль - пришлось ковырять это дело самому. Оказалось, всё не так сложно.
Сразу оговорюсь, что буду рассматривать добавление аватара
на примере кода Джустины 1.0, но поскольку код-то примерно одинаковый во всех сборках Джумлы, то вряд ли возникнут проблемы с изменением и их.
При добавлении аватара мной использован код из компонента ja_submit (его присутствие в системе не требуется) и слегка изменен com_user таким образом, что после сохранения параметров пользователь возвращается в свой профиль, а не на главную страницу сайта.
Перед началом изменения настоятельно рекомендуется сделать резервную копию файлов. Мануал предоставляется as is

.
Итак, первым делом добавим поле для сохранения названия аватара в базу данных. Для этого надо выполнить запрос в phpMyAdmin -
ALTER TABLE `jos_users` ADD `avatar` VARCHAR(255) NOT NULL default '';
Далее открываем файл
/includes/joomla.php. В него надо будет внести несколько изменений.
1) Находим код (1200 строка)
$query = "SELECT id, name, email, block, sendEmail, registerDate, lastvisitDate, activation, params"
Заменяем на
$query = "SELECT id, name, email, block, sendEmail, registerDate, lastvisitDate, activation, params, avatar"
2) Находим немного ниже код (1212 строка)
$user->activation = $my->activation;
После него добавляем строку -
$user->avatar = $my->avatar;
3) Находим код (1962 строка)
var $params = null;
/**
* @param database A database connector object
*/
function mosComponent( &$db ) {
Меняем его на
var $params = null;
var $avatar = null;
/**
* @param database A database connector object
*/
function mosComponent( &$db ) {
Теперь откроем файл
/components/com_user/user.html.php. Сюда надо добавить поле для загрузки аватара и изменить тег form. Находим код (77 строка)
<form action="index.php" method="post" name="mosUserForm">
Меняем на
<form action="index.php" method="post" name="mosUserForm" enctype="multipart/form-data">
Поле для аватара я добавил в конец формы. После кода -
<tr>
<td colspan="2">
<?php echo $params->render( 'params' ); ?>
</td>
</tr>
<?php
}
?>
Добавляем -
<tr>
<td>
Аватар:
<br />
(Разрешенные форматы: png, gif, jpg)
</td>
<td>
<input type='file' name='avatar' value='' size="30"/>
<br /><br />
<?php
if ($row->avatar=='') {
?>
<img src="/images/avatars/user.gif" width='32' />
<?php
} else {
?>
<img src="/images/avatars/<?php echo $row->avatar;?>" width='32' />
<?php } ?>
</td>
</tr>
user.gif - это аватар по умолчанию, он присутствует у всех, кто не загрузил собственный.
Осталась самая малость - откроем файл
/components/com_user/user.php.
1) Находим функцию (92 строка)
function userSave( $option, $uid) {
global $database, $my, $mosConfig_frontend_userparams, $mainframe, $mosConfig_live_site, $mosConfig_absolute_path;
Меняем на
function userSave( $option, $uid) {
global $database, $my, $mosConfig_frontend_userparams, $mainframe, $mosConfig_live_site, $mosConfig_absolute_path, $Nameimage1;
Чуть ниже, после кода (97 строка)
// do some security checks
if ($uid == 0 || $user_id == 0 || $user_id != $uid) {
mosNotAuth();
return;
}
добавляем -
if (!image_upload()){
mosRedirect( "index.php?option=com_user&task=UserDetails","Ошибка при загрузке картинки." );
}
2) Чуть ниже после кода (129 строка) -
mosMakeHtmlSafe($row);
Добавляем -
if ($Nameimage1==''){
} else {
$row->avatar=$Nameimage1;
}
Здесь код не слишком совершенен, но у меня насчет этого места свои планы, так что не обессудьте.
3) Далее строку 190 -
mosRedirect( 'index.php', _USER_DETAILS_SAVE );
Меняем на
mosRedirect( "index.php?option=com_user&task=UserDetails", _USER_DETAILS_SAVE );
Теперь находим самую последнюю строку файла -
?>
И перед ней добавляем код -
/****************************************************/
//IMAGE RESIZE FUNCTION FOLLOW ABOVE DIRECTIONS
function makeimage($filelocation,$filename,$newfilename,$path,$newwidth,$newheight) {
//SEARCHES IMAGE NAME STRING TO SELECT EXTENSION (EVERYTHING AFTER . )
$image_type = strstr($filename, '.');
//SWITCHES THE IMAGE CREATE FUNCTION BASED ON FILE EXTENSION
switch($image_type) {
case '.jpg':
$source = imagecreatefromjpeg($filelocation);
break;
case '.jpeg':
$source = imagecreatefromjpeg($filelocation);
break;
case '.JPG':
$source = imagecreatefromjpeg($filelocation);
break;
case '.JPEG':
$source = imagecreatefromjpeg($filelocation);
break;
case '.png':
$source = imagecreatefrompng($filelocation);
break;
case '.PNG':
$source = imagecreatefrompng($filelocation);
break;
case '.gif':
$source = imagecreatefromgif($filelocation);
break;
case '.GIF':
$source = imagecreatefromgif($filelocation);
break;
default:
//echo("Error: Invalid Image Type");
mosRedirect('index.php?option=com_user&task=UserDetails',"Error: Invalid Image Type");
die;
break;
}
//CREATES THE NAME OF THE SAVED FILE
$file = $newfilename . strtolower($filename);
//CREATES THE PATH TO THE SAVED FILE
$fullpath = $path . $file;
//FINDS SIZE OF THE OLD FILE
list($width, $height) = getimagesize($filelocation);
//CREATES IMAGE WITH NEW SIZES
$thumb = imagecreatetruecolor($newwidth, $newheight);
//RESIZES OLD IMAGE TO NEW SIZES
imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
//SAVES IMAGE AND SETS QUALITY || NUMERICAL VALUE = QUALITY ON SCALE OF 1-100
imagejpeg($thumb, $fullpath, 85);
//CREATING FILENAME TO WRITE TO DATABSE
$filepath = $fullpath;
//RETURNS FULL FILEPATH OF IMAGE ENDS FUNCTION
return $filepath;
}
function image_upload(){
global $mosConfig_live_site, $mosConfig_absolute_path;
global $mainframe,$my, $Nameimage1;
//global $database, $mainframe, $my, $Nameimage1;
#set upload dirs
$uploadphotodir = $mosConfig_absolute_path."/images/avatars/"; // куда сохранять аватары
$tempdir = $mosConfig_absolute_path."/cache/"; //временная папка
$H_allowable_images="png,gif,jpg"; //разрешенные форматы
$H_allowable_images=str_replace(".","",$H_allowable_images);
$allowtype=explode(",",$H_allowable_images);
$H_enable_resize = 1; // изменять размер или нет - в принципе лишний параметр
$H_width = "32"; // ширина
$H_height = "32"; // высота
#File size in Bytes.Changed its type to variable
$H_maxSize = "1000000"; // максимальный объём в байтах
//-------------Image 1---------------//
#check move image 1
$Nameimage1 = $_FILES['avatar']['name'];
$name1Ext=substr($Nameimage1,strlen($Nameimage1)-3,3);
if ($Nameimage1!=""){
//check the allow extension
if (!in_array($name1Ext,$allowtype)) mosRedirect('index.php?option=com_user&task=UserDetails', "Формат не поддерживается.");
$image1Temp = $tempdir.$Nameimage1;
if (move_uploaded_file($_FILES['avatar']['tmp_name'], $image1Temp)) {
#check size. Fixed Display error
if($_FILES['avatar']['size'] > $H_maxSize) {
mosRedirect('index.php?option=com_user&task=UserDetails',"Загрузка картинки ".$Nameimage1." сорвана - файл слишком большого объёма.");
}else{
#get original size
list($oldwidth, $oldheight) = getimagesize($image1Temp);
#resize
if($oldwidth > $oldheight) {
$smwidth = "$H_width";
$smheight = ($oldheight*($smwidth/$oldwidth));
} else {
$smheight = "$H_height";
$smwidth = ($oldwidth*($smheight/$oldheight));
}
// новое имя для файла = логин пользователя.
$Nameimage1=$my->username.".".$name1Ext;
if (isset($smheight) && isset($smwidth)) {
makeimage($image1Temp,$Nameimage1,'',$uploadphotodir,$smwidth,$smheight);
}
}
#delete temp file
unlink($image1Temp);
}
}
return true;
}
/****************************************************/
Вот и всё. Как вы видите - кое-какие параметры я оставил в переменных, я сделал это умышленно, т.к. планирую сделать их настройку через админку. Конечно же, этот вариант есть куда дорабатывать - напр., необходимо добавить возможность удаления аватара. Но и в таком варианте это вполне приемлемое рабочее решение. И не стоит ради такой мелочи ставить Community Builder.