После добавления товара, первый товар добавляется и возвращается одновременно, последующие товары добавляются
после клика, а возвращаются после повторного клика.
Получается или $_SESSION после добавления товара не
обновляется (но тогда почему первый
товар добавился и вернулся одновременно?!)
или json передается только в одну сторону (???).
Пробовал использовать session_regenerate_id () - безрезультатно.
Почему так получается?
function addToCart(id) {
$.ajax({
url: 'json.php',
type: 'post',
data: 'products_id=' + id,
dataType: 'json',
success: function(json) {
if (json['name']) {
html = '<div>' + json['name'] + '</div>';
$('#cart-success').html('<div>' + html + '</div>');
}
} }); }
<?php
include ('includes/top.php');
//добавляется товар в корзину
$_SESSION['cart']->add_cart($_POST['products_id'],
$_SESSION['cart']->get_quantity(os_get_uprid($_POST['products_id'], 0)) + os_remove_non_numeric(1, 0));
//получается список товаров
$products = $_SESSION['cart']->get_products();
//формируется строка с таблицей для отправки через json
$data_products = '<table>';
$data_products .= '<tr><td>N</td>
<td>Goods</td>
<td>Quantity</td>
<td>Price</td></tr>' ;
for ($i = 0, $n = sizeof($products); $i < $n; $i++) {
$data_products .= '<tr>
<td></td>
<td><a href="'.os_href_link(FILENAME_PRODUCT_INFO,
os_product_link($products[$i]['id'],
$products[$i]['name'])).'">'.$products[$i]['name'].'</a></td>
<td>'.$products[$i]['quantity'].'</td>
<td>'.$osPrice->Format($products[$i]['price'], true).'</td>
<td>'.$sum.'</td></tr>' . "\n";
$data_products .= '</tr>' . "\n";
}
$data_products .= '</table>';
//заполняется массив $json
$json = array();
$json ['name'] = $data_products;
echo json_encode($json);
?>
<a onclick="addToCart('.$id.');">Click</a>
Спустя 18 минут, 58 секунд (30.07.2012 - 15:10) SerginhoLD написал(а):
я ничего не понял, но вот в js при работе с json правильно писать так:
if (json.name) {
html = '<div>' + json.name + '</div>';
// ...
}
Спустя 6 минут, 30 секунд (30.07.2012 - 15:17) OleKh написал(а):
вот тут работает правильно, после того как товар добавляется в корзину, товар в корзине отображается - http://next2nowt.com/demo2/, на движке OpenCart, я пробую прикрутить этот модуль к Shopos, у меня json работает, данные передаются и принимаются, НО одно НО, когда добавляется новый товар, товар отображается в корзине после повторного клика
Спустя 18 минут, 19 секунд (30.07.2012 - 15:35) OleKh написал(а):
Цитата (SerginhoLD @ 30.07.2012 - 13:10) |
я ничего не понял, но вот в js при работе с json правильно писать так:
|
и так и так работает одинаково, буду знать, спс
Спустя 2 часа, 49 минут, 43 секунды (30.07.2012 - 18:25) OleKh написал(а):
Может быть эта дополнительная информация что-то прояснит. Я уже теряюсь в догадках.
Скрины из firebug. На одном скрине передача POST запросов товаров id 1194, 1195, 1196, на другом JSON ответы.
После запроса id 1194 возврат output 1194,
id 1195 возврат output 1194
id 1196 возврат output 1195
Проверил прием/передачу JSON не через $_SESSION следующим образом (запросы-возврат совпадают, в отличии от вышеуказанного).
$test= $_POST['products_id'];
$json = array();
$json ['name'] = $test;
echo json_encode($json);
Скрины:
Скрины из firebug. На одном скрине передача POST запросов товаров id 1194, 1195, 1196, на другом JSON ответы.
После запроса id 1194 возврат output 1194,
id 1195 возврат output 1194
id 1196 возврат output 1195
Проверил прием/передачу JSON не через $_SESSION следующим образом (запросы-возврат совпадают, в отличии от вышеуказанного).
$test= $_POST['products_id'];
$json = array();
$json ['name'] = $test;
echo json_encode($json);
Скрины:
Спустя 3 часа, 6 минут, 41 секунда (30.07.2012 - 21:31) bodja написал(а):
OleKh
Через JSON передается JS а не HTML,зачем делать пародию?
Через JSON передается JS а не HTML,зачем делать пародию?
Спустя 51 минута, 6 секунд (30.07.2012 - 22:22) OleKh написал(а):
Цитата (bodja @ 30.07.2012 - 19:31) |
OleKh Через JSON передается JS а не HTML,зачем делать пародию? |
Почему пародию. Я сделал pop-up корзину на fancybox, но корзина оказалась тормознутая, пришлось поискать решение поинтереснее, нашел вот такой плагин, пример на http://next2nowt.com/demo2/ и решил попробовать сделать вариант для другого движка. Почти получилось, кроме вот того, что тут уже написано. А где конкретно передается html через json? В данном случае на сервер передается POST запрос 'product_id=' + id, обратно массив json, значение которого html таблица с данными (строка php), сформированная в php. Проблемка только в том, что где-то ошибка или недорботка. Скорее всего связано с сессиями, одним запросом добавить товар в $_SESSION['cart'], затем обновить $_SESSION['cart'], затем выбрать из $_SESSION['cart'] не получается. Поэтому товар добавляется в $_SESSION['cart'] и выбирается из $_SESSION['cart'] без вновь добавленного товара. А при следующем запросе отображается.
Спустя 17 минут, 39 секунд (30.07.2012 - 22:40) SerginhoLD написал(а):
Ну проверь на ошибки тогда свой класс 'cart', да и что у тебя написано в top.php никто не знает
Спустя 9 часов, 42 минуты, 56 секунд (31.07.2012 - 08:23) OleKh написал(а):
Ошибок не нашел. Нашел почему так получалось.
Убрал комменты с $products_query = os_db_query("...."); и
закомментировал $products = get_products_cache(os_get_prid($products_id); ... .
Создал новый метод специально для json где товары вытягиваются из базы.
Работает нормально.
Не хотелось бы создавать лишнего,
а просто добавить где-то в начале функции get_products_cache () что-то типа session_regenerate_id (); для обновление cache,
но к сожалению этот вариант выдает ошибку.
Убрал комменты с $products_query = os_db_query("...."); и
закомментировал $products = get_products_cache(os_get_prid($products_id); ... .
Создал новый метод специально для json где товары вытягиваются из базы.
Работает нормально.
Не хотелось бы создавать лишнего,
а просто добавить где-то в начале функции get_products_cache () что-то типа session_regenerate_id (); для обновление cache,
но к сожалению этот вариант выдает ошибку.
function get_products_cache ($products_id)
{
global $get_products_cache;
$cont = $_SESSION['cart']->contents;
if (empty($get_products_cache))
{
$sql = '';
foreach ($cont as $val => $_val)
{
if (empty($sql))
{
$sql .= ' p.products_id = \''.$val.'\'';
}
else
{
$sql .= ' or p.products_id = \''.$val.'\'';
}
}
$sql = '('.$sql.')';
$product_query = osDBquery("select p.products_id, pd.products_name,p.products_shippingtime, p.products_image, p.products_model, p.products_price, p.products_discount_allowed, p.products_weight, p.products_tax_class_id from ".TABLE_PRODUCTS." p, ".TABLE_PRODUCTS_DESCRIPTION." pd where ".$sql." and pd.products_id = p.products_id and pd.language_id = '".$_SESSION['languages_id']."'");
if (os_db_num_rows($product_query,true))
{
while ($products = os_db_fetch_array($product_query,true))
{
$get_products_cache[$_SESSION['languages_id']][$products['products_id']] = $products;
}
}
if (empty($get_products_cache)) $get_products_cache = 1;
if (isset($get_products_cache[$_SESSION['languages_id']][$products_id])) return $get_products_cache[$_SESSION['languages_id']][$products_id];
else return false;
}
else
{
return @$get_products_cache[$_SESSION['languages_id']][$products_id];
}
}
Спустя 16 часов, 41 минута, 9 секунд (1.08.2012 - 01:04) bodja написал(а):
Цитата |
Почему пародию. Я сделал pop-up корзину на fancybox, но корзина оказалась тормознутая, пришлось поискать решение поинтереснее, нашел вот такой плагин, пример на http://next2nowt.com/demo2/ и решил попробовать сделать вариант для другого движка. Почти получилось, кроме вот того, что тут уже написано. |
Такие окошки спокойно делаются максиум 50 строчками обычного JS ,а не от 50кило либ и плагинов.
Цитата |
А где конкретно передается html через json? |
Если судить по скинам - то везде.
Цитата |
В данном случае на сервер передается POST запрос 'product_id=' + id, обратно массив json, значение которого html таблица с данными (строка php), сформированная в php. Проблемка только в том, что где-то ошибка или недорботка. |
Недоработка в том ,что добавление товара в корзину можно сделать без сессий в частности и без ПХП вообще.
ЗЫ То ,что вы находите в инете ,не обязательно должно быть примером для подражания,
старайтесь думать своей головой.
Спустя 23 минуты, 1 секунда (1.08.2012 - 01:27) sebastjan написал(а):
Полностью с тобой соглан по поводу корзины без ПХП на яваскрипт.
Но по любому надо делать адменке скрипт проверки введённых данных.
Да и по умному, всегда сидит конкретный человек и перепроверяет все покупки.
Вот ему и надо сделать хорошую админку а тут уже без РНР не обойтись.
Но по любому надо делать адменке скрипт проверки введённых данных.
Да и по умному, всегда сидит конкретный человек и перепроверяет все покупки.
Вот ему и надо сделать хорошую админку а тут уже без РНР не обойтись.
Спустя 6 минут, 27 секунд (1.08.2012 - 01:34) bodja написал(а):
sebastjan
Я про сам процесс добавления товара в корзину на сайте,
при подаче заявки ,тут уж кто как хочет,можно хоть простым мылом отсылать.
ЗЫ Очередная прикольная ава?
Я про сам процесс добавления товара в корзину на сайте,
при подаче заявки ,тут уж кто как хочет,можно хоть простым мылом отсылать.
ЗЫ Очередная прикольная ава?
Спустя 1 день, 5 часов, 57 минут, 52 секунды (2.08.2012 - 07:32) OleKh написал(а):
bodja
Цитата |
Такие окошки спокойно делаются максиум 50 строчками обычного JS ,а не от 50кило либ и плагинов. |
Есть ссылки на посмотреть?
Спустя 9 часов, 22 минуты, 52 секунды (2.08.2012 - 16:54) bodja написал(а):
Вот пример из моего кода ,окошко для мыла с основными полями,накладывает полупрозрачную маску и можно закрыть потом.
function Mail() {
this.mask = document.createElement('div');
this.mask.style.cssText = 'position:fixed;width:100%;height:100%;left:0px;top:0px;background:#888;opacity:0.5;';
this.container = document.createElement('div');
this.container.style.cssText = 'position:fixed;width:500px;height:320px;left:100px;top:100px;font:13px Arial;background:#eee;';
this.title = document.createElement('div');
this.title.style.cssText = 'position:absolute;width:500px;height:32px;left:0px;top:0px;font:bold 13px Arial;background:#eef;';
this.title.innerHTML = 'написать письмо';
this.topic = document.createElement('input');
this.topic.style.cssText = 'position:absolute;width:480px;height:24px;left:10px;top:40px;font:13px Arial;border:solid 1px #000;';
this.topic.value = 'название темы';
this.text = document.createElement('textarea');
this.text.style.cssText = 'position:absolute;width:480px;height:200px;left:10px;top:70px;font:13px Arial;border:solid 1px #000;';
this.text.value = 'текст письма';
this.mymail = document.createElement('input');
this.mymail.style.cssText = 'position:absolute;width:160px;height:24px;left:10px;top:280px;font:13px Arial;border:solid 1px #000;';
this.mymail.value = 'мое мыло';
this.close = document.createElement('img');
this.close.style.cssText = 'position:absolute;width:24px;height:24px;left:470px;top:3px;font:13px Arial;border:solid 1px #000;cursor:pointer';
this.but = document.createElement('div');
this.but.style.cssText = 'position:absolute;width:100px;height:24px;left:390px;top:280px;font:13px Arial;border:solid 1px #000;';
this.but.innerHTML = 'отправить';
this.open = function (name) {
this.content.appendChild(this.topic);
this.text.value ='текст письма от '+ name;
this.container.appendChild(this.title);
this.container.appendChild(this.text);
this.container.appendChild(this.mymail);
this.content.appendChild(this.close);
this.content.appendChild(this.but);
document.body.appendChild(this.mask);
document.body.appendChild(this.container);
}
this.close.onclick = function (o) {
return function () {
document.body.removeChild(o.mask);
document.body.removeChild(o.container);
}
}
(this);
}