Это вроде работает, корзина появляется, но теперь другая проблема появилась. Если пользователь жмёт кнопку "В корзину" - значению value элемента #form-buy-data присваивается название товара, и его количество. И потом если пользователь захочет добавить в корзину ещё какой-нибудь товар, и жмёт "В корзину" - то вместо того, чтобы значение нового товара "добавлялось" в #form-buy-data, оно меняется, т.е. просто меняется на новое, а это не есть гуд, т.к. при оформлении заказа форма будет брать этот атрибут value, а там будут не все товары, а только последний, может кто знает как это исправить? Вот код script2.js (точку останова ставим на 149 строке, там где var mss = data.split(';')):
| JavaScript | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
| var basketAllShop = 0;
var basketAllPrice = 0;
var existsUpdateData = 1;
var tlp = new TheLandPage();
$(document).ready(function () {
// Кешируем объект окна
$window = $(window);
$('section[data-type="background"]').each(function () {
var $bgobj = $(this); // Назначаем объект
$(window).scroll(function () {
// Прокручиваем фон со скоростью var.
// Значение yPos отрицательное, так как прокручивание осуществляется вверх!
var yPos = -($window.scrollTop() / $bgobj.data('speed'));
// Размещаем все вместе в конечной точке
var coords = '50% ' + yPos + 'px';
// Смещаем фон
$bgobj.css({backgroundPosition: coords});
});
});
//
// Shop buy
//
// Update basket after loading page
setInterval(updateBasket, 500);
// Add new shop in user list
$('.add-shop-card').add('.shop-t-delete').on('click', function () {
var th = $(this);
var dataShopId = parseInt(th.attr('data-shop'));
var dataCount = parseInt(th.attr('data-count'));
//
var data = "p=2&shop_id=" + dataShopId + "&count=" + dataCount;
ajaxUpdateBasketData(data, 'inc/shop.php');
});
// Delete shop out basket
$('body').on('click', '.shop-update-count', function () {
var th = $(this);
var dataShopId = parseInt(th.attr('data-shop'));
var dataCount = parseInt(th.attr('data-count'));
//
var data = "p=2&shop_id=" + dataShopId + "&count=" + dataCount;
ajaxUpdateBasketData(data, 'inc/shop.php');
});
// Show and hide full list of shops buy
$('.show-all-buy').on('click', function () {
var fullListShops = $('#shop-all-list');
//
$('.show-all-buy').removeClass('hidden');
$(this).addClass('hidden');
//
if (fullListShops.hasClass('hidden')) {
fullListShops.removeClass('animated fadeOutDown');
fullListShops.addClass('animated fadeInUp');
fullListShops.removeClass('hidden');
}
else {
fullListShops.removeClass('animated fadeInUp');
fullListShops.addClass('animated fadeOutDown');
setTimeout(function () {
fullListShops.addClass('hidden');
}, 500);
}
});
// Form send data
tlp.ajaxForm('#form1', 'send.php');
tlp.ajaxForm('#form2', 'send.php');
tlp.ajaxForm('#form3', 'send.php');
tlp.ajaxForm('#form6', 'send2.php');
});
$(window).scroll(function () {
//
// Change shop menu
//
var windowTop = $(window).scrollTop() + 80;
var headerMenuShop = $('#header-shop-menu');
var menuShop = $('#menu');
var blockRegion = $('#box-5-w').offset().top + $('#box-5-w').height();
var animShow = 'fadeInUpRubber';
var animHidden = 'slideOutDown';
if (menuShop.offset().top < windowTop) {
// If user not visible block of shop
if (blockRegion < windowTop) {
if (!headerMenuShop.hasClass('hidden')) {
// Animated
var menuItems = $('.menu-5-small');
menuItems.removeClass('animated ' + animShow);
menuItems.addClass('animated ' + animHidden);
setTimeout(function () {
headerMenuShop.addClass('hidden');
}, 500);
}
}
// If user visible block of shop
else {
if (headerMenuShop.hasClass('hidden')) {
headerMenuShop.removeClass('hidden');
// Animated
var menuItems = $('.menu-5-small');
menuItems.removeClass('animated ' + animHidden);
menuItems.addClass('animated ' + animShow);
}
}
}
// If user higher block of shop
else {
if (!headerMenuShop.hasClass('hidden')) {
// Animated
var menuItems = $('.menu-5-small');
menuItems.removeClass('animated ' + animShow);
menuItems.addClass('animated ' + animHidden);
setTimeout(function () {
headerMenuShop.addClass('hidden');
}, 500);
}
}
});
//
// Work with shop basket
//
function updateBasket() {
if (existsUpdateData == 1) {
var file = 'inc/shop.php';
var basketBlock = $('#shop-card-block');
var basketItemsCount = $('#basket-items-count');
var basketItemsPrice = $('#basket-items-price');
var formBuyData = $('#form-buy-data');
// Update counters
$.ajax({
type: "GET",
url: file,
data: "p=0"
}).done(function (data) {
var mss = data.split(';');
basketAllShop = mss[0];
basketAllPrice = mss[1];
// update elements
basketItemsCount.html(basketAllShop);
basketItemsPrice.html(basketAllPrice);
formBuyData.val(mss[2]);
updateBasketShowState();
});
// Update html in basket
$.ajax({
type: "GET",
url: file,
data: "p=1"
}).done(function (data) {
basketBlock.html(data);
});
existsUpdateData = 0;
}
}
function updateBasketShowState() {
var basket = $('#shop-basket');
// Update basket bottom state
if (basketAllShop > 0) {
basket.removeClass('hidden');
basket.removeClass('animated fadeOutDown');
basket.addClass('animated fadeInUp');
}
else {
basket.removeClass('animated fadeInUp');
basket.addClass('animated fadeOutDown');
setTimeout(function () {
basket.addClass('hidden')
}, 500);
}
}
function ajaxUpdateBasketData(dataSend, file) {
$.ajax({
type: "GET",
url: file,
data: dataSend
}).done(function (data) {
existsUpdateData = 1;
if (data == 'new')
showAlert(1, 'Товар удачно добавлен в корзину');
if (data == 'update')
showAlert(1, 'Товар удачно обновлен в корзине');
if (data == 'delete')
showAlert(2, 'Товар удален из корзины');
});
}
function showAlert(type, text) {
var obj = $('.alert-success');
if (type == 2) {
obj = $('.alert-fail');
}
obj.html(text);
obj.removeClass('hidden');
obj.removeClass('animated fadeOut');
obj.addClass('animated fadeIn');
setTimeout(function () {
obj.removeClass('animated fadeIn');
obj.addClass('animated fadeOut');
setTimeout(function () {
obj.addClass('hidden');
}, 1000);
}, 2000);
}
/*
* Создаем элементы HTML5 для IE
*/
document.createElement("article");
document.createElement("section"); |
|
А вот файл shop.php и basket.class.php, который отдаёт js-скрипту обработанные данные:
shop.php:
| PHP | 1
2
3
| <?php
include_once "../inc/basket.class.php";
Basket::process(); |
|
basket.class.php:
| PHP | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
| <?php
class Basket {
static $error = 0;
static $response = '';
static $product = array();
static $process = 0;//0 - вывод продукта, 1 - вывод корзины, 2 - добавление/удаление товара
static $count = 0;//0 - удаление продукта
static $do = 0;//0 - удаление продукта
static function process() {
include_once "../inc/config.php";
include_once "../inc/mysqli.class.php";
DB::connect(DBUSER, DBPASS, DBNAME, DBHOST,1);
if (mysqli_connect_errno()) {
echo 'ќшибка подключени¤: ' . mysqli_connect_errno();
die();
}
session_start ();
self::$process = (int)(isset($_GET['p']) ? $_GET['p'] : 0);
switch (self::$process) {
case -1:
unset($_SESSION['basket']);
default:
case 0:
self::get_product();
break;
case 1:
self::get_basket();
break;
case 2:
self::add_remove_product();
break;
}
self::complete();
}
static function get_basket() {
$template = '
<div class="shop-t">
<div class="shop-update-count shop-t-delete" data-shop="{product_id}" data-count="0">+</div>
<div class="shop-t-photo"><img src="{img_path}"/></div>
<div class="shop-t-name">{product_name}</div>
<div class="shop-t-price">{price} руб.</div>
<div class="shop-t-count">
<span class="shop-update-count shop-t-count-minus" data-shop="{product_id}" data-count="0">-</span>
<span class="shop-t-count-num">{count}</span>
<span class="shop-update-count shop-t-count-plus" data-shop="{product_id}" data-count="2">+</span>
</div>
</div>
';
$html = '';
if (isset($_SESSION['basket'])) {
foreach ($_SESSION['basket']['products'] as $id => $prod_arr) {
if ( $prod_arr['count'] < 1) {
continue;
}
$t = $template;
$t = str_replace('{product_id}', $prod_arr['id'], $t);
$t = str_replace('{product_name}', $prod_arr['name'], $t);
$t = str_replace('{price}', $prod_arr['price'] * $prod_arr['count'], $t);
$t = str_replace('{count}', $prod_arr['count'], $t);
$t = str_replace('{img_path}', $prod_arr['basket_img'], $t);
$html .= $t;
}
}
self::$response = $html;
}
static function get_product() {
if (isset($_SESSION['basket'])) {
//print_r($_SESSION['basket']['products']);
$sum = 0;
$cnt = 0;
foreach ( $_SESSION['basket']['products'] as $id => $prod_arr ) {
if ($prod_arr['count'] < 1) {
continue;
}
//print_r($prod_arr);
$sum = $sum + $prod_arr['price'] * $prod_arr['count'];
$cnt++;
}
if ($sum == 0) {
self::$response = '0;0;';
} else {
self::$product = $_SESSION['basket']['products'][ $_SESSION['basket']['last_id'] ];
//self::$response = count($_SESSION['basket']['products']) . ';' . $sum . ';' . self::$product['name'] . '(' . $_SESSION['basket']['products'][self::$product['id']]['count'] . ')';
self::$response = $cnt . ';' . $sum . ';' . self::$product['name'] . '(' . $_SESSION['basket']['products'][self::$product['id']]['count'] . ')';
}
}
}
static function complete() {
DB::close();
switch (self::$error) {
case 0:
switch (self::$process) {
case -1:
header('Location: /');
case 0:
break;
case 1:
break;
case 2:
if (!isset($_SESSION['basket'])) {
$_SESSION['basket'] = array('last_id', 'products');
}
$_SESSION['basket']['products'][self::$product['id']] = self::$product;
$_SESSION['basket']['last_id'] = self::$product['id'];
self::$response = self::$do;
break;
}
break;
case 1:
//в базе продукт не найден
break;
case 2:
//количество продукта == 0
break;
case 3:
//не верные параметры запроса
break;
}
echo self::$response;
exit;
}
static function add_remove_product() {
$product_id = (int)(isset($_GET['shop_id']) ? $_GET['shop_id'] : 0);
self::$count = (int)(isset($_GET['count']) ? $_GET['count'] : -1);
if ($product_id == 0 || self::$count == -1) {
self::$error = 3;
} else {
if ( isset($_SESSION['basket']['products'][$product_id]) ) {
if (self::$count == 1 || self::$count > $_SESSION['basket']['products'][$product_id]['count']) {
$dir = 1;
} elseif (self::$count < $_SESSION['basket']['products'][$product_id]['count']) {
$dir = -1;
} else {
$dir = 1;
}
if ($dir == 1) {
self::$do = 'update';
} else {
self::$do = 'delete';
}
$_SESSION['basket']['products'][$product_id]['count'] = $_SESSION['basket']['products'][$product_id]['count'] + $dir;
self::$product = $_SESSION['basket']['products'][$product_id];
if ($_SESSION['basket']['products'][$product_id]['count'] < 1) {
unset($_SESSION['basket']['products'][$product_id]);
}
} else {
$sql = "
select * from products where id = " . $product_id. "
";
$q = DB::query( $sql );
if (!($row = DB::get_row($q))) {
self::$error = 1;
exit;
}
if ($row['count'] < 1) {
self::$error = 2;
exit;
}
self::$product = $row;
if (strlen(self::$product['name']) > 41) {
self::$product['name'] = substr(self::$product['name'], 0, 40) . '..';
}
self::$do = 'new';
}
}
}
} |
|
Как недавно выяснилось, это копия вот этого: http://dev.thelandpage.ru/body/ - там при добавлении нового товара в атрибут value значение добавляется, а не меняется.
0
|