zamień tą metodę na inną - trochę mi tu coś nie gra - nie wiem, czy masz gdzieś redirekta czy co [akurat nie w metodzie], jeśli już to wcześniej zobaczysz skok o 2 [zamieniłem też tutaj strukturę tabeli koszyka]:
public function koszykAction() {
$filtr = new Application_Model_statyczne_filtry();
$id = (integer) $filtr->filtrowanie_id($this->getRequest()->getParam('id'));
$koszyk = new Zend_Session_Namespace('koszyk');
$koszyk->setExpirationSeconds(7200);
if (isset($id) && $id !== 0
): if (!isset($koszyk->dane[$id])) { //DODAWANIE $dane = array('sztuk'=>1
); $koszyk->dane[$id] = $dane;
} else { //ZWIĘKSZANIE LICZBY
++$koszyk->dane[$id]['sztuk'];
}
// WYŚWIETLANIE
foreach ($koszyk->dane as $id_key => $info_produkt):
echo 'To jest ID: ' . $id_key . ' ma sztuk: ' . $info_produkt['sztuk'] . '<br />'; endforeach;
endif;
}
// KOSZYK O STRUKTURZE
//$koszyk->dane=array(
// INTEGER_klucz_produktu => ARRAY_dodatkowe_dane_produktu
//);
a wogóle to bym to podzielił na 2 części razem z redirektem gdyż różne rzeczy o indexacji słyszałem...
class koszyk {
private $koszyk;
public function __construct() {
$this->koszyk = new Zend_Session_Namespace('koszyk');
$this->koszyk->setExpirationSeconds(7200);
}
public function dodajAction() {
$filtr = new Application_Model_statyczne_filtry();
$id = (integer) $filtr->filtrowanie_id($this->getRequest()->getParam('id'));
$this->koszyk = new Zend_Session_Namespace('koszyk');
$this->koszyk->setExpirationSeconds(7200);
if (isset($id) && $id !== 0
): if (!isset($this->koszyk->dane[$id])) { //DODAWANIE $dane = array('sztuk'=>1
); $this->koszyk->dane[$id] = $dane;
} else { //ZWIĘKSZANIE LICZBY
++$this->koszyk->dane[$id]['sztuk'];
}
endif;
// PRZEKIEROWUJEMY NA KOSZYK COBY WYŚWIETLIĆ ZAWARTOŚĆ
header('Location: ' . $ADRES_DO_KOSZYKA); }
public function koszykAction() {
// WYŚWIETLANIE ZAWARTOŚCI
$str = '';
foreach ($this->koszyk->dane as $id_key => $info_produkt):
$str .= 'To jest ID: ' . $id_key . ' ma sztuk: ' . $info_produkt['sztuk'] . '<br />';
endforeach;
return $str;
}
}
//a tak najlepiej to by było dane przekazywać metodą POST gdzie jeszcze dodatkowo mógłbyś zdefiniować ile sztuk ktoś chce kupić
class koszyk2 {
private $koszyk;
public function __construct() {
$this->koszyk = new Zend_Session_Namespace('koszyk');
$this->koszyk->setExpirationSeconds(7200);
}
public function dodajAction() {
$id = (integer) $_POST['id'];
$ile = (integer) $_POST['ile'];
// PASUJE SPRAWDZIĆ ALBO TUTAJ ALBO PRZY WYŚWIETLANIU CZY JEST W BAZIE PRODUKT O TYM ID - PROPONUJĘ PRZY WYŚWIETLANIU I JEŚLI W BAZIE NIE MA TO TAKIE INDEKSY POUSUWAĆ
// TRZEBA JESZCZE PAMIĘTAĆ, BY KTOŚ NIE ZAMÓWIŁ WIĘCEJ NIŻ JEST DOSTĘPNYCH PRODUKTÓW
// CENY NIE PRZECHOWUJ W SESJI ZWŁASZCZA JESLI KOSZYK CHOĆ KILKA GODZIN MA ŻYWOTNOŚCI - POBIERAJ PRZY WYŚWIETLANIU Z BAZY...
if ($id !== 0 && $ile !== 0):
if (!isset($this->koszyk->dane[$id])) { //DODAWANIE $dane = array('sztuk'=>$ile); $this->koszyk->dane[$id] = $dane;
} else { //ZWIĘKSZANIE LICZBY - o tyle ktoś dokupuje
$this->koszyk->dane[$id]['sztuk'] += $ile;
}
endif;
// PRZEKIEROWUJEMY NA KOSZYK COBY WYŚWIETLIĆ ZAWARTOŚĆ
header('Location: ' . $ADRES_DO_KOSZYKA); }
public function koszykAction() {
if (reset($this->koszyk->dane) === false) return false; //PUSTY KOSZYK I NIC NIE MA - ZWRACAMY JAKIŚ WIDOK PUSTKI... // POBIERAMY AKTUALNE INFO z bazy w stylu "SELECT * FROM produkty WHERE `id` IN (...)
// $sql='SELECT * FROM `produkty` WHERE `id` IN ('.$in.')';
//...
//ODPYTUJEMY BAZE O AKTUALNE PRODUKTY;
$produkty_z_bazy = array();//NIE PUSTE JUŻ... I NAJLEPIEJ TAK JUŻ UŁOŻONY JAK W KOSZYKU PO ID PRODUKTU // CENĘ W BAZIE PRZECHOWYWAĆ JAKO INTEGER A POTEM PODZIELIĆ PRZEZ 100..
// JAK NIE MUSZE TO NIE UŻYWAM FOREACH - ALE RÓŻNICY TO NIE ROBI
$bufor = '';
$razem = 0;
do {
$id_key = key($this->koszyk->dane); if (!isset($produkty_z_bazy[$id_key])) { $to_del[] = $id_key;
continue; // POMIJAMY NIE POPRAWNE WIERSZE
};
// TRZA BY ZROBIĆ JESZCZE JEDNEGO IFA CZY PRODUKTU W BAZIE NIE MA MNIEJ NIŻ W KOSZYKU I JESLI TAK TO W KOSZYKU ZMIENIĆ LICZBĘ NA MNIEJSZĄ
$sztuk = $this->koszyk->dane[$id_key]['sztuk'];
$za_produkt_razem = $sztuk * $produkty_z_bazy[$id_key]['cena'];//cena dalej jest 100 razy większa.
$razem += $za_produkt_razem;
$bufor .= 'To jest ID: ' . $id_key . ' ma sztuk: '
. $this->koszyk->dane[$id_key]['sztuk'] . ' o łącznej wartości: '
. floor($za_produkt_razem / 100) . ',' . $za_produkt_razem % 100 . '<br />'; } while (next($this->koszyk->dane) !== false); for ($i = 0
, $count = count($to_del);$i < $count;++$i) unset($this->koszyk->dane[$i]); $bufor .= 'RAZEM: ' . floor($razem / 100) . ',' . $razem % 100; return $bufor;
}
}