Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Вывод товара в корзине
 
 автор: arhat78   (21.07.2014 в 16:43)   письмо автору
 
 

Всем привет! В свободное от работы время изучаю PHP и тренируюсь в создании инет-магазина, и вот возник вопрос: добавляю в корзину ботинок Арт.10001 c размером 20 из выпадающего списка, в корзине выводится этот ботинок с размером 20; затем добавляю этот же ботинок, но с размером 24 - а в корзине уже выводится этот последний ввод с размером 24 (24й размер перезаписывает 20й). Вот как поменять код, какой применить принцип, чтобы в корзину добавлялся ботинок одного id, но с разными выбранными размерами? У размеров своя таблица в mysql, с id. Заранее благодарен

Добавление товара в корзину:

<form action="index.php" method="get">
        <input type="hidden" name="view" value="add_to_cart">
        <input type="hidden" name="id" value="<?=$product['id']?>">
        <select name="size" >
        <?PHP
        $sql
="SELECT * FROM sizes WHERE `sizes`.`id_boot`='$id' ";
        echo 
$sql.'<br>';
        
$a=mysql_query($sql);
        while (
$b mysql_fetch_array($a))
        {
              echo 
"<option  value='$b[2]' >  $b[2] </option>";
        }
        
?>
        </select>
        <input type="submit" value="Добавить в корзину">
        </form>


Это вывод в корзине:

foreach ($_SESSION['cart'] as $id => $quantity): $product = get_product($id);
     
            $b['size'] = $_SESSION['cart_size'][$id];
     
            if (!empty($_GET['size'])) {echo $_GET['size'];}
          ?>
     
          <tr>
              <td align="center"><?=$product['title']; ?></td>
              <td align="center">  <?=$b['size'];?> </td>
              <td align="center">  <?=number_format($product['price'],2); ?> руб</td>
              <td align="center"><input type="text" size="2" name="<?=$id?>" maxlength="2" value="<?=$quantity?>" /></td>
              <td align="center">  <?=number_format($product['price'] * $quantity ,2); ?> руб</td>
          </tr>

  Ответить  
 
 автор: confirm   (21.07.2014 в 17:05)   письмо автору
 
   для: arhat78   (21.07.2014 в 16:43)
 

1) это не добавление в корзину, а вывод списка товаров, то есть форма.
2) кода непосредственно добавления в корзину не наблюдается.
3) получается что у вас не очень удачно составлены таблицы - отсюда и весь сыр бор.

Есть объекты А и Б. Они могут иметь размеры из списка: 1, 2, 3.
Если за любым из этих объектов закреплены несколько размеров, то что это будет?
Наверное же массив этих размеров под ID объекта.
Корзина должна содержать массив, первичными ключами которого являются ID товаров, а их значениями массив размеров, причем, если они различны по цене, то желательно здесь же и цену за единицу, и количество набранного.

  Ответить  
 
 автор: arhat78   (24.07.2014 в 10:46)   письмо автору
 
   для: confirm   (21.07.2014 в 17:05)
 

confirm, всё верно - это форма вывода списком размеров обуви....

1. Вот так добавляю товар:

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;  


3. У меня есть таблица "sizes", где размеры привязываются к id ботинка. id_boot - это id ботинока, и size - это существующие размеры этого ботинка


id id_boot size
1 1 20
2 1 21
3 1 22
4 2 20
5 2 21
6 2 22
и так далее

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

  Ответить  
 
 автор: confirm   (24.07.2014 в 11:34)   письмо автору
 
   для: arhat78   (24.07.2014 в 10:46)
 

Еще раз:

если товар имеет характеристики и можно выбрать один и тот же товар с различными характеристиками, то разве можно такой набор сохранить как

$_SESSION['cart_size'][$id] = $size;

???

Ну явно же это должен быть массив, вы же шмуляете одно значение, вот и получается, что будет сохранен последний выбор.

Во-первых, если покупатель может выбрать один и тот же товар, но с различными характеристиками, то список характеристик должен иметь атрибут multiple, а имя этого списка должно отождествляться с массивом - name="name[]". Сервер будет получать это значение как массив, его и нужно будет помещать в $_SESSION['cart_size'][$id].
Но, есть тут одна неясность. Я задавал вопрос - может ли покупатель выбрать товар с любой из характеристик не один, а несколько? Если да, то решение со списком множественного выбора в этом случае будет неудобно. Должны быть связанные списки, и прием и помещение в корзину несколько сложнее будет.

Ваша корзина должна выглядеть так, как я писал ранее - id товара ключ, под которым содержаться массив выбранных характеристик и их количество (если это так).

  Ответить  
 
 автор: arhat78   (24.07.2014 в 12:01)   письмо автору
 
   для: confirm   (24.07.2014 в 11:34)
 

confirm, да уж.... не лёгкая эта работа, из болота тащить правильный код.... ))))))))) Пытаюсь сейчас штудировать array, но пока на практике тяжело, очень тяжело даётся..............

  Ответить  
 
 автор: confirm   (24.07.2014 в 12:52)   письмо автору
 
   для: arhat78   (24.07.2014 в 12:01)
 

А какая проблема с массивом может быть?

Вы так и не ответили на вопрос - может ли покупатель выбрать товар, например, размера 20 не один, а скажем 3, а размера 30 - 2?

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

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

Вот с этим сперва определитесь, а уж затем будет видно какова структура массива у корзины должна быть.

  Ответить  
 
 автор: rusultras   (24.07.2014 в 13:32)   письмо автору
 
   для: confirm   (24.07.2014 в 12:52)
 

А зачем знать есть возможность нескольких размеров или нет? сразу делать универсальный код добавления товаров в корзину, чтобы потом на других сайтах не переделывать, делать массив вида:

$_SESSION['cart'][$product_id][$product_size] = array('cnt', 'price', 'sale');

cnt - количество,
price - цена
sale - скидка если нужна

этот же массив и для сайтов без размеров подайдет, можно просто передавать в качестве $product_size единую величину наприме "non"

  Ответить  
 
 автор: confirm   (24.07.2014 в 14:35)   письмо автору
 
   для: rusultras   (24.07.2014 в 13:32)
 

Вы мне вопрос задаете или чего вы от меня хотите?

  Ответить  
 
 автор: rusultras   (24.07.2014 в 14:44)   письмо автору
 
   для: confirm   (24.07.2014 в 14:35)
 

это был риторический вопрос Вам, и ответ каким должен быть массив автору темы)

  Ответить  
 
 автор: confirm   (24.07.2014 в 15:04)   письмо автору
 
   для: rusultras   (24.07.2014 в 14:44)
 

Ну тогда ответ на "риторику". А что значит универсальность, и должна ли она учитывать выбор нескольких позиций?

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

  Ответить  
 
 автор: rusultras   (24.07.2014 в 17:39)   письмо автору
 
   для: confirm   (24.07.2014 в 15:04)
 

и чем же оно под указанные требования не подходит? вполне себе подходит... у меня у самого десяток магазинов с одеждой, ИД товара, его размер, количество и цена... прекрасно работает... или Вам просто повыеживаться охота?

  Ответить  
 
 автор: confirm   (24.07.2014 в 18:15)   письмо автору
 
   для: rusultras   (24.07.2014 в 17:39)
 

Тем, что не учитываются характеристики, о чем потрудились бы прочесть.
Ваша решение будет подходить к данному контексту только в том случае, если один товар, но с разными характеристиками будет храниться в базе под своим ID.

  Ответить  
 
 автор: rusultras   (24.07.2014 в 18:49)   письмо автору
 
   для: confirm   (24.07.2014 в 18:15)
 

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

  Ответить  
 
 автор: confirm   (24.07.2014 в 19:02)   письмо автору
 
   для: rusultras   (24.07.2014 в 18:49)
 

Речь не о том, как связаны таблицы товаров и их характеристик, а о том, что ваша корзина не отображает этот выбор. Вот вам и "универсальность", тем более, если учесть, что характеристик товаров может быть гораздо больше.

  Ответить  
 
 автор: arhat78   (24.07.2014 в 17:47)   письмо автору
 
   для: confirm   (24.07.2014 в 15:04)
 

confirm, вот ссылка на макет моего сайта: http://top-top.bl.ee/index.php?view=product&id=2 . Здесь сразу попадаете на страницу ботинка с выбором размера. У меня пока получается только выбирать у одного ботинка один размер.

  Ответить  
 
 автор: confirm   (24.07.2014 в 18:19)   письмо автору
 
   для: arhat78   (24.07.2014 в 17:47)
 

То есть товар имеет одну и ту же цену не зависимо от размера его. Значит список со множественным выбором как я писал ранее.

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

  Ответить  
 
 автор: arhat78   (24.07.2014 в 18:37)   письмо автору
 
   для: confirm   (24.07.2014 в 18:19)
 

почему же, можно. в корзине можно менять количество товара. автоматически меняется сумма покупки. попробуйте.

а цена, да, у каждой модели ботинка своя, не зависимо от размера.

  Ответить  
 
 автор: rusultras   (24.07.2014 в 18:46)   письмо автору
 
   для: arhat78   (24.07.2014 в 18:37)
 

позволю себе еще раз влезть в разговор и сказать что с точки зрения пользователя это неудобно, вот скажите Вы хотите купить 3 пары чего либо, вы кладете в корзину одну пару - Вы как покупатель догадаетесь что количество меняется в корзине? лично мне хотелось бы сразу видеть сколько я положил штук и какова будет сумма покупки... хотя признаюсь что на ряде моих магазинов руководство категорически отказалось давать возможность пользователям менять количество в карточке товара, только в корзине, но тут уж их тараканы...

  Ответить  
 
 автор: arhat78   (24.07.2014 в 18:53)   письмо автору
 
   для: rusultras   (24.07.2014 в 18:46)
 

так я же только учусь. пока нужно в общем создать принципы, какие сейчас вижу. а потом уже можно будет подгонять под удобство пользователя. сейчас остался один не ясный вышеуказанный вопрос. вот как только его решу, можно будет уже над интерфейсов поработать ))))

  Ответить  
 
 автор: confirm   (24.07.2014 в 19:16)   письмо автору
 
   для: arhat78   (24.07.2014 в 18:53)
 

Учиться вы будете решать программно задачу поставленную, а вот удобства для ваших покупателей вы должны обдумать еще до этого как возьметесь решать ее. Для этого достаточно представить себя на месте покупателя в обычном магазине. Подумайте, будет ли для вас удобно, если вас заставят в магазине бегать к полке за каждой пачкой чая принося ее к кассе, вместо возможности взять сразу сколько нужно и расплатиться за все?
Если вы потом будет что-то дописывать, то вряд ли, придется либо заново переписывать, либо ваш скрипт превратиться в разношерстного монстра.

Старайтесь ставить задачу сразу, учитывая главное, а удобства для покупателя, это наиважнейшая характеристика магазина, иначе вы будете проигрывать конкурентам. Именно такие "мелочи" всякие в задаче и будут определять и структуру данных, и интерфейс, и сценарии их решения, а никак не наоборот - сначала наваяем, а потом будем думать как надо сделать удобнее.

  Ответить  
 
 автор: arhat78   (24.07.2014 в 19:42)   письмо автору
 
   для: confirm   (24.07.2014 в 19:16)
 

Как то нужно засунуть размер в массив, а затем выводить в корзине, но как это сделать - пока не догоняю.... :
$_SESSSION['cart'] = array('size'=>.......)

  Ответить  
 
 автор: confirm   (24.07.2014 в 19:07)   письмо автору
 
   для: rusultras   (24.07.2014 в 18:46)
 

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

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

  Ответить  
 
 автор: rusultras   (24.07.2014 в 19:37)   письмо автору
 
   для: confirm   (24.07.2014 в 19:07)
 

по-моему я как раз о том, я вродь и написал что изменение количества в корзине неудобно для покупателя.. читайте внимательно!

  Ответить  
 
 автор: arhat78   (24.07.2014 в 19:56)   письмо автору
 
   для: rusultras   (24.07.2014 в 19:37)
 

Как то нужно засунуть размер в массив, а затем выводить в корзине, но как это сделать - пока не догоняю.... :
$_SESSSION['cart'] = array('size'=>.......) 

  Ответить  
 
 автор: rusultras   (24.07.2014 в 20:29)   письмо автору
 
   для: arhat78   (24.07.2014 в 19:56)
 

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

$_SESSION['cart']['ID товара']['Размер'] = array('cnt' => 3, 'price' => 3400);

ну а вывод циклом например

foreach($_SESSION['cart'] as $key => $item){

}


правда в этом случае будет два цикла, пожалуй это лишняя нагрузка, возможен вариант если у вас в таблице с размерами у каждой строки есть свой уникальный ID, тогда массив может быть вида

$_SESSION['cart']['ID строки'] = array('product_id' => 20, 'size' => 'XXL', 'cnt' => 3, 'price' => 3400);

  Ответить  
 
 автор: arhat78   (24.07.2014 в 20:46)   письмо автору
 
   для: rusultras   (24.07.2014 в 20:29)
 

У меня есть таблица "sizes", где размеры привязываются к id ботинка. id_boot - это id ботинока, и size - это существующие размеры этого ботинка


id id_boot size
1 1 20
2 1 21
3 1 22
4 2 20
5 2 21
6 2 22
и так далее


И вот этот вид: array('product_id' => 20, 'size' => 'XXL', 'cnt' => 3, 'price' => 3400) я в учебниках встречаю, но как это осуществить на практике - не понимаю пока.... :(

  Ответить  
 
 автор: rusultras   (24.07.2014 в 20:53)   письмо автору
 
   для: arhat78   (24.07.2014 в 20:46)
 

так у вас все есть

$_SESSION['cart'][5] = array('id_boot' => 2, 'size' => 21....);

вывод через цикл


foreach($_SESSION['cart'] as $key => $item){
echo $item['id_boot'];
echo $item['size'];
}


а добавление в корзину с проверкой

if(isset($_SESSION['cart'][$id])){
$_SESSION['cart'][$id]['cnt'] += 1; // тут 1 - это количество
}else{
$_SESSION['cart'][$id] = array('id_boots' => $id_boots, 'size' => $size, 'cnt' => 1, 'price' => $price);
}

  Ответить  
 
 автор: arhat78   (24.07.2014 в 21:24)   письмо автору
 
   для: rusultras   (24.07.2014 в 20:53)
 

так, что то я уже совсем запутался. и локальный сервер глючит. попробовал этот код внедрить в свой - одни ошибки посыпались. вернул старый, так теперь в корзине появилась дополнительная строка 'cnt' с изменяемым цифровым окошком (также, как меняется количество товара $qty)........ фигня какая то.

  Ответить  
 
 автор: arhat78   (24.07.2014 в 22:50)   письмо автору
 
   для: rusultras   (24.07.2014 в 20:53)
 

перезагрузил локальный сервак - одни ошибки выходят с этим кодом...... с моим никак не адаптируется... :(

  Ответить  
 
 автор: arhat78   (28.07.2014 в 18:26)   письмо автору
 
   для: arhat78   (24.07.2014 в 22:50)
 

Люди добрые, не молчите - помогите! :)

  Ответить  
 
 автор: confirm   (29.07.2014 в 03:42)   письмо автору
 
   для: arhat78   (28.07.2014 в 18:26)
 

А вы определились как будет выбирать покупатель количество?

  Ответить  
 
 автор: arhat78   (29.07.2014 в 11:15)   письмо автору
 
   для: confirm   (29.07.2014 в 03:42)
 

Ну пока в корзине. Первое время будет только детская обувь, и сомневаюсь что кто то будет брать одну пару обуви больше, чем в одном экземпляре....... Но нужно, конечно, будет такое же окошко с изменяющимся количеством из корзины перенести на страницу карточки товара. Как я понял, это будет тоже не простая задача, но тоже будем справляться )))

  Ответить  
 
 автор: confirm   (29.07.2014 в 12:03)   письмо автору
 
   для: arhat78   (29.07.2014 в 11:15)
 

Сначала в вопросе:

затем добавляю этот же ботинок, но с размером 24 - а в корзине уже выводится этот последний ввод с размером 24 (24й размер перезаписывает 20й)

теперь:

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

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

И что вы тогда хотите услышать в ответ?

  Ответить  
 
 автор: arhat78   (29.07.2014 в 12:13)   письмо автору
 
   для: confirm   (29.07.2014 в 12:03)
 

confirm если не трудно, то зайдите сюда: http://top-top.bl.ee/index.php?view=product&id=2 и попробуйте выбрать этот ботинок сначала 19го размера (зайдя в корзину, вы увидите выбранный 19й размер); затем вернитесь обратно к этому ботинку, и выберите теперь 22й размер и добавьте в корзину. Зайдя в корзину вы не найдёте этот ботинок с выбранными двумя размерами (19м и 22м), а только с последним выбранным (22м). А хотелось бы, чтобы в корзине были оба выбранных размера.....

  Ответить  
 
 автор: confirm   (29.07.2014 в 12:27)   письмо автору
 
   для: arhat78   (29.07.2014 в 12:13)
 

Я уже там был, поэтому вопрос о количестве выбора и возник. Вы же совсем не отвечаете на поставленные вопросы.

Выбрать 19 и 22 размер, это значит иметь возможность выбора товара более одного, а на вопрос как это вы планируете делать, последовал ответ, что типа и нафик этого не надо. И как это понимать?

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

  Ответить  
 
 автор: arhat78   (29.07.2014 в 16:06)   письмо автору
 
   для: confirm   (29.07.2014 в 12:27)
 

А разве нельзя сделать, чтобы в корзине первой строкой был ботинок 19го размера, а второй строкой этот же ботинок, но уже 22го размера? А третьей строкой , например, уже другой ботинок (если выбрать)? Если честно, то я себе это так представлял....

Хотя может быть у меня действительно и с quantity в принципе что то не так....

  Ответить  
 
 автор: confirm   (29.07.2014 в 16:30)   письмо автору
 
   для: arhat78   (29.07.2014 в 16:06)
 

А в базе вы тоже так будете хранить товары - ботик А, размер 20, ботик А, размер 21, ... и т.д.?

  Ответить  
 
 автор: arhat78   (29.07.2014 в 16:34)   письмо автору
 
   для: confirm   (29.07.2014 в 16:30)
 

пока нет. в одной таблице - ботинки с описанием и ценами, во второй таблице размеры, которые связаны с ботинками через id_boot...

  Ответить  
 
 автор: confirm   (29.07.2014 в 17:34)   письмо автору
 
   для: arhat78   (29.07.2014 в 16:34)
 

Ну вот видите, разумно. А почему в корзине подобный разум должен отсутствовать?

  Ответить  
 
 автор: arhat78   (29.07.2014 в 17:46)   письмо автору
 
   для: confirm   (29.07.2014 в 17:34)
 

Конечно должен присутствовать! Вот только никак не удаётся привить этот разум корзине ))))))

Но как можно этот id_boot идентифицировать в корзине??? Да и в функции add_to_cart нужно тогда как то id_boot передавать...

  Ответить  
 
 автор: confirm   (29.07.2014 в 18:34)   письмо автору
 
   для: arhat78   (29.07.2014 в 17:46)
 

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

А у вас не понять что. К примеру, товар у вас помещается в корзину на какой-то "куцей" странице, что с точки зрения поисковика "пустота" несущественная, а с точки зрения покупателя и неудобство и никчемность. Уж хотя бы сервис для покупателя на такой голой странице был, нет его, не говоря уже о том, что просто дикость в трактовке понятия "количество товара".

А ведь первое над чем над чем надо было думать, так это как раз о количестве, и уже это будет определять элементы формы. Почему можно выбрать разные размеры, но нельзя выбрать несколько одного размера? Это глупость искусственно разделять что-то на количество, а что-то "не может быть такого". Все должно подчиняться единой закономерности - товар -> характеристика -> количество. Именно из этой закономерности вытекает следующее:

1) использовать для выбора количества каждой характеристики выпадающий список неудобно
2) выбор покупателя - это массив описывающий выше указанную закономерность

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

  Ответить  
 
 автор: arhat78   (29.07.2014 в 18:46)   письмо автору
 
   для: confirm   (29.07.2014 в 18:34)
 

confirm, и расстроили меня, что код совсем никчёмный :( Но и показываете, что его нужно полностью пересматривать..... Есть над чем подумать

  Ответить  
 
 автор: confirm   (29.07.2014 в 18:54)   письмо автору
 
   для: arhat78   (29.07.2014 в 18:46)
 

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

Я сказал,напишу позже.

  Ответить  
 
 автор: arhat78   (29.07.2014 в 18:58)   письмо автору
 
   для: confirm   (29.07.2014 в 18:54)
 

confirm, благодарю! Вам показать код более обширно?

Буду пока штудировать "учебники" )))

  Ответить  
 
 автор: confirm   (30.07.2014 в 11:37)   письмо автору
 
   для: arhat78   (29.07.2014 в 18:58)
 

Нет, не надо мне обширного, изучать его, что-то "вклеивать" в него я не буду.

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

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

Забрасывайте учебники в дальний угол и отправляйтесь на практические занятия в реальный магазин. Сделайте там покупку, после чего проанализируйте свои действия. Результатом анализа должно быть понимание, что виртуальный магазин должен иметь два представления корзины - краткое и полное. Зачем, повторять не буду. А так как краткое представление корзины (при наличие товаров в корзине) отображается всегда, то нужно подумать о такой структуре корзины, чтобы можно было просто получать информацию для ее краткого представления. С учетом ваших товаров выбрана следующая структура:

<?
//для удобства расчета, а это требуется при каждой смене страницы,
//корзина содержит общее количество каждого товара отдельным значением,
//а также цену товара, чтобы исключить лишние запросы к базе
$_SESSION['basket'] = array(
    
=> array( //под ID товара содержится массив
        
'count' => 3//число набранного товара
        
'price' => 1200//цена товара
        
'size'  => array(2=>14=>2//набранного товара по каждому из размеров: ключ - id размера, значение - количество
    
),
    
=> array(
        
'count' => 2,
        
'price' => 1500,
        
'size'  => array(1=>13=>1)
    ),
    .....
        
);
//в этом случае функция total_basket() легко делает такой просчет


Исходя из этой структуры соответственно строятся и формы. При этом форма добавления товара отображает размеры как набор checkbox, а количество, которое можно выбрать, поле text, которое появляется у выбранного checkbox. Значение вводимое в поле text присваивается соответствующему checkbox. Всем этим управляет клиентский сценарий на Javascript.

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

Запускайте, смотрите, думайте.

<?
session_start
();
?>
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<style>
label {
    margin-right: 20px;
}

th {
    padding: 10px;
    background: #ddd;
}

td {
    padding: 10px;
    border: 1px solid #ddd;
    vertical-align: top;
}
</style>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script>
$(function() {
    //добавить/удалить поле выбора количества при выборе 
    $('#add input:checkbox').click(function() {
       var p = $(this).closest('div');
       this.checked ? p.append('<label>количество: <input type=text name=cnt['+this.name.match(/\d+/)[0]+'] value=1 /></label>') : p.children().last().remove();
       this.value = 1;
    });
    //установить количество
    $('#add').on('keyup', 'input:text', function() {
       $(this).closest('div').find('input:checkbox').val(this.value);
    });
    //удалить поля количества при отправке
    $('#add').submit(function() {
        $(this).find('input:text').remove();
    });
});
</script>    
</head>

<body>
<?
//приведение ключей и значений массива POST к integer
function to_int() {
    
array_walk_recursive($_POST, function(&$v, &$k) {
        
$v = (int)$v;
        
$k = (int)$k;    
    });
}
//просчитать всего в корзине
function total_basket() {
    return array(
array_sum(array_map('current'$_SESSION['basket'])), array_sum(array_map('array_product'$_SESSION['basket'])));
}
//изменение корзины
function set_basket($ids$del=null) {
    global 
$products//работаем не с базой, а с имитатором, поэтому делаем доступным массив
    
$bsk = &$_SESSION['basket']; //корзина
    //если есть товары для удаления из корзины при ее редактировании
    
if($del) {
        if(
$del[0]) {
            
$id array_flip($del[0]);
            
//удалить выбранные товары из корзины
            
$bsk array_diff_key($bsk$id);
            
//вычесть удаляемые товары из редактируемых
            
$ids array_diff_key($ids$id);
            
//и из удаляемых размеров
            
if($del[1]) $del[1] = array_diff_key($del[1], $id);        
        }
        if(
$del[1]) {
            
//удалить выбранные размеры товара
            
foreach($del[1] as $k=>$v) {
                
//из корзины
                
$bsk[$k]['size'] = array_diff_key($bsk[$k]['size'], array_flip($v));
                
//из редактируемых
                
$ids[$k] = array_diff_key($ids[$k], array_flip($v));
            }
        }
    }
    
//добавление в корзину и обновление корзины
    
foreach($ids as $k=>$v) {
        
//добавляем товар в корзину
        
if(!$bsk || !array_key_exists($k$bsk)) $bsk[$k] = array('count'=>array_sum($v), 'price'=>$products[$k]['price'], 'size'=>$v);
        
//изменяем товар в корзине
        
else if(array_key_exists($k$bsk)) {
            
//изменяем количество по каждому из размеров
            
foreach($v as $m=>$n$bsk[$k]['size'][$m] = $n;
            
//обновляем общее количество набранного товара 
            
$bsk[$k]['count'] = array_sum($bsk[$k]['size']);
        }
    }
}

//массив имитирующий таблицу товаров
$products = array(
    
=> array('name'=>'Модель 1''price'=>980),
    
=> array('name'=>'Модель 2''price'=>1000),
    
=> array('name'=>'Модель 3''price'=>1100),
    
=> array('name'=>'Модель 4''price'=>1200),
    
=> array('name'=>'Модель 5''price'=>1500),
    
=> array('name'=>'Модель 6''price'=>850)
);
//массив имитирующий размер
$size = array(1=>2021222324);
//массив имитирующий наличие размеров у товаров
$shoes_size = array(
    
=> array(2,3,4),
    
=> array(1,2,3,4),
    
=> array(1,2,3,4,5),
    
=> array(1,3,4,5),
    
=> array(1,3,5),
    
=> array(1,2,3,4,5)
);

$bsk = &$_SESSION['basket']; //корзина

//если есть запрос на добавление товара и ключ массива действителен (не равен 0))
if(isset($_POST['add'])) {
    if(
$_POST['add'] && isset($_POST['prd'])) {
        
//приведение к типу integer для безопасности, ибо по этому параметру будут производиться запросы к базе
        //также удаляем "мусор", это исключит пустые запросы
        
to_int();
        
//убираем из массива добавленных размеров недействительный ключ (равный 0)
        
$_POST['prd'] = array_diff_key($_POST['prd'], array(0));
        if(
$_POST['prd']) { 
            
//если есть добавляемые размеры, убираем из массива добавленных размеров незначащие значения (равные 0)
            
$_POST['prd'] = array_diff($_POST['prd'], array(0));
            
//если есть добавляемые размеры, добавляем товар в корзину
            
if($_POST['prd'])  set_basket(array($_POST['add']=>$_POST['prd']));
            else exit(
'Лажа'); 
        } else exit(
'Лажа');
    } else exit(
'Лажа');
}

//если есть запрос на редактирование корзины
if(isset($_POST['edt'])) {
    if(isset(
$_POST['prd'])) {
        
//проверка данных как и при добавлении  
        
to_int();
        
//убираем из массива несуществующий товар (ключ равен 0)
        
$_POST['prd'] = array_diff_key($_POST['prd'], array(0));
        if(
$_POST['prd']) {
            
//если есть редактируемые товары, убираем из массива добавленных размеров недействительные ключи и значения (равные 0)
            
foreach($_POST['prd'] as $k=>$v) {
                foreach(
$v as $m=>$n) if(!$m || !$n) unset($_POST['prd'][$k][$m]);
                
//если массив размеров пуст, убираем товар из редактируемых
                
if(!$_POST['prd'][$k]) unset($_POST['prd'][$k]);
            }
            if(
$_POST['prd']) set_basket($_POST['prd'], $_POST['del']);
            else exit(
'Лажа');
        } else exit(
'Лажа');    
    } else exit(
'Лажа');
}

//если есть запрос на удаление корзины
if(isset($_POST['clr'])) $bsk = array();

//есть ли в корзине товары
if($bsk) {
    
//если есть, то выведем их общее количество и сумму для краткого представления корзины
    
$tot total_basket();
    
//выводим краткое представление таблицы
    
echo '<div><h4><a href="?edt">В корзине:</a></h4>товаров - ' $tot[0] . ' шт.<br>на сумму - ' $tot[1] . ' руб.'
}

//запрос на выбор товара для корзины
if(!$_POST && isset($_GET['add']) && $id = (int)$_GET['add']) {
    
//запрашиваем инфу о товаре
    
if(array_key_exists($id$products)) {
        
//выводим форму выбора
        
echo '<h2>' $products[$id]['name'] . '</h2><form id=add method="post">';
        
//получаем размеры
        
foreach($shoes_size[$id] as $v) echo '<div><label><input type="checkbox" name="prd[' $v ']" /> размер ' $size[$v] . '</label></div>';
        echo 
'<button name="add" value="' $id '">Добавить</button></form>';
    } else exit(
'Лажа');
}

//запрос редактирования корзины
if(!$_POST && isset($_GET['edt'])) {
    
//запрашиваем инфу о товаре по первичным ключам корзины - implode(',', array_keys($bsk))
    //но это для реальной базы, а в примере все из массива
    
    //выводим корзину
    
$crt '<h1>Корзина</h1><form method="post"><table><tr><th>Товар</th><th>Цена</th><th>Размер/Количество</th><th>На сумму</th><th>Удалить</th></tr>';
    
    foreach(
$bsk as $k=>$v) {
        
$crt .= '<tr><td>' $products[$k]['name'] . '</td><td>' $v['price'] . ' руб.</td><td>';
        foreach(
$v['size'] as $m=>$n) {
            
$crt .= 'размер ' $size[$m] . ': <input name=prd[' $k '][' $m '] value=' $n ' />
                     <label><input type="checkbox" name="del[1]['
.$k.'][]" value='.$m.' /> удалить</label><br>';
        }
        
$crt .= '</td><td>' $v['price'] * $v['count'] . ' руб.</td><td><label><input type="checkbox" name="del[0][]" value='.$k.' /> удалить</label></td></tr>';   
    }
    
$tot total_basket();
    echo 
$crt '<tr><td colspan=5>Всего: товаров - ' $tot[0] . ' шт., на сумму - ' $tot[1] . ' руб.</td></tr></table>
                 <button name="edt">Обновить корзину</button> <button name="clr">Очистить корзину</button></form>'
;
    
}

//вывод списка товаров
if(!$_GET || $_POST) {
    echo 
'<h1>Товары</h1>';
    foreach(
$products as $k=>$v) echo '<h2>' $v['name'] . '</h2><p>' $v['price'] . ' руб.<br>
                                       <a href="?' 
. ($bsk && array_key_exists($k$bsk) ? 'edt' 'add') . '=' $k '">'
                                      
. ($bsk && array_key_exists($k$bsk) ? 'В корзине ' $bsk[$k]['count'] : 'Добавить в корзину') . '</a></p>'
}
?>
</body>
</html>


А вот хранить товары оформленного заказа в таблице базы уже лучше так:

id_заказа id_товара id_размера количество
id_заказа id_товара id_размера количество
...............
id_заказа id_товара id_размера количество


Естественно, что корзина после оформления заказа удаляется.

  Ответить  
 
 автор: moonfox   (31.07.2014 в 02:34)   письмо автору
 
   для: confirm   (30.07.2014 в 11:37)
 

какая долго играющая тема....
думаю человеку просто принцип понять надо
а не пытаться выдрючить его пример.

  Ответить  
 
 автор: confirm   (31.07.2014 в 04:33)   письмо автору
 
   для: moonfox   (31.07.2014 в 02:34)
 

А вы мастер пояснений? Тогда какого хрена со своими комментариями ко мне? Засучивайте то чего вы там думаете и вперед пояснять.

  Ответить  
 
 автор: arhat78   (31.07.2014 в 11:05)   письмо автору
 
   для: confirm   (30.07.2014 в 11:37)
 

confirm, только добрался до ноута. Вот это вы меня грузанули с самого утра!!!! Как минимум неделю буду разбирать ваш код, чтобы понять хотя бы его принцип. Большую часть кода на первый взгляд не понял.

А про мой код более подробно - профессиональный взгляд увидит, что там лишнее и что нужно переделать.

Благодарю за код, за неделю попробую разобрать вышеприведённое........

  Ответить  
 
 автор: confirm   (31.07.2014 в 15:02)   письмо автору
 
   для: arhat78   (31.07.2014 в 11:05)
 

Это кажется, что сложно, и только возможно потому, что не знаете функций работы с массивами, которые в большем применяются.

Замените в JS коде строку:

this.checked ? p.append('<label>количество: <input type=text name=cnt['+this.name.match(/\d+/)[0]+'] value=1 /></label>') : p.children().last().remove();


на

this.checked ? p.append('<label>количество: <input type=text value=1 /></label>') : p.children().last().remove();
//а эти строки
//удалить поля количества при отправке 
$('#add').submit(function() { 
     $(this).find('input:text').remove(); 
});
//удалите вообще 


Изначально писалось под иной сценарий и так и осталось.

Что касается корзины и вашего вопроса "как", то ответ заключается в организации корзины, в функции подсчета ее основных параметров total_basket(), функции собственно работающей с корзиной set_basket: добавление, изменение, удаление.

Массивы $products, $size и $shoes_size - это имитаторы таблиц базы данных, для примера, чтобы понятно было сразу что, откуда и зачем.

Далее две конструкции выполняющие по условиям соответствующим (параметру GET запроса) соответственно прием формы добавления товара в корзину и формы редактирования корзины.

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

Открывайте руководство РНР по указанным ссылкам, читайте код и о функциях которые в нем применяются. Изучайте их работу, уясняя на простых примерах.

Это что касается кода. А что касается как вам конкретно строить свой код, то я вам уже говорил неоднократно - так как в реальности, описывая свои реальные потребности и действия html структурой и код ее обслуживающий.

  Ответить  
 
 автор: arhat78   (01.08.2014 в 17:14)   письмо автору
 
   для: confirm   (31.07.2014 в 15:02)
 

А почему или зачем "Размер/Количество" в одной колонке?

И у меня в основном код выводится на странице магазина в таком виде: "$v) { //из корзины $bsk[$k]['size'] = array_diff_key($bsk[$k]['size'], array_flip($v)); //из редактируемых $ids[$k] = array_diff_key($ids[$k], array_flip($v)); } } } //добавление в корзину и обновление корзины foreach($ids as $k=>$v) { //добавляем товар в корзину if(!$bsk || !array_key_exists($k, $bsk)) $bsk[$k] = array('count'=>array_sum($v), 'price'=>$products[$k]['price'], 'size'=>$v); //изменяем товар в корзине else if(array_key_exists($k, $bsk)) { //изменяем количество по каждому из размеров foreach($v as $m=>$n) $bsk[$k]['size'][$m] = $n; //обновляем общее количество набранного товара $bsk[$k]['count'] = array_sum($bsk[$k]['size']); } } } //массив имитирующий таблицу товаров $products = array( 1 => array('name'=>'Модель 1', 'price'=>980), 2 => array('name'=>'Модель 2', 'price'=>1000), 3 => array('name'=>'Модель 3', 'price'=>1100), 4 => array('name'=>'Модель 4', 'price'=>1200), 5 => array('name'=>'Модель 5', 'price'=>1500), 6 => array('name'=>'Модель 6', 'price'=>850) );" и т.д.

Но буду разбирать; и может быть что-нибудь, да получится )))

  Ответить  
 
 автор: confirm   (01.08.2014 в 17:22)   письмо автору
 
   для: arhat78   (01.08.2014 в 17:14)
 

Потому, что эта колонка отображает размер модели и выбранное количество этого размера.
Удалить же из корзины можно либо целиком модель, либо только какой-то размер/размеры модели.

Что написано дальше - ничего не понятно. Что означает "у меня так выводится", а код из примера?

  Ответить  
 
 автор: arhat78   (01.08.2014 в 17:28)   письмо автору
 
   для: confirm   (01.08.2014 в 17:22)
 

Да? А я себе по другому вывод корзины представлял........ В каждой новой строчке отображается новый выбор....


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

  Ответить  
 
 автор: confirm   (01.08.2014 в 17:39)   письмо автору
 
   для: arhat78   (01.08.2014 в 17:28)
 

Вы странно подходите к структуре как корзины так и ее представления.
Не проблема написать и такую таблицу как вы написали, но в данном случае форма будет иная.
У вас один товар, а все остальное это его характеристики, так зачем их разбрасывать по форме?

А вот хранение товаров корзины в заказе, это уже будет именно построчно, собственно об этом я уже писал.

  Ответить  
 
 автор: arhat78   (01.08.2014 в 17:44)   письмо автору
 
   для: confirm   (01.08.2014 в 17:39)
 

У меня страница корзины и страница заказа - идентичны. Разве что на странице заказа уже нельзя менять количество....

Буду разбирать в уме новую для меня конструкцию корзины.

  Ответить  
 
 автор: arhat78   (01.08.2014 в 17:26)   письмо автору
 
   для: confirm   (31.07.2014 в 15:02)
 

confirm, а может быть можно к этому вопросу по другому подойти? Если как-нибудь через проверку наличие данного размера сделать? Допустим в корзине уже лежит ботинок А с размером 21; вот выбираешь и добавляешь ещё один 21й размер: уже есть 21й размер, то прибавлять +1 количество; а вот если выбираешь и добавляешь ботинок А с 22м размером, то просто в корзину в новой строке выводить ботинок А с новым размером...?

  Ответить  
 
 автор: confirm   (01.08.2014 в 17:58)   письмо автору
 
   для: arhat78   (01.08.2014 в 17:26)
 

Вы в реальном магазине когда либо были или нет? Вроде бы как уже говорили об этом - заставлять покупателя покупать мелочь по 1-й единице, ну это свинство как минимум.

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

Но а надо ли вообще так, и удобно ли это? Нет конечно, и необходимости пулять покупателя куда-то для добавления совсем не требуется. Можно заказывать товары прямо на странице товаров, можно на любой другой странице где выводится товар. И для того чтобы отредактировать уже набранный, или еще добавить какой либо, тоже совсем не обязательно заходить в корзину. Для этого достаточно выводить не сообщение-ссылку "В корзине 1", а "В корзине" и далее поле ввода с количеством набранного, которое можно прямо на странице изменить, и эти изменения будет отображены в корзине. Можно и удалять.

В общем чем больше сервиса, тем лучше. Вы же наоборот не о сервисе думаете, а как выгодно вам, а вам выгодно то, что совсем неудобно будет для покупателей.

Мне в общем то все равно, как хотите, так и делайте. На главный вопрос ваш я дал ответ - это пример хранения набора товара с разными характеристиками в корзине, и как такой набор можно добавлять в нее.

  Ответить  
 
 автор: arhat78   (01.08.2014 в 18:01)   письмо автору
 
   для: confirm   (01.08.2014 в 17:58)
 

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

  Ответить  
 
 автор: confirm   (01.08.2014 в 18:07)   письмо автору
 
   для: arhat78   (01.08.2014 в 18:01)
 

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

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования