[sesje] koszyk na zakupy

Języki, których efekty są wykonywane po stronie serwera. PHP, ASP czy CGI w połączeniu z bazami danych SQL dają niezwykłe możliwości budowy i zarządzania stron WWW. Tu zadajemy pytania oraz demonstrujemy kod, z którym mamy problem.
Olimpia_ona
Nowy
Nowy
Posty: 27
Rejestracja: pt gru 03, 2004 7:41 pm
Lokalizacja: Elbląg

[sesje] koszyk na zakupy

Post autor: Olimpia_ona »

Witam,
na początek powiem, że nie umiem programować obiektowo, ale znalazłam bardzo czytelny kawałek skryptu, który chciałabym lekko zmodyfikować, ale nie wiem jak. Mam prarę pomysłów, ale z chęcią poznam Wasze.
[php]<?php
class koszyk
{
/* tablica asocjacyjna zawierajaca stan koszyka */
/* klucz, to wartosc id produktu, wartosc to ilosc elementow */
var $zawartosc;

function dodaj($element, $ilosc)
{
$this->zawartosc[$element] += $ilosc;
}

function usun($element, $ilosc)
{
if ($this->zawartosc[$element] > $ilosc)
$this->zawartosc[$element] -= $ilosc;
else
unset($this->zawartosc[$element]);
}

function stan()
{
return $this->zawartosc;
}
}

if (!$koszyk)
$koszyk = new koszyk;

if ($dodaj)
$koszyk->dodaj($dodaj, 1); //dodaj($element, $ilosc) - dodaje $ilosc $elementow do koszyka

if ($usun)
$koszyk->usun($usun, 1); //usun($element, $ilosc) - usuwa $ilosc $elementow z koszyka

session_register("koszyk");

$stan = $koszyk->stan(); //zwraca zawartosc w postaci hasza
......
$stan = $koszyk->stan();
if ($stan)
while (list($key, $value) = each($stan))
echo "$key $value<br>";
.....

?>[/php]

Otóż na mojej stronie niektóre asortymenty maja rozmiar i kolor (do wyboru checkboxem) i chciałabym by te dane też były przechowywane w koszyku. Jak można przerobić tą funkcję dodaj?
Czy da się to jakoś zrobić na zasadzie:
[php]<?php
function dodaj($element, $ilosc, $kolor, $rozmiar) { //??? }
?>[/php]

Jeśli się da to jak potem wyciągnąć te dane tym sposobem:
[php]<?php
while (list($key, $value) = each($stan)) echo "$key $value<br>";
?>[/php]
123456
Zaczyna działać
Zaczyna działać
Posty: 514
Rejestracja: sob paź 28, 2006 1:19 pm

Re: [sesje] koszyk na zakupy

Post autor: 123456 »

Proponuje dwa wyjścia: albo znajdź klasę, która obsługuje również cechy produktów, albo zleć napisanie takiego koszyka, komuś kto zna obiektówkę.

Jeśli chcesz sama powalczyć to poniżej jedno z możliwych rozwiązań:
Przykład czysto dydaktyczny (działający), uproszczony mający na celu pokazanie teorii działania a nie zapewnienia gotowego kodu

[php]<?php
class koszyk {

private $zawartosc = Array();

// -------------
public function dodaj($goods)
{
$this->zawartosc[] = $goods;
}
// -------------
// (...)
// -------------
public function stan()
{
return $this->zawartosc;
}
// -------------
// (...)
// -------------
}
// --------------------------------------------------------------------------
$koszyk = new koszyk;

/*Funkcja dodaj() za argument przyjmuje tablice ktora obowiązkowo musi miec wartosc ID czyli identyfikator produktu i AMT czyli ilosc towaru. Jesli produkt posiada dodatkowe atrybuty przekazywane sa w dodatkowej tablicy trzymanej w polu o indeksie "cechy"*/

// przykladowe dodanie produktów
$addGoods = array( "id" => 456, "amt" => 2 );
$koszyk->dodaj($addGoods);

$addGoods = array( "id" => 123, "amt" => 1, "cechy" => array("color" => 3) );
$koszyk->dodaj($addGoods);

$addGoods = array("id" => 136, "amt" => 22, "cechy" => array("size" => 8) );
$koszyk->dodaj($addGoods);

$addGoods = array("id" => 136, "amt" => 3, "cechy" => array("size" => 5) );
$koszyk->dodaj($addGoods);

$addGoods = array("id" => 89, "amt" => 1, "cechy" => array("size" => 2, "color" => 2) );
$koszyk->dodaj($addGoods);
// //==//

// przykladowe wyswietlanie zawartosci koszyka
$html = '<table border="1" cellpadding="5"><tr><td colspan="4">Zawartosc koszyka</td></tr>'."\n";
$html.= "<tr><td>LP</td><td>Produkt</td><td>Ilosc</td><td>Cechy</td></tr>\n";
$cnt = 0;

foreach($koszyk->stan() AS $G)
{
$cnt++;
$html.= "<tr><td>".$cnt."</td>";
$html.= "<td>Produkt o ID ". $G['id'] ."</td>";
$html.= "<td>". $G['amt']."</td>";
$html.= "<td>";

// jesli sa jakies cechy...
if( isset($G['cechy']) ){
// to wyjmujemy je z tablicy
foreach($G['cechy'] AS $cecha=>$wartosc)
{
$html.= $cecha.": ".$wartosc."<br>";
}

} else {

$html.= "-";

}

$html.= "</td></tr>\n";
}

$html.= "</table>";
print $html;
?>[/php]
Olimpia_ona
Nowy
Nowy
Posty: 27
Rejestracja: pt gru 03, 2004 7:41 pm
Lokalizacja: Elbląg

Re: [sesje] koszyk na zakupy

Post autor: Olimpia_ona »

123456 pisze:Jeśli chcesz sama powalczyć to poniżej jedno z możliwych rozwiązań:
Przykład czysto dydaktyczny (działający), uproszczony mający na celu pokazanie teorii działania a nie zapewnienia gotowego kodu
Dziękuje, chcę spróbować sama powalczyć (trzeba się rozwijać ;))
Napisałeś, że przykład jest działający, więc w celach testowych uruchomiłam go i wyskoczył mi błąd:
Parse error: parse error, expecting `T_OLD_FUNCTION' or `T_FUNCTION' or `T_VAR' or `'}'' in c:\usr\krasnal\www\test\koszyk_cechy.php on line 4
Co trzeba poprawić? W czym tkwi błąd?

P.S W mojej pierwotnej wersji (tej bez cech produktu) mam tak rozwiązany sposób uruchomienia funkcji dodaj:
[php]<?php
$link2="?dodaj=$id_produktu"; //link do zamówienia
<a href='$link2' class='promocje_tyt'>$nazwa_produktu</a>
?>[/php]
Jak by taki link musiał wyglądać w tej twojej wersji?
[php]<?php
// przykladowe dodanie produktów
$addGoods = array( "id" => 456, "amt" => 2 );
$koszyk->dodaj($addGoods);

?>[/php]
123456
Zaczyna działać
Zaczyna działać
Posty: 514
Rejestracja: sob paź 28, 2006 1:19 pm

Re: [sesje] koszyk na zakupy

Post autor: 123456 »

Napisałeś, że przykład jest działający, więc w celach testowych uruchomiłam go i wyskoczył mi błąd:
Bo on działa... jest napisany pod PHP 5. (Nie polecam używania krasnala - to tak na marginesie).
Poniższa wersja klasy będzie działać pod PHP 4.
[php]<?php
class koszyk {

$zawartosc = Array();

// -------------
function dodaj($goods)
{
$this->zawartosc[] = $goods;
}
// -------------
// (...)
// -------------
function stan()
{
return $this->zawartosc;
}
// -------------
// (...)
// -------------
}
?>[/php]
Powinno ruszyć chociaż nie mam nigdzie wersji 4 żeby sprawdzić a zmieniać nie chce.
$link2="?dodaj=$id_produktu"; //link do zamówienia
<a href='$link2' class='promocje_tyt'>$nazwa_produktu</a>
Tutaj przekazujesz tylko ID produktu. Co z ilością? Czy jest przekazywana przez formularz czy link? Nie wiem jak wygląda obecnie całość więc za bardzo nie wiem jak napisać, żeby się dostosować do istniejącej wersji.
[php]<?php
$link2="?dodaj=$id_produktu"; //link do zamówienia
<a href='$link2' class='promocje_tyt'>$nazwa_produktu</a>
// ---------
$id = (int) $_GET['dodaj'];
$amt = (int) $_GET['ilosc']
$addGoods = array( "id" => $id, "amt" => $amt );
$koszyk->dodaj($addGoods);
?>[/php]
Szczerze mówiąc bardzo ciężko będzie Ci to napisać bez średniej znajomości PHP. Gdzie będzie użyty ten kod? Tylko do nauki czy używany na co dzień? Jeśli druga opcja wchodzi w grę radziłbym znaleźć jednak kogoś do napisania tego. W razie błędów będzie miał kto je poprawiać w ramach reklamacji. Jeśli do nauki to proponuję liczne kursy do PHP i książkę (eBook) PHP5 Power programming (9MB - prawy myszy->zapisz jako ;))
Olimpia_ona
Nowy
Nowy
Posty: 27
Rejestracja: pt gru 03, 2004 7:41 pm
Lokalizacja: Elbląg

Re: [sesje] koszyk na zakupy

Post autor: Olimpia_ona »

123456 pisze:Bo on działa... jest napisany pod PHP 5. (Nie polecam używania krasnala - to tak na marginesie).
Poniższa wersja klasy będzie działać pod PHP 4.

Szczerze mówiąc bardzo ciężko będzie Ci to napisać bez średniej znajomości PHP. Gdzie będzie użyty ten kod? Tylko do nauki czy używany na co dzień? Jeśli druga opcja wchodzi w grę radziłbym znaleźć jednak kogoś do napisania tego. W razie błędów będzie miał kto je poprawiać w ramach reklamacji. Jeśli do nauki to proponuję liczne kursy do PHP i książkę (eBook) PHP5 Power programming (9MB - prawy myszy->zapisz jako ;))
:) Dzięki za odpowiedź, rzeczywiście w firmie programujemy na krasnalu i jego wersja php jest 4. Próbowałam zainstalować php5 ale jakieś błędy mi wywaloło. W każdym razie z krasnala nie mogę zrezygnować.

Co do tej poprawki klasy, to się sama domyśliłam, by zlikwidować to private, ale to nie pomogło, błąd jest nadal ten sam. :(
Jak se z tym nie poradzę, to będe szukać innego rozwiązania, chodz przyznam, że to wydaje mi się czytelne. Trochę znam php, ale proceduralne. No jeśli by mi się udało to zrobić, to kod by był używany na co dzień. hymm... nie lubie się tak szybko poddawać :)
ODPOWIEDZ