Создание php MVC приложения. Редактирование профиля

Главная » Видеоуроки » PHP+MySQL » Создание php MVC приложения. Редактирование профиля

В этом уроке мы реализуем редактирование профиля пользователя нашего приложения (кабинета) — смена логина и email, а также смена пароля.

В этом уроке будет вновь использован angular. Также мы напишем sql запросы типа UPDATE.

Код урока (profile.tpl.php)

<!DOCTYPE html>
<html lang="ru" data-ng-app="profile">

<head>

    <meta charset="utf-8">
    <base href="/cabinet/products/">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <title><?php echo $pageData['title']; ?></title>

    <!-- Bootstrap Core CSS -->
    <link href="/css/bootstrap.min.css" rel="stylesheet">

    <!-- MetisMenu CSS -->
    <link href="/css/admin/metisMenu.min.css" rel="stylesheet">

    <!-- Custom CSS -->
    <link href="/css/admin/sb-admin-2.css" rel="stylesheet">

    <!-- Morris Charts CSS -->
    <link href="/css/admin/morris.css" rel="stylesheet">

    <!-- Custom Fonts -->
    <link href="/css/font-awesome.min.css" rel="stylesheet" type="text/css">

    <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
    <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
    <!--[if lt IE 9]>
        <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
        <script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
    <![endif]-->

</head>

<body>

    <div id="wrapper">

        <!-- Navigation -->
        <nav class="navbar navbar-default navbar-static-top" role="navigation" style="margin-bottom: 0">
            <div class="navbar-header">
                <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
                    <span class="sr-only">Toggle navigation</span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                </button>
                <a class="navbar-brand" href="index.html">Кабинет</a>
            </div>
            <!-- /.navbar-header -->

            <ul class="nav navbar-top-links navbar-right">
                <!-- /.dropdown -->
                <li class="dropdown">
                    <a class="dropdown-toggle" data-toggle="dropdown" href="#">
                        <i class="fa fa-user fa-fw"></i> <i class="fa fa-caret-down"></i>
                    </a>
                    <ul class="dropdown-menu dropdown-user">
                        <li><a href="/cabinet/profile"><i class="fa fa-user fa-fw"></i> Профиль</a>
                        </li>
                        <li class="divider"></li>
                        <li><a href="/cabinet/logout"><i class="fa fa-sign-out fa-fw"></i> Выйти</a>
                        </li>
                    </ul>
                    <!-- /.dropdown-user -->
                </li>
                <!-- /.dropdown -->
            </ul>
            <!-- /.navbar-top-links -->

            <div class="navbar-default sidebar" role="navigation">
                <div class="sidebar-nav navbar-collapse">
                    <ul class="nav" id="side-menu">

                        <li>
                            <a href="/cabinet"><i class="fa fa-area-chart"></i> Статистика</a>
                        </li>
                        <li>
                            <a href="/cabinet/products"><i class="fa fa-cart-plus"></i> Товары</a>
                        </li>
                        <li>
                            <a href="/cabinet/users"><i class="fa fa-user-o"></i> Пользователи</a>
                        </li>
                    </ul>
                </div>
                <!-- /.sidebar-collapse -->
            </div>
            <!-- /.navbar-static-side -->
        </nav>

        <div id="page-wrapper" data-ng-controller="profileController">
   			<div class="row">
   				<div class="col-md-12">
   					<h2><?php echo $pageData['title']; ?></h2>
   					<form class="form-horizontal" method="post" data-ng-submit="saveProfileData()">
   						<input type="hidden" name="userId" id="userId" value="<?php echo $pageData['userInfo']['id']; ?>">
   						<fieldset>
   							<div class="form-group">
   								<label for="login" class="col-md-4 control-label">Логин</label>
   								<div class="col-md-4">
   									<input class="form-control input-md" required="true" type="text" id="login" name="login" value="<?php echo $pageData['userInfo']['login']; ?>">
   								</div>
   							</div>

   							<div class="form-group">
   								<label for="login" class="col-md-4 control-label">Email</label>
   								<div class="col-md-4">
   									<input class="form-control input-md" required="true" type="email" id="email" name="email" value="<?php echo $pageData['userInfo']['email']; ?>">
   								</div>
   							</div>

   							<div class="form-group">
   								<div class="col-md-offset-4 col-md-8">
   									<button id="save" name="save" class="btn btn-success">Сохранить</button>
   								</div>
   							</div>
   						</fieldset>
   					</form>
   				</div>
   			</div>

   			<div class="row">
   				<div class="col-md-12">
   					<h2>Сменить пароль</h2>
   					<form class="form-horizontal" method="post" data-ng-submit="updatePassword()">
   						<input type="hidden" name="userId" id="userId" value="<?php echo $pageData['userInfo']['id']; ?>">
   						<fieldset>
   							<div class="form-group">
   								<label for="newPass" class="col-md-4 control-label">Новый пароль</label>
   								<div class="col-md-4">
   									<input class="form-control input-md" data-ng-model="newpass" required="true" type="password" id="newpass" name="newpass" value="">
   								</div>
   							</div>

   							<div class="form-group">
   								<label for="repeatPass" class="col-md-4 control-label">Повторите пароль</label>
   								<div class="col-md-4">
   									<input class="form-control input-md" data-ng-model="repeatpass" required="true" type="password" id="repeatPass" name="repeatPass" value="">
   								</div>
   							</div>

   							<div class="form-group">
   								<div class="col-md-offset-4 col-md-8">
   									<button id="update" name="update" class="btn btn-success">Обновить</button>
   								</div>
   							</div>
   						</fieldset>
   					</form>
   				</div>
   			</div>
        </div>
        <!-- /#page-wrapper -->

    </div>
    <!-- /#wrapper -->

    <!-- jQuery -->
    <script src="/js/jquery.js"></script>

    <!-- Bootstrap Core JavaScript -->
    <script src="/js/bootstrap.min.js"></script>

	<!-- Angular framework -->
    <script src="/js/angular.min.js"></script>    

    <script src="/js/admin/profile.js"></script>  

    <!-- Metis Menu Plugin JavaScript -->
    <script src="/js/admin/metisMenu.js"></script>

    <!-- Custom Theme JavaScript -->
    <script src="/js/admin/sb-admin-2.js"></script>

</body>

</html>

Код урока (profile.js)

var profile = angular.module('profile', []);

profile.controller("profileController", function($scope, $http, $window){

	$scope.saveProfileData = function() {
		id = angular.element("#userId").val();
		login = angular.element("#login").val();
		email = angular.element("#email").val();

		$http({
			method: "POST",
			url: "http://cabinet.kamil-abzalov.ru/profile/updateProfile",
			data: $.param({id: id, login: login, email: email}),
			headers: {"Content-Type": 'application/x-www-form-urlencoded'}
		}).then(function(result){
			// TODO
			console.log(result);
		})
	}


	$scope.updatePassword = function() {
		id = angular.element("#userId").val();

		$http({
			method: "POST",
			url: "http://cabinet.kamil-abzalov.ru/profile/updatePassword",
			data: $.param({id: id, newpass: $scope.newpass, repeatpass: $scope.repeatpass}),
			headers: {"Content-Type": 'application/x-www-form-urlencoded'}
		}).then(function(result){
			// TODO
			console.log(result);
		})
	}


})

Код урока (ProfileController.php)

<?php


class ProfileController extends Controller {


	private $pageTpl = "/views/profile.tpl.php";

	public function __construct() {
		$this->model = new ProfileModel();
		$this->view = new View();
	}

	public function index() {
		if(!$_SESSION['user']) {
			header("Location: /");
		}

		$userId = $_SESSION['userId'];
		$userInfo = $this->model->getAccountInfo($userId);
		$this->pageData['userInfo'] = $userInfo;
		$this->pageData['title'] = "Мой аккаунт";
		$this->view->render($this->pageTpl, $this->pageData);
	}

	public function updateProfile() {
		if(!$_SESSION['user']) {
			header("Location: /");
		}

		if(empty($_POST) || !isset($_POST['login']) || !isset($_POST['email'])) {
			echo json_encode(array("success" => false, "text" => "Введите все данные"));
		} else {
			$profileId = $_POST['id'];
			$profileLogin = trim($_POST['login']);
			$profileEmail = trim($_POST['email']);
			if($this->model->updateProfile($profileId, $profileLogin, $profileEmail)) {
				echo json_encode(array("success" => true));
			} else {
				echo json_encode(array("success" => false, "text" => "Ошибка при обновлении"));
			}
		}		
	}

	public function updatePassword() {
		if(!$_SESSION['user']) {
			header("Location: /");
		}

		if(empty($_POST) || !isset($_POST['newpass']) || !isset($_POST['repeatpass'])) {
			echo json_encode(array("success" => false, "text" => "Ошибка ввода пароля"));
		} else {
			$profileId = $_POST['id'];
			$newPass = trim($_POST['newpass']);
			$repeatPass = trim($_POST['repeatpass']);

			if($newPass != $repeatPass) {
				echo json_encode(array("success" => false, "text" => "Пароли не совпадают"));
			} else {
				if($this->model->updatePassword($profileId, md5($newPass))) {
					echo json_encode(array("success" => true));
				} else {
					echo json_encode(array("success" => false, "text" => "Ошибка"));
				}
			}

		}		
	}

}

Код урока (ProfileModel.php)

<?php

class ProfileModel extends Model {


	public function getAccountInfo($id) {

		$result = array();
		$sql = "SELECT id, login, email FROM users WHERE id = :id";

		$stmt = $this->db->prepare($sql);
		$stmt->bindValue(":id", $id, PDO::PARAM_INT);
		$stmt->execute();
		$result = $stmt->fetch(PDO::FETCH_ASSOC);
		return $result;

	}


	public function updateProfile($id, $login, $email) {

		$sql = "UPDATE users
				SET login = :login, email = :email
				WHERE id = :id";

		$stmt = $this->db->prepare($sql);
		$stmt->bindValue(":login", $login, PDO::PARAM_STR);
		$stmt->bindValue(":email", $email, PDO::PARAM_STR);
		$stmt->bindValue(":id", $id, PDO::PARAM_INT);
		$stmt->execute();
		return true;

	}

	public function updatePassword($id, $password) {

		$sql = "UPDATE users
				SET password = :password
				WHERE id = :id";

		$stmt = $this->db->prepare($sql);
		$stmt->bindValue(":password", $password, PDO::PARAM_STR);
		$stmt->bindValue(":id", $id, PDO::PARAM_INT);
		$stmt->execute();
		return true;

	}

}

Код урока (IndexModel.php)

<?php

class IndexModel extends Model {

	
	public function checkUser() {

		$login = $_POST['login'];
		$password = md5($_POST['password']);

		$sql = "SELECT * FROM users WHERE login = :login AND password = :password";

		$stmt = $this->db->prepare($sql);
		$stmt->bindValue(":login", $login, PDO::PARAM_STR);
		$stmt->bindValue(":password", $password, PDO::PARAM_STR);
		$stmt->execute();


		$res = $stmt->fetch(PDO::FETCH_ASSOC);


		if(!empty($res)) {
			$_SESSION['user'] = $_POST['login'];
			$_SESSION['userId'] = $res['id'];
			header("Location: /cabinet");
		} else {
			return false;
		}

	}

}

4 комментария

  1. Владимир

    angular при смене логина и пароля не работает

    Ответить
      • Владимир

        Здравствуйте)
        Можно как-нибудь сделать без ангулара, редактирование всего этого?
        Подскажите пожалуйста,я новичок в этом.

        P.S С Уважением

        Ответить
        • Камиль

          Здравствуйте. Можно конечно. Можно без js вообще это сделать. Но на js актуальнее и удобнее

          Ответить

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *


Срок проверки reCAPTCHA истек. Перезагрузите страницу.

Pin It on Pinterest

Share This