Wyświetlanie komunikatów do użytkownika w aplikacjach webowych. PHP AJAX CRUD: tworzenie, usuwanie, edycja rekordów w bazie danych MySQL Skrypt PHP do operacji CRUD

Przegląd

Wbudowany system powiadomień, po raz pierwszy w Joomla, pozwala Twojej aplikacji na bieżąco informować użytkownika (lub grupę użytkowników) o różnych zdarzeniach. Pomyśl o powiadomieniach jako o ważnych alertach, które użytkownik będzie zainteresowany ich przeczytaniem i śledzeniem.
Powiadomienia można generować wszędzie. W komponencie lub wtyczkach, a później wyświetlane w systemie powiadomień JomSocial.
W tym samouczku pokażę Ci, jak to zrobić, ale ponieważ nie mamy pomysłu na komponent innej firmy, którego moglibyśmy użyć :) przykłady zostaną wykonane na wtyczce społeczności, która zostanie uruchomiona podczas zdarzenia onAfterProfileUpdate
Jeśli nie wiesz jak stworzyć wtyczkę, która będzie uruchamiana w tym zdarzeniu, sugerujemy zapoznanie się z tym przewodnikiem

I tak implementuj to w swoim komponencie

Jak stwierdzono w przeglądzie tego samouczka, będziemy generować powiadomienia za pomocą wtyczki społeczności.
Najprawdopodobniej będziesz chciał utworzyć powiadomienia w swoim komponencie lub wtyczce. Poniższy samouczek będzie działać w każdym z tych przypadków. Musisz tylko określić, w którym momencie kodu zostanie utworzone powiadomienie i po prostu załadować plik bibliotek JomSocial Core Libraries.

require_once JPATH_ROOT . "/components/com_community/libraries/core.php" ;

Postępowanie zgodnie z tutorialem opisanym poniżej będzie działać dobrze również w przypadku Twojego rozszerzenia

Przygotowanie środowiska programistycznego

1. Zakładamy, że masz już utworzoną przykładową wtyczkę typu społeczność, która zostanie uruchomiona, gdy użytkownik zmieni swój profil
Jeśli nie, możesz pobrać pustą przykładową wtyczkę z , zainstalować ją w Joomla i włączyć wtyczkę. To jest nazwane Społeczność — przykład powiadomień
2. Przejdź do swojej bazy danych i opróżnij te dwie tabele, tak aby nie zawierały żadnych rekordów

A) prefix_community_notification
b) prefix_community_mailq

3. Miej co najmniej dwóch (2) użytkowników w swoich witrynach testowych i poznaj ich identyfikatory

We wcześniejszych wersjach Joomla identyfikatory użytkowników zawsze zaczynały się od określonej liczby (62, 42). W Joomla 3 liczba ta będzie losowa, stąd obraz naszego środowiska testowego, ponieważ u Ciebie na pewno będzie ono inne.

Pierwsze powiadomienie

Otwórz plik php wtyczki, który będzie zlokalizowany w katalogu ROOT/plugins/community/example
W funkcji onAfterProfileUpdate() zamień

CNotificationLibrary::add ( $cmd , $actor , $target , $temat , $treść , $template , $params ) ;

Jak pokazano na przykładzie, API dodawania powiadomień ma 7 parametrów

  • $cmd - jest typem powiadomienia. W tym pliku możesz zobaczyć wszystkie typy powiadomień. ROOT/components/com_community/libraries/notificationtypes.php zaczynając od linii 53 lub w jej pobliżu. Zalecamy używanie typu powiadomienia system_messaging.
  • $aktor - to osoba wykonująca akcję
  • $target - to osoba lub grupa osób, która otrzyma powiadomienie
  • $temat - temat powiadomienia, zarówno w wyskakującym oknie powiadomienia, jak i w tytule wiadomości e-mail
  • $body - jest treścią wiadomości e-mail z powiadomieniem
  • $template - jeśli potrzebujesz konkretnego szablonu, możesz go tutaj zdefiniować. W przeciwnym razie ten parametr może być pusty
  • $params - niestandardowe zdefiniowane parametry
  • Wiedząc to wszystko, zdefiniujmy zmienne, których będziemy używać
    Zmień kod wtyczki na:

    $użytkownik = CFactory::getUser(); $cmd = "komunikaty_systemowe" ; // pierwszy parametr, typ działania $actor = $user -> id ; //drugi parametr - pobierz identyfikator $actor $target = "965" ; // trzeci parametr. Kto otrzymuje powiadomienie? W naszym środowisku deweloperskim administrator ma identyfikator 965. W Twoim środowisku najprawdopodobniej będziesz chciał uzyskać identyfikator ze swojego obiektu lub z tablicy użytkowników. $temat = "Temat powiadomienia"; // Temat zarówno powiadomień e-mailowych, jak i wyskakujących $body = ; // Treść wiadomości w e-mailach. $szablon = "" ; // Jeśli chcesz użyć konkretnego pliku szablonu jomsocial, możesz go zdefiniować tutaj. $parametry = nowy Cparametr("" ); // Chcemy utworzyć dodatkowy obiekt params i przypisać do niego dane bez konieczności formalnego definiowania klasy CNotificationLibrary:: add ( $cmd , $actor , $target , $subject , $body , $template , $params ) ;

    Teraz zaloguj się jako dowolny użytkownik i zmień informacje w profilu. Przejdźmy do bazy danych, aby zobaczyć, co się stało.
    Przejdź do tabeli prefix_community_notifications i obserwuj nowy rekord

    Przejdź do tabeli prefix_community_mailq i zobacz nowy rekord

    Gratulacje! - Pomyślnie utworzyłeś swoje pierwsze własne powiadomienie, które zostało wysłane e-mailem i wewnętrznym systemem powiadomień JomSocial


    Potencjalne rozdęcie kodu

    Powyższy przykład jest w porządku i działa, ale ogólnie nie zaleca się używania go w ten sposób. Zamiast tego można to napisać w ten sposób

    $aktor = CFactory::getUser(); $parametry = nowy Cparametr("" ); CNotificationLibrary:: add („system_messaging”, $actor -> „To jest treść powiadomienia”, „” , $params );

    Jest to znacznie czystsze i łatwiejsze do naśladowania, a zasadniczo robi dokładnie to samo, co kod pokazany powyżej.

    Niestandardowe parametry powiadomień

    Interfejs API powiadomień można rozszerzyć o dowolny parametr, który chcesz dodać.
    Parametry te można przekazać do dowolnego szablonu wiadomości e-mail, powiadomienia i oczywiście pliku językowego.

    $aktor = CFactory::getUser(); $link = "http://www.google.com" ; $parametry = nowy Cparametr("" ); $params -> set („aktor” , $aktor -> getDisplayName () ) ; // może być użyty jako znacznik (aktora) $params -> set („actor_url” , „index.php?option=com_community&view=profile&userid=" . $actor -> id ) ; // Link do tagu (aktora) $params -> set („url” , $link ) ; //url całego działania. Używane po najechaniu myszką na awatar w oknie powiadomień. Może być również używany jako tag (url) w wychodzących e-mailach. Upewnij się, że zdefiniowałeś zmienną $link :) CNotificationLibrary:: add ( "system_messaging" , $actor -> id , "965" , "Temat powiadomienia" , "To jest treść powiadomienia" , "" , $params ) ;

    • $params = nowy parametr C( ); - Chcemy utworzyć nowy obiekt params i przypisać do niego dane, bez konieczności formalnego definiowania klasy.
    • $params->set("aktor", $aktor->getDisplayName()); - Twoje powiadomienie powinno zawsze mieć aktora. Parametr ten można przekazać do szablonu jako tag (aktor). W oknie powiadomień definiuje użytkownika, który wykonuje akcję.
    • $params->set("actor_url", "index.php?option=com_community&view=profile&userid=" . $actor->id); - Adres URL aktora to zazwyczaj adres URL aktora. W wyskakującym okienku powiadomienia dodaje link do elementu (aktor).
    • $params->set("url", $link); - To najważniejszy parametr, który zawsze należy odpowiednio ustawić. W oknie powiadomień ten parametr jest używany nad obrazem awatara. W powiadomieniu e-mail wyświetlana jest lokalizacja, w której wystąpiła aktywność.

    W tym przykładzie ustawimy zmienną $link na lądującą www.google.comżebyś mógł zobaczyć jak to działa

    Dodawanie ciągu językowego i używanie parametrów

    Parametry, które właśnie ustawiliśmy, są dostępne również do wykorzystania w naszych plikach językowych.
    Zdefiniujmy klucze językowe, zmieniając „ CNotificationLibrary::add() API

    CNotificationLibrary::add("system_messaging" , $actor -> id , "965" , JText::sprintf("PLG_COMMUNITY_EXAMPLE_SUBJECT") , JText::sprintf("PLG_COMMUNITY_EXAMPLE_BODY" ), "" , $params ) ;

    Plik językowy powinien wyglądać tak

    PLG_COMMUNITY_EXAMPLE_SUBJECT = "(aktor) zaktualizował profil" PLG_COMMUNITY_EXAMPLE_BODY = "Witam, administratorze \n To jest wiadomość z informacją, że (aktor) zaktualizował profil \n\n Jeśli chcesz przejść do Google, kliknij tutaj \n a href=" _QQ_" (url)"_QQ_">(url)"

    W tym przykładzie użyliśmy tagu (aktor) i (adres URL) do przekazania danych zarówno do szablonów powiadomień, jak i wiadomości e-mail. Zobaczmy jak to wygląda.
    W oknie powiadomień, gdy najedziesz kursorem na awatar, zwróć uwagę na parametr (adres URL), który został uruchomiony i dodał link do Google nad awatarem. Jest to zamierzone, bo tak to zrobiliśmy :)


    ]

    W tym samym oknie, po najechaniu kursorem na link aktora. To jest część, w której (actor) powtórzył użytkownika wykonującego akcję, podczas gdy (actor_url)” zadbał o to, aby obiekt był prawidłowo połączony


    Zobaczmy, co stanie się w kolejce e-maili


    I wreszcie rzeczywista wiadomość e-mail wysyłana do użytkownika końcowego


    Powodzenie
    Do tej pory stworzyliśmy trzy (3) parametry, które z powodzeniem są używane w oknie powiadomień i e-mailach.

  • (actor) - Zwraca nazwę użytkownika, który wykonuje akcję
  • (actor_url) - Daje przypisać (aktorowi)
  • (url) - Nie jest obowiązkowe, ale zawsze powinieneś mieć to w swoim powiadomieniu. Jest to główny adres URL, pod którym miała miejsce akcja, o której jesteśmy powiadamiani.
  • Podobnie możesz zdefiniować „

    • (cel) - jeśli tego potrzebujesz
    • (target_url), jeśli potrzebujesz go w swoim powiadomieniu.
    • (tytuł) - Powszechnie używane w odniesieniu do obiektu, który wygenerował powiadomienie. Przykład: „Użytkownik X opublikował nowe zdjęcie w Albumie Y”. Album Y jest tutaj tytułem
    • (title_url) - Podobnie jak w przypadku poprzednich, adres URL obiektu, który wygenerował powiadomienie.
    • (wiadomość) — tego parametru można użyć do ustawienia (i powtórzenia) wiadomości w treści wiadomości e-mail JomSocial.
    3,3 tys

    Wyświetlanie komunikatów użytkownikowi to dość częsta akcja, którą powinna wykonywać aplikacja internetowa. Może się to zdarzyć podczas przetwarzania formularzy, mogą to być komunikaty o błędach, komunikaty informujące o konieczności rejestracji, gdy użytkownik próbuje uzyskać dostęp do zastrzeżonej części witryny i w wielu innych przypadkach.

    Bardzo często tworzenie i wysyłanie wiadomości jest rozdzielane na różne żądania HTTP. Z reguły wygodnie jest skorzystać z przekierowania po przetworzeniu formularzy (by uniknąć problemów z przyciskami Wstecz i Odśwież), ale jednocześnie naturalnym momentem tworzenia wiadomości jest właśnie moment przetworzenia formularzy i wykonania czynności towarzyszących To. Dlaczego? Wyobraź sobie, że tekst wiadomości powinien wyglądać mniej więcej tak: „Liczba zamówionych sztuk produktu «Podkładka pod mysz» została pomyślnie zmieniona z 7 na 12.” Po przekierowaniu, być może na zupełnie inną pod względem funkcjonalnym stronę, ustalenie, co zostało zrobione wcześniej, będzie dodatkowym problemem.

    Najczęściej komunikaty wyświetlają się w żądaniu POST przetwarzającym formularz - to niedobrze, słowa „ta strona jest nieaktualna” psują życie (gdy użytkownik zdecyduje się spróbować przycisku Wstecz).

    Ktoś korzysta z przekierowania, rezygnując z przyjaznych wiadomości.

    Jednocześnie istnieje prosty i oczywisty sposób na poprawę życia. Mimo oczywistości, z jakiegoś powodu nigdy nie widziałem, żeby ktoś z tego korzystał - przynajmniej gdy przeglądałem źródła innych osób.

    Mamy więc problem – wiadomość musi „żyć” w różnych żądaniach. Potrzebujemy mechanizmu, który przeniesie tekst wiadomości na stronę, która ma go wyświetlić. Pewnie pamiętaliście już o sesjach.

    Tak, generalnie masz rację. Inne metody, np. poprzez zmienną globalną, nie pozwalają na zapisanie danych w przypadku użycia przekierowania (przypis Maxima Naumenko). Poza tym zazwyczaj dbam o to, aby każdy ekran w aplikacji miał możliwość, wraz z innymi informacjami, wyświetlenia komunikatów, które zostały wygenerowane na poprzednich ekranach. Jest to wygodne, ponieważ nie trzeba przygotowywać osobnych ekranów do wyświetlania komunikatów, a użytkownik nie musi ponownie klikać myszką. Ale tak naprawdę projektant musi się tu zastanowić - wyróżnić obszar, w którym pojawią się komunikaty.

    Pomysł jest bardzo prosty i można go wdrożyć za pomocą kilku klas.

    Pierwszą rzeczą, która przychodzi na myśl, jest utworzenie klasy Message, która w rzeczywistości reprezentowałaby wiadomość na naszym prostym diagramie klas. Wiadomość musi mieć możliwość zapisania się w sesji, a także wyświetlenia na ekranie.

    class Message ( /** * Treść wiadomości. */ var $content; /** * Konstruktor inicjujący tekst wiadomości. * * @param content treść wiadomości */ funkcja Message($content) ( $this->content = $ treść ; ) /** * Napisz wiadomość do sesji */ funkcja send() ( $_SESSION["session_messages"] = $this->treść; ) /** * Wyprowadź wiadomość na stronę. */ funkcja toPage() ( echo " - " . $this->treść . "
    "; } }

    Aby uzyskać dostęp do sesji, używana jest zmienna $_SESSION.

    Zauważ, że $_SESSION jest tablicą, używamy tylko jednego elementu tej tablicy z indeksem „session_message”.

    W tym przypadku mamy do czynienia z „tablicą tablic” – to co przechowujemy w elemencie „session_message” to tablica, jest to lista przesłanych wiadomości (oczywiście może ich być kilka).

    Jeśli nie mogłeś znaleźć wątku, czas odświeżyć sekcje podręcznika poświęcone sesjom i tablicom.

    Możesz mieć pytanie. Dlaczego potrzebne są tutaj zajęcia? Można byłoby obejść się dzięki dwóm funkcjom. Ale spójrzmy dalej. Być może będziemy musieli utworzyć wiadomości różnych typów (informacje, błędy, ostrzeżenia) i określić odbiorców wiadomości.

    Należy pamiętać, że w tej chwili do sesji nie jest wprowadzany sam obiekt, a jedynie tekst wiadomości. OOP pozwala nam później zmienić zachowanie metody send() bez zmiany kodu klienta uzyskującego dostęp do tej metody (na przykład w przyszłości będziemy mogli zapisać do sesji cały obiekt Message, jeśli ma on wiele pól).

    Wyobraźmy sobie, że zrobilibyśmy to za pomocą funkcji. Prawdopodobnie mielibyśmy funkcję Message_send($txt), a także funkcję Message_to_page($txt). Teraz musimy dodać możliwość innego zachowania dla różnych typów wiadomości. Zmiana wywołań funkcji: Message_send($txt, $kind), Message_to_page($txt, $kind). Będziesz musiał przeszukać cały kod aplikacji w poszukiwaniu takich funkcji, wprowadzając poprawki.

    Można tego uniknąć, przewidując sytuację z wyprzedzeniem, przedstawiając komunikat jako tablicę asocjacyjną: $msg[„txt”], $msg[„kind”], wtedy w wywołaniach funkcji będzie tylko jeden parametr. Czy czujesz, jak to próbuje stać się klasą?

    Zatem OOP daje Ci możliwość luksusu nieprzemyślania wszystkiego z wyprzedzeniem.

    Kolejna klasa - Inbox - jest przeznaczona właśnie do tego.

    class Inbox ( /** * Tablica odebranych wiadomości. */ var $messages = array(); /** * W konstruktorze pobieramy wszystkie otrzymane wiadomości * i usuwamy je z sesji. */function Inbox() ( if (is_array($ _SESSION["session_messages"])) ( $messages = $_SESSION["session_messages"]; $co = sizeof($messages); for ($i = 0; $i< $co; $i++) { $this->wiadomości = nowa wiadomość($wiadomości[$i]); ) ) /* wyczyść tablicę komunikatów */ $_SESSION["session_messages"] = array(); ) /** * Wyświetla zawartość skrzynki odbiorczej na stronie. */ funkcja toPage() ( $co = sizeof($this->messages); if ($co > 0) ( echo "Wiadomość z systemu:
    "; ) dla ($i = 0; $i< $co; $i++) { $this->wiadomości[$i]->ToPage(); ) ) )

    Wypróbujmy nasz system przesyłania wiadomości.

    Stwórzmy bardzo prosty przykład, który odpowie na przesłanie formularza, podając liczbę sekund w bieżącej minucie.

    Całą pracę z tablicami i sesjami ukryliśmy wewnątrz klas, dzięki czemu ostateczny kod wygląda prosto i pięknie.

    Utwórz katalog na swoim serwerze internetowym, następnie utwórz w nim te trzy pliki i wypróbuj skrypt. Należy pamiętać, że nie ma problemów z przyciskami Wstecz i Odśwież.

    Teraz wyobraź sobie, że tworzysz złożony portal, w którym z reguły na stronach znajduje się kilka bloków, a każdy z nich może zawierać osobną aplikację.

    Natrafiamy tu na dwie trudności:

    *Chciałbym, żeby lista wiadomości pojawiała się w konkretnej części strony, a Ty już znalazłeś na to dobre miejsce.
    Problem w tym, że trzeba uruchomić komendę $inbox->toPage() dokładnie w momencie, który odpowiadałby pozycji listy wiadomości na stronie. Jeśli będziemy chcieli zmienić położenie tej listy, będziemy musieli wejść w kod, ale nie jest dobrze w tym celu ciągle zmieniać ramkę portalową. Najlepszym rozwiązaniem byłoby wyprowadzenie komunikatów w postaci osobnego modułu, o którym wiemy tylko, że trzeba go podłączyć do frameworka.
    Oznacza to, że uwolnij się od ścisłej kolejności uruchamiania modułów. Rzeczywiście, skoro wynik działania Inboxa nie zależy od działania systemu (na tym etapie mamy już wszystkie dane w sesji), to po co ta dodatkowa złożoność?
    * Aby zachować wygląd (projekt) listy wiadomości, należy zadbać o kod HTML, który jest zakodowany na stałe w metodach toPage() klas Message i Inbox. Zazwyczaj, aby zmienić projekt, będziesz musiał zmienić kod PHP.

    Aby spróbować rozwiązać pierwszy problem, możesz utworzyć bufor przechowujący wynik działania skrzynki odbiorczej.

    Być może nadal będziemy mieli kilka podobnych (do Inboksa) rzeczy i musimy stworzyć system buforów. Aby nie mylić, czyje jest czyje wyjście, prawdopodobnie przejdziemy do nazywania buforów. Zapiszemy gdzieś kolejność, według której powinny być wyprowadzane bufory - najlepiej w zewnętrznym pliku, aby ułatwić zmiany.

    Ta próba rozwiązania już podsuwa nam pomysł wykorzystania XML jako sposobu przechowywania danych pośrednich. Użycie stylów XSLT pomoże rozwiązać drugi problem.

    Nie będę się rozwodzić nad tym, czym jest XML i czym jest XSLT. Jeśli nie jesteś zaznajomiony z tymi rzeczami, dobrym miejscem do rozpoczęcia poszukiwań będzie zvon.org.

    Pomysł polega na tym, aby w metodach toPage() wygenerować nie kod HTML, ale strukturę XML. Dokument strony zostanie utworzony jako string z kodem XML (będzie pełnił rolę „bufora”), a na ostatnim etapie skryptu skorzystamy z transformacji XSL.

    Najpierw wyobraźmy sobie, jaki powinien być wynik głównej części kodu.

    minuta 57 sekund: 45

    Co to jest, dość łatwo zgadnąć - dwie wiadomości i formularz. Należy pamiętać, że skrypt PHP wystarczy przygotować taki ciąg znaków - jest to bardzo proste. Co więcej, kolejność głównych tagów nie jest istotna - możesz umieścić je np. na pierwszym miejscu, tak jak będzie to wygodne dla programisty. Jak to wdrożyć. Możesz, bez zmiany czegokolwiek, użyć buforowania danych wyjściowych, wyprowadzić plik XML zamiast kodu HTML, a na koniec po prostu przechwycić dane wyjściowe w ciągu znaków. Ale wtedy stracimy elastyczność - na przykład czasami chcesz wyprowadzić informacje debugowania bezpośrednio na stronę (za pomocą echa). Jednocześnie programiści PHP pracują nad modułem DOM, który oferuje bardziej zaawansowany sposób tworzenia i przekazywania dokumentów w postaci drzewa. Jeśli będziemy chcieli zaimplementować DOM, będziemy musieli przeprojektować całą aplikację, zmieniając wyjście ciągów znaków na tworzenie elementów DOM. Dlatego wolę przechowywać reprezentację XML obiektów w samych obiektach, sekwencyjnie składając wspólny dokument XML. Nie jest to takie trudne, wymaga jedynie niewielkiej modyfikacji. Zobaczysz, że technika ta nie jest ściśle powiązana z konkretnym sposobem przechowywania danych XML, co pozwoli Ci przy niewielkim wysiłku przejść na korzystanie z modelu DOM. Przede wszystkim zauważ, że każdy z naszych obiektów posiada metodę toPage(). To podobieństwo powinno skłonić nas do zastanowienia się nad wprowadzeniem nowej wspólnej klasy nadrzędnej. Niech każda klasa, która może tworzyć fragmenty dokumentu XML dla strony, dziedziczy po klasie, która zajmie się reprezentacją obiektu XML. Nazwijmy to wyjściowym.

    class Outputable ( /** * Kontener XML (string). */ var $output = ""; /** * Podaj zawartość kontenera i wyczyść kontener. * * @return ciąg znaków z danymi XML */ funkcja getOutput () ( $ out = $this->output; $this->output = ""; return $out; ) /** * Dodaj część do zawartości kontenera. * * @param string ciąg znaków do dodania * / funkcja appendOutput($string) ( $this ->output .= $string . "n"; ) /** * Metoda „Abstrakcyjna”. */ funkcja toPage() ( ) )

    Metoda toPage() jest pusta - w tym przypadku jest potrzebna jako wskaźnik tego, jak zewnętrzne klasy „matrioszki” powinny komunikować się z klasą wewnętrzną. Moglibyśmy jednak zaproponować tutaj domyślną implementację, gdybyśmy zauważyli, że istnieje wiele obiektów, które wyświetlają się na stronie w ten sam sposób.

    Klasy Message i Inbox ulegną niewielkim zmianom - powinny teraz dziedziczyć po Outputable, zmienią się także metody toPage()
    Wiadomość.php

    class Wiadomość rozciąga się na wyjściu ( /** * Treść wiadomości. */ var $content; /** * Konstruktor inicjujący tekst wiadomości. * * @param content treść wiadomości */ funkcja Wiadomość($treść) ( $this->content = $content; ) /** * Napisz wiadomość do sesji */ funkcja send() ( $_SESSION["session_messages"] = $this->content; ) /** * Wyprowadź wiadomość na stronę. * / funkcja toPage() ( $this->appendOutput("".$this->treść.""); ) )

    class Inbox Extends Outputable ( /** * Tablica odebranych wiadomości. */ var $messages = array(); /** * W konstruktorze odbieramy wszystkie otrzymane wiadomości * i usuwamy je z sesji. */ funkcja Inbox( ) ( if (is_array ($_SESSION["session_messages"])) ( $messages = $_SESSION["session_messages"]; $co = sizeof($messages); for ($i = 0; $i< $co; $i++) { $this->wiadomości = nowa wiadomość($wiadomości[$i]); ) ) /* wyczyść tablicę komunikatów */ $_SESSION["session_messages"] = array(); ) /** * Wyświetla zawartość skrzynki odbiorczej na stronie. */ funkcja toPage() ( $co = sizeof($this->messages); $this->appendOutput(""); for ($i = 0; $i< $co; $i++) { $this->wiadomości[$i]->toPage(); $this->appendOutput($this->messages[$i]->getOutput()); ) $this->appendOutput(""); ) )

    Zmieniła się metoda wyprowadzania - teraz zamiast bezpośrednio wyprowadzać na stronę, zewnętrzna reprezentacja jest na razie przechowywana w Outputable, który „znajduje się” w każdym z obiektów. Metoda appendOutput() zastępuje konstrukcję echo(). Aby uzyskać wynik obiektu, używana jest metoda getOutput().

    Zobaczmy teraz, jaka jest część kodu klienta, co rozwiąże ten sam problem, co poprzednio.
    indeks.php

    Główną innowacją jest obiekt $global_content, którego nazwa mówi sama za siebie. W tym przypadku należy ona do klasy Outputable; w rzeczywistych zadaniach prawdopodobnie utworzyłbyś osobną klasę dla zawartości strony.

    Jeśli przyjrzysz się uważnie, zawartość skryptu praktycznie się nie zmieniła - ta sama skrzynka odbiorcza, ta sama funkcja toPage(). Dodano instrukcję wyświetlającą zawartość listy wiadomości w treści strony. Dla urozmaicenia generowane są teraz dwie wiadomości.

    Aby zobaczyć wynik wystarczy przygotować szablon XSL.
    styl.xsl

    Przykład XSLT

    wiadomość

    Co osiągnęliśmy?

    Przede wszystkim można z większą pewnością podejmować się skomplikowanych projektów – zapewniona jest realna niezależność modułów. Kolejność umieszczania wyników na stronie jest teraz kontrolowana za pomocą zewnętrznego szablonu XSL i nie jest zależna od kolejności uruchamiania modułów.

    W projekcie można zastosować dowolny moduł, który w wyniku swojej pracy generuje dane XML. Swoją drogą to jedna z przewag nad silnikami szablonowymi, w których tworzenie danych polega na sekwencji wywołań metod (przypisanie itp.) konkretnego silnika, dla którego nie ma wspólnego standardu.

    Kolejną zaletą jest łatwość debugowania. Jeśli uruchomisz skrypt, zauważysz, że każda strona zawiera dane wyjściowe debugowania — prototyp XML, który znacznie upraszcza debugowanie aplikacji.

    Kolejną rzeczą, o której musisz pomyśleć, jest tworzenie obiektów wiadomości. Nie zawsze wygodnie jest używać new bezpośrednio w kodzie klienta. Ale być może jest to temat na osobny artykuł.

    Na koniec galop o perspektywach:

    * Wyskakujące okna z listą ważnych wiadomości
    * „strony nadawców” i „strony docelowe” w wiadomościach
    * rejestrowanie komunikatów w bazie danych
    * przycisk „pokaż historię moich działań”
    * analiza statystyczna działań użytkowników w ramach sesji
    * „inteligentni asystenci” w aplikacjach webowych

    W KP i BUS począwszy od wersji 11.5, w edycjach uwzględniających portal społecznościowy, pojawił się nowy moduł „Web messenger”.
    Przed udostępnieniem wszystkim moduł przeszedł chrzest bojowy w naszym „Intranecie Społecznościowym”, zbierając aż 8 aktualizacji


    W ciągu sześciu miesięcy prac nad grą zrobiliśmy wiele

    Całkowicie porzuciliśmy poprzedni interfejs i stworzyliśmy nowy, bazując na doświadczeniach popularnych komunikatorów internetowych.
    Wewnątrz strony zaczęło się otwierać okno dialogowe, pojawiły się w nim twarze, wiadomości zostały oznaczone kolorami i możliwe stało się łatwe prowadzenie rozmowy z kilkoma osobami jednocześnie.

    Okno historii to osobny temat, każdy od dawna chciał mieć możliwość przeszukiwania historii, teraz w końcu ją mamy, planujemy dodać tam kalendarz do szybkiej nawigacji.

    Stworzyliśmy centrum powiadomień z różnymi rodzajami wiadomości, udostępniliśmy możliwość przeglądania historii ich otrzymania, a dla programistów proste API do dodawania i przywoływania powiadomień.

    A wszystko to jest dostępne na każdej stronie Twojej witryny!

    Niestety nie wszystko, co było zaplanowane, zostało zrealizowane

    Pierwszy Nie mieliśmy czasu na przetłumaczenie wiadomości na nasze tabele.
    Takie przejście umożliwiłoby rezygnację z modułu „sieć społecznościowa”, co dałoby większą swobodę w wyborze redaktorów, a także umożliwiłoby wprowadzenie czatów grupowych.

    Drugi, jest to realizacja prawdziwej „natychmiastowej” komunikacji. Teraz moduł korzysta z regularnego łączenia, odpytując serwer co n-sekund, okres odpytywania różni się w zależności od aktywności komunikacyjnej.
    Planujemy napisać osobną usługę, która będzie utrzymywać stałe połączenia i w razie potrzeby wysyłać aktualizacje danych (dla komunikatora, dla relacji na żywo itp.).

    Trzeci planujemy nieco zmienić interfejs, zrezygnować z osobnej listy kontaktów i okna dialogowego i połączyć je w jedną całość, co w przyszłości umożliwi nam przeniesienie komunikatora do aplikacji mobilnej.

    Dokumentacji na razie nie ma i pojawi się dopiero jesienią, bo... Moduł jest aktywnie rozwijany i chcemy pozostawić możliwość zmiany API.
    Postaram się jednak opublikować przykłady pracy z tą częścią API, nad którą prace zostały już zakończone i można je bezpiecznie wykorzystać w swoich modułach.

    Praca z powiadomieniami (dotyczy komunikatorów począwszy od wersji 11.5.2)

    Wdrożyliśmy trzy typy powiadomień:
    - spersonalizowane powiadomienie;
    - powiadomienie z systemu;
    - powiadomienie wymagające potwierdzenia;

    Przed skorzystaniem z API należy sprawdzić czy moduł jest zainstalowany w systemie:

    if (IsModuleInstalled("im") && CModule::IncludeModule("im")) ( ) ?>

    Spersonalizowane powiadomienie


    Jeśli wiadomości są ustawione na NOTIFY_TAG, użytkownik będzie je grupował.

    Powiadomienie z systemu


    $arMessageFields = array(// odbiorca "TO_USER_ID" => $USER->GetId(), // nadawca (może być >0) "FROM_USER_ID" => 0, // typ powiadomienia "NOTIFY_TYPE" => IM_NOTIFY_SYSTEM, // moduł, który zażądał wysłania powiadomienia "NOTIFY_MODULE" => "im", // znacznik symboliczny do grupowania (wyświetli się tylko jeden komunikat), jeśli nie jest to wymagane, nie ustawiaj parametru "NOTIFY_TAG" => "IM_CONFIG_NOTICE", // tekst powiadomienia na stronie (dostępne kody HTML i BB) "NOTIFY_MESSAGE" => "[b]Uwaga: należy sprawdzić i określić poprawną ścieżkę do sieci społecznościowej w ustawieniach modułu "Komunikaty internetowe i powiadomienia"" , // tekst powiadomienia wysyłany e-mailem (lub XMPP ), jeśli nie ma różnic, nie ustawiaj parametru //"NOTIFY_MESSAGE_OUT" => ""); CIMNotify::Add($arMessageFields); ?>

    Powiadomienie wymagające potwierdzenia (potwierdź)


    $arMessageFields = array(// odbiorca "TO_USER_ID" => $USER->GetId(), // nadawca "FROM_USER_ID" => 2, // typ powiadomienia "NOTIFY_TYPE" => IM_NOTIFY_CONFIRM, // moduł, który zażądał wysłania powiadomienia "NOTIFY_MODULE " => "kalendarz", // znacznik symboliczny do grupowania (wyświetli się tylko jeden komunikat), jeśli nie jest to wymagane, nie ustawiaj parametru "NOTIFY_TAG" => "KALENDARZ|INVITE|123|".$ USER->GetId() , // tekst powiadomienia na stronie (dostępne kody HTML i BB) "NOTIFY_MESSAGE" => "Zapraszam do wzięcia udziału w spotkaniu „Instant Messaging and Notifications”, które odbędzie się 15 marca, 2012 o 14:00", // tekst powiadomienia do wysłania e-mailem (lub XMPP), jeśli nie ma różnic, nie ustawiaj parametru „NOTIFY_MESSAGE_OUT” => „Użytkownik Evgeny Shelenkov zaprasza do wzięcia udziału w spotkaniu „Instant wiadomości i powiadomienia” #BR#, które odbędzie się 15.03.2012 o godzinie 14:00.#BR # #BR# Zaakceptuj: http://test.ru/calend.php?CONFIRM=Y&CID=123 #BR# Odmówić: http://test.ru/calend.php?CONFIRM=N&CID=123", // tablica opisująca przyciski powiadomień "NOTIFY_BUTTONS" => Array(// 1. nazwa przycisku, 2. wartość, 3. szablon przycisku , 4. przejście do adresu po kliknięciu (parametr opcjonalny) Array("TITLE" => "Akceptuj", " WARTOŚĆ" => "T", "TYPE" => "akceptuj" /*, "URL" => " http://test.ru/?confirm=Y" */), Array("TITLE" => " Odmów", "WARTOŚĆ" => "N", "TYPE" => "anuluj" /*, "URL " => "http://test.ru/?confirm=N" */),), // kod symboliczny szablonu wysyłania listu, jeśli nie został określony, jest wysyłany wraz z szablonem powiadomienia "NOTIFY_EMAIL_TEMPLATE" => " KALENDARZ_ZAPROSZENIE"); CIMNotify::Add($arMessageFields); ?>

    Aby pracować z tego typu powiadomieniami, nie wystarczy po prostu wysłać wiadomość, trzeba ją także obsłużyć.

    Praca
    Są dwie możliwości, najprostsza to podążanie za linkiem (jeśli ustawisz 4. parametr w NOTIFY_BUTTONS).
    Po kliknięciu linku musisz wywołać w swoim kodzie następujący kod:
    Uwaga: zwracaj szczególną uwagę na nazwy tagów; gdy wywołasz usuwanie, wszystkie wiadomości z tym tagiem zostaną usunięte.
    W przypadku wysyłania wielu wiadomości należy to wziąć pod uwagę, aby wykonanie akcji przez jednego użytkownika nie spowodowało przypadkowego usunięcia powiadomienia dla wszystkich (poza miejscami, gdzie taka logika jest potrzebna).

    Druga opcja dotyczy wydarzeń.
    1. musisz zarejestrować zależność

    Nie zapomnij o swoich funkcjach Potwierdź prośbę I Odrzuć żądanie spowodować usunięcie powiadomienia CIMNotify::DeleteByTag()

    Na razie tyle, czekam na Wasze sugestie w komentarzach, udanych realizacji!
    Jeśli chcesz wypróbować API przed wydaniem 11.5.2 w tablicy z parametrami, musisz dodatkowo określić "MESSAGE_TYPE" => IM_MESSAGE_SYSTEM, także opcja z linkiem w przyciskach nie będzie działać w przypadku powiadomień potwierdzających. Ale lepiej poczekać, aktualizacja 11.5.2 ukaże się 23 maja.

    Lepsza zła passa niż delirium tremens...

    PHP AJAX CRUD: tworzenie, usuwanie, edycja rekordów w bazie MySQL

    W tym artykule dowiemy się, jak dodawać, edytować i usuwać rekordy w bazie danych MySQL za pomocą języka PHP. Użyliśmy procedury obsługi JQuery, która wysyła żądanie AJAX do skryptu po stronie serwera. Program obsługi aktualizuje listę rekordów.

    Formularz AJAX do wysyłania próśb o utworzenie, usunięcie, edycję

    Podczas dodawania rekordu formularz wysyła dane do skryptu PHP poprzez żądanie AJAX. Jeżeli dodawanie się powiedzie, lista wpisów zostanie ponownie załadowana.

    Funkcje JQuery AJAX dla zapytań do bazy danych CRUD

    W funkcji JQuery AJAX mamy możliwość przełączania przypadków, dodawania, edytowania i usuwania. Przypadki te generują różne ciągi danych zapytań i odpowiedzi w zależności od działań w bazie danych.

    funkcja showEditBox(id) ( $("#frmAdd").hide(); var currentMessage = $("#message_" + id + " .message-content").html(); var editMarkUp = ""+bieżącaWiadomość+" SaveCancel"; $("#wiadomość_" + id + " .treść-wiadomości").html(editMarkUp); ) funkcja cancelEdit(wiadomość,id) ( $("#wiadomość_" + id + " .treść-wiadomości") .html(wiadomość); $("#frmAdd").show(); ) funkcja callCrudAction(akcja,id) ( $("#loaderIcon").show(); var queryString; switch(akcja) ( case "add ": queryString = "action="+action+"&txtmessage="+ $("#txtmessage").val(); break; case "edit": queryString = "action="+action+"&message_id="+ id + " &txtmessage="+ $("#txtmessage_"+id).val(); break; case "delete": queryString = "action="+action+"&message_id="+ id; break; ) jQuery.ajax(( url: "crud_action.php", dane:queryString, wpisz: "POST", sukces:funkcja(dane)(przełącznik(akcja) (przypadek "add": $("#lista-komentarzy").append(data); break; case "edit": $("#message_" + id + " .message-content").html(data); $("#frmAdd").show(); przerwa; case "usuń": $("#message_"+id).fadeOut(); przerwa; ) $("#txtmessage").val(""); $("#loaderIcon").hide(); ), błąd:funkcja ()() )); )

    Skrypt PHP do operacji CRUD

    Poniższy kod wykonuje zapytania względem bazy danych. Ten skrypt PHP po wykonaniu akcji CRUD aktualizuje rekordy w wyniku odpowiedzi AJAX.

    require_once("dbcontroller.php"); $db_handle = nowy kontroler DB(); $akcja = $_POST["akcja"]; if(!empty($akcja)) ( switch($akcja) ( case "add": $result = mysql_query("WSTAW DO komentarza(wiadomości) WARTOŚCI("".$_POST["txtmessage"].")" ) ; if($result)($insert_id = mysql_insert_id(); echo " Edytuj Usuń " . $_POST["txtmessage"] . " "; ) break; case "edit": $result = mysql_query("AKTUALIZUJ komunikat zestawu komentarzy = "".$_POST["txtmessage"]."" GDZIE id=".$_POST["message_id"]); if($result) echo $_POST["txtmessage"]; przerwa; case "usuń": if ( !empty($_POST["message_id"])) ( mysql_query("USUŃ Z komentarza GDZIE id=".$_POST["message_id"]); ) break; ) )

    Na tym etapie kursu opisano podstawy naszej wtyczki, zdefiniowano niestandardowy hak i dołączono trwały komunikat pokazujący, jak działa hak.

    Że my Nie to zrobili, nie zaimplementowali typów komunikatów i ich wyświetlania zgodnie z danymi wprowadzanymi przez użytkownika.

    Ale zanim zaczniemy, musimy dodać obsługę różnych typów wiadomości, interfejs klas, który będzie obsługiwał każdy typ wiadomości, oraz strukturę danych potrzebną do przechowywania takich wiadomości.

    Gotowy żeby zacząć?

    Nie mogę się doczekać kontynuacji samouczka, ale jest kilka rzeczy, które musimy rozważyć, zanim zagłębimy się w kod źródłowy. Upewnij się, że masz zainstalowane w systemie następujące oprogramowanie:

    • PHP 5.6.25 i MySQL 5.6.28
    • Apache lub Nginx
    • WordPressa 4.6.1
    • Twoje preferowane IDE lub edytor

    A jeśli szukasz rozwiązania typu „wszystko w jednym”, nie zapomnij wypróbować MAMP.

    Awansowaliśmy do

    Jak wspomnieliśmy wcześniej, jesteśmy dokładnie w połowie tego kursu. Jeśli przegapiłeś którąkolwiek z pierwszych lekcji, oto, co omówiliśmy do tej pory:

  • W pierwszym samouczku skupiliśmy się na minimalnych podstawach tworzenia naszej wtyczki i tym, co jest potrzebne, aby zacząć.
  • W drugiej części posunęliśmy się dalej z wtyczką, dodając trochę do podstawowej strony administracyjnej w WordPressie. Przypisaliśmy także niestandardowy hak, którego używamy i uruchomiliśmy go po stronie serwera. Ustawiamy także podstawowe parametry naszego Komunikatora ustawień.
  • I to właśnie rozważymy na ostatnim etapie szkolenia:

  • Połączymy to wszystko w całość, zobaczymy w akcji i udostępnimy wtyczkę publicznie do pobrania.
  • Aktualnie mamy inne zadania i na nich się skupimy.

    Wróćmy do pracy

    Ponieważ zabraliśmy się do pracy (jak stwierdzono na poprzednich lekcjach), jesteśmy zaangażowani w dalszą realizację zadań z tej części:

    W tym samouczku będziemy nadal rozwijać nasz komunikator ustawień, dodając obsługę komunikatów o sukcesach i niepowodzeniach, a także poruszając kwestie bezpieczeństwa.

    W poprzednim artykule zaczęliśmy od Komunikatora ustawień, ale tylko do momentu skonfigurowania funkcji, która będzie stale wyświetlać powiadomienie o powodzeniu podczas ładowania strony użytkownika.

    W tym samouczku dodamy obsługę komunikatów o błędach, ostrzeżeniach i sukcesach. Następnie wyświetlimy je na ekranie, aby zorientować się, jak będzie działał komunikator.

    Dodatkowo zamierzamy wprowadzić kolejną zmianę, która doda obsługę odrzucania powiadomień według uznania użytkownika.

    To jest cały plan niezbędnej pracy dla tej lekcji. Zaczynajmy.

    Ustawienia rozszerzenia Messenger

    Pamiętaj, że celem Settings Messenger jest zdefiniowanie naszego sposobu pracy z niestandardowymi wiadomościami, niestandardowymi hakami i natywnym API WordPress do wyświetlania wiadomości w kontekście panelu administracyjnego WordPress.

    Aby to zrobić, rozszerzymy pracę wykonaną na ostatniej lekcji i zaczniemy od tego miejsca.

    Pomyślne wiadomości

    Ponieważ w poprzedniej lekcji zaczęliśmy od skutecznych wiadomości, kontynuujmy je. Teraz mamy zakodowaną na stałe metodę, która wyświetla jedną sztuczkę: