Добавление аватара в профили joomla — joomla 3.5.1

Я пытаюсь добавить фотографию аватара в профиль jommla, выполнив следующие действия
1 — мой сервер
PHP построен на Windows NT ******* 6.1 build 7600 (Windows 7 Home Premium Edition) i586
Версия базы данных 5.5.5-10.1.10-MariaDB
Сравнение базы данных utf8_general_ci
Подборка соединений с базой данных utf8mb4_general_ci
Версия PHP 5.6.19
Веб-сервер Apache / 2.4.17 (Win32) OpenSSL / 1.0.2d PHP / 5.6.19
Интерфейс WebServer к PHP apache2handler
Joomla! Версия Joomla! 3.5.1 Стабильный [Единорог] 05-Апреля-2016 22:45 GMT
Joomla! Версия платформы Joomla Platform 13.1.0 Стабильный [Любопытство] 24 апреля 2013 г. 00:00 по Гринвичу
Пользовательский агент Mozilla / 5.0 (Windows NT 6.1) AppleWebKit / 537.36 (KHTML, как Gecko) Chrome / 51.0.2704.79 Safari / 537.36

2- Соответствующие настройки PHP

Безопасный режим выключен
Открытый базис Нет
Ошибки дисплея выключены
Короткие открытые теги отключены
Загрузка файлов включена
Волшебные цитаты выключены
Регистрация Globals Off
Буфер вывода выключен
Путь сохранения сеанса C: \ xampp \ tmp
Сеанс автозапуска 0
XML включен Да
Zlib включен Да
Собственный ZIP включен Да
Отключенные функции Нет
Многобайтовая строка (mbstring) включена Да
Iconv Доступен Да
Максимальные входные переменные 1000

3- редактирование файлов и полей

Я добавил поле загрузки файла в файл в

joomla_path / плагины / пользователь / профиль / profile.xml

Я добавил этот файл в плагин для профиля пользователя joomla в конце страницы.

<field name="register-require_avatar"type="list"description="PLG_USER_PROFILE_FIELD_AVATAR_DESC"label="PLG_USER_PROFILE_FIELD_AVATAR_LABEL">
<option value="2">JOPTION_REQUIRED</option>
<option value="1">JOPTION_OPTIONAL</option>
<option value="0">JDISABLED</option>
</field>

Я добавил (multipart / form-data) в форму.
Я добавил поле загрузки файла в файл в

joomla_path / плагинов / пользователь / Профиль / профили / profile.xml
Я добавил этот файл в плагин для профиля пользователя joomla в конце страницы.

<field
name="avatar"type="file"id="avatar"description="PLG_USER_PROFILE_FIELD_AVATAR_DESC"label="PLG_USER_PROFILE_FIELD_AVATAR_LABEL"/>

В файле profile.php, который находится в пути:
joomla_path / плагины / пользователь / профиль / profile.php

Я добавил этот код для создания папки аватара пользователя и код для загрузки файла изображения (я добавил этот код в функцию «onUserBeforeSave»)

import joomla's filesystem classes
jimport('joomla.filesystem.folder');
// Get the user info
$user = JFactory::getUser();
//The right way to create user folder and avatar folder
$path = JPATH_SITE . '/images/users/'. $user->id . '-' . $user->username . '/avatar';
JFolder::create($path);

jimport('joomla.filesystem.file');
$file = JRequest::getVar('jform', null, 'files', 'array');
if (isset($file) && $file['size']['profile']['avatar'] != '') {
//Clean up filename to get rid of strange characters like spaces etc
$filename = JFile::makeSafe($file['name']);

//First check if the file has the right extension, we need jpg only
if ($file['type']['profile']['avatar'] == 'image/jpeg' || $file['type']['profile']['avatar'] == 'image/png' || $file['type']['profile']['avatar'] == 'image/gif') {
if ($file['type']['profile']['avatar'] == 'image/png') {

$image = imagecreatefrompng($file['tmp_name']['profile']['avatar']);
imagejpeg($image, $path . '/avatar' . $filename .'.jpg', 80);
imagedestroy($image);
$image = JUri::root() . '/images/users/'. $user->id . '-' . $user->username . '/avatar/' . $filename;
} else if ($file['type']['profile']['avatar'] == 'image/jpeg') {
$image = imagecreatefromjpeg($file['tmp_name']['profile']['avatar']);
imagejpeg($image, $path . '/avatar' . $filename .'.jpg', 80);
imagedestroy($image);
} else if ($file['type']['profile']['avatar'] == 'image/gif') {
$image = imagecreatefromgif($file['tmp_name']['profile']['avatar']);
imagejpeg($image, $path . '/avatar' . $filename . '.jpg', 80);
imagedestroy($image);
}
} else {
//Redirect and notify user file is not right extension
throw new Exception(JText::_('PLG_USER_FILE_TYPE_INVALID'));

return false;
}
return true;
}

/////////////////////////////////////////////////

****** проблема в том, что я не могу отобразить поле в базе данных, чтобы сохранить путь к файлу аватара ****
Я должен знать, что я могу создать папку аватаров пользователей и загрузить файл изображения по этому пути, но проблема заключается в том, как сохранить путь к файлу изображения в базе данных, затем я могу вызвать его на любой странице, связавшись с этим путем, так как правильный способ сделать это ???

0

Решение

Вы можете создать функцию для вставки изображения в базу данных.

function insertAvatar($userid, $filename, $ext){

// Get a db connection.
$db = JFactory::getDbo();
try {
// Create a new query object.
$query = $db->getQuery(true);

// Insert columns.
$columns = array('user_id', 'profile_key', 'profile_value', 'ordering');

// Insert values.
$values = array($userid,'profile.avatar', $filename.$ext, 1);

// Prepare the insert query.
$query
->insert($db->quoteName('#__user_profiles'))
->columns($db->quoteName($columns))
->values(implode(',', $values));

$db->setQuery($query);
return $db->execute();
}
catch (Exception $e){
return $e->getMessage();
}
}

Вызовите функцию в соответствующем месте

if ($file['type']['profile']['avatar'] == 'image/png') {
$this->insertAvatar($user->id, $filename, 'png');

Аналогично для остальных трех типов, т. Е. «Jpg» и «gif», используйте

$this->insertAvatar($user->id, $filename, 'jpg');

а также

$this->insertAvatar($user->id, $filename, 'gif');

. Вы вызываете другие параметры профиля так же, как вы называете имя файла изображения.

0

Другие решения

Это функция, которую вы создали для меня

function insertAvatar($userid, $filename, $ext){

// Get a db connection.
$db = JFactory::getDbo();
try {
// Create a new query object.
$query = $db->getQuery(true);

// Insert columns.
$columns = array('user_id', 'profile_key', 'profile_value', 'ordering');

// Insert values.
$values = array($userid,'profile.avatar', $filename.$ext, 1);

// Prepare the insert query.
$query
->insert($db->quoteName('#__user_profiles'))
->columns($db->quoteName($columns))
->values(implode(',', $values));

$db->setQuery($query);
return $db->execute();
}
catch (Exception $e){
return $e->getMessage();
}
}

и это функция (onUserBeforeSave), где я положил свой код

public function onUserBeforeSave($user, $isnew, $data)
{
/////////////////////////////////////////////////////

// import joomla's filesystem classes
jimport('joomla.filesystem.folder');
// Get the user info
$user = JFactory::getUser();
//The right way to create user folder and avatar folder
$path = JPATH_SITE . '/images/users/'. $user->id . '-' . $user->username . '/avatar/';
JFolder::create($path);

jimport('joomla.filesystem.file');
$file = JRequest::getVar('jform', null, 'files', 'array');
if (isset($file) && $file['size']['profile']['avatar'] != 0) {
//Clean up filename to get rid of strange characters like spaces etc
$filename = JFile::makeSafe($file['name']);

//First check if the file has the right extension, we need jpg only
if ($file['type']['profile']['avatar'] == 'image/jpeg' || $file['type']['profile']['avatar'] == 'image/png' || $file['type']['profile']['avatar'] == 'image/gif') {
if ($file['type']['profile']['avatar'] == 'image/png') {

$image = imagecreatefrompng($file['tmp_name']['profile']['avatar']);
imagejpeg($image, $path . $filename .'.jpg', 80);
$this->insertAvatar($user->id, $filename, 'jpg');
imagedestroy($image);

} else if ($file['type']['profile']['avatar'] == 'image/jpeg') {
$image = imagecreatefromjpeg($file['tmp_name']['profile']['avatar']);
imagejpeg($image, $path . $filename .'.jpg', 80);
$this->insertAvatar($user->id, $filename, 'jpg');
imagedestroy($image);

} else if ($file['type']['profile']['avatar'] == 'image/gif') {
$image = imagecreatefromgif($file['tmp_name']['profile']['avatar']);
imagejpeg($image, $path . $filename . '.jpg', 80);
$this->insertAvatar($user->id, $filename, 'jpg');
imagedestroy($image);
}
} else {
//Redirect and notify user file is not right extension
throw new Exception(JText::_('PLG_USER_FILE_TYPE_INVALID'));

return false;
}
return true;
}

/////////////////////////////////////////////////

// Check that the date is valid.
if (!empty($data['profile']['dob']))
{
try
{
$date = new JDate($data['profile']['dob']);
$this->date = $date->format('Y-m-d H:i:s');
}
catch (Exception $e)
{
// Throw an exception if date is not valid.
throw new InvalidArgumentException(JText::_('PLG_USER_PROFILE_ERROR_INVALID_DOB'));
}
if (JDate::getInstance('now') < $date)
{
// Throw an exception if dob is greather than now.
throw new InvalidArgumentException(JText::_('PLG_USER_PROFILE_ERROR_INVALID_DOB'));
}
}
// Check that the tos is checked if required ie only in registration from frontend.
$task       = JFactory::getApplication()->input->getCmd('task');
$option     = JFactory::getApplication()->input->getCmd('option');
$tosarticle = $this->params->get('register_tos_article');
$tosenabled = ($this->params->get('register-require_tos', 0) == 2) ? true : false;
if (($task == 'register') && ($tosenabled) && ($tosarticle) && ($option == 'com_user'))
{
// Check that the tos is checked.
if ((!($data['profile']['tos'])))
{
throw new InvalidArgumentException(JText::_('PLG_USER_PROFILE_FIELD_TOS_DESC_SITE'));
}
}return true;
}

мой код, который находится между строк комментариев, как это
/////////////////////////////////////

0