Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Komunikaty dla użytkownika.
Forum PHP.pl > Forum > PHP
br-design.pl
Zastanawiam się jakie podejście będzie najwłaściwsze dla komunikatów dla użytkownika (typu dodano artykuł, usnięto produkt, zły login lub hasło itd.).

Myślałem nad jakąś klasą Logger'a ale nie wiem czy to przypadkiem nie za dużo, pozatym Loggera o ile się nie myle stosuję się głownie do błędów aplikacji.

Inny sposób o którym tylko słyszałem to zrobić kolekcje obiektów, ale nie bardzo wiem na czym to by miało polegać...

Jezeli ktoś ma jakiś pomysł to będe wdzięczny?
TomASS
Ostatnio czytałem, że fajnie pracuje się z wyjątkami. Może do Twojego celu by się nadawały?

Co do "kolekcje obiektów" to nawet nie słyszałem.
Ociu
Wyjątki przy informacji "Artykuł został dodany" blinksmiley.gif

Może poprostu wykorzystaj javascriptowy alert(), A potem wrzucaj do debuggera. Coś na modłe

  1. <?php
  2. function ShowAlert( $msg, $error = false )
  3. {
  4.  
  5. # Tu wywolanie alerta, niestety nie chce mi sie myslec :)
  6.  
  7. if( $error )
  8. {
  9.  
  10. Debug::addMessage( $msg );
  11.  
  12. }
  13.  
  14. }
  15. ?>
br-design.pl
Z wyjątkami pracuje się doskonale a i owszem, ale przy wyjątkach a nie komunikatach.

Hmmm pomysł z java jest całkiem ok, ale wydaje mi się troche na wyrost, napewno musi istnieć jakiś prosty przyjemny sposób na rozwiązanie problemu.

Myślałem zeby zrobić coś takiego:
dodawanie do loggera tych wiadomości, oczywiscie oznaczając je jako wiadomosc dla użytkownika i potem je wyswietlać w miejscu wywolania np. funkcji $logger->showMsg(), tylko jak oznaczać że wiadomość było już wyświetlona? Ma ktoś jakiś pomysł? Zwykla zmienna flagowa?

Ale z drugiej strony czy Logger nie powinien złużyć do rapoertowania bardziej błędów dla admina niż wiadomości dla użytkownika?
nospor
Cytat
Ale z drugiej strony czy Logger nie powinien złużyć do rapoertowania bardziej błędów dla admina niż wiadomości dla użytkownika?
To jak ci nazwa Logger nie pasuje to nadaj tej klasie nazwe: Messager i juz chyba bedzie ok smile.gif po co na sile tworzyc se problemy. nie pasuje nazwa to ją zmien i po sprawie.
br-design.pl
Heh...

Tym tropem to mogę sobie zmienić wyjątki na powiadamiacze ;-) Logger to ogolnie przyjeta nazwa dla klasy która odpowiada za logowanie zdarzeń, nie ważne czy się nazywa Loging, Logger, Messager, Log itd. Chodzi mi o to że mieszać jedno z drugim, ale mogę sie przecież mylić.
nospor
Cytat
Tym tropem to mogę sobie zmienić wyjątki na powiadamiacze ;
Nie, zdecydowanie idziemy innym tropem smile.gif
Raz mowisz ze logger to bardziej dla admina niz wiadomosc dla usera,raz ze to ogolnie przyjeta nazwa dla czegos tam.... no sie zdecyduj. zrob klase dla logowania zdarzen, zrob klasy dla wiadomosci dla usera i juz. A jak chcesz polaczyc to polacz tylko rozdzielaj typami.
Ja przykladowo mam polaczone, tj. w jednej klasie mam metody do komunikatow dla usera oraz logowanie do pliku. sa to metody podobne i czesciowo zalezne wiec je polaczym i jest mi z tym dobrze smile.gif
Strzałek
Cytat
Hmmm pomysł z java jest całkiem ok, ale wydaje mi się troche na wyrost, napewno musi istnieć jakiś prosty przyjemny sposób na rozwiązanie problemu.


java !== java script !

A co do problemu.

U mnie jest klasa Template która dziedziczy po Smarty.
Posiada ona metode displayMessage('Dodano news');

Cała filozofia snitch.gif

Ja rozwiązuje to bardzo prosto. Więc chętnie wysłucham jak robią to inni.
br-design.pl
@nospor

OK,

Co do Loggera chodziło mi po prostu o rozwiązanie, nie wiedziałem czy mam takie komunikaty po prostu logować czy może inaczej je jakoś exportować.

Wpadłem na jeszcze taki pomysł aby po prostu zapisywać komunikaty w obiekcie w zmiennej tablicy z którego się korzysta a potem je wyciągać 'po najświeższej', taki zalążek, co wy na to?

A powiedz jeszcze, jak w swoim rozwiązaniu rozwiązujesz kwestie wyświetlenia odpowiedniej wiadomości? Bo wiadomo że nie wyświetlisz całego 'loga', wyświetlasz po prostu ostatnio dodaną czy w np. przypisujesz wydarzenia do wiadomości i potem to jakoś rozwiązujesz przy wyświetlaniu?

@Strzałek

Hehe, myślę że nie będe miał już problemu z wyświetleniem komunikatu ;-)
Bardziej mi chodzi o sposób jego zapisywania...
nospor
Cytat
A powiedz jeszcze, jak w swoim rozwiązaniu rozwiązujesz kwestie wyświetlenia odpowiedniej wiadomości? Bo wiadomo że nie wyświetlisz całego 'loga', wyświetlasz po prostu ostatnio dodaną czy w np. przypisujesz wydarzenia do wiadomości i potem to jakoś rozwiązujesz przy wyświetlaniu?

Wiadomosci moga byc roznych typow. Moze byc kilka wiadomosci dla danego typu. W zaleznosci od typu roznie wyswietlam wiadomosci. jedne na czerwono (bledy), inne na zielono (komunikaty) i inne na inny kolor. Wyswietlam tyle wiadomosci ile bylo.
sa tez wiadomosci ktore sa czystym logiem. W zaleznosci od ustawionych parametrow takie wiadomosci wyswietlam albo tylko do logow pisze
br-design.pl
To ja poproszę wtedy o szybką lekcje php bo nie potrafie dojść do jednego.

Powiedz masz obiekt klasy news która ma funkcje wyświetlenie formularza do dodawania i po wysłaniu danych dodaje go oraz ma metode wyświetlania wiadomości (dla uproszczenia załużmy że w tym samej klasie a nie osobnej). Mając powiedzmy prostą stronę:

  1. <?php
  2. $news = new News();
  3. <body>
  4. <h1>dodawanie newsa</h1>
  5. $news->show_message();
  6. $news->print_addForm();
  7. </body>
  8. ?>


wysylasz formularz, dodaje się news, tworzy się wiadomość o tym fakcie, strona przeładowuje się i informacja umiera, chyba że zapisujesz ją w sesji, pliku lub w DB?

Ten fakt że tak powiem mnie najbardziej zastanawia.
nospor
Cytat
tworzy się wiadomość o tym fakcie, strona przeładowuje się i informacja umiera, chyba że zapisujesz ją w sesji, pliku lub w DB

W ktorym momencie napisalem ze mi sie strona przeladowuje po dodaniu wiadomosci? smile.gif
wiadomosc jest dodawana juz po przeladowaniu strony. wysylasz formualrz (strona sie przeladowuje), zapisujesz do bazy i w zaleznosci od tego czy sie udalo czy nie to tworzysz taka czy siaka wiadomosc. Potem masz jakies cudo co ci dodaje do wygenerowanej strony wiadomosci ktore sa zapisane.

Jesli jednak z jakiegos powodu musisz znowu przeladowac strone to wiadomosci zapisujesz w sesji
br-design.pl
Ok, a co z problemem przeładowania?

Po takiej operacji jak ty mówisz, weźmy dla przykładu naszego newsa, bez przeładowania nie czyści się ani POST ani GET. Wieć po dodaniu tego newsa, użytkownik widzi nasz komunikat, pusty formularz na nowego newsa, ale wystarczy że odświeży strone i nawet się nie zoreintuje kiedy dodał drugi raz ten sam rekord.
netzah
Strasznie komplikujesz proste rzeczy.

masz na stronie 3 akcje:
- formularz (zawsze)
- zapis newsa do bazy, nastepnie przekierowanie, zeby nie wyslac 2 raz posta
- wyswietlasz komunikat, ktory trzymasz np. w sesji, po czym go usuwasz.
Prph
Wczesniej przy programowaniu strukturalnym zastosowalem pewnien prosty mechanizm, ktory dzialal bardzo dobrze i calkiem wygodnie.

Mialem np. dodajNowoscFormularz i dodajNowosc. Pierwszy wyswietlal form, a drugi zapisywal w bazie - form kierowany byl do tego drugiego.

Jezeli wszystko wyszlo ok robilem na koncu przekierowanie (header('Location: xyz.php?msg=Dodano Nowosc')).

W pliku xyz.php mialem

  1. <?php
  2. if(!empty($_GET['msg']))
  3. echo $_GET['msg'];
  4. ?>


Adrian.
nospor
Cytat
Po takiej operacji jak ty mówisz, weźmy dla przykładu naszego newsa, bez przeładowania nie czyści się ani POST ani GET. Wieć po dodaniu tego newsa, użytkownik widzi nasz komunikat, pusty formularz na nowego newsa, ale wystarczy że odświeży strone i nawet się nie zoreintuje kiedy dodał drugi raz ten sam rekord.

Tu masz cos jak zapobiegac odswierzaniu i to bez przekierowania:
http://forum.php.pl/index.php?showtopic=44383
Pozatym problem z odswierzaniem ma sie nijak do komunikatow.

Jesli jednak koniecznie chcesz robic przekierowanie to zapisz komuniakty do sesji, po przekierowaniu je odbierz, wyswietl i usun z sesji. No tu nie ma zadnej filozofii

Cytat
Jezeli wszystko wyszlo ok robilem na koncu przekierowanie (header('Location: xyz.php?msg=Dodano Nowosc')).

@Prph taka metoda jest beznadziejna. A jak bedziesz chcial przekazac kilka komunikatow i beda za dlugie na url? Pomijam juz fakt ze ktos ci moze takiego linka spreparowac ze na Twojej stronie bedzie napisa:
"Ta strona jest do.... kitu smile.gif" albo jeszcze gorsze rzeczy i porazka totalna

edit: z php5 to ma malo wspolnego. przenosze
thornag
Jak dla mnie to klasa metoda dla wyswietlania. Ostatni serwis jaki robilem byl tak zaprojektowany(graficznie) ze w pliku index.php nad calym includowaniem itp moglem umiescic metode wyswietlajaca wiadomosci. Jesli wiadomosci nie bylo wszystko wygladalo w porzadku. Takze mala klasa i do wyswietlania i przekazywania wiadomosci.

  1. <?php
  2. if(akcja()) { /// jesli jakas tam operacja jest udana
  3. $msg->AddMessage("Operacja udana");
  4. } else { // jesli niedudana
  5.  $msg->AddMessage("Operacja nieudana"); // mozna dodawac jeszcze parametry e.g flagi bledow itp.
  6. }
  7. ?>


A gdziekolwiek tam gdzie chcesz dodac tylko

  1. <?php
  2. echo $msg->ShowMessage() // ewentualnie flaga jako parametr.
  3. ?>


Przewagatego uwazam jest taka, ze taka wiadomosc mozesz wyprintowac sobie gdzie tylko chcesz smile.gif
br-design.pl
To ja ciągle czegoś nie rozumiem, jeżeli np. wyswietlasz wiadomosc w kodzie przed wywolaniem akcji to co wtedy? Wtedy nie ma jeszcze wiadomości...
Więc chyba trzeba najpierw wywołać akcje, zapisać wiadomość do sesji, przeładować stronę żeby wyczyścić REQUESTa i dopiero potem wyswietlic wiadomosc z sesji...
nospor
teraz ja nie rozumiem. do kogo to pytanie? do mnie czy do thornag'a? W zasadzie to i tak bez roznicy.
Ty chyba mylisz pojecia "dodanie wiadomosci" i "wyswietlenie wiadomosci". Dodawac to se mozesz kiedy chcesz, przed zapisem formualrza, po zapisie formularza, ale wyswietlasz wtedy kiedy potrzebujesz. robisz przekierowanie - wyswietlaj po przekierowaniu.
br-design.pl
Pytanie do zainteresowanych: ;-)

No ale jak, przecież po przeładowaniu obiekt tworzy się na nowo i wszystkie wartości zmiennych idą w las. Więc nie można sobie przekierować a potem wyśwetlić zmiennej, chyba że jest to zmienna sesyjna, ale odwoływałem się do jego sposobu thornag'a:

że wystarczy zmienić kolejność w jego przypadku i wszystko się posypię:

tj.

wpierw zrobię w kodzie:
  1. <?php
  2. echo $msg->ShowMessage() // ewentualnie flaga jako parametr.
  3. ?>

a dopiero potem
  1. <?php
  2. if(akcja()) { /// jesli jakas tam operacja jest udana
  3. $msg->AddMessage("Operacja udana");
  4. } else { // jesli niedudana
  5.  $msg->AddMessage("Operacja nieudana"); // mozna dodawac jeszcze parametry e.g flagi bledow itp.
  6. }
  7. ?>


To jeżeli nie zapiszę zmiennej do sesji i nie przeładuję strony to nic się nie pokaże.

I druga kwestia w tym wypadku.

Czy używać jednej zmiennej sesyjnej i przy każdym wydarzeniu napisywać ją? Ale wtedy możemy wyświetlić tylko jedną wiadomość.
A jeżeli dla każdego komunikatu dawać inna nazwę zmiennej sesyjnej to jak z jej czyszczeniem?

------
Edit:

OK, już mam rozwiązany problem ;-)
Dzięki wszystkim za pomoc. Jakby co to rozwiązałem to tak:
Przykładowa metoda dodawania danych:

  1. <?php
  2. public function form_addRekord() {
  3. if($this->form->validate()) {
  4. try {
  5. // dodawanie do DB.
  6. $this->addRekordFromPost(array('id', 'MAX_FILE_SIZE'));
  7. // sprawdzam czy sa jakies pliki do uploadu
  8. if($_FILES) {
  9. $this->handleFileUpload();
  10. }
  11.  
  12. $this->addMsg('Dodano nowy rekord.'); // ustawiam komunikat
  13.  
  14. $tuJestem = $_SERVER['PHP_SELF'];
  15. header("Location: $tuJestem"); // robie przekierowanie
  16.  
  17. } catch (Exception $e) {
  18. MyErrorHandling::handle_error($e);
  19. }
  20. } else {
  21. $this->form->addElement('submit', null, 'Dodaj');
  22. $this->form->display();
  23. }
  24. }
  25. ?>


Metody obsługujące komunikaty.

  1. <?php
  2. public function showMsg() {
  3. echo $_SESSION['userMsg'];
  4. $_SESSION['userMsg'] = null;
  5. }
  6.  
  7. public function addMsg($string) {
  8. $_SESSION['userMsg'] = $string;
  9. }
  10. ?>

No i potem na stronie:
  1. <?php
  2. $cms->showMsg();
  3. $cms->form_addRekord(); 
  4. ?>
nospor
no to przeciez caly czas mowie, ze jesli robisz przekierowanie to wal to do sesji.
niech Twoje metoda AddMessage() zapisuje dane do sesji.
Metoda GetMessage() niech pobiera z sesji i usuwa powiedzmy od razu

edit: nie widzialem jak edytowales poprzedniego posta (byl na innej stronie)
br-design.pl
No i już sobie przypomniałem dlaczego zadałem wlaściwie to pytanie, otóż to rozwiązanie której opisałem powyżej już kiedyś zastosowałem, i jest problem, już tłumacze jaki.

Mam liste rekordów, do każdej link usun np. usun.php?id=10 (dla ułatwienia).

Klikam link
Usuwam rekord
Ustawiam komunikat: usunieto rekord
Przeladowuje strone (ale wiadomo header location wczytuje do konca dokument i dopiero sie przeladowuje)
Komunikat wyswietla sie mimo wszystko (tylko tego nie widac bo zaraz znika)
Zmienna z SESYJNA z komunikatem czysci sie (bo ma sie czyscic po pokazaniu).
Strona sie przeladowala.
I komunikat sie nie wyswietla bo jest pusty.

I co tu robic?
nospor
Cytat
Przeladowuje strone (ale wiadomo header location wczytuje do konca dokument i dopiero sie przeladowuje)

  1. <?php
  2. header('Location: ....');
  3. ?>
br-design.pl
Sprawdź...
exit zatrzymuje wogóle cały proces, nie tylko wykonywanie skryptu, strona po prostu "zawiesi się" i nie przeładuję się wogole.
nospor
smile.gif
To ty sprawdź smile.gif
exit powoduje zatrzymanie wysylania juz czegokolwiek do przegladarki. ale juz header poszedl i ten header zalatwia ci sprawe. Tak sie wlasnie robi: puszcza sie headera przekierowujacego i wali sie exit bo nie ma sensu juz generowanie czego innego

ps: ty pracujesz dla tej firmy co masz w nicku? bo sie tak zastanawiam czytajac ich oferte
br-design.pl
ad 1) Sprawdziłem zanim to napisałem i jest tak jak mówie, ale wieczorem sprawdze jeszcze raz dla pewności.

ad 2) Pomagam czasami.
nospor
Jesli ja dla Ciebie nie jestem osobą wiarygodną to moze manual Cię przekona:
http://www.php.net/manual/pl/function.header.php

Cytat
Drugim specjalnym wywołaniem funkcji header jest nagłówek "Location:". W tej sytuacji, do klienta wysyłany jest nie tylko ten nagłówek, ale także status przekierowania REDIRECT (302), o ile inny status zapytania 3xx nie został już wysłany.


<?php
header("Location: http://www.example.com/"); /* Przekieruj przeglądarkę */
/* Upewnij się, że kod poniżej nie zostanie wykonany po przekierowaniu. */
exit;

?>
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.