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]
[sesje] koszyk na zakupy
-
Olimpia_ona
- Nowy

- Posty: 27
- Rejestracja: pt gru 03, 2004 7:41 pm
- Lokalizacja: Elbląg
Re: [sesje] koszyk na zakupy
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" =>
);
$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]
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" =>
$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

- Posty: 27
- Rejestracja: pt gru 03, 2004 7:41 pm
- Lokalizacja: Elbląg
Re: [sesje] koszyk na zakupy
Dziękuje, chcę spróbować sama powalczyć (trzeba się rozwijać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
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]
Re: [sesje] koszyk na zakupy
Bo on działa... jest napisany pod PHP 5. (Nie polecam używania krasnala - to tak na marginesie).Napisałeś, że przykład jest działający, więc w celach testowych uruchomiłam go i wyskoczył mi błąd:
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.
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.$link2="?dodaj=$id_produktu"; //link do zamówienia
<a href='$link2' class='promocje_tyt'>$nazwa_produktu</a>
[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

- Posty: 27
- Rejestracja: pt gru 03, 2004 7:41 pm
- Lokalizacja: Elbląg
Re: [sesje] koszyk na zakupy
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)
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ć
