Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP][Smarty] Produkt w sklepie internetowym, Powiązanie z wieloma klasami
jasinskiwojciech
post
Post #1





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 18.03.2009

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


Witam,
Chcę wyświetlić w sklepie informacje o produkcie. Mam moduł, który pobiera informacje o danym produkcie i przekazuje obiekt Produkt do Smarty.
W skrócie wygląda to tak:

pokazProdukt.php
  1. <?php
  2. $produkt = new Produkt(1);
  3. $produkt->PobierzZdjecia();
  4.  
  5. $smarty->assign("produkt", $produkt);
  6. ?>


Produkt.class.php
  1. <?php
  2. class Produkt
  3. {
  4.    public
  5.    $id = 0,
  6.    $nazwa = "",
  7.    $cena = 0,
  8.    ...
  9.    $idDodajacego = 0, // id uzytkownika, który dodal produkt - pobrany z bazy
  10.    $dodajacy = null, // obiekt Uzytkownik
  11.    $zdjecia = null; // obiekt Zdjecia
  12.    
  13.    function __construct($id)
  14.    {
  15.        // pobieranie z bazy produktu i ustawianie wartości
  16.        // np. $this->id = $r['id']; itp.
  17.        
  18.        // po pobraniu idDodającego z bazy tworzony jest obiekt Uzytkownik
  19.        $this->Dodajacy = new Uzytkownik($this->idDodajacego); // konstruktor Uzytkownika działa na tej samej zasadzie co w Produkt
  20.    }
  21.    
  22.    public function PobierzZdjecia()
  23.    {
  24.        $this->zdjecia = new Zdjecia($this->id); // pobieranie wszystkich zdjęć należących do tego produktu
  25.    }
  26.  
  27. }
  28. ?>


Zdjecia.class.php
  1. <?php
  2. class Zdjecia
  3. {
  4.    public lista = array();
  5.    
  6.    function __construct($id)
  7.    {
  8.        // pobieranie wszystkich zdjec do produktu o podanym ID i dodawanie zdjec do $this->lista
  9.        $q = mysql_query(....);
  10.        while ($r=mysql_fetch_assoc($q))
  11.        {
  12.            $this->lista[] = new Zdjecie($r);
  13.        }
  14.    }
  15. }
  16. ?>


Zdjecie.class.php
  1. <?php
  2. class Zdjecie
  3. {
  4.    public
  5.    $id,
  6.    $nazwaPliku,
  7.    .....
  8.    $idDodajacego,
  9.    $dodajacy;
  10.    
  11.    function __construct($dane)
  12.    {
  13.        // ustawianie wartosci zmiennych $id, $nazwapliku itp na podstawie tablicy $dane
  14.        // np. $this->id = $dane['id']; itp.
  15.        
  16.        // tak samo jak przy produkcie mamy idUzytkownika, który dodał dane zdjęcie i pobieramy jego dane
  17.        $this->dodajacy = new Uzytkownik($this->idDodajacego); // konstruktor Uzytkownika działa na tej samej zasadzie co w Produkt
  18.    }
  19. }
  20. ?>


Po przekazaniu obiektu Produkt do Smarty z poziomu szablonu mam dostęp do wszystkich informacji z takiego oto drzewa:
Kod
Produkt
+ id
+ nazwa
+ ...
+ dodajacy
      Uzytkownik
      + id
      + login
      ...
+ zdjecia
      Zdjecia
      + lista
            1 - Zdjecie
                    + id
                    + nazwaPliku
                    + ...
                    + dodajacy
                      Uzytkownik
                      + id
                      + login
                      ...
            2 - Zdjecie
                    + id
                    + nazwaPliku
                    + ...
                    + dodajacy
                      Uzytkownik
                      + id
                      + login
                      ...
            3 - Zdjecie
                    + id
                    + nazwaPliku
                    + ...
                    + dodajacy
                      Uzytkownik
                      + id
                      + login
                      ...


Stworzenie takiej "hierarchii" może mieć sens jeśli chcemy wyświetlić wszystkie możliwe informacje np podpisując zdjęcia danymi użytkowników, którzy je dodali itp.

Mam jednak parę wątpliwości:
  1. Wszystkie pola klas (id, nazwa ...) są publiczne.
  2. Przekazujemy do Smarty obiekt (a w zasadzie cały zbiór obiektów), które przecież zawierają takie metody jak: Dodaj, Usun, Edytuj, których nie wymieniłem wcześniej, żeby nie zaciemniać. Czy przekazanie tych metod, które będą publiczne, jest bezpieczne?
  3. Czy rozwiązanie jakie przedstawiłem powyżej jest w ogóle warte uwagi? Proszę o komentarze.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
bazyliszek83
post
Post #2





Grupa: Zarejestrowani
Postów: 81
Pomógł: 6
Dołączył: 24.07.2007
Skąd: Poznań

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


Jeżeli masz aplikacje zabezpieczoną pod względem "wstrzyknięcia kodu" (czytaj tutaj) to nie masz się o co martwić.

Natomiast, sama enkapsulacja jest ważna patrząc z poziomu stabilnego działania aplikacji. Najważniejsze jest to o czym pisałem w punkcie 1, czyli dostęp do pól za pomoca funkcji get... i set... . Idąc dalej, blokujemy krytyczne metody np. usuń przed dostepem z zewnątrz, jednocześnie dając możliwość jej wywołania przez wspomniany wcześniej kontroler.

Tak na prawdę można napisać "dobrą" aplikację bez stosowania tych głównych założeń. Ale trzeba pamiętać że dobry projekt to też taki który jest poźniej łatwy do pielegnacji i rozbudowy. Wyobraź sobie że do dużego projektu który napisałeś bez użycia tych podstawowych zasad, zasiada po jakimś czasie ktoś inny, potem jeszcze ktoś inny. Robi się bajzel, co ostatecznie może doprowadzić do dziwnych zachowań w aplikacji. Dlatego tak ważne jest stosowanie się do ogólnych wzorców:)
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: 31.12.2025 - 09:26