Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Podział klas ze względu na dane w XML
Forum PHP.pl > Forum > PHP > Object-oriented programming
webmaniak
Witam,
z góry przepraszam za temat, ale nie wiem jak go sensownie nazwać. Już przedstawiam problem:
Mam jakieś dane w formacie xml:
  1. <?xml version='1.0' encoding='UTF-8' ?>
  2. <!-- was: no XML declaration present -->
  3. <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
  4. <levelsTable>
  5. <group name="Angielski - praktyczny kurs">
  6. <product levelFrom="a13" levelTo="b21">
  7. <name>Angielski - praktyczny kurs</name>
  8. <link>useful_eng.php</link>
  9. </product>
  10. </group>
  11. <group name="Inne">
  12. <product levelFrom="b13" levelTo="c13">
  13. <name>Angielski w pracy</name>
  14. <link>ang_praca_za_gran.php</link>
  15. </product>
  16. <product levelFrom="a23" levelTo="b23">
  17. <name>Angielski At Once!</name>
  18. <link>angielski_at_once.php</link>
  19. </product>
  20. </group>
  21. <group name="Język na 6+">
  22. <product levelFrom="a13" levelTo="b12">
  23. <name>Angielski na 6+</name>
  24. <link>ang6_plus.php</link>
  25. </product>
  26. <product levelFrom="a13" levelTo="b12">
  27. <name>Niemiecki na 6+</name>
  28. <link>niem6_plus.php</link>
  29. </product>
  30. <product levelFrom="a13" levelTo="b12">
  31. <name>Rosyjski na 6+</name>
  32. <link>ros6_plus.php</link>
  33. </product>
  34. </group>
  35. ...
  36. </levelsTable>

Jak widać w levelsTable są grupy a w nich produkty. Co chciałbym zrobić: chciałbym utworzyć następujące klasy:
-product - zawierają produkty
-products - zawierająca kilka produktów
-productGroup - zawierająca grupę produktów
-productGroups - zawierająca kilka grup
-oraz Data(nazwa pewnie będzie inna smile.gif ) - która będzie sortowała dane oraz zawierała listę pól klas powyżej
W czym mam problem:
- z utworzeniem klas products, productGroup oraz productGroups. W tabeli produkt umieszczam parametry czyli name i link oraz settery i gettery. Problem jest w tym że nie wiem co umieścić w w products żeby zawierała odpowiednie pola? No i kolejne klasy, co powinny zawierać? Chodzi generalnie żeby klasy ładnie były od siebie uzależnione i nawzajem się wywoływały, tzn. wywoływana będzie ostatnia klasa Data, ale chciałbym, jeśli to możliwe mieć dostęp do klasy products.
Nie wiem czy to dobrze opisałem, postaram się dopowiedzieć. Od razu napiszę że nie jest jakieś zadanie domowe:), po prostu znalazłem gdzieś coś podobnego, jednak nie mam dostępu do tego kodu, a chciałbym to przećwiczyć smile.gif Proszę o pomoc, wytlumaczenie co tam ma być, przykład, jednym słowem - cokolwiek smile.gif
Crozin
O ile dobrze zrozumiałem, szukasz mappera XML-obiekty. W takim razie biblioteka JMS\Serializer może Cię zainteresować.
webmaniak
Wiem że nie lubicie takich pytań ale muszę je zadać:
jak to pobrać? bo chciałbym zobaczyć samą bibliotekę. Nie używam composer, projekt mam oparty o codeigniter. Jak mniemam to samo jest tu:
https://github.com/schmittjoh/JMSSerializer...lizerBundle.php
Widzę że w tym pliku to są odwołania do kolejnych, no ale chyba jestem ślepy bo nie widzę ich w strukturze.
No i na końcu - choć najważniejsze - dzięki za odpowiedź, wiem czego szukać, tylko że mnie bardziej interesuje zbudowanie własnej biblioteki do tego, a ta podana jest dla mnie trochę zawiła ;/
Crozin
1. Ciebie interesuje JMSSerializer (biblioteka), nie JMSSerializerBundle (integracja biblioteki z Sf2).
2. Repozytorium: https://github.com/schmittjoh/serializer
3.
Cytat
[...] tylko że mnie bardziej interesuje zbudowanie własnej biblioteki do tego [...]
Ale dlaczego sam sobie rzucasz kłody pod nogi?
webmaniak
Dzięki za linki, zaraz zobaczę smile.gif
Cytat(Crozin @ 9.02.2013, 17:32:56 ) *
3. Ale dlaczego sam sobie rzucasz kłody pod nogi?

Ponieważ chce zrobić coś takiego(czyt. bibliotekę) dla nauki/lepszego zrozumienia. Każdy inaczej się uczy, jeden człowiek odpali symfony i wystarczy mu dokumentacja do zrozumienia programowania, inny musi zbudować swój framework by przekonać się że własne rozwiązanie jest gorsze. Analogicznie w tej sytuacji smile.gif.

Trochę przeglądnąłem tą bibliotekę, możecie podpowiedzieć czy dobrze rozumiem jakby to mogło wyglądać w moim przykładzie?
Klasa product:
  1. <?php
  2.  
  3. <?php
  4.  
  5. class Product {
  6.  
  7. private $name;
  8. private $level;
  9. private $levelFrom;
  10. private $levelTo;
  11.  
  12. public function getName() {
  13.  
  14. }
  15.  
  16. public function setName() {
  17.  
  18. }
  19.  
  20. public function getLink() {
  21.  
  22. }
  23.  
  24. public function setLink() {
  25.  
  26. }
  27.  
  28. public function getLevelFrom(){
  29.  
  30. }
  31.  
  32. public function setLevelFrom(){
  33.  
  34. }
  35.  
  36. public function getLevelTo(){
  37.  
  38. }
  39.  
  40. public function setLevelTo(){
  41.  
  42. }
  43.  
  44.  
  45.  
  46. }

a klasa products:
  1. <?php
  2.  
  3. <?php
  4.  
  5. class Products {
  6.  
  7. private $products;
  8. private $names;
  9. private $levels;
  10.  
  11. public function __construct(){
  12. //no właśnie, co tutaj?
  13. }
  14.  
  15. public function getNames() {
  16. foreach...
  17. }
  18.  
  19. public function setNames() {
  20.  
  21. }
  22.  
  23. public function getLinks() {
  24. foreach...
  25. }
  26.  
  27. public function setLinks() {
  28.  
  29. }
  30. }

Czy coś takiego jest chociaż w części poprawne? Bo jeśli tak to resztę zbuduję przez analogię. Jeśli nie to jakby to mogło wyglądać? Proszę o pomoc. Z góry dziękuję.
Crozin
1. Wymyślanie koła od nowa w ramach nauki jest jeszcze OK, chociaż z tego co zauważyłem nauka korzystania z istniejących narzędzi przyspiesza naukę samą w sobie. wink.gif
2. Czy aby na pewno potrzebujesz osobnego obiektu do reprezentacji kolekcji obiektów Product? Może zwykła tablica/ArrayObject, albo jakaś gotowa kolekcja ogólnego przeznaczenia (np. ArrayCollection z Doctrine Commons) będzie wystarczająca?
3. O ile w przypadku klasy Product nie ma się do czego przyczepić (ot, zwykła klasa typu POPO), tak w przypadku klasy Products (lepszą nazwą byłoby ProductCollection) nie bardzo rozumiem cel właściowści names czy levels - chyba, że mają one udostępniać szybki dostęp do kolekcji dostępnych nazw/poziomów w całym zbiorze.
webmaniak
ad1. No właśnie nie każdemu przyspiesza, bo np. używam rutingu w Codeigniter, ale jak on działa to nie wiem, bo jest napisany gotowy - jak to we frameworku, no i jakbym miał np. w ramach testu gdzieś napisać prosty routing albo opisać jego działanie pewnie bym poległ - to tylko przykład z routingiem smile.gif.
ad2. Hmm, taką założyłem sobie strukturę, W mojej koncepcji ma to głębszy sens - ale nie jestem w stanie wytłumaczyć tutaj jaki smile.gif jak będzie więcej kodu to przedstawię smile.gif
ad3. ProductCollection to będzie ostatnia klasa zawierająca listę pól. No i tak jak pisałeś
Cytat(Crozin @ 10.02.2013, 20:46:14 ) *
3. O ile w przypadku klasy Product nie ma się do czego przyczepić (ot, zwykła klasa typu POPO), tak w przypadku klasy Products (lepszą nazwą byłoby ProductCollection) nie bardzo rozumiem cel właściowści names czy levels - chyba, że mają one udostępniać szybki dostęp do kolekcji dostępnych nazw/poziomów w całym zbiorze.

w moim zamyśle to ma być dostęp do klasy product, w groupproduct do kilku product a w groupproducts do kilku grupproduct. Czyli to co przedstawiłem "trzyma się kupy"?

Po głębszym namyśle sam zastanawiam się nad tymi właściwościami names i levels. Czyli zostawić samo products i w konstruktorze foreach który będzie przechodził po wszystkich product?
CuteOne
Cytat
ProductCollection to będzie ostatnia klasa zawierająca listę pól.

Pomyliłeś kolejności wink.gif


w takim prymitywnym uproszczeniu
  1. class CollectionX {
  2.  
  3. public function getItem($key) {
  4.  
  5. if($this->hasItem($key)) {
  6.  
  7. return $this->_items[$key];
  8. }
  9. }
  10.  
  11. public function addItem($key, ObjectX $item) {
  12.  
  13. if($this->hasItem($key)) {
  14.  
  15. throw new Exception('juz istnieje');
  16. }
  17. $this->_items[$key] = $item;
  18. }
  19. }
  20.  
  21. class ObjectX {
  22.  
  23. public function getName() { return $this->name; }
  24. }
  25.  
  26.  
  27. $collection = new CollectionX()
  28. $collection -> addItem(12, new ObjectX);
  29.  
  30. echo $collection -> getItem(12)->getName();



ps. zobacz do Zenda lub Symfony jak tam wyglądają kolekcje (ogólnie poczytaj na googlu o tym jak tworzą je ludzie z wieloletnim doświadczeniem i do czego można je wykorzystać)
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.