Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Sklep] 3 kroki kupowania a płatności
Forum PHP.pl > Forum > PHP > Object-oriented programming
Adi32
Witajcie.

Jestem w trakcie robienia sklepu internetowego na podstawie innego, gdzie 3 kroki kupowania są napisane strukturalnie, a dokładniej na SWITCHu.
W kroku pierwszym jest wybór formy płatności i formy transportu. Jest zaimplementowany system płatności raty żagiel.
Krok 2 i 3 i stado IFów przez które rozstrzyga się jaki formularz załadować i jakie ceny wyświetlić względem tego jaki użytkownik wybrał transport i jaką formę transportu.
Teraz muszę dodać do tego skryptu inne możliwości płatności, PayPal itd i jest to koszmar, ten skrypt ma się dalej w przyszłości rozwijać dlatego trzeba to przerobić.

Próbuje rozrysowywać to, robić schematy i nie moge wymyślić jak to zrobić... co ma być intefrejsem, co klasą abstrakcyjną a co pozostawić w tym SWITCHu z 3 krokami (SWITCH ($_GET['krok']) i wszystko w sesjach... )...

Wiem, że problem prosty do rozwiązania ale odpowiedzieć na niego to nie jest minutka jednak dla mnie to pierwsza rzecz obiektowa w której chciałbym w końcu użyć interfejsów bo wiem, że ta część skryptu ma się rozwijać. Nie wiadomo ile będzie form płatności i transportu. Dodam jeszcze że forma płatności może mieć wpływ na cenę (np. za pobraniem) ale admin ma możliwość sam dodawać formy płatności i ewentualnie uploadować plik z dodatkowym formularzem.

Pozdrawiam.
lukaskolista
Niestety nie znamy tego kodu, chcialbym pomoc ale nie mam jak. Wrzuc jakis przyklad, bo stwierdzenie "stado IFów" jest bardzo subiektywne i nie oddaje istoty problemu.
Adi32
Ponieważ - uważam - stado IF'ów samo w sobie jest problemem, tym bardziej, gdy z tego powodu bardzo problematyczne jest nawet drobne rozszerzenie skryptu.
To o co proszę to koncepcja napisania zespołu klas i interfejsów umożliwiających bezproblemowy przebieg zakupów w 3 krokach:

Krok 1: Użytkownik (klient) wybiera formę płatności i formę transportu (+ podaje swoje daje jeśli jest nie zarejestrowany)
Krok 2: Jeżeli użytkownik wybrał formę płatności Raty Żagiel to pojawiają się przyciski "Oblicz ratę" i "Zapoznałem się z regulaminem kupowania na raty" + lista produktów wraz z cenami + na tej liście ewentualna cena transportu
Krok 3: Zatwierdzenie, jeżeli były wybrane raty to ten krok przenosi do ich systemu, po wypełnieniu formularza w żaglu jest zwrot do kroku czwartego, w innym przypadku kończy się na kroku trzecim.

Jak można się domyślić w każdym z kroków (SWITCH ($_GET['krok']) case 1: ... break; case 2: ... break; case 3: ... break; ) jest w cholerę ifów, bo w zależności od tego jaką kombinację użytkownik wybrał w pierwszym kroku to inne rzeczy mają się wydarzyć, wyświetlić. Np. jeżeli użytkownik wybrał dowóz towaru do domu to w drugim kroku jest dołączana funkcja licząca cenę transportu na podstawie wagi towaru + dodatkowa dopłata jeżeli towar jest jakiś specjalny i jego wysyłka wymaga jakichś dodatkowych działań czy zabezpieczeń.

I przyszło mi do tego dodać jeszcze kilka systemów płatności gdzie dodanie jednego to jakby to nazwać syzyfowe prace...

Jestem pewien, że da się to rozplanować obiektowo żeby miało to ręce i nogi.

Dla pokazania wrzucam jednego case'a:
(przerabiałem już ten kod ale nie jest mój)
  1. <? case 2:
  2.  
  3.  
  4.  
  5. # tr to transport a pl to płatność
  6.  
  7. # forma transportu i płatności z tym związane
  8. if ($_POST['transport'] == 1) {
  9.  
  10. $tr = fraza(134); // Odbiór osobisty
  11. $koszty = '0.00';
  12. unset($_SESSION['zamowienie']['dodatkowe_platnosci']['cena_za_transport']);
  13.  
  14. } else if ($_POST['transport'] == 2) {
  15.  
  16. $tr = fraza(136);
  17. $koszty = policz_po_wadze($koszyk->suma_wag());
  18. if ($platnosc_za_kategorie = sprawdz_czy_kategoria_nie_narzuca_dodatkowej_platnosci()) {
  19. $_SESSION['zamowienie']['dodatkowe_platnosci']['cena_za_kategorie']['tytulem'] = 'Dodatkowa opłata wynikająca z wysyłki specyficznego towaru';
  20. $_SESSION['zamowienie']['dodatkowe_platnosci']['cena_za_kategorie']['kwota'] = $platnosc_za_kategorie;
  21. }
  22.  
  23. $_SESSION['zamowienie']['dodatkowe_platnosci']['cena_za_transport']['tytulem'] = 'Opłata za transport';
  24. $_SESSION['zamowienie']['dodatkowe_platnosci']['cena_za_transport']['kwota'] = $koszty;
  25.  
  26. } else {
  27. }
  28.  
  29. # forma płatności i płatności z tym związane
  30. $platnosc = $db->query("SELECT * FROM platnosc WHERE id = {$_POST['platnosc']} AND status = 1")->row();
  31.  
  32. if ($platnosc['specialne'] == 'zagiel') {
  33. $_SESSION['zamowienie']['zagiel'] = 1;
  34. } else {
  35. $_SESSION['zamowienie']['zagiel'] = 0;
  36. }
  37.  
  38. $_SESSION['zamowienie']['id_platnosc'] = $platnosc['id'];
  39.  
  40. if ($platnosc['cena'] > 0) {
  41. $_SESSION['zamowienie']['dodatkowe_platnosci']['cena_za_platnosc']['tytulem'] = 'Opłata za płatność "za pobraniem"';
  42. $_SESSION['zamowienie']['dodatkowe_platnosci']['cena_za_platnosc']['kwota'] = $platnosc['cena'];
  43. } else {
  44. unset($_SESSION['zamowienie']['dodatkowe_platnosci']['cena_za_platnosc']);
  45. }
  46.  
  47. $_SESSION['zamowienie']['pl'] = $platnosc['nazwa'];
  48. $_SESSION['zamowienie']['tr'] = $tr;
  49.  
  50. ?>
  51.  
  52. <form method="post" action="kasa,3" <? if($_SESSION['zamowienie']['zagiel']) { ?> onsubmit="return validate_Zagiel()" <? } ?> >
  53.  
  54. <table class="lista_produktow" width="100%" cellspacing="0">
  55.  
  56. <?
  57. $koszty = 0;
  58. if($_SESSION['zamowienie']['dodatkowe_platnosci']) {
  59. foreach ($_SESSION['zamowienie']['dodatkowe_platnosci'] as $platnosc) {
  60. $key = count($produkty);
  61. $produkty[$key]['nazwa'] = $platnosc['tytulem'];
  62. $produkty[$key]['cena'] = $platnosc['kwota'];
  63. $produkty[$key]['ilosc'] = 1;
  64.  
  65. $koszty += $platnosc['kwota'];
  66. }
  67. }
  68.  
  69. tr(
  70. th('Nazwa') .
  71. th('Cena') .
  72. th('Ilość') .
  73. th('Wartość')
  74. );
  75.  
  76. foreach ($produkty as $produkt) {
  77. tr(
  78. td('<strong>'.$produkt['nazwa'].'</strong>').
  79. td('<span style="color: #FF7300; font-size: 13px;">'.number($produkt['cena']).'</span>').
  80. td('<span style="color: #aaaaaa; font-size: 13px;">'.$produkt['ilosc'].'</span>').
  81. td('<span style="color: #FF7300; font-size: 13px; font-weight: bold;">'.number($produkt['cena'] * $produkt['ilosc']).'</span>')
  82. );
  83. }
  84.  
  85. ?>
  86.  
  87. </table>
  88.  
  89. <div class="razem">
  90. <?echo fraza(143)?>  <span><?= number($koszty + $koszyk->suma_cen()) ?></span>
  91. </div>
  92.  
  93.  
  94.  
  95. <strong style="font-size:14px;">Szczegóły dostawy</strong>
  96.  
  97. <table width="48%" style="margin: 0 0 10px 0;">
  98. <tr style="background: none;">
  99. <td><?echo fraza(139)?></td>
  100. <td style="text-align: left; color: #FE8200; font-size: 13px;"><?= $_SESSION['zamowienie']['tr']?></td>
  101. </tr>
  102.  
  103. <tr>
  104. <td><?echo fraza(140)?></td>
  105. <td style="text-align: left; color: #FE8200; font-size: 13px;"><?=$_SESSION['zamowienie']['pl']?></td>
  106. </tr>
  107. </table>
  108.  
  109. <strong style="font-size:14px;margin:10px 0 0 0;">Adres dostawy:</strong>
  110.  
  111. <div class="form">
  112. <table cellspacing="0" width="90%">
  113. <?
  114.  
  115. tr(
  116. td($_SESSION['zamowienie']['imie'] . ' ' . $_SESSION['zamowienie']['nazwisko'])
  117. ).
  118. tr(
  119. td('ul. '. $_SESSION['zamowienie']['ulica'] . ' '.$_SESSION['zamowienie']['dom'] . '/ m.' . $_SESSION['zamowienie']['mieszkanie'])
  120. ).
  121. tr(
  122. td($_SESSION['zamowienie']['miasto'] . ' ' . $_SESSION['zamowienie']['poczta'])
  123. );
  124.  
  125. ?>
  126. </table>
  127. </div>
  128.  
  129.  
  130.  
  131. <div class="bottom">
  132.  
  133. <? if ($_SESSION['zamowienie']['zagiel']) {?>
  134.  
  135. Zapoznałem się
  136. <a OnClick="nowe_okno();" style="cursor: pointer;">
  137. <b>
  138. <u>z procedurą udzielenia kredytu ratalnego e-Raty Żagiel</u>
  139. </b>
  140. </a>
  141. <input type="checkbox" id="zapoznalemsie" />
  142. <? } ?>
  143. <input id="fin2" type="submit" name="zamowienie" value="<?=fraza(144)?>" />
  144. </div>
  145.  
  146. </form>
  147.  
  148.  
  149.  
  150. <?
  151.  
  152. break;
mambus
Może utwórz sobie do każdego sposobu płatności osobną klasę i funkcję która będzie ją załączała i tworzyła w zależności od tego co user wybierze. Czasami warto trochę więcej popracować by sobie ułatwić życie. Bez sensu twardo tworzyć każdego IFa w każdym case-ie, powiela się kod w ten sposób. Z klasy np class.payu.php będziesz mógł zawsze skorzystać. Warto bazę w to zaangażować skoro piszesz że ma to byś dalej rozwijane.

Nie do końca zrozumiałem pytanie.
darko
Takie kwestie są z reguły skomplikowane, ponieważ jest tu pewien proces ciągły, proces zakupowy, w którym mamy do czynienia z wielokrotnym wyborem i z mnóstwem czynników, które wpływają na przebieg tego procesu, m.in.:

- wymieniony rodzaj i sposób wysyłki, z możliwością skalkulowania kosztów i wyborem usługodawcy, dodatkowo tutaj wpływ ma destynacja przesyłki plus opcje dodatkowe, np. masa i wymiary paczki, możliwość ekspresowej wysyłki za dopłatą (termin dostawy)

- od strony produktu - wszystko, co wpłynie na masę przesyłki, a więc - głównie rozmiar, ilość produktów etc.

- model cenowy produktu uwzględniający możliwe rabaty (nawet kilka jednocześnie w zależności od promocji i tego, na co ostatecznie skusi się klient, jeżeli pod pewnymi warunkami zaoferujemy mu rabat jeśli np. wybierze więcej niż jedną sztukę produktu)

- także pozostałe rabaty i promocje okolicznościowe itp.

- dostępne metody i sposoby płatności

Magento może nie jest mistrzem w tej kwestii, ale jeśli przyjrzymy się wybranym obiektom i relacjom między nimi na pierwszych z brzegu diagramach związków encji, to temat wydaje się bardziej skomplikowany, niż można byłoby przypuszczać:

Klient i jego tzw. otoczenie
wysyłka
Promocje, zniżki, rabaty
Koszyk
płatności

Ciężko sobie wyobrazić próbować oddać te wszystkie relacje za pomocą ifów i switch-case. Najlepiej przyjrzeć się procesom zakupowym w kilku najpopularniejszych platformach e-commerce, wytypować kilka, do trzech, które z nich najbliżej oddają to, co chcemy osiągnąć i dokonać porównania i analizy, wybierając najlepsze rozwiązania.
Adi32
Cytat(darko @ 7.09.2012, 01:46:42 ) *
Ciężko sobie wyobrazić próbować oddać te wszystkie relacje za pomocą ifów i switch-case.

Ano, ciężko... Jednak rozwiązanie na pewno będzie prostsze niż te z Magneto. Jeśli się da...
Mam obowiązek stworzyć sklep w wersji BOX. Większość mam już zrobione i zostało właśnie to kupowanie. Administrator ma mieć możliwość włączania i wyłączania sposobów płatności a programiści mają mieć łatwą możliwość dodawania ich. Zależności pomiędzy poszczególnymi wyborami jest zbyt wiele żebym mógł sobie to jakoś wyobrazić i ubrać w klasy.
Na pewno będę kombinował jednak dzisiaj mija termin...
Nie pozostaje mi nic tylko zacząć to robić i może samo mi się jakoś rozświetli. Dzięki za odpowiedzi.
jarexx
Jesli chodzi o zaimplementowanie platnosci, to sprawa jest prosta. Wdrozylem ponizsze rozwiazanie i dziala znakomicie.
Temat: System platnosci on line Jaki wzorzec
Adi32
Cytat(jarexx @ 10.09.2012, 08:25:27 ) *
Jesli chodzi o zaimplementowanie platnosci, to sprawa jest prosta. Wdrozylem ponizsze rozwiazanie i dziala znakomicie.
Temat: System platnosci on line Jaki wzorzec

Jestem 'troszke' dalej. Napisałem już coś w ten deseń, zapakowałem to do sesji, nie wiem czy słuszeni aby na następnych krokach (stronach) móc się odwoływać do pól. Teraz pozostało dorobić dla każdego systemu inny formularz i inne wpływy na cenę, do tego powiązać to jakoś z systemem transportu który mam zamiar zrobić w ten sam sposób. Nie wiem czy będzie to miało ręce i nogi ale na nic innego nie mam czasu a będzie to rozwiązanie lepsze od dotychczasowego.

Dzięki i pozdrawiam.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.