![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 4 655 Pomógł: 556 Dołączył: 17.03.2009 Skąd: Katowice Ostrzeżenie: (0%) ![]() ![]() |
Witam!
Potrzebuję podzielić widok, na kilka klas. Dokładniej chcę mieć główny widok i klasy które rozszerzą jego możliwości. Nie byłoby problemu, bo mógłbym nawet dziedziczyć tylko, że potrzebuję użyć np. 3-4 rozszerzeń naraz. Przykłady rozszerzeń: - Klasa obsługująca szablony (parsowanie etc.) - Klasa parsująca bb-code - Klasa tworząca formularze Sam wymyśliłem coś takiego: Klasa widok, ma metodę:
Problem polega na tym, że używanie tak wczytanego modułu jest niewygodne, bo muszę robić to np. tak:
Od razu tutaj zaznaczę, że mam magiczną metodę __get() dlatego odwołuję się poprzez $view->template. Co w tym niewygodnego? Muszę wszystko zwracać returnami, bo inaczej nic w widoku nie zapiszę. Dokładniej:
To co mi się nie podoba, działa akurat na zasadzie wywołania __toString, który uruchamia parser template. Z template jest najmniejszy problem, gorzej z robieniem formów... Gdzie np. każdego inputa muszę zapisać do zmiennej i potem $view->save($zmiennaZinputem) Jak za słabo objaśniłem to czekam na pytania. (IMG:style_emoticons/default/haha.gif) |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 304 Pomógł: 51 Dołączył: 4.02.2005 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Nie wiem czy dobrze zrozumiałem Twój problem, ale jeśli w aplikacji istnieje "zapach" wielodziedziczenia to dekorator powinien dać radę ;] Ewentualnie możesz zrobić "złożony" widok (Composite), do którego dodajesz te widoki podrzędne o których mówisz, a widok główny deleguje zadania kolejno do każdego z widoków podrzędnych i składa wynik.
Ten post edytował -=Peter=- 10.08.2009, 12:20:29 |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 4 655 Pomógł: 556 Dołączył: 17.03.2009 Skąd: Katowice Ostrzeżenie: (0%) ![]() ![]() |
Nie wiem czy dobrze zrozumiałem Twój problem, ale jeśli w aplikacji istnieje "zapach" wielodziedziczenia to dekorator powinien dać radę ;] Tutaj nie ma dziedziczenia, napisałem że gdyby chodziło o jeden moduł rozszerzający naraz to bym dziedziczył, w przeciwnym wypadku (tym) nie mogę. Ewentualnie możesz zrobić "złożony" widok (Composite), do którego dodajesz te widoki podrzędne o których mówisz, a widok główny deleguje zadania kolejno do każdego z widoków podrzędnych i składa wynik. Nie wiem czy dobrze zrozumiałem, ale właśnie do głównego widoku ładuję te moduły rozszerzające czy jak to nazwałeś widoki podrzędne. |
|
|
![]()
Post
#4
|
|
Grupa: Moderatorzy Postów: 15 467 Pomógł: 1451 Dołączył: 25.04.2005 Skąd: Szczebrzeszyn/Rzeszów ![]() |
Nie wiem, czy u Ciebie nie byłby dobry wzorzec Adapter.
Cytat Jak za słabo objaśniłem to czekam na pytania. Trochę nie jarzę, jak chcesz w ogóle to wszystko osiągnąć - żeby samo wczytywało wstawki i automatycznie je wykonywało? |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 4 655 Pomógł: 556 Dołączył: 17.03.2009 Skąd: Katowice Ostrzeżenie: (0%) ![]() ![]() |
Trochę nie jarzę, jak chcesz w ogóle to wszystko osiągnąć - żeby samo wczytywało wstawki i automatycznie je wykonywało? Chodzi mi o to, abym mógł w prosty sposób rozwiązać "komunikację" głównego widoku z modułami rozszerzającymi. Przykładowo moduł do form, powiedzmy tworzenie inputa:
Chodzi mi o to, aby po wywołaniu $view->form->createInput była jakby "automatycznie" wywoływana $view->save(), abym nie musiał tworzyć kolejnej zmiennej w tym wypadku $input. Bo robi się bałagan jak robię np. 3 inputy (login, hasło, submit) Jednym słowem wszystko jest jakieś niewygodne. Jak trzeba to pokażę moje testowe/przejściowe rozwiązanie, napisane na kolanie. |
|
|
![]()
Post
#6
|
|
Grupa: Moderatorzy Postów: 15 467 Pomógł: 1451 Dołączył: 25.04.2005 Skąd: Szczebrzeszyn/Rzeszów ![]() |
Cytat Chodzi mi o to, aby po wywołaniu $view->form->createInput była jakby "automatycznie" wywoływana $view->save(), abym nie musiał tworzyć kolejnej zmiennej w tym wypadku $input. Hmm, to może zrób wg tego:
i potem wewnątrz tamtej klasy wywołujesz, co trzeba. |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 4 340 Pomógł: 542 Dołączył: 15.01.2006 Skąd: Olsztyn/Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Nie jestem ekspertem w OOP i może napisze niezłą głupotę ale czy __call by ci nie pomogło (IMG:style_emoticons/default/questionmark.gif)
__call |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 4 655 Pomógł: 556 Dołączył: 17.03.2009 Skąd: Katowice Ostrzeżenie: (0%) ![]() ![]() |
Chyba lepiej pokaże moje rozwiązanie na kolanie pisane:
Klasa view (główna) do niej "ładuję" moduły
Przykładowy moduł:
Mam nadzieję, że to mniej więcej rozjaśni mój problem. ;d |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 143 Pomógł: 17 Dołączył: 8.11.2008 Skąd: Libiąż Ostrzeżenie: (0%) ![]() ![]() |
I jak masz zamiar tego użyć? Bo mimo, że się wgłębiłem, to nie mogę znaleźć się w Twoim kodzie... Pokaż przykładowy kod użycia proszę.
BTW. Od tego są tablice asocjacyjne, żeby nie robić takich diabełków jak to:
tylko uprościć sobie:
EDIT: Potem sobie korzystasz z array_keys() Ten post edytował megawebmaster 15.08.2009, 22:18:27 |
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 4 655 Pomógł: 556 Dołączył: 17.03.2009 Skąd: Katowice Ostrzeżenie: (0%) ![]() ![]() |
I jak masz zamiar tego użyć? Bo mimo, że się wgłębiłem, to nie mogę znaleźć się w Twoim kodzie... Pokaż przykładowy kod użycia proszę. Masz w pierwszym poście... BTW. Od tego są tablice asocjacyjne, żeby nie robić takich diabełków jak to: Jak już wspomniałem kod jest pisany na kolanie, tylko w celach "testowych". (chciałem zobaczyć jak to będzie działało) |
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 143 Pomógł: 17 Dołączył: 8.11.2008 Skąd: Libiąż Ostrzeżenie: (0%) ![]() ![]() |
No to najprostszym rozwiązaniem jest przekazanie do obiektu view_template przy ładowaniu samego siebie ($this) i w ten sposób uzyskasz dostęp do metod klasy view. Dzięki temu możesz sobie dodać zapisywanie, albo nawet bezpośrednie dodawanie do zmiennej $content klasy view w metodach dołączonych. To takie najprostsze rozwiązanie. Inne rozwiązanie to zrobienie to tak jak napisał ktoś wcześniej - wzorzec adapter - i ładowanie modułów, ale ich obsługa bezpośrednio w klasie view. To tyle wymyśliłem na kolanie.
P.S. Ewentualnie w obiektach modułów można wywołać w konstruktorze modułu view::create() i pobrać instancję klasy view. |
|
|
![]() ![]() |
![]() |
Aktualny czas: 22.08.2025 - 21:25 |