Сегодня мы будем делать профиль пользователя. Этот урок связан со статьями по созданию регистрации, авторизации и загрузке картинок на сервер, рекомендуем сначала изучить их. В профиле будет иметься возможность поменять аватар, пароль и логин пользователя.
Сначала нужно модернизировать нашу таблицу с пользователями до такого вида:
Добавились два новых поля – ava и role. Поле ava будет хранить название загруженной аватарки пользователя с расширением. Поле role будет содержать статус пользователя: 0 – пользователь, 1 – администратор, 2 – младший модератор, 3 – старший модератор. Если пользователь не авторизирован, то он имеет статус гость.
Добавим маршруты в файл routes.php, он находится в папке config:
'user/profile' => 'user/profile',
'user/edit_password' => 'user/editPass',
Теперь создадим обработчик для страницы профиля, создавать его нужно в файле UserController.php, он находится в папке controllers. Сначала с помощью функции checkAdminId проверяем, авторизирован ли пользователь, если да, то в переменную id_user вернется его id. Далее с помощью функции getUserById, по id записанному в переменной id_user, получаем данные пользователя из таблицы БД и записываем их в п переменную user. Эти данные будут отображаться в полях формы.
Если на странице с формой нажали кнопку «Изменить», то методом POST получаем значение заполненных полей и проверяем, корректно ли введен логин пользователя и не занят ли он. Если да, то проверяем, выбрал ли пользователь аватар, если нет, то ему будет выставлен аватар по умолчанию. Затем будет выполнена функция editUserProfile, она изменит данные в таблице базы данных.
Если же аватар выбран в форме, то мы используем функцию editUserProfileImg. Функция выполнит загрузку нового аватара на сервер и изменит данные в таблице базы данных.
public function actionProfile() {
$id_user = User::checkAdminId();
$user = User::getUserById($id_user);
$result = false;
if (isset($_POST['submit'])) {
$login = $_POST['login'];
$old_img_url = $_POST['old_ava'];
$img_url = $_FILES['ava']['name'];
$tmp_name_img = $_FILES['ava']['tmp_name'];
$errors = false;
if (!User::checkName($login)) {
$errors[] = 'Имя не должно быть короче 2-х символов'
}
$checkLogin = User::checkUserLogin($login);
if ($checkLogin == true) $errors[] = 'Пользователь с таким Логином, уже зарегистрирован, введите другой Логин'
if ($errors == false) {
if ($img_url == null) {
$img_url = 'defava.jpg';
$result = User::editUserProfile($id_user, $login);
}
else $result = User::editUserProfileImg($id_user, $img_url, $tmp_name_img, $old_img_url);
require_once(ROOT . '/views/user/profile.php');
return true;
}
}
require_once(ROOT . '/views/user/profile.php');
return true;
}
Теперь опишем используемые функции, они будут находиться в папке models в файле News.php:
Функция editUserProfile. Она соединяется с базой данных и производит обновление поля с логином пользователя.
public static function editUserProfile($id_user, $login)
{
$db = Db::getConnection();
$sql = "UPDATE users SET login = :login WHERE id = :id";
$result = $db->prepare($sql);
$result->bindParam(':id', $id_user, PDO::PARAM_STR);
$result->bindParam(':login', $login, PDO::PARAM_STR);
return $result->execute();
}
Функция editUserProfileImg. С помощью функции downloadAvatar загружает картинку на сервер и получает в переменную ava_url имя с расширением. Далее выполняет SQL запрос, который обновляет поле с аватаркой и логином пользователя:
public static function editUserProfileImg($id_user, $login, $img_url, $tmp_name_img, $old_img_url)
{
$ava_url = self::downloadAvatar($old_img_url, $img_url, $tmp_name_img);
$db = Db::getConnection();
$sql = "UPDATE users ava SET ava = :ava, login = :login WHERE id = :id";
$result = $db->prepare($sql);
$result->bindParam(':ava', $ava_url, PDO::PARAM_STR);
$result->bindParam(':login', $login, PDO::PARAM_STR);
$result->bindParam(':id', $id_user, PDO::PARAM_INT);
return $result->execute();
}
Функция downloadAvatar. Эта функция полностью идентична функции загрузки изображений на сервер, разница лишь в пути сохранения изображения:
public static function downloadAvatar($old_img_url, $img_url, $tmp_name_img)
{
$img_url1 = Page::translitPhp($img_url);
$path = 'template/avatars/'; // Путь к папке
$file_type = substr($img_url1, strrpos($img_url1, '.')+1); // Получаем Расширение файла
$pos = strpos($img_url1, ".");
$fn = substr($img_url1, 0, $pos);
$file_name = $fn;
$img_url1=$file_name.(Page::getRandomFileName($path, $file_type)).'_avagoodnets.'.$file_type;
if (move_uploaded_file($tmp_name_img, $path . $img_url1)) {
$newFileName = $path . $img_url1;
if (($file_type == 'png') || ($file_type == 'PNG')) {
$src = imagecreatefrompng($newFileName);
$ar = Page::changeSizeImg($newFileName, $src);
$dest = $ar[0];
imagepng($dest, $newFileName, 0);
imagedestroy($dest);
}
if (($file_type == 'jpg') || ($file_type == 'JPG') || ($file_type == 'jpeg') || ($file_type == 'JPEG')) {
$src = imagecreatefromjpeg($newFileName);
$ar = Page::changeSizeImg($newFileName, $src);
$dest = $ar[0];
imagejpeg($dest, $newFileName, 100);
imagedestroy($dest);
}
}
return $img_url1;
}
Функция checkAdminId проверяет, авторизирован ли пользователь, путем проверки существования переменной сессии user. Если переменная существует, то возвращаем значение этой переменной, иначе делаем редирект на страницу авторизации:
public static function checkAdminId()
{
if (isset($_SESSION['user'])) {
return $_SESSION['user'];
}
header("Location: /user/login");
}
Функция getIserById получает данные пользователя из базы данных, по полученному id:
public static function getUserById($id)
{
$db = Db::getConnection();
$sql = 'SELECT * FROM users WHERE id = :id';
$result = $db->prepare($sql);
$result->bindParam(':id', $id, PDO::PARAM_INT);
$result->setFetchMode(PDO::FETCH_ASSOC);
$result->execute();
return $result->fetch();
}
Создадим страницу с формой профиля. Если пользователь гость, то показываем ему сообщение, что он не авторизирован. Далее идет обычная страница с выводом ошибок и проставлением данных пользователя в поля.
<?php if (User::isGuest()): ?><!--Если пользователь гость то мы показываем ему кнопку входа а иначе каб.-->
<a href="/user/login/"> Вы не авторизированны Вход</a>
<?php else: ?>
<html>
<head>
<title></title>
</head>
<body>
<div class="page-content">
<div class="content-block">
<div class="page-views">
<h1>Профиль</h1>
<div style="color: green; font-size: 18px; display: block; width:400px;">
<?php if ($result): ?>
<p>Данные отредактированы! <a href="/user/profile">Вернуться в профиль</a></p>
<?php else: ?>
</div>
<div style="color: red; font-size: 18px; display: block; width:400px;">
<?php if (isset($errors) && is_array($errors)): ?>
<ul>
<?php foreach ($errors as $error): ?>
<li> - <?php echo $error; ?></li>
<?php endforeach; ?>
</ul><br>
<?php endif; ?>
</div>
<form method="post" action="#" enctype="multipart/form-data" style="width:100%; ">
<input type="hidden" name="old_ava" value="<?php echo $user['ava']; ?>">
<? if ($user['ava'] == '') { ?>
<img src="../../template/avatars/defava.jpg" width="200" class="img-c-tree">
<? } else { ?>
<img src="../../template/avatars/<?php echo $user['ava']; ?>" width="200" class="img-c-tree">
<?}?>
<br><br>
<label>Загрузить изображение профиля (аватар) <br>
Картинку для аватара страйтесь выберать, с одниковой высотой и шириной (128*128, 256*256, 512*512, 1024*1024)<br><br>
<input name="ava" type="file" multiple accept="image/*"></label><br><br>
<lable>Логин<input type="text" name="login" value="<? echo trim($user['login']); ?> "></lable><br><br><br><br>
<lable>E-mail<input type="email" value="<? echo trim($user['email']);?> " disabled></lable><br><br><br><br>
<lable>Пароль
<span style="background: #f1f1f1; #6f9ecc; padding: 7px 10px 7px 10px; width:98%; border: 1px solid #ccc; display: block;">Ваш пароль <b>зашифрован</b>, вы можете его изменить только с помощью <a href="/user/edit_password">формы смены пароля</a>. </span>
</lable><br>
<lable>Ваш статус <input type="text" name="st" size="30" value="<?
if ($user['role'] == '0') { echo 'Пользователь';}
elseif ($user['role'] == '1') { echo 'Администратор'; }
elseif ($user['role'] == '2') { echo 'Младший модератор'; }
elseif ($user['role'] == '3') { echo 'Старший модератор'; }
?> " disabled></lable><br><br><br><br>
<?php endif; ?>
<input type="submit" name="submit" class="btn btn-default" value="Изменить" style="width: 17%;" /><br><br><br><br>
</form>
</div>
</div>
</div>
</body>
</html>
<?php endif; ?>
Полям e-mail и статус отключаем редактирование, они содержат информационный характер. После нажатия кнопки изменить, страница будет перезагружена и если данные успешно отредактированы, то показываем пользователю сообщение об этом.
В браузере эта форма будет выглядеть следующим образом:
Так как наши пароли зашифрованы, да и просто для удобства, создаем форму смены пароля. Создаем ее обработчик в NewsController.php:
public function actionEditPass() {
$id_user = User::checkAdminId();
$result = false;
if (isset($_POST['submit'])) {
$password = $_POST['password'];
$password2 = $_POST['password2'];
$errors = false;
if (!$password == $password2) {
$errors[] = 'Пароли не совпадают';
}
if (!User::checkPassword($password)) {
$errors[] = 'Пароль не должен быть короче 6-ти символов';
}
if ($errors == false) {
$hash_password = User::generateHash($password);
$result = User::editPassword($id_user,$hash_password);
require_once(ROOT . '/views/user/profile.php');
return true;
}
}
require_once(ROOT . '/views/user/edit_password.php');
return true;
}
В обработчике мы получили введенные в форму пароли, сравнили, равны ли введенные пароли и проверили, чтобы пароль был не короче шести символов. Далее если ошибок нет, то мы используем функцию generateHash, которая шифрует пароль (эта функция была разобрана в статье по созданию регистрации). Затем с помощью функции editPassword (была рассмотрена в этой статье) меняем пароль в таблице базы данных на новый. Форма страницы редактирования пароля будет реализована так:
<?php if (User::isGuest()): ?>
<a href="/user/login/"> Вы не авторизированны Вход</a>
<?php else: ?>
<html>
<head>
<titile></titile>
</head>
<body>
<div class="page-content">
<div class="content-block">
<div style="color: red; font-size: 14px; padding: 20px; margin: 0 auto; display: block; width:400px;">
<?php if (isset($errors) && is_array($errors)): ?>
<ul>
<?php foreach ($errors as $error): ?>
<li> - <?php echo $error; ?></li>
<?php endforeach; ?>
</ul>
<?php endif; ?>
</div>
<form action="#" method="post" style="display: block; width: 400px; margin: 0 auto; background: #f2f1f0; padding: 20px; color:#555; text-align: center;">
<center><h2>Форма смены пароля</h2></center><br>
<input type="text" name="password" placeholder="Введите новый пароль" value=""/><br><br><br>
<input type="text" name="password2" placeholder="Введите еще раз" value=""/><br><br><br>
<input type="submit" name="submit" class="btn btn-default" value="Изменить пароль" /><br><br>
</form>
</div>
</div>
</body>
</html>
<?php endif; ?>
В браузере она будет отображаться следующим образом:
В итоге мы получаем профиль пользователя с возможностью смены логина и аватара. Чтобы не создавать функцию downloadAvatar, можно хранить аватарки вместе с загруженными картинками, а это не очень удобно. Лучше сделать проверку какого-то параметра в функции downloadImg и относительно него выбирать путь, по которому будем сохранять аватарку.
Смотрите также дополнительные статьи про MVC
Комментарии ( 2 )
Хорошая статья для начинающих.
05.11.2018
А можно структуру файлов и папок? Мне непонятно куда добавлять формы. А лучше дайте исходник,посотреть что и как. Просто у меня белый экран и все.
05.11.2018