Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> koszyk na zakupy, na sesjach
Olimpia_ona
post
Post #1





Grupa: Zarejestrowani
Postów: 71
Pomógł: 2
Dołączył: 10.03.2005
Skąd: Elbląg

Ostrzeżenie: (0%)
-----


Witam,
na początek powiem, że nie umiem programować obiektowo, ale znalazłam bardzo czytelny kawałek skryptu, który bym chciała dołączyć do swojego strukturalnego kodu.
Na początek wkleje ten piękny skrypt.
plik koszyk.php
  1. <?php
  2. /* koszyk.php - klasa bazowa koszyka na zakupy 
  3. */ 
  4. /* zawiera definicje podstawowych operacji na koszu 
  5. */
  6. /* Zaimplementowane funkcje: 
  7. */ 
  8. /* koszyk  - konstruktor tworzy koszyk z zawartoscia 
  9. */ 
  10. /* dodaj - dodaje $ilosc $elementow do koszyka 
  11. */ 
  12. /* usun  - usuwa $ilosc $elementow z koszyka 
  13. */ 
  14. /* stan  - zwraca zawartosc w postaci hasza 
  15. */ 
  16.  
  17.  
  18. class koszyk 
  19. { 
  20. /* tablica asocjacyjna zawierajaca stan koszyka 
  21. */ 
  22. /* klucz, to wartosc id produktu, wartosc to ilosc elementow 
  23. */ 
  24. var $zawartosc; 
  25.  
  26.  
  27. function dodaj($element, $ilosc) 
  28. { 
  29. $this->zawartosc[$element] += $ilosc; 
  30. } 
  31.  
  32.  
  33. function usun($element, $ilosc) 
  34. { 
  35. if ($this->zawartosc[$element] > $ilosc) 
  36. $this->zawartosc[$element] -= $ilosc; 
  37. else 
  38. unset($this->zawartosc[$element]); 
  39. } 
  40.  
  41.  
  42. function stan() 
  43. { 
  44. return $this->zawartosc; 
  45. } 
  46.  
  47.  
  48.  
  49. }
  50. ?>


plik session.php
  1. <?php
  2. /* klasa koszyka */ 
  3. include('koszyk.php'); 
  4.  
  5.  
  6. /* start sesji */ 
  7.  
  8.  
  9. if (!$koszyk) 
  10. $koszyk = new koszyk; 
  11.  
  12.  
  13. if ($dodaj) 
  14. $koszyk->dodaj($dodaj, 10); 
  15.  
  16.  
  17. if ($usun) 
  18. $koszyk->usun($usun, 10); 
  19.  
  20.  
  21. session_register('koszyk'); 
  22.  
  23.  
  24. $stan = $koszyk->stan(); 
  25. if ($stan) 
  26. while (list($key, $value) = each($stan)) 
  27. echo "$key $value<br>";
  28. ?>



i teraz tak, to co jest pod słowem plik session.php wkleiłam sobie na stronę pomiędzy jakieś tam <td></td> no i wyskakuje mi błąd
Fatal error: Unknown(): The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition <b>koszyk</b> of the object you are trying to operate on was loaded _before_ the session was started

więc zrobiłam tak jak napisali i wkleiłam fragment include("koszyk.php"); na górze swojej strony index.php
  1. <?php
  2. include ('incl/funkcje.php');
  3. include("koszyk.php");
  4. $status=$_GET['status'];
  5. ..itd
  6. ?>


no ale w tym wypadku wyświetla mi się błąd:
Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at c:\usr\krasnal\www\sexshop\koszyk.php:60) in c:\usr\krasnal\www\sexshop\index.php on line 4

Wiec jak ja mam to rozwiązać? Pomocy
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Sedziwoj
post
Post #2





Grupa: Zarejestrowani
Postów: 793
Pomógł: 32
Dołączył: 23.11.2006
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Mam pytanie to ma być obiektowo? czy bawimy się proceduralnie?
Przecież tan koszyk to nic innego niż kolekcja... (nie wiem czy to ta nazwa)
Ogólnie powinien być np.:
  1. <?php
  2. class Produkt{
  3.  private $intId;
  4.  private $strKolor;
  5.  private $intRozmiar;
  6.  
  7.  public function getId(){
  8.  return $this->intId;
  9.  }
  10.  public function __construct( $intId ){
  11. //chyba najlepiej gdyby tu pobierało (podkreślam chyba, bo można przekazywać przy tworzeniu)
  12.  
  13. //zamiast na sztywno, powinno skądś to pobrać
  14. $this->strKolor = 'czarnr'.$intId;
  15. $this->intRozmiar = 4+$intId;
  16.  }
  17.  
  18.  public function getKolor(){
  19. return $this->strKolor;
  20.  }
  21.  
  22.  public function getRozmiar(){
  23. return $this->intRozmiar;
  24.  }
  25. }
  26. ?>


no i wtedy ten koszyk by wyglądał jakoś tak:
  1. <?php
  2. class Koszyk{
  3.  private $arrProdukt;
  4.  
  5.  public function getByProduktId( $intId ){
  6. return $this->arrProdukt[$intId];
  7.  }
  8.  
  9.  public function getWszystkie(){
  10. return $this->arrProdukt;
  11.  }
  12.  
  13.  public function dodaj( Produkt $objProdukt, $intIlosc ){
  14. if( !isset(this->arrProdukt[$intId]) ){
  15.  this->arrProdukt[$objProdukt->getId] = array(
  16. 'produkt' => $objProdukt,
  17. 'ilosc' => $intIlosc
  18. );
  19. }else{
  20.  $this->arrProdukt[$intId]['ilosc'] += $intIlosc;
  21. }
  22.  }
  23.  
  24.  public function usun( Produkt $objProdukt ){
  25. $this->arrProdukt[$intId]['ilosc'] -= $intIlosc;
  26.  }
  27. }
  28. ?>


co prawda można to jeszcze ładniej... do tego nie dałem żadnej weryfikacji.
Ale teraz wystarczy wiedzieć, że obiekt Produkt ma metodę getId(), która zwraca unikalny identyfikator, a reszta nas nie obchodzi, no bo oprucz co to za element i ile go jest nie powinno nas nic obchodzić.
(sam kod na tej zasadzie można jeszcze lepiej zorganizować, choć się zastanawiam czy warto trzymać coś więcej niż id produktu i ilość, bo PHP i tak to wszystko traci między stronami, a nie ma sensu trzymać całych opisów w danych sesyjnych, więc iloć i id produktu wystarczyło by, a potem kiedy trzeba wyświetlić zawartość to już nie kłopot jedno zapytanie i mamy wszystkie produkty z koszyka)
Go to the top of the page
+Quote Post
Olimpia_ona
post
Post #3





Grupa: Zarejestrowani
Postów: 71
Pomógł: 2
Dołączył: 10.03.2005
Skąd: Elbląg

Ostrzeżenie: (0%)
-----


Cytat(Sedziwoj @ 11.05.2007, 18:21:04 ) *
...no bo oprucz co to za element i ile go jest nie powinno nas nic obchodzić.
(sam kod na tej zasadzie można jeszcze lepiej zorganizować, choć się zastanawiam czy warto trzymać coś więcej niż id produktu i ilość, bo PHP i tak to wszystko traci między stronami, a nie ma sensu trzymać całych opisów w danych sesyjnych, więc iloć i id produktu wystarczyło by, a potem kiedy trzeba wyświetlić zawartość to już nie kłopot jedno zapytanie i mamy wszystkie produkty z koszyka)


No właśnie ja mam tak zrobione, że do tego koszyka jest tylko id produktu i ilość, ale niektóre produkty mają wiele kolorów i różne rozmiary i chcę zrobić tak, by klient zanim wciśnie dodaj do koszyka mógł zaznaczyć, jaki kolor i rozmiar danego produktu chce kupić i to też bym chciała trzymać w koszyku/sesji.
Dla tego zależałoby mi by to było jakoś tak na podstawie takiej funkcji
  1. <?php
  2. function dodaj($element, $ilosc, $kolor, $rozmiar) 
  3. }
  4. ?>


>> Sedziwoj w tej Twojej funkcji nie rozumiem tego fragmentu:
  1. <?php
  2. public function __construct( $intId )
  3. { $this->strKolor = 'czarnr'.$intId; $this->intRozmiar = 4+$intId;  }
  4. ?>


czumu jest 'czarnr'.$intId z kropką, a tu z plusem 4+$intId
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 3.10.2025 - 01:01