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

Сначала нужно модернизировать нашу таблицу с пользователями до такого вида:

 

Добавились два новых поля – 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>. &nbsp;</span>
                    </lable><br>
                    <lable>Ваш статус &nbsp;&nbsp;&nbsp; <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

 

 

 

 

Grai Просмотров сегодня +1 29 июня 2017 команда сайта
Комментарии ( 2 )
Валерий
Хорошая статья для начинающих.
05.11.2018
Serhio
А можно структуру файлов и папок? Мне непонятно куда добавлять формы. А лучше дайте исходник,посотреть что и как. Просто у меня белый экран и все.
05.11.2018
Оставить комментарий
→ Займы под залог недвижимости срочно за 1 день! ИП Блажевич Денис Викторович ИНН: 032602092643
Реклама Получите займ под залог без подтверждения доходов в день обращения. Самые выгодные условия. Любая кредитная история!
www.capitalinvestbv.ru
SEO продвижение ваших сайтов от 25 000 руб. в мес. Создание сайтов и мобильных приложений от 5 500 руб. Любой сложности!
Реклама Собственный фреймворк. Большие и сложные проекты. ТОП 100 разработчиков РФ.
irogex.ru
→ BULLET-SHOP - сварка аргоном, полуавтомат, тюнинг авто!
Реклама Ремонтируем радиаторы, интеркулеры, пайпинг и ВСЁ из алюминия, чугуна, стали с ГАРАНТИЕЙ КАЧЕСТВА. Диагностика и ремонт подвески, трансмиссии, всех узлов и агрегатов
www.bullet-shop.pro
Реклама помогает поддерживать
и развивать наш сервис.


Подробнее
(ссылка откроется в новой вкладке)