Создание php MVC приложения. Angular - редактирование и удаление из приложения

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

На прошлом уроке мы начали использовать angular js в нашем приложении. Сегодня мы продолжим писать angular код — реализуем функции редактирования и удаления товаров и базы данных

Для работы с сервером, как и на прошлом уроке, мы будем использовать встроенный в angular сервис $http. В качестве домашнего задания предлагаю вам самим реализовать функцию добавления нового товара в приложение.

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

<form class="form-horizontal" name="productInfo" data-ng-submit="saveProduct()">
    <input type="hidden" id="productId" data-ng-model="productId">
    <legend>Редактирование товара</legend>
    <div class="form-group">
        <label for="productName" class="col-sm-3">Наименование товара</label>
        <div class="col-sm-9">
            <input type="text" data-ng-model="productName" id="productName" class="form-control">
        </div>
    </div>
    <div class="form-group">
        <label for="productPrice" class="col-sm-3">Стоимость товара</label>
        <div class="col-sm-9">
            <input type="text" data-ng-model="productPrice" id="productPrice" class="form-control">
        </div>
    </div>
    <div class="form-group">
        <div class="col-sm-offset-3 col-sm-9">
            <button class="btn btn-default">Сохранить</button>
            <button class="btn btn-danger" type="button" data-ng-click="deleteProduct(productId)">Удалить</button>
        </div>
    </div>
</form>

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

 var app = angular.module('products', ["ngRoute"]);
app.config(function($routeProvider, $locationProvider){
    $routeProvider
        .when("/:id", {
            templateUrl : "/views/product.tpl.php"
        });

     $locationProvider.html5Mode(true);
})

app.controller('productsController', function($scope, $http, $window) {

    $scope.getInfoByProductId = function(id) {
        $http({
            method: "GET",
            url: "http://cabinet.codetogether.ru/cabinet/products/getProduct",
            params: {id: id}
        }).then(function(result){
            $scope.productId = result.data.id;
            $scope.productName = result.data.name;
            $scope.productPrice = result.data.price;
        })
    }

    $scope.saveProduct = function() {
        // TODO: Домашнее задание - добавить валидацию данных, реализовать удаление товара

        $scope.productName = angular.element("#productName").val();
        $scope.productPrice = angular.element("#productPrice").val();

        $http({
            method: "POST",
            url: "http://cabinet.codetogether.ru/cabinet/products/saveProduct",
            data: $.param({id: $scope.productId, name: $scope.productName, price: $scope.productPrice}),
            headers: {'Content-Type': 'application/x-www-form-urlencoded'}
        }).then(function(result){
            if(result.data.success) {
                $window.location.href = '/cabinet/products/';
            }
        })

    }

    $scope.addProduct = function() {
        // TODO: добавить валидацию данных
        $http({
            method: "POST",
            url: "http://cabinet.codetogether.ru/cabinet/products/addProduct",
            data: $.param({productName: $scope.newProductName, productPrice: $scope.newProductPrice}),
            headers: {'Content-Type': 'application/x-www-form-urlencoded'}
        }).then(function(result){
            // TODO: написать и вызвать метод получения всех продуктов
            if(result.data.success) {
                $window.location.reload();
            }
        })

    }

    $scope.deleteProduct = function(id) {
        $http({
            method: "POST",
            url: "http://cabinet.codetogether.ru/cabinet/products/deleteProduct",
            data: $.param({id: id}),
            headers: {'Content-Type': 'application/x-www-form-urlencoded'}
        }).then(function(result){
                $window.location.href = '/cabinet/products/';
        });
    }

});

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

<?php

class ProductsController extends Controller {

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

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

    public function index() {
        if(!$_SESSION['user']) {
            header("Location: /");
        }
        $this->pageData['products'] = $this->model->getAllProducts();
        $this->pageData['title'] = "Товары";
        $this->view->render($this->pageTpl, $this->pageData);

        if($_FILES) {
            if($_FILES['csv']['type'] != 'text/csv' || $_FILES['csv']['type'] == '') {
                $this->pageData['errors'] = "Ошибка! Возможно данный файл имеет некорректный формат";
            } else {
                if(move_uploaded_file($_FILES['csv']['tmp_name'],UPLOAD_FOLDER.$_FILES['csv']['name'])) {
                    $file = fopen(UPLOAD_FOLDER.$_FILES['csv']['name'], "r");
                    $row = 1;
                    while($data = fgetcsv($file, 200, ";")) {
                        if($row == 1) {
                            $row++;
                            continue;
                        } else {
                            $this->model->addFromCSV($data);
                        }
                    }
                    fclose($file);
                    $this->model->getAllProducts();
                }
            }
        }
    }

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

        if(!isset($_GET['id'])) {
            echo json_encode(array("success" => false));
        } else {
            $productId = $_GET['id'];
            $productInfo = json_encode($this->model->getProductById($productId));
            echo $productInfo;
        }

    }

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

        if(!isset($_POST['id']) || trim($_POST['name']) == '' || trim($_POST['price']) == '') {
            echo json_encode(array("success" => false));
        } else {
            $productId = $_POST['id'];
            $productName = trim($_POST['name']);
            $productPrice = trim($_POST['price']);

            if($this->model->saveProductInfo($productId, $productName, $productPrice)) {
                echo json_encode(array("success" => true));
            } else {
                echo json_encode(array("success" => false));
            }
        }
    }

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

        if(empty($_POST) || trim($_POST['productName']) == '' || trim($_POST['productPrice']) == '') {
            echo json_encode(array("success" => false));
        } else {
            $productName = trim($_POST['productName']);
            $productPrice = trim($_POST['productPrice']);

            if($this->model->addProduct($productName, $productPrice)) {
                echo json_encode(array("success" => true));
            } else {
                echo json_encode(array("success" => false));
            }
        }
    }

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

        if(empty($_POST) || !isset($_POST['id'])) {
            echo json_encode(array("success" => false));
        } else {
            $productId = $_POST['id'];
            if($this->model->deleteProduct($productId)) {
                echo json_encode(array("success" => true));
            } else {
                echo json_encode(array("success" => false));
            }
        }
    }

}

 ?>

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

<?php

class ProductsModel extends Model {

    public function getAllProducts() {
        $result = array();
        $sql = "SELECT * FROM products";
        $stmt = $this->db->prepare($sql);
        $stmt->execute();
        while($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
            $result[$row['id']] = $row;
        }
        return $result;
    }

    public function addFromCSV($data) {
        $sql = "INSERT INTO products(name, price) VALUES(:name, :price)";

        $stmt = $this->db->prepare($sql);
        $stmt->bindValue(":name", $data[0], PDO::PARAM_STR);
        $stmt->bindValue(":price", $data[1], PDO::PARAM_INT);
        $stmt->execute();
    }

    public function getProductById($id) {
        $result = array();
        $sql = "SELECT * FROM products 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 saveProductInfo($id, $name, $price) {
        $sql = "UPDATE products
                SET price = :price, name = :name
                WHERE id = :id
                ";
        $stmt = $this->db->prepare($sql);
        $stmt->bindValue(":price", $price, PDO::PARAM_INT);
        $stmt->bindValue(":name", $name, PDO::PARAM_STR);
        $stmt->bindValue(":id", $id, PDO::PARAM_INT);
        $stmt->execute();
        return true;
    }


    public function addProduct($productName, $productPrice) {
        $sql = "INSERT INTO products(name, price)
                VALUES(:productName, :productPrice)
                ";
        $stmt = $this->db->prepare($sql);
        $stmt->bindValue(":productName", $productName, PDO::PARAM_STR);
        $stmt->bindValue(":productPrice", $productPrice, PDO::PARAM_INT);
        $stmt->execute();
        return true;
    }

    public function deleteProduct($id) {
        $sql = "DELETE FROM products WHERE id = :id";
        $stmt = $this->db->prepare($sql);
        $stmt->bindValue(":id", $id, PDO::PARAM_INT);
        $stmt->execute();
        $count = $stmt->rowCount();
        if($count > 0) {
            return true;
        } else {
            return false;
        }

    }

}

 ?>

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

  1. Дарья

    Добрый день, Камиль!

    С большим удовольствием продолжаю смотреть Ваши видео-уроки. Для меня, как для новичка, все очень интересно и понятно излагаете. Спасибо Вам за Ваш труд. Надеюсь, увидеть на Вашем канале еще много полезных видео)

    P.S: почему-то Ваш сайт у меня очень долго грузится =( , хотя интернет хороший и другие сайты загружаются быстро..

    Ответить
  2. Камиль

    Здравствуйте, Дарья.
    Очень рад вашим успехам, и вашему энтузиазму, к которым Камиль не имеет никакого отношения. У вас есть цель, и вы ее прекрасно выполняете. Спасибо вам за яркий пример для всех и для меня в том числе.
    Уроки будут — не планирую останавливаться.
    Что касается загрузки сайта, то не встречал жалоб. Возможно, последние действия РКН (РосКомНадзора) оставляют «следы» — некоторые ресурсы google, коих у меня на странице не мало, возможно, еще не везде разблокированы.

    Ответить
  3. Павел

    Для добавления товара нужна кнопка
    Добавить

    Ответить
  4. Камиль

    Павел, код в комментариях отображаться не будет в целях защиты. Опишите ситуацию на мою почту.

    Ответить

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

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


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

Pin It on Pinterest

Share This