Javascript-форум (https://javascript.ru/forum/)
-   Серверные языки и технологии (https://javascript.ru/forum/server/)
-   -   Вывод товара в корзине (https://javascript.ru/forum/server/55802-vyvod-tovara-v-korzine.html)

arhat78 17.05.2015 16:18

laimas, благодарю и на этом :thanks: Буду изучать новое построение конструкции корзины и всё, что с ней связано. Надеюсь, получится.

arhat78 20.05.2015 11:23

laimas, в общем смотрел я, читал, пытался вникнуть, и понял, что здесь вообще ничего не понял :( Сколько видел уроков с объяснениями, там была моя структура корзины. А здесь, у вас - капец просто. Я уверен, что если грамотно, по вашему корзину построить, то будет всё по науке. Но вот где найти уроки с объяснениями.....?

laimas 20.05.2015 11:56

Не знаю, где эти уроки по корзине "как у меня" можно увидеть, но может лучше стоит подумать, зайдя с другой стороны? :)

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

Будем рассуждать, и для начала забиваем и на РНР, и на все остальные языки, а будем оперировать исключительно блокнотом и карандашом.

Есть магазин, в котором туфли: "Туфли черные", цена 100, размеры 40, 41; "Туфли красные", цена 110, размеры 41, 42; "Туфли белые", цена 150, размер 42.

Выбираем "Туфли черные", одну пару размера 40, и пишет в блокноте:

"Туфли черные": 100 руб., 40 разм., 1 шт.

Затем выбрали еще "Туфли красные", добавляем в блокнот запись и в нем уже будет так:

"Туфли черные": 100 руб., 40 разм., 1 шт.
"Туфли красные": 110 руб., 41 разм., 1 шт.


Затем решили добавить еще "Туфли черные", но 41 размера и две пары. Вопрос - как выгоднее записать этот выбор в блокноте, так:

"Туфли черные": 100 руб., 40 разм., 1 шт.
"Туфли красные": 110 руб., 41 разм., 1 шт.
"Туфли черные": 100 руб., 41 разм., 2 шт.


или так:

"Туфли черные": 100 руб., 40 разм., 1 шт., 41 разм. 2 шт.
"Туфли красные": 110 руб., 41 разм., 1 шт.


?

arhat78 20.05.2015 12:02

Как по мне, то первый вариант....(это я про вывод в корзине)
Цитата:

Сообщение от laimas (Сообщение 371609)
"Туфли черные": 100 руб., 40 разм., 1 шт.
"Туфли красные": 110 руб., 41 разм., 1 шт.
"Туфли черные": 100 руб., 41 разм., 2 шт.

А вот оптимально хорошо выглядит второй вариант.

А уроки про "магазин и корзину" - могу ссылку сбросить :)

laimas 20.05.2015 13:37

Не надо мне ссылок, ибо они кроме "порослей вредного" ничего вам не принесли, так как выбранный вами вариант, это как раз есть самый неудобный даже для блокнота с карандашом, не говоря о компьютере.
Не дай бог и я заражусь. :)

Он не удобен тем, что при подсчетах нужно будет пробегать по всем строкам в блокноте, чтобы найти одни и те же туфли, и если выбор туфлей будет на нескольких его страницах, то такой расчет будет затруднителен. А вот при втором варианте каждая запись, это какие-то одни туфли, для которых описаны различные наборы, и расчет всего, это удобно получить сумму за туфли, затем последовательно суммируя ее с суммой следующей строки. Выискивать записи среди страниц блокнота не придется, а просто перелистываем их когда сумма на текущей просчитана.

Легенда гласит - труд сделал из обезьяны человека, и когда он понял, что считать на косточках не удобно он придумал компьютер. А чтобы компьютер понимал что от него хотят, человек придумал инструкции для него, которые облек в понятие "язык мышления для компьютера". Эти инструкции описывают конкретные представления человека, например, bcdiv(a, b, c) означает - "взять косточку а, разбить ее на b частей, и кроме полученных частей собрать еще и с осколков". А набором таких различных инструкций можно описать задачу, которую и выполнит компьютер, например, сколько литров наваристого борща получится из косточки разделенной на части, включая и осколки.

То есть компьютер всего лишь решает задачу описывающую чисто наши представления о быте, в данном случае "борщ". Чем глубже и разностороннее будут наши представления о мире, чем более удачно мы сможет представлять решения проблем, тем более выгодные инструкции для компьютера, нами придуманные, мы выберем для описания этих представлений и решения проблем, тем оперативнее компьютер выдаст результат.

Компьютер выполняет ровно то, что мы от него хотим. А вот если бы наш мир появился не согласно легенде, а в результате большого взрыва (как и вселенной) появились машинные инструкции, которые породили компьютер, которые породили бы нас... Вот тогда все было бы иначе - компьютер бы разбил а на b частей и с осколков, и напечатал - "это борщ, ешь и не гавкай". :-?

Есть такой лозунг - "Мы не рабы, рабы не мы!". Мы не рабы машин, мы управляем ими. Хотя айпады поработили человека, но это из области привычек и потребления, "ум" в айпады все равно человек вложил. Поэтому начинать надо с изначального - с представления того, что я хочу от машины, и только потом облекать желание в инструкции. А тут блокнот и карандаш тоже могут помочь. И вообще, существуют блок-схемы, посредством которых можно описать компьютерную программу. Такие схемы не содержат конкретных функций языка, но они хорошо иллюстрируют алгоритм программы, ее конструкцию, блоки, важные узлы.

Попробуйте с блокнотом, думаю польза будет, а нет, ну тогда не знаю. Расписывать же уроки и некогда, да и не всегда охота писать много. :)

arhat78 21.05.2015 12:10

laimas, вот у меня есть сессия
$_SESSION['cart'] = array()


А мне, получается, нужно записывать этот массив таким образом?
$_SESSION['cart'] = array(
       209 => array(
          'count' => 3,
          'price'  => 1500,
          'prop' => array('size'=>array(42 => 2, 41 => 1), 'name' => 'Галоши')
       ),
  
       150 => array(
          'count' => 2,
          'price'  => 1000,
          'prop' => array('size'=>array(40 => 1, 41 => 1), 'name' => 'Туфли')
       )
);


И у меня, получается, много лишнего написано? Этот кэйс :
case('add_to_cart'):
      $id = $_GET['id'];
      $size = $_GET['size'];
      $_SESSION['cart_size'][$id] = $size;
      
      $add_item = add_to_cart($id);
      $_SESSION['total_items'] = total_items($_SESSION['cart']);
      $_SESSION['total_price'] = total_price($_SESSION['cart']);
      header('Location:index.php?view=product&id='.$id);
   break;


И вот это, функция добавления в корзину:
function add_to_cart($id, $size)
{
    if(isset($_SESSION['cart'][$id]))
     {
        $_SESSION['cart'][$id]++;
        return true;
     }       
    else
    {
        $_SESSION['cart'][$id] = 1;
        return true;
    }
        return false; 
}


А как же быть с этими функциями подсчёта общего количества и общей суммы?:

function total_items($cart)
{
    $num_items = 0;
    
    if(is_array($cart))
    {
        foreach($cart as $id => $qty)
        {
            $num_items +=  $qty;
        }
        return $num_items;
    }
}



function total_price($cart)  
{
    $total_price = '0.00';
    
    global $link;
    
    if(is_array($cart))
    {
        foreach($cart as $id => $qty)
        {           
            $result = $link->query("SELECT price FROM products WHERE id='$id' ");
                       
            if($result)
            {
                $item_price = mysqli_fetch_assoc($result);
                $total_price +=  $item_price['price'] * $qty;
            }          
        }
        return $total_price;         
    }
}


В общем, что делать???? Как исправляться???? Неужели потратил год в пустую????

laimas 21.05.2015 19:02

Кто задавал вопрос о различных размерах ботинок? Если размеры различные и при этом это один ID товара, то каким образом можно узнать что заказаны те или иные его размеры поступая вот таким образом $_SESSION['cart'][$id]++; ?
Если же каждый ID товара может описывать только один размер, тогда да можно было бы так поступать - нет такого ID в корзине, значит добавляем, есть, значит увеличиваем его количество.

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

arhat78 21.05.2015 22:27

Я понимаю, что здесь прибавляется в корзине только определённый товар - $_SESSION['cart'][$id]++; А можно в эту сессию добавить каким то образом идентификатор или ключ размера?

laimas 22.05.2015 01:21

Добавляйте, а каким-то каким образом, понятия не имею, попробуйте "как-то". :)

Я описывал структуру корзины, которая описывает наборы не только товаров, но и учитывает их характеристики, в данном случае размеры, а могут быть еще и цвет, и другое. Чем эта структура не устраивает ваш магазин?

arhat78 22.05.2015 17:46

laimas, сейчас для меня эта структура без пошаговых объяснений, как переводчику заглянуть в учебник по термоядерной динамике :lol:

Пробовал вот такой составной ключ:
$add_item = add_to_cart(sprintf('id%ds%d', $id, $size));

но здесь, когда добавляю один ботинок с двумя разными размерами, в корзине выводится этот ботинок двумя отдельными строчками, но без количества, размеров.....

Ещё пробовал такую проверку в корзине, но от этой проверки толка нет...:

if ($product !== get_product($id)) 
      {
       echo $_GET('id');
      }
     if ($b['size'] !== $_SESSION['cart_size'][$id]) 
      {
       echo $_GET['size'];
      }


Часовой пояс GMT +3, время: 16:13.