Advertisement
  1. Code
  2. PHP

Створюємо кошик на PHP та MySQL

Scroll to top
Read Time: 13 min

() translation by (you can also view the original English article)

У цьому щотижневому уроці screencast + ми навчимося створювати власний кошик з PHP і MySQL. Ви побачите, що все не так складно, як здається.


Попередній перегляд скрінкасту



Крок 1

Почнемо з розгляду структури папки:


Структура

  • reset.css - ви можете отримати файл reset з цього посилання
  • style.css - наш css файл, який ми будемо використовувати для стилю HTML макета
  • connection.php - файл для з'єднання з базою даних
  • index.php - шаблон нашого кошика покупок
  • cart.php - файл, який змінює продукти в кошику (додавання, видалення)
  • products.php - сторінка списку продуктів

Крок 2

Почнемо з розмітки html, а потім її оформлення. Відкрийте index.php і скопіюйте / вставте наступний код:

1
 
2
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 

3
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
4
 
5
<html xmlns="http://www.w3.org/1999/xhtml"> 
6
<head> 
7
   
8
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
9
	<link rel="stylesheet" href="css/reset.css" /> 
10
	<link rel="stylesheet" href="css/style.css" /> 
11
	 
12
	<title>Shopping cart</title> 
13
 
14
</head> 
15
 
16
<body> 
17
	 
18
	<div id="container"> 
19
 
20
		<div id="main"> 
21
			 
22
		</div><!--end main--> 
23
		 
24
		<div id="sidebar"> 
25
			 
26
		</div><!--end sidebar--> 
27
 
28
	</div><!--end container--> 
29
 
30
</body> 
31
</html>

Як ви бачите, наша сторінка має дві колонки: основний стовпець і sidebar. Тепер пройдемо в CSS. Відкрийте файл style.css і пропишіть наступний код:

1
 
2
	 
3
body { 
4
	font-family: Verdana; 
5
	font-size: 12px; 
6
	color: #444; 
7
} 
8
 
9
 
10
#container { 
11
	width: 700px; 
12
	margin: 150px auto; 
13
	background-color: #eee; 
14
	overflow: hidden; /* Set overflow: hidden to clear the floats on #main and #sidebar */ 
15
	padding: 15px; 
16
} 
17
 
18
	#main { 
19
		width: 490px; 
20
		float: left; 
21
	} 
22
 
23
	#sidebar { 
24
		width: 200px; 
25
		float: left; 
26
	}

Ось як повинна зараз виглядати сторінка продуктів:



Повний скрінкаст



Крок 3

Перш ніж перейти до частини PHP / MySQL, нам потрібно створити базу даних. Відкрийте phpMyadmin і виконайте наступні дії:

  1. Перейдіть на вкладку Privileges, натисніть кнопку додавання нового користувача і налаштуйте: Username: tutorial; Host: localhost; Password: supersecretpassword. Тепер переконайтеся, що встановлені Global privileges; потім переходите до наступного кроку.
  2. Створіть нову базу даних під назвою tutorials.
  3. Створіть нову таблицю products і встановіть кількість полів 4. Тепер заповніть ці поля так: id_integer - переконайтеся, що він встановлений в INT і позначте його як PRIMARY (також встановіть його в auto_increment); name - буде VARCHAR довжиною 100; description - VARCHAR довжиною 250; price - значення DECIMAL (2,6)
  4. Заповніть таблицю декількома прикладами продуктів.

Для економії часу я експортував свою таблицю, щоб ви просто запустили наступний запит:

1
 
2
CREATE TABLE IF NOT EXISTS `products` ( 
3
  `id_product` int(11) NOT NULL AUTO_INCREMENT, 
4
  `name` varchar(100) NOT NULL, 
5
  `description` varchar(250) NOT NULL, 
6
  `price` decimal(6,2) NOT NULL, 
7
  PRIMARY KEY (`id_product`) 
8
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ; 
9
 
10
INSERT INTO `products` (`id_product`, `name`, `description`, `price`) VALUES 
11
(1, 'Product 1', 'Some random description', '15.00'), 
12
(2, 'Product 2', 'Some random description', '20.00'), 
13
(3, 'Product 3', 'Some random description', '50.00'), 
14
(4, 'Product 4', 'Some random description', '55.00'), 
15
(5, 'Product 5', 'Some random description', '54.00'), 
16
(6, 'Product 6', 'Some random description', '34.00');




Крок 4

До отримання даних з бази даних я зроблю index.php шаблон для списку продуктів і кошики. Тому додайте наступний код в початок сторінки index.php:

1
 
2
<?php 
3
	session_start(); 
4
	require("includes/connection.php"); 
5
	if(isset($_GET['page'])){ 
6
		 
7
		$pages=array("products", "cart"); 
8
		 
9
		if(in_array($_GET['page'], $pages)) { 
10
			 
11
			$_page=$_GET['page']; 
12
			 
13
		}else{ 
14
			 
15
			$_page="products"; 
16
			 
17
		} 
18
		 
19
	}else{ 
20
		 
21
		$_page="products"; 
22
		 
23
	} 
24
?>
  1. session_start () - для подальшого використання; це дозволить нам використовувати сеанси (дуже важливо, щоб session_start був написаний раніше, ніж інші дані будуть відправлені в браузер).
  2. У другому рядку ми вкажемо connection.php, який встановить з'єднання з базою даних (ми розглянемо це в секунду). І ще одне: різниця між include і require полягає в тому, що якщо ви використовуєте require і файл не може бути знайдений, виконання скрипта закінчиться. Якщо ви використовуєте "include", скрипт продовжить працювати.
  3. Замість копіювання всього html-коду (посилання на css, на js) для кожного файлу на вашому сайті, можете просто зробити їх все відносно одного файлу. Спочатку я перевіряю, чи є змінна GET, звана "page set". Якщо немає, я створюю нову змінну _pages. Вказуючи спочатку змінну GET, звану pages, я хочу переконатися, що файл, який я збираюся включити, є допустимою сторінкою.

Для цього нам потрібно включити файл; додайте цей рядок в index.php між div з id "main":

1
 
2
	<?php require($_page.".php"); ?>

Тепер ми маємо повний index.php:

1
 
2
	<?php 
3
	session_start(); 
4
	require("includes/connection.php"); 
5
	if(isset($_GET['page'])){ 
6
		 
7
		$pages=array("products", "cart"); 
8
		 
9
		if(in_array($_GET['page'], $pages)) { 
10
			 
11
			$_page=$_GET['page']; 
12
			 
13
		}else{ 
14
			 
15
			$_page="products"; 
16
			 
17
		} 
18
		 
19
	}else{ 
20
		 
21
		$_page="products"; 
22
		 
23
	} 
24
 
25
?> 
26
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
27
<html xmlns="http://www.w3.org/1999/xhtml"> 
28
<head> 
29
	 
30
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
31
	<link rel="stylesheet" href="css/reset.css" /> 
32
	<link rel="stylesheet" href="css/style.css" /> 
33
	 
34
 
35
	<title>Shopping Cart</title> 
36
 
37
 
38
</head> 
39
 
40
<body> 
41
	 
42
	<div id="container"> 
43
 
44
		<div id="main"> 
45
			 
46
			<?php require($_page.".php"); ?> 
47
 
48
		</div><!--end of main--> 
49
		 
50
		<div id="sidebar"> 
51
			 
52
		</div><!--end of sidebar--> 
53
 
54
	</div><!--end container--> 
55
 
56
</body> 
57
</html>

Створимо з'єднання з MySQL. Відкрийте connections.php і пропишіть наступне:

1
 
2
	<?php 
3
 
4
	$server="localhost"; 
5
	$user="tutorial"; 
6
	$pass="supersecretpassword"; 
7
	$db="tutorials"; 
8
	 
9
	// connect to mysql 

10
	 
11
	mysql_connect($server, $user, $pass) or die("Sorry, can't connect to the mysql."); 
12
	 
13
	// select the db 

14
	 
15
	mysql_select_db($db) or die("Sorry, can't select the database."); 
16
 
17
?>

Крок 5

Пропишемо розмітку для сторінки продуктів. Відкрийте її та пропишіть наступне:

1
 
2
<h1>Product List</h1> 
3
	<table> 
4
	    <tr> 
5
	        <th>Name</th> 
6
	        <th>Description</th> 
7
	        <th>Price</th> 
8
	        <th>Action</th> 
9
	    </tr> 
10
	    <tr> 
11
	        <td>Product 1</td> 
12
	        <td>Some random description</td> 
13
	        <td>15 $</th> 
14
	        <td><a href="#">Add to cart</a></td> 
15
	    </tr> 
16
	     <tr> 
17
	        <td>Product 2</td> 
18
	        <td>Some random description</td> 
19
	        <td>25 $</th> 
20
	        <td><a href="#">Add to cart</a></td> 
21
	    </tr> 
22
	</table>

Поглянемо на сторінку:


Як ви бачите, це жахливо. Тому добавимо в файл стилю CSS наступний код: 

1
 
2
a {color: #48577D; text-decoration: none;} 
3
 
4
a:hover {text-decoration: underline;} 
5
 
6
h1, h2 {margin-bottom: 15px} 
7
 
8
h1 {font-size: 18px;} 
9
h2 {font-size: 16px} 
10
	#main table { 
11
			width: 480px; 
12
		} 
13
		 
14
			#main table th { 
15
				padding: 10px; 
16
				background-color: #48577D; 
17
				color: #fff; 
18
				text-align: left; 
19
			} 
20
			 
21
			#main table td { 
22
				padding: 5px; 
23
			} 
24
			#main table tr { 
25
				background-color: #d3dcf2; 
26
			}

Хорошо: тепер ми маємо інакший вигляд:


Виглядає набагато краще, чи не так? Внизу вказаний повний код style.css:

1
 
2
body { 
3
	font-family: Verdana; 
4
	font-size: 12px; 
5
	color: #444; 
6
} 
7
 
8
a {color: #48577D; text-decoration: none;} 
9
 
10
a:hover {text-decoration: underline;} 
11
 
12
h1, h2 {margin-bottom: 15px} 
13
 
14
h1 {font-size: 18px;} 
15
h2 {font-size: 16px} 
16
 
17
#container { 
18
	width: 700px; 
19
	margin: 150px auto; 
20
	background-color: #eee; 
21
	padding:15px; 
22
	overflow: hidden; 
23
} 
24
 
25
	#main { 
26
		width: 490px; 
27
		float: left; 
28
	} 
29
	 
30
		#main table { 
31
			width: 480px; 
32
		} 
33
		 
34
			#main table th { 
35
				padding: 10px; 
36
				background-color: #48577D; 
37
				color: #fff; 
38
				text-align: left; 
39
			} 
40
			 
41
			#main table td { 
42
				padding: 5px; 
43
			} 
44
			 
45
			#main table tr { 
46
				background-color: #d3dcf2; 
47
			} 
48
	 
49
	#sidebar { 
50
		width: 200px; 
51
		float: left; 
52
	}

Крок 6

Перш ніж отримати продукт з бази даних, давайте видалимо останні два рядки з нашої таблиці (були потрібні тільки для того, щоб побачити, як вона буде виглядати). Видалить це:

1
 
2
		    <tr> 
3
	        <td>Product 1</td> 
4
	        <td>Some random description</td> 
5
	        <td>15 $</th> 
6
	        <td><a href="#">Add to cart</a></td> 
7
	    </tr> 
8
	     <tr> 
9
	        <td>Product 2</td> 
10
	        <td>Some random description</td> 
11
	        <td>25 $</th> 
12
	        <td><a href="#">Add to cart</a></td> 
13
	    </tr>

Відмінно! Тепер в тому місці, де були рядки таблиці, введіть наступний код PHP:

1
 
2
	<?php 
3
 
4
	$sql="SELECT * FROM products ORDER BY name ASC"; 
5
	$query=mysql_query($sql); 
6
	 
7
	while ($row=mysql_fetch_array($query)) { 
8
		 
9
?> 
10
		<tr> 
11
		    <td><?php echo $row['name'] ?></td> 
12
		    <td><?php echo $row['description'] ?></td> 
13
		    <td><?php echo $row['price'] ?>$</td> 
14
		    <td><a href="index.php?page=products&action=add&id=<?php echo $row['id_product'] ?>">Add to cart</a></td> 
15
		</tr> 
16
<?php 
17
		 
18
	} 
19
 
20
?>
  1. Отже, спочатку ми використовуємо SELECT для отримання продуктів, потім перебираємо кожен рядок з бази даних і переводимо її на сторінку в рядку таблиці.
  2. Ви бачите, що anchor посилається на ту ж сторінку (коли користувач вибирає продукт, додаючи в кошик / сеанс). Ми передаємо деякі додаткові змінні, такі як id продукту.

Якщо ви вкажете одну з посилань для додавання в корзину, побачите в нижній частині сторінки, що id переданий.



Крок 7

Давайте зробимо anchor роботу, додавши наступний код в початок нашої сторінки:

1
 
2
<?php 
3
 
4
	if(isset($_GET['action']) && $_GET['action']=="add"){ 
5
		 
6
		$id=intval($_GET['id']); 
7
		 
8
		if(isset($_SESSION['cart'][$id])){ 
9
			 
10
			$_SESSION['cart'][$id]['quantity']++; 
11
			 
12
		}else{ 
13
			 
14
			$sql_s="SELECT * FROM products 

15
				WHERE id_product={$id}"; 
16
			$query_s=mysql_query($sql_s); 
17
			if(mysql_num_rows($query_s)!=0){ 
18
				$row_s=mysql_fetch_array($query_s); 
19
				 
20
				$_SESSION['cart'][$row_s['id_product']]=array( 
21
						"quantity" => 1, 
22
						"price" => $row_s['price'] 
23
					); 
24
				 
25
				 
26
			}else{ 
27
				 
28
				$message="This product id it's invalid!"; 
29
				 
30
			} 
31
			 
32
		} 
33
		 
34
	} 
35
 
36
?>
  1. Якщо змінна GET, звана action, встановлена ​​і її значення дорівнює ADD, ми виконуємо код.
  2. Ми переконуємося, що id, що пройшов через змінну GET, є цілим числом
  3. Якщо id продукту знаходиться в кошику SESSION, ми просто збільшуємо його кількість на 1
  4. Якщо id не перебуває у сеансі, нам потрібно переконатися, що id, що пройшов через змінну GET, існує в базі даних. Якщо так, ми беремо ціну і створюємо сесію. Якщо це не так, ми встановлюємо змінну з ім'ям message, яка буде містити нашу помилку.

Перевіримо, чи встановлена ​​ця змінна повідомлення і викличте її на сторінку (введіть цей код під заголовком сторінки H1):

1
 
2
		<?php 
3
		if(isset($message)){ 
4
			echo "<h2>$message</h2>"; 
5
		} 
6
	?>

Тепер ви можете побачити повну сторінку products.php.

1
 
2
<?php 
3
 
4
	if(isset($_GET['action']) && $_GET['action']=="add"){ 
5
		 
6
		$id=intval($_GET['id']); 
7
		 
8
		if(isset($_SESSION['cart'][$id])){ 
9
			 
10
			$_SESSION['cart'][$id]['quantity']++; 
11
			 
12
		}else{ 
13
			 
14
			$sql_s="SELECT * FROM products 

15
				WHERE id_product={$id}"; 
16
			$query_s=mysql_query($sql_s); 
17
			if(mysql_num_rows($query_s)!=0){ 
18
				$row_s=mysql_fetch_array($query_s); 
19
				 
20
				$_SESSION['cart'][$row_s['id_product']]=array( 
21
						"quantity" => 1, 
22
						"price" => $row_s['price'] 
23
					); 
24
				 
25
				 
26
			}else{ 
27
				 
28
				$message="This product id it's invalid!"; 
29
				 
30
			} 
31
			 
32
		} 
33
		 
34
	} 
35
 
36
?> 
37
	<h1>Product List</h1> 
38
	<?php 
39
		if(isset($message)){ 
40
			echo "<h2>$message</h2>"; 
41
		} 
42
	?> 
43
	<table> 
44
		<tr> 
45
			<th>Name</th> 
46
			<th>Description</th> 
47
			<th>Price</th> 
48
			<th>Action</th> 
49
		</tr> 
50
		 
51
		<?php 
52
		 
53
			$sql="SELECT * FROM products ORDER BY name ASC"; 
54
			$query=mysql_query($sql); 
55
			 
56
			while ($row=mysql_fetch_array($query)) { 
57
				 
58
		?> 
59
			<tr> 
60
			    <td><?php echo $row['name'] ?></td> 
61
			    <td><?php echo $row['description'] ?></td> 
62
			    <td><?php echo $row['price'] ?>$</td> 
63
			    <td><a href="index.php?page=products&action=add&id=<?php echo $row['id_product'] ?>">Add to cart</a></td> 
64
			</tr> 
65
		<?php 
66
				 
67
			} 
68
		 
69
		?> 
70
		 
71
	</table>

Це повідомлення помилки, якщо id продукту недійсний



Крок 8

Повернемося до index.php і пропишемо sidebar. Додайте наступний код:

1
 
2
	<h1>Cart</h1> 
3
	<?php 
4
	 
5
		if(isset($_SESSION['cart'])){ 
6
			 
7
			$sql="SELECT * FROM products WHERE id_product IN ("; 
8
			 
9
			foreach($_SESSION['cart'] as $id => $value) { 
10
				$sql.=$id.","; 
11
			} 
12
			 
13
			$sql=substr($sql, 0, -1).") ORDER BY name ASC"; 
14
			$query=mysql_query($sql); 
15
			while($row=mysql_fetch_array($query)){ 
16
				 
17
			?> 
18
				<p><?php echo $row['name'] ?> x <?php echo $_SESSION['cart'][$row['id_product']]['quantity'] ?></p> 
19
			<?php 
20
				 
21
			} 
22
		?> 
23
			<hr /> 
24
			<a href="index.php?page=cart">Go to cart</a> 
25
		<?php 
26
			 
27
		}else{ 
28
			 
29
			echo "<p>Your Cart is empty. Please add some products.</p>"; 
30
			 
31
		} 
32
	 
33
	?>
  1. Спочатку перевіримо, чи встановлений сеанс кошику. Якщо немає, ми виводимо повідомлення, попереджаючи користувача про те, що кошик порожній.
  2. Потім створюємо mysql SELECT, але ми вибираємо тільки ті продукти, які присутні в цьому сеансі. Для цього використовуємо функцію foreach. Отже, ми проходимо цикл і додаємо ідентифікатор продукту в SELECT. Потім ми використовуємо функцію substr для видалення останньої коми з SELECT.
  3. В кінці виводимо дані в браузер.

Подивіться на картинку знизу:



Оскільки index.php є шаблоном для всіх файлів, sidebar також буде видно в cart.php. Хіба це не круто?!


Крок 9

Нарешті, відкрийте cart.php і введіть наступний код:

1
 
2
<h1>View cart</h1> 
3
<a href="index.php?page=products">Go back to products page</a> 
4
<form method="post" action="index.php?page=cart"> 
5
     
6
	<table> 
7
	     
8
		<tr> 
9
		    <th>Name</th> 
10
		    <th>Quantity</th> 
11
		    <th>Price</th> 
12
		    <th>Items Price</th> 
13
		</tr> 
14
		 
15
		<?php 
16
		 
17
			$sql="SELECT * FROM products WHERE id_product IN ("; 
18
					 
19
					foreach($_SESSION['cart'] as $id => $value) { 
20
						$sql.=$id.","; 
21
					} 
22
					 
23
					$sql=substr($sql, 0, -1).") ORDER BY name ASC"; 
24
					$query=mysql_query($sql); 
25
					$totalprice=0; 
26
					while($row=mysql_fetch_array($query)){ 
27
						$subtotal=$_SESSION['cart'][$row['id_product']]['quantity']*$row['price']; 
28
						$totalprice+=$subtotal; 
29
					?> 
30
						<tr> 
31
						    <td><?php echo $row['name'] ?></td> 
32
						    <td><input type="text" name="quantity[<?php echo $row['id_product'] ?>]" size="5" value="<?php echo $_SESSION['cart'][$row['id_product']]['quantity'] ?>" /></td> 
33
						    <td><?php echo $row['price'] ?>$</td> 
34
						    <td><?php echo $_SESSION['cart'][$row['id_product']]['quantity']*$row['price'] ?>$</td> 
35
						</tr> 
36
					<?php 
37
						 
38
					} 
39
		?> 
40
					<tr> 
41
					    <td colspan="4">Total Price: <?php echo $totalprice ?></td> 
42
					</tr> 
43
		 
44
	</table> 
45
	<br /> 
46
	<button type="submit" name="submit">Update Cart</button> 
47
</form> 
48
<br /> 
49
<p>To remove an item, set it's quantity to 0. </p>

Він схожий на код з index.php і products.php, тому я не буду пояснювати все знову. Ви помітили, що кількість тепер відображається не в формі, а в поле введення (щоб ми могли змінювати кількість). Крім того, таблиця укладена в form tag. Щоб отримати загальну вартість елементів, ми множимо кількість конкретного продукту (з сеансу) id на його ціну. Це повторюється в кожному циклі.

ПРИМІТКА: input - це масив, key - це id продукту, а quantity - значення кількості.



Крок 10

Нарешті, нам потрібно змусити форму працювати. Тому додайте цей код в початок сторінки cart.php.

1
 
2
if(isset($_POST['submit'])){ 
3
 
4
foreach($_POST['quantity'] as $key => $val) { 
5
	if($val==0) { 
6
		unset($_SESSION['cart'][$key]); 
7
	}else{ 
8
		$_SESSION['cart'][$key]['quantity']=$val; 
9
	} 
10
} 
11
 
12
}
  1. Спочатку перевіряємо, чи була надана форма. Якщо була і значення введення дорівнювало нулю, ми скасовуємо цей сеанс.
  2. Якщо було будь-яке інше значення, замість нього ми вказуємо кількість.

Ось повний cart.php

1
 
2
	<?php 
3
 
4
	if(isset($_POST['submit'])){ 
5
		 
6
		foreach($_POST['quantity'] as $key => $val) { 
7
			if($val==0) { 
8
				unset($_SESSION['cart'][$key]); 
9
			}else{ 
10
				$_SESSION['cart'][$key]['quantity']=$val; 
11
			} 
12
		} 
13
		 
14
	} 
15
 
16
?> 
17
 
18
<h1>View cart</h1> 
19
<a href="index.php?page=products">Go back to the products page.</a> 
20
<form method="post" action="index.php?page=cart"> 
21
     
22
	<table> 
23
	     
24
		<tr> 
25
		    <th>Name</th> 
26
		    <th>Quantity</th> 
27
		    <th>Price</th> 
28
		    <th>Items Price</th> 
29
		</tr> 
30
		 
31
		<?php 
32
		 
33
			$sql="SELECT * FROM products WHERE id_product IN ("; 
34
					 
35
					foreach($_SESSION['cart'] as $id => $value) { 
36
						$sql.=$id.","; 
37
					} 
38
					 
39
					$sql=substr($sql, 0, -1).") ORDER BY name ASC"; 
40
					$query=mysql_query($sql); 
41
					$totalprice=0; 
42
					while($row=mysql_fetch_array($query)){ 
43
						$subtotal=$_SESSION['cart'][$row['id_product']]['quantity']*$row['price']; 
44
						$totalprice+=$subtotal; 
45
					?> 
46
						<tr> 
47
						    <td><?php echo $row['name'] ?></td> 
48
						    <td><input type="text" name="quantity[<?php echo $row['id_product'] ?>]" size="5" value="<?php echo $_SESSION['cart'][$row['id_product']]['quantity'] ?>" /></td> 
49
						    <td><?php echo $row['price'] ?>$</td> 
50
						    <td><?php echo $_SESSION['cart'][$row['id_product']]['quantity']*$row['price'] ?>$</td> 
51
						</tr> 
52
					<?php 
53
						 
54
					} 
55
		?> 
56
					<tr> 
57
					    <td colspan="4">Total Price: <?php echo $totalprice ?></td> 
58
					</tr> 
59
		 
60
	</table> 
61
	<br /> 
62
	<button type="submit" name="submit">Update Cart</button> 
63
</form> 
64
<br /> 
65
<p>To remove an item set its quantity to 0. </p>

Сподіваюся, урок вам сподобався. Якщо виникнуть запитання, подивіться більш докладний відеоурок!

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.