Создание 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;
}
}
}
?>
Добрый день, Камиль!
С большим удовольствием продолжаю смотреть Ваши видео-уроки. Для меня, как для новичка, все очень интересно и понятно излагаете. Спасибо Вам за Ваш труд. Надеюсь, увидеть на Вашем канале еще много полезных видео)
P.S: почему-то Ваш сайт у меня очень долго грузится =( , хотя интернет хороший и другие сайты загружаются быстро..
Здравствуйте, Дарья.
Очень рад вашим успехам, и вашему энтузиазму, к которым Камиль не имеет никакого отношения. У вас есть цель, и вы ее прекрасно выполняете. Спасибо вам за яркий пример для всех и для меня в том числе.
Уроки будут — не планирую останавливаться.
Что касается загрузки сайта, то не встречал жалоб. Возможно, последние действия РКН (РосКомНадзора) оставляют «следы» — некоторые ресурсы google, коих у меня на странице не мало, возможно, еще не везде разблокированы.
Для добавления товара нужна кнопка
Добавить
Павел, код в комментариях отображаться не будет в целях защиты. Опишите ситуацию на мою почту.