![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 12 Pomógł: 1 Dołączył: 9.10.2003 Ostrzeżenie: (0%) ![]() ![]() |
Mam formularz rejestracyjny (widok). Są dwa kontrolery: IndexController i EmailController.
W dużym skrócie, co chcę osiągnąć 1) IndexController odpala widok, który wyświetla formularz 2) Po wysłaniu formularza, IndexController zapisuje dane do bazy (za pomocą jakiegośtam modelu) 3) IndexController wywołuje EmailController (robię to za pomocą _forward() ) 4) EmailController pobiera z bazy szablon wiadomości (znowu jakiś model) 5) EmailController wysyła maila (wykorzystałem Zend_Mail) 6) Teraz chcę wyświetlić komunikat, że link z kodem aktywacyjnym został wysłany mailem. Punkty 1-5 mam zrealizowane. Utknąłem na 6). Nie wiem w jaki sposób i w którym miejscu wyświetlić ten komunikat. Nie mogę tego zrobić w EmailController, ponieważ będzie on wykorzystany do wysyłania różnych maili, w różnych "modułach" serwisu - a zatem za każdym razem będzie wyświetlał inny komunikat. Najlepiej gdyby z EmailController dało się "wrócić" do miejsca(kontrolera i akcji) z którego zostal odpalony. Coś w tym stylu:
Próbowałem drugi raz użyć _forward(). ale wtedy działa tylko ten drugi. Siedzę nad tym od ponad 3 godzin. Wymęczyłem dokumentacje ZF, googla i wszelkie znane mi źródła. To mój pierwszy "projekt" z wykorzystaniem ZF i zarazem pierwszy kontakt z MVC. Jestem pewien, że robię jakiś głupi błąd. |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 2 262 Pomógł: 21 Dołączył: 3.05.2004 Skąd: Sopot, Krakow, W-wa Ostrzeżenie: (0%) ![]() ![]() |
Postaw sobie pytanie czy kontroler do wysylania emaili jest Ci koniecznie potrzebny (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 12 Pomógł: 1 Dołączył: 9.10.2003 Ostrzeżenie: (0%) ![]() ![]() |
Kontroler - nie. Natomiast koniecznie potrzebne jest wydzielenie go jako jakiejś klasy. Klasa
pobiera z bazy szablon (przez odpowiedni model), wstawia dane i w zależności od ustawień dla danego szablonu zapisuje wiadomość w archiwum wysłanych (znowu jakiś model. Na pewno wystarczająco duży kawałek kodu żeby to wydzielić jako osobną klasę. Na pewno widok to nie jest (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) Gdybym sobie przyjął że ta klasa jest modelem to byłoby dużo łatwiej, ale to nie jest model. Więc zostaje kontroler (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) Ten projekt traktuje trochę "dydaktycznie" - dlatego zależy mi na tym, żeby nie stosować jakichś obejść. Nie wiem czy dobrze to rozumiem, ale potrzebowałbym do rozwiązania mojego problemu tego łańcuch akcji, którego w ZF nie ma. Ten post edytował mr__y 14.11.2007, 10:48:00 |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 1 415 Pomógł: 117 Dołączył: 7.09.2005 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
A słyszałeś o FlashMessengerze? Ten helper udostępnia funkcjonalność której poszukujesz.
|
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 12 Pomógł: 1 Dołączył: 9.10.2003 Ostrzeżenie: (0%) ![]() ![]() |
A słyszałeś o FlashMessengerze? Ten helper udostępnia funkcjonalność której poszukujesz. Tak, widziałem to w dokumentacji. Jak rozumiem miałoby to wyglądać w ten sposób: IndexController:
EmailController:
Wszystko fajnie, ale co, jeśli po wysłaniu maila chcę wykonać kolejną akcję? na przykład obsługa płatności - po zapłaceniu chcę wysłać maila do klienta (potwierdzenie zakupu) i do administratora. Czyli chciałbym dwa razy wywołać EmailController i znowu leżę (IMG:http://forum.php.pl/style_emoticons/default/blinksmiley.gif) Natomiast wymyśliłem inne rozwiązanie - wysyłanie maili zrobić jako Action Helper. "Action Helpers aim to minimize the necessity to extend the abstract Action Controller in order to inject common Action Controller functionality" Więc jakoś to pasuje do definicji (IMG:http://forum.php.pl/style_emoticons/default/blinksmiley.gif) |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 1 415 Pomógł: 117 Dołączył: 7.09.2005 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
FlashMessenger może trzymać kilka wiadomości.
Piszesz, że na przeszkodzie stoi brak rozbudowanych łańcuchów akcji. I jak byś z tymi łańcuchami rozwiązał problem wysyłania maili razy kilka? FlashMessenger równie dobry pomysł jak ten z osobnym helperem. edit: I sorry, nie doczytałem Twojego kodu. Źle robisz, po co wiadomość umieszczasz w IndexControllerze? Zrób to MailControlerze faktycznie po wysłaniu maila, a potem jeszcze raz - po wysłaniu kolejnego maila, przejdz np na IndexController (bo rozumiem, że akcje MailControllera nie mają widoków?) i tam wyswietl wiadomości. Ja mam to zautomatyzowane . W szablonie layoutu mam już odpowiedni blok dla wiadomości z FlashMessengera. Ten post edytował LBO 14.11.2007, 12:26:05 |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 12 Pomógł: 1 Dołączył: 9.10.2003 Ostrzeżenie: (0%) ![]() ![]() |
FlashMessenger może trzymać kilka wiadomości. Piszesz, że na przeszkodzie stoi brak rozbudowanych łańcuchów akcji. I jak byś z tymi łańcuchami rozwiązał problem wysyłania maili razy kilka? FlashMessenger równie dobry pomysł jak ten z osobnym helperem. Ok, to w takim razie ja czegoś nie wiem, nie rozumiem (IMG:http://forum.php.pl/style_emoticons/default/wstydnis.gif) Jak w ogóle mogę dwa razy wywołać ten mój nieszczęsny EmailController? Na pewno nie mogę tego zrobić tak:
Z tego co rozumiem, wykonanie takiej serii akcji to właśnie Action Chain. Generalnie, gdyby nie MVC zrobiłbym to w ten sposób:
I tak naprawdę chciałbym dowiedzieć się jak takie coś uzyskać w MVC. Być może ta klasa, która wysyła maile wcale nie musi być kontrolerem?? |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 1 415 Pomógł: 117 Dołączył: 7.09.2005 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Dostosuj kontroler żeby obsłużył więcej tagów
|
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 12 Pomógł: 1 Dołączył: 9.10.2003 Ostrzeżenie: (0%) ![]() ![]() |
Uparciuch ze mnie (IMG:http://forum.php.pl/style_emoticons/default/aaevil.gif)
Oczywiście żaden problem mogę przerobić EmailController tak żeby przyjmował całą tablicę tag'ów. EmailController musi wywołać IndexController, jak rozumiem w metodzie postDispatch(). Czyli wiąże się to z dwoma konsekwencjami: 1) EmailController musi "wiedzieć" gdzie ma "wrócić" po zakończeniu (tj jaką akcję/kontroler wywołać). Dla mnie jest to sprzeczne z zasadą hermetyzacji, kontroler powinien "zrobić swoje" i po prostu zakończyć działanie. Jeżeli ma służyć wyłącznie do wysyłania/archiwizacji poczty, to nie powinien "zajmować się" odpalaniem jakichś widoków. 2) EmailController zawsze po zakończeniu będzie wywoływał IndexController A co jeśli będę chciał wykorzystać EmailController w przyszłości, w innym kontrolerze itp (czyli powrót do IndexControllera będzie niepożądany) Nie chcę szukać dziury w całym, ale gdyby przyjąć, że klasa wysyłająca maila nie jest kontrolerem, tylko po prostu biblioteką, to cała sprawa byłaby dziecinnie prosta - stworzyłbym sobie plik w library/costam/
I cała ta otoczka MVC jest, jak na razie , wyłącznie utrudnieniem dla mnie - widać jeszcze sporo nauki przede mną (IMG:http://forum.php.pl/style_emoticons/default/dry.gif) W każdym razie na chwilę obecną rozwiązałem to tak, że napisałem plugin Zend_Controller'a. Plugin ma statyczną tablicę przechowującą listę akcji do wykonania. Za pomocą metody Plugin::addAction() dopisuję sobie akcje do tej tablicy. Później w Plugin::postDispatch() odpalam po kolei akcje z listy. Czyli mam taki nędzny łańcuch akcji. Muszę jeszcze sprawdzić, czy nie ma konfliktów z Zend_Controller_Action::_forward() |
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 1 415 Pomógł: 117 Dołączył: 7.09.2005 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
To już lepiej zostań przy samym helperze (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Nie ingeruj aż tak mocno w MVC ZF - możesz tylko napsuć (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Ale, ale... twoje pyt. dotyczyło notyfikacji użytkowników o wykonaniu zadania - nadal moim zdaniem najlepszy jest flashMessenger. Sprawdzony w kilku framworkach (Django na przykład) - może nie w identycznej postaci. Pozdrawiam. P.S. Co do powrotu do strony po przedniej. Też wszystko zautomatyzowałem, w sesji przechowuję ostatni url (oczywiście mogą wybierać które akcje mają być zapisywane w tej zmiennej) i jeżeli cos tego wymaga - robię twarde przekierowanie. |
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 398 Pomógł: 10 Dołączył: 24.11.2004 Skąd: Łódź Ostrzeżenie: (0%) ![]() ![]() |
Co do klasy wysylajacej maile to wydaje mi sie ze to jednak jest warstwa modelu. Pamietaj ze model jest odpowiedzialny za logike biznesowa aplikacji, a nie tylko za manipulowanie danymi. Do warstwy modelu pakujesz cala funkcjonalnosc systemu, a w kontrolerach korzystasz sobie tylko z API modelu. Manipulowanie i przekierowywanie do roznych kontrolerow wydaje sie byc nieintuicyjne.
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 24.08.2025 - 13:26 |