Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] W jaki sposób "zaktualizować niestandardową" tablicę?
Forum PHP.pl > Forum > PHP
Savage.Mephisto
Jak w poniższej tablicy odwołać się do pola 'ilosc' i zmienić jego wartość? Tablica ta przechowuje produkty znajdujące się w koszyku.

Podgląd tablicy:
  1. (
  2. [0] => Towar Object
  3. (
  4. [id:protected] => 126
  5. [nazwa:protected] => Body Pawełek
  6. [cena:protected] => 21.00,21.00,21.00,23.00,23.00
  7. [rozmiar:protected] => 62,68,74,80,86
  8. [opis:protected] => opis
  9. [data_dodania:protected] => 2009-07-17 08:21:21
  10. [small:protected] => galeria/thumb/thumb_1247811681.jpg
  11. [big:protected] => galeria/image/image_1247811681.jpg
  12. [small2:protected] =>
  13. [big2:protected] =>
  14. [second_pict:protected] => n
  15. [active:protected] => t
  16. [dostepnosc:protected] => produkt dostępny
  17. [nowosci:protected] => n
  18. [nowosci_time:protected] => 0
  19. [promocje:protected] => n
  20. [promocje_time:protected] => 0
  21. [kolor:protected] => multikolor
  22. [visits:protected] => 7
  23. [data_aktualizacji:protected] => 2010-10-13 12:31:53
  24. [slowa_kluczowe:protected] =>
  25. [pack_size:protected] => 1
  26. [vat:protected] => 0.22
  27. [kolor2:protected] => Array
  28. (
  29. [126] => multikolor
  30. )
  31.  
  32. [ilosc:protected] => Array
  33. (
  34. [126] => 3
  35. )
  36.  
  37. [rozmiar2:protected] => Array
  38. (
  39. [126] => 62
  40. )
  41.  
  42. [cena2:protected] => Array
  43. (
  44. [126] => 21.00
  45. )
  46.  
  47. )
  48.  
  49. )


W "zwykłej" tablicy byłoby to coś na wzór:
  1. public function refresh($nr) {
  2. if ($nr<0 || $nr>$this->counter()) return 0;
  3. $id = intval($_POST['id']);
  4. foreach ($this->list as $nr=>$towar) {
  5. if ($towar != NULL) {
  6. $this->list[$nr] = $_POST['ilosc'][$id];
  7. }
  8. }
  9. return $this->list[$nr];
  10. }


==========
Fragmenty kodu
==========

Produkty:
  1. class Towar extends basicElement {
  2.  
  3. protected $id;
  4. protected $nazwa;
  5. protected $cena;
  6. protected $rozmiar;
  7. protected $opis;
  8. protected $data_dodania;
  9. protected $small;
  10. protected $big;
  11. protected $small2;
  12. protected $big2;
  13. protected $second_pict;
  14. protected $active;
  15. protected $dostepnosc;
  16. protected $nowosci;
  17. protected $nowosci_time;
  18. protected $promocje;
  19. protected $promocje_time;
  20. protected $kolor;
  21. protected $visits;
  22. protected $data_aktualizacji;
  23. protected $slowa_kluczowe;
  24. protected $pack_size;
  25. protected $vat;
  26. protected $kolor2;
  27. protected $ilosc;
  28. protected $rozmiar2;
  29. protected $cena2;
  30.  
  31.  
  32. public function __construct($row,$kolor,$ilosc,$rozmiar,$cena) {
  33.  
  34. $this->id = $row[0];
  35. $this->nazwa = $row[1];
  36. $this->cena = $row[2];
  37. $this->rozmiar = $row[3];
  38. $this->opis = $row[4];
  39. $this->data_dodania = $row[5];
  40. $this->small = $row[6];
  41. $this->big = $row[7];
  42. $this->small2 = $row[8];
  43. $this->big2 = $row[9];
  44. $this->second_pict = $row[10];
  45. $this->active = $row[11];
  46. $this->dostepnosc = $row[12];
  47. $this->nowosci = $row[13];
  48. $this->nowosci_time = $row[14];
  49. $this->promocje = $row[15];
  50. $this->promocje_time = $row[16];
  51. $this->kolor = $row[17];
  52. $this->visits = $row[18];
  53. $this->data_aktualizacji = $row[19];
  54. $this->slowa_kluczowe = $row[20];
  55. $this->pack_size = $row[21];
  56. $this->vat = $this->showVat();
  57. $this->kolor2 = $kolor;
  58. $this->ilosc = $ilosc;
  59. $this->rozmiar2 = $rozmiar;
  60. $this->cena2 = $cena;
  61.  
  62. }
  63. }


Dodawanie produktu do koszyka:
  1. $id = intval($_GET['id']);
  2. $ilosc = $_POST['ilosc'];
  3. $kolor = $_POST['kolor'];
  4. $rozmiar = $_POST['rozmiar'];
  5. $rozmiary[$id] = explode(',', $rozmiar[$id]);
  6. $rozmiar = array(''.$id.'' => ''.$rozmiary[$id][0].'');
  7. $cena = array(''.$id.'' => ''.$rozmiary[$id][1].'');
  8.  
  9. $query = "SELECT * FROM `towar` WHERE `id`='$id'";
  10. $result = $db->Execute($query);
  11. $row = $result->FetchRow();
  12.  
  13. $towar = new Towar($row,$kolor,$ilosc,$rozmiar,$cena);
  14. $koszyk->doKoszyka($towar);


koszyk.lib.php
  1. public function doKoszyka($towar) {
  2. $this->push($towar);
  3. return 1;
  4. }


W czym mam problem:
jestem w klasie o nazwie Koszyk i chciałbym za pomocą funkcji refresh() zmienić wartość pola 'ilosc' danego produktu na tą podaną przez użytkownika za pomocą metody $_POST().
Wnioskuję, że trzeba skorzystać z magicznych funkcji __get() oraz __set().

do pliku koszyk.lib.php dopisałem te dwie funkcje:
  1. public function __get($name) {
  2. if (array_key_exists($name, $this->list))
  3. return $this->list[$name];
  4. }
  5.  
  6. public function __set($name, $value) {
  7. $this->list[$name] = $value;
  8. }


Ale po wywołaniu __set() moja tablica wygląda następująco:
  1. (
  2. [0] => Towar Object
  3. (
  4. [id:protected] => 126
  5. [nazwa:protected] => Body Pawełek
  6. [cena:protected] => 21.00,21.00,21.00,23.00,23.00
  7. [rozmiar:protected] => 62,68,74,80,86
  8. [opis:protected] => opis
  9. [data_dodania:protected] => 2009-07-17 08:21:21
  10. [small:protected] => galeria/thumb/thumb_1247811681.jpg
  11. [big:protected] => galeria/image/image_1247811681.jpg
  12. [small2:protected] =>
  13. [big2:protected] =>
  14. [second_pict:protected] => n
  15. [active:protected] => t
  16. [dostepnosc:protected] => produkt dostępny
  17. [nowosci:protected] => n
  18. [nowosci_time:protected] => 0
  19. [promocje:protected] => n
  20. [promocje_time:protected] => 0
  21. [kolor:protected] => multikolor
  22. [visits:protected] => 7
  23. [data_aktualizacji:protected] => 2010-10-13 12:31:53
  24. [slowa_kluczowe:protected] =>
  25. [pack_size:protected] => 1
  26. [vat:protected] => 0.22
  27. [kolor2:protected] => Array
  28. (
  29. [126] => multikolor
  30. )
  31.  
  32. [ilosc:protected] => Array
  33. (
  34. [126] => 3
  35. )
  36.  
  37. [rozmiar2:protected] => Array
  38. (
  39. [126] => 62
  40. )
  41.  
  42. [cena2:protected] => Array
  43. (
  44. [126] => 21.00
  45. )
  46.  
  47. )
  48.  
  49. [ilosc:protected] => 15 // zapis po wywołaniu __set()
  50.  
  51. )


Ktoś pomoże? Pogubiłem się w tym wszystkim. Zaćmienie totalne. Będę wdzięczny za wszelkie wskazówki.
Majzok
A nie możesz w klasie dodać sobie:
Kod
public function setIlosc($value)
{
       $this->ilosc = $value;
}
Savage.Mephisto
Do tablicy muszę się dostać z "zewnątrz", stąd te funkcje dostępowe __get() i __set(). Pole 'ilosc' należy do obiektu Towar, a nie Koszyk.
Majzok
No tak, ale w tablicy masz obiekty.
Cytat
[0] => Towar Object

Nie wiem czym tablice zwracasz, ale zrób tak:

$towary = $koszyk->funkcjaKtoraPobieraArray();

i patrząc dalej z twojej tablicy:
$towary[0]->setIlosc(10);

Potem musisz zwrócić zmodyfikowaną zmienną do koszyka.
Nie robiłem tego nigdy w ten sposób, ale to tak na chłopski rozum winksmiley.jpg
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.