Anzeigen von Nachrichten für den Benutzer in Webanwendungen. PHP AJAX CRUD: Erstellen, Löschen und Bearbeiten von Datensätzen in der MySQL-Datenbank. PHP-Skript für CRUD-Operationen

Überblick

Das integrierte Benachrichtigungssystem, erstmals in Joomla, ermöglicht es Ihrer App, den Benutzer (oder eine Gruppe von Benutzern) über verschiedene Ereignisse auf dem Laufenden zu halten. Stellen Sie sich Benachrichtigungen als wichtige Warnungen vor, die der Benutzer gerne lesen würde, und behalten Sie den Überblick.
Benachrichtigungen können überall generiert werden. In Ihrer Komponente oder Ihren Plugins und später im JomSocial-Benachrichtigungssystem angezeigt.
Dieses Tutorial zeigt Ihnen, wie es geht, aber da wir keine Ahnung haben, welche Drittanbieter-Komponente wir verwenden könnten:) werden die Beispiele mit einem Community-Plugin erstellt, das beim onAfterProfileUpdate-Ereignis ausgelöst wird
Wenn Sie nicht wissen, wie Sie ein Plugin erstellen, das bei diesem Ereignis ausgelöst wird, empfehlen wir Ihnen, diese Anleitung zu lesen

Implementieren Sie es trotzdem in Ihrer Komponente

Wie im Überblick über dieses Tutorial erwähnt, werden wir Benachrichtigungen mithilfe des Community-Plugins generieren.
Sie möchten höchstwahrscheinlich Benachrichtigungen innerhalb Ihrer Komponente oder Ihres Plugins erstellen. Das folgende Tutorial funktioniert in jedem dieser Fälle. Sie müssen lediglich festlegen, an welcher Stelle in Ihrem Code die Benachrichtigung erstellt wird, und einfach die JomSocial Core Libraries-Datei laden.

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

Das Befolgen der unten erläuterten Anleitung wird auch für Ihre Erweiterung problemlos funktionieren

Vorbereiten der Entwicklungsumgebung

1. Wir gehen davon aus, dass Sie bereits ein Community-Beispiel-Plugin erstellt haben, das ausgelöst wird, wenn der Benutzer sein Profil ändert
Wenn nicht, können Sie ein leeres Beispiel-Plugin von herunterladen, es in Joomla installieren und das Plugin aktivieren. Es heißt Community – Beispiel für Benachrichtigungen
2. Navigieren Sie zu Ihrer Datenbank und leeren Sie diese beiden Tabellen, sodass sie überhaupt keine Datensätze mehr enthalten

A) prefix_community_notification
b) prefix_community_mailq

3. Haben Sie mindestens zwei (2) Benutzer an Ihren Teststandorten und kennen Sie deren IDs

In früheren Versionen von Joomla begannen Benutzer-IDs immer mit einer bestimmten Nummer (62, 42). In Joomla 3 wird diese Nummer zufällig sein, daher wird das Bild unserer Testumgebung bei Ihnen definitiv anders sein.

Die erste Benachrichtigung

Öffnen Sie die Plugin-PHP-Datei, die sich unter ROOT/plugins/community/example befindet
Ersetzen Sie innerhalb der Funktion onAfterProfileUpdate() die

CNotificationLibrary::add ( $cmd , $actor , $target , $subject , $body , $template , $params );

Wie im Beispiel gezeigt, verfügt die API zum Hinzufügen von Benachrichtigungen über 7 Parameter

  • $cmd – ist der Benachrichtigungstyp. In dieser Datei können Sie alle Benachrichtigungstypen sehen. ROOT/components/com_community/libraries/notificationtypes.php ab oder um Zeile 53. Wir empfehlen die Verwendung des Benachrichtigungstyps system_messaging.
  • $actor – ist die Person, die die Aktion ausführt
  • $target – ist die Person oder Personengruppe, die eine Benachrichtigung erhält
  • $subject – ist der Betreff der Benachrichtigung, sowohl im Benachrichtigungs-Popup-Fenster als auch im E-Mail-Titel
  • $body – ist der Text der E-Mail-Benachrichtigungsnachricht
  • $template – Wenn Sie eine bestimmte Vorlage benötigen, können Sie diese hier definieren. Andernfalls kann dieser Parameter leer sein
  • $params – benutzerdefinierte Parameter
  • Wenn wir das alles wissen, definieren wir die Variablen, die wir verwenden werden
    Ändern Sie Ihren Plugin-Code in:

    $user = CFactory::getUser(); $cmd = "system_messaging" ; // erster Parameter, Art der Aktivität $actor = $user -> id ; //zweiter Parameter – die ID von $actor abrufen $target = "965" ; // dritter Parameter. Wer erhält eine Benachrichtigung? In unserer Entwicklungsumgebung hat der Admin-Benutzer die ID 965. In Ihrer Umgebung möchten Sie die ID höchstwahrscheinlich von Ihrem Objekt oder einer Benutzergruppe erhalten. $subject = "Betreff der Benachrichtigung" ; // Betreff sowohl der E-Mail- als auch der Popup-Benachrichtigungen $body = ; //Textnachricht in E-Mails. $template = "" ; // Wenn Sie eine bestimmte Jomsocial-Vorlagendatei verwenden müssen, können Sie diese hier definieren. $params = new CParameter("" ); // Wir möchten ein zusätzliches params-Objekt erstellen und ihm Daten zuweisen, ohne formal eine Klasse definieren zu müssen CNotificationLibrary:: add ( $cmd , $actor , $target , $subject , $body , $template , $params ) ;

    Melden Sie sich nun mit einem beliebigen Benutzer an und ändern Sie die Profilinformationen. Gehen wir zur Datenbank, um zu sehen, was passiert ist.
    Navigieren Sie zur Tabelle „prefix_community_notifications“ und beobachten Sie den neuen Datensatz

    Navigieren Sie zur Tabelle prefix_community_mailq und sehen Sie sich den neuen Datensatz an

    Glückwunsch! - Sie haben erfolgreich Ihre erste eigene Benachrichtigung erstellt, die per E-Mail und über das interne JomSocial-Benachrichtigungssystem versendet wurde


    Mögliche Code-Aufblähung

    Das obige Beispiel ist in Ordnung und funktioniert, aber im Allgemeinen wird es nicht empfohlen, es so zu verwenden. Stattdessen könnte es auch so geschrieben werden

    $actor = CFactory::getUser(); $params = new CParameter("" ); CNotificationLibrary:: add ( "system_messaging" , $actor -> "Dies ist die Benachrichtigungstextnachricht" , "" , $params );

    Dies ist viel übersichtlicher und einfacher zu befolgen, während es im Grunde genau das Gleiche tut wie der oben gezeigte Code.

    Benutzerdefinierte Benachrichtigungsparameter

    Eine Benachrichtigungs-API kann mit jedem beliebigen Parameter erweitert werden, den Sie hinzufügen möchten.
    Diese Parameter können entweder an die E-Mail-Vorlage, die Benachrichtigung und natürlich an die Sprachdatei übergeben werden.

    $actor = CFactory::getUser(); $link = "http://www.google.com" ; $params = new CParameter("" ); $params -> set ("actor" , $actor -> getDisplayName () ); // kann als (Akteurs-)Tag verwendet werden $params -> set ("actor_url" , "index.php?option=com_community&view=profile&userid=" . $actor -> id ); // Link für das (Akteur-)Tag $params -> set ("url" , $link ) ; //URL der gesamten Aktivität. Wird verwendet, wenn Sie im Benachrichtigungsfenster mit der Maus über den Avatar fahren. Kann auch als (URL-)Tag in ausgehenden E-Mails verwendet werden. Stellen Sie sicher, dass Sie die Variable $link definiert haben:) CNotificationLibrary:: add ( "system_messaging" , $actor -> id , "965" , "Notification Subject" , "This is the notification body message" , "" , $params ) ;

    • $params = neuer CParameter( ); - Wir möchten ein neues params-Objekt erstellen und ihm Daten zuweisen, ohne formal eine Klasse definieren zu müssen.
    • $params->set("actor", $actor->getDisplayName()); - Ihre Benachrichtigung sollte immer einen Akteur enthalten. Dieser Parameter kann als (Akteur-)Tag an die Vorlage übergeben werden. Im Benachrichtigungsfenster wird der Benutzer definiert, der eine Aktion durchführt.
    • $params->set("actor_url", "index.php?option=com_community&view=profile&userid=" . $actor->id); - Darsteller-URL ist normalerweise die URL eines Schauspielers. Im Benachrichtigungs-Popup wird der Link zum Element (Akteur) hinzugefügt
    • $params->set("url", $link); - Dies ist der wichtigste Parameter, den Sie immer richtig einstellen müssen. Im Benachrichtigungsfenster wird dieser Parameter über dem Avatarbild verwendet. In der E-Mail-Benachrichtigung wird der Ort angezeigt, an dem die Aktivität stattgefunden hat.

    In diesem Beispiel setzen wir die Variable $link auf „landet on“. www.google.com damit Sie sehen können, wie es funktioniert

    Sprachzeichenfolge hinzufügen und Parameter verwenden

    Die soeben eingestellten Parameter können auch in unseren Sprachdateien verwendet werden.
    Definieren wir die Sprachschlüssel, indem wir das „ ändern. CNotificationLibrary::add() API

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

    Die Sprachdatei sollte so aussehen

    PLG_COMMUNITY_EXAMPLE_SUBJECT = „(Schauspieler) aktualisiertes Profil“ PLG_COMMUNITY_EXAMPLE_BODY = „Hallo Admin \n Dies ist die E-Mail, um Sie darüber zu informieren, dass (Schauspieler) Profil aktualisiert wurde. \n\n Wenn Sie zu Google gehen möchten, klicken Sie hier \n a href=" _QQ_" (URL)"_QQ_">(URL)"

    In diesem Beispiel haben wir die Tags (Akteur) und (URL) verwendet, um die Daten sowohl an Benachrichtigungs- als auch an E-Mail-Vorlagen zu übergeben. Mal sehen, wie das aussieht.
    Wenn Sie im Benachrichtigungsfenster mit der Maus über den Avatar fahren, beachten Sie, dass der (URL-)Parameter aktiviert wurde und den Link zu Google über den Avatar hinzufügt. Das ist Absicht, denn wir haben es so gemacht :)


    ]

    Im selben Fenster, wenn Sie mit der Maus über den Schauspieler-Link fahren. Dies ist der Teil, in dem (Akteur) den Benutzer widerspiegelt, der eine Aktion ausführt, während (Akteur_url)“ dafür gesorgt hat, dass das Objekt ordnungsgemäß verknüpft ist


    Mal sehen, was in der E-Mail-Warteschlange passiert


    Und schließlich die eigentliche E-Mail, die an den Endbenutzer gesendet wird


    Erfolg
    Bisher haben wir drei (3) Parameter erstellt, die erfolgreich im Benachrichtigungsfenster und in E-Mails verwendet werden.

  • (Akteur) – Gibt den Benutzernamen des Benutzers zurück, der die Aktion ausführt
  • (actor_url) – Gibt die Attribut zum (Schauspieler)
  • (URL) – Ist nicht obligatorisch, sollte aber immer in Ihrer Benachrichtigung enthalten sein. Dies ist die Haupt-URL, unter der die Aktion stattgefunden hat, über die wir benachrichtigt werden.
  • Ebenso können Sie „

    • (Ziel) – wenn Sie es brauchen
    • (target_url), wenn Sie es in Ihrer Benachrichtigung benötigen.
    • (Titel) – Wird häufig verwendet, um auf ein Objekt zu verweisen, das eine Benachrichtigung generiert hat. Beispiel: „Benutzer X hat ein neues Foto in Album Y gepostet.“ Album Y ist hier der Titel
    • (title_url) – Wie bei den vorherigen, die URL eines Objekts, das eine Benachrichtigung generiert hat.
    • (Nachricht) – Dieser Parameter kann verwendet werden, um die Nachricht im Textkörper der JomSocial-E-Mail festzulegen (und wiederzugeben).
    3,3K

    Das Anzeigen von Nachrichten für den Benutzer ist eine recht häufige Aktion, die eine Webanwendung ausführen sollte. Es kann bei der Verarbeitung von Formularen auftreten, es können Fehlermeldungen sein, Meldungen, die Sie zur Registrierung auffordern, wenn ein Benutzer versucht, auf einen eingeschränkten Teil der Website zuzugreifen, und in vielen anderen Fällen.

    Sehr oft sind die Erstellung und Ausgabe von Nachrichten in verschiedene HTTP-Anfragen aufgeteilt. In der Regel ist es praktisch, nach der Bearbeitung von Formularen eine Weiterleitung zu verwenden (um Probleme mit den Schaltflächen „Zurück“ und „Aktualisieren“ zu vermeiden), aber gleichzeitig ist der natürliche Zeitpunkt zum Erstellen einer Nachricht genau der Moment der Bearbeitung von Formularen und der Durchführung begleitender Aktionen Es. Warum? Stellen Sie sich vor, dass der Nachrichtentext etwa so aussehen sollte: „Die Anzahl der bestellten Einheiten für das Produkt ‚Mauspad‘ wurde erfolgreich von 7 auf 12 geändert.“ Nach einer Weiterleitung, möglicherweise auf eine völlig andere Seite in Bezug auf die Funktionalität, wird es zusätzliche Kopfschmerzen bereiten, herauszufinden, was zuvor getan wurde.

    Am häufigsten werden Nachrichten in der POST-Anfrage angezeigt, die das Formular verarbeitet – das ist nicht gut, die Worte „Diese Seite ist veraltet“ ruinieren das Leben (wenn der Benutzer beschließt, die Schaltfläche „Zurück“ auszuprobieren).

    Jemand verwendet eine Weiterleitung und verzichtet auf freundliche Nachrichten.

    Gleichzeitig gibt es eine einfache und offensichtliche Möglichkeit, das Leben besser zu machen. Trotz der Offensichtlichkeit habe ich aus irgendeinem Grund nie jemanden gesehen, der es verwendet hat – zumindest wenn ich mir die Quellen anderer Leute angesehen habe.

    Wir haben also ein Problem: Die Nachricht muss in verschiedenen Anfragen „leben“. Wir benötigen einen Mechanismus, um den Text der Nachricht auf die Seite zu übertragen, auf der er angezeigt werden soll. Sie haben sich wahrscheinlich schon an die Sitzungen erinnert.

    Ja, im Großen und Ganzen hast du recht. Andere Methoden, beispielsweise über eine globale Variable, erlauben keine Datenspeicherung bei Verwendung einer Weiterleitung (Anmerkung von Maxim Naumenko). Außerdem stelle ich normalerweise sicher, dass auf jedem Bildschirm in der Anwendung neben anderen Informationen auch Meldungen angezeigt werden können, die auf vorherigen Bildschirmen generiert wurden. Dies ist praktisch, da keine separaten Bildschirme für die Anzeige von Meldungen vorbereitet werden müssen und der Benutzer nicht erneut mit der Maus klicken muss. Aber hier muss der Designer wirklich nachdenken – um den Bereich hervorzuheben, in dem die Nachrichten erscheinen würden.

    Die Idee ist sehr einfach und kann mit ein paar Klassen umgesetzt werden.

    Das erste, was mir in den Sinn kommt, ist die Erstellung einer Message-Klasse, die tatsächlich eine Nachricht in unserem einfachen Klassendiagramm darstellen würde. Die Nachricht muss in der Sitzung gespeichert und auf dem Bildschirm angezeigt werden können.

    class Message ( /** * Nachrichteninhalt. */ var $content; /** * Konstruktor zum Initialisieren des Nachrichtentextes. * * @param content Nachrichteninhalt */ function Message($content) ( $this->content = $ content ; ) /** * Eine Nachricht an die Sitzung schreiben. */ function send() ( $_SESSION["session_messages"] = $this->content; ) /** * Eine Nachricht an die Seite ausgeben. */ function toPage() ( echo " - " . $this->content . "
    "; } }

    Für den Zugriff auf die Sitzung wird die Variable $_SESSION verwendet.

    Beachten Sie, dass $_SESSION ein Array ist. Wir verwenden nur ein Element dieses Arrays mit dem Index „session_message“.

    In diesem Fall haben wir es mit einem „Array von Arrays“ zu tun – was wir im Element „session_message“ speichern, ist ein Array, das ist die Liste der übertragenen Nachrichten (es können natürlich auch mehrere davon sein).

    Wenn Sie den Thread nicht finden konnten, ist es an der Zeit, die Abschnitte des Handbuchs zu Sitzungen und Arrays aufzufrischen.

    Möglicherweise haben Sie eine Frage. Warum werden hier Kurse benötigt? Es wäre möglich, mit zwei Funktionen auszukommen. Aber schauen wir weiter. Möglicherweise müssen wir Nachrichten mit unterschiedlichen Typen (Info, Fehler, Warnung) erstellen und die Empfänger der Nachrichten bestimmen.

    Bitte beachten Sie, dass derzeit nicht das Objekt selbst, sondern nur der Nachrichtentext in die Sitzung aufgenommen wird. Mit OOP können wir später das Verhalten der send()-Methode ändern, ohne den Clientcode zu ändern, der auf diese Methode zugreift (z. B. können wir in Zukunft das gesamte Message-Objekt in die Sitzung schreiben, wenn es viele Felder hat).

    Stellen wir uns vor, wir würden dies mithilfe von Funktionen tun. Wir hätten wahrscheinlich eine message_send($txt)-Funktion und auch eine message_to_page($txt)-Funktion. Jetzt müssen wir die Möglichkeit hinzufügen, für unterschiedliche Nachrichtentypen unterschiedliche Verhaltensweisen festzulegen. Funktionsaufrufe ändern sich: message_send($txt, $kind), message_to_page($txt, $kind). Sie müssen den gesamten Anwendungscode auf der Suche nach solchen Funktionen durchforsten und Korrekturen vornehmen.

    Dies kann vermieden werden, indem die Situation im Voraus vorhergesehen wird, indem die Nachricht als assoziatives Array dargestellt wird: $msg[‘txt’], $msg[‘kind’], dann gibt es in Funktionsaufrufen nur einen Parameter. Spüren Sie, wie dies versucht, eine Klasse zu werden?

    OOP bietet Ihnen also den Luxus, nicht alles im Voraus durchdenken zu müssen.

    Die nächste Klasse – Posteingang – ist genau dafür konzipiert.

    class Inbox ( /** * Array der empfangenen Nachrichten. */ var $messages = array(); /** * Im Konstruktor erhalten wir alle empfangenen Nachrichten * und löschen sie aus der Sitzung. */ function Inbox() ( if (is_array($ _SESSION["session_messages"])) ( $messages = $_SESSION["session_messages"]; $co = sizeof($messages); for ($i = 0; $i< $co; $i++) { $this->Nachrichten = neue Nachricht($messages[$i]); ) ) /* das Nachrichtenarray löschen */ $_SESSION["session_messages"] = array(); ) /** * Zeigt den Inhalt des Posteingangs auf der Seite an. */ function toPage() ( $co = sizeof($this->messages); if ($co > 0) ( echo "Nachricht vom System:
    "; ) für ($i = 0; $i< $co; $i++) { $this->Nachrichten[$i]->ToPage(); ) ) )

    Probieren wir unser Nachrichtensystem aus.

    Lassen Sie uns ein sehr einfaches Beispiel erstellen, das auf die Übermittlung eines Formulars reagiert, indem es die Anzahl der Sekunden in der aktuellen Minute meldet.

    Wir haben die gesamte Arbeit mit Arrays und Sitzungen in Klassen versteckt, und der endgültige Code sieht einfach und schön aus.

    Erstellen Sie ein Verzeichnis auf Ihrem Webserver, erstellen Sie dann diese drei Dateien darin und probieren Sie das Skript aus. Bitte beachten Sie, dass es mit den Schaltflächen „Zurück“ und „Aktualisieren“ keine Probleme gibt.

    Stellen Sie sich nun vor, Sie erstellen ein komplexes Portal, bei dem es in der Regel mehrere Blöcke auf den Seiten gibt und jeder eine separate Anwendung enthalten kann.

    Hier stoßen wir auf zwei Schwierigkeiten:

    * Ich möchte, dass die Liste der Nachrichten in einem bestimmten Teil der Seite erscheint, und Sie haben bereits eine gute Stelle dafür gefunden.
    Das Problem besteht darin, dass Sie den Befehl $inbox->toPage() genau zu dem Zeitpunkt ausführen müssen, der der Position der Nachrichtenliste auf der Seite entspricht. Wenn wir die Position dieser Liste ändern möchten, müssen wir in den Code einsteigen, aber es ist nicht gut, dafür ständig den Portalrahmen zu ändern. Die beste Lösung wäre, die Ausgabe von Nachrichten in Form eines separaten Moduls vorzunehmen, von dem wir nur wissen, dass es mit dem Framework verbunden werden muss.
    Das heißt, befreien Sie sich von der strengen Reihenfolge beim Starten von Modulen. Da das Ergebnis der Inbox-Ausgabe tatsächlich nicht vom Betrieb des Systems abhängt (in diesem Schritt haben wir bereits alle Daten in der Sitzung), warum dann die zusätzliche Komplexität?
    * Um das Erscheinungsbild (Design) der Nachrichtenliste beizubehalten, müssen Sie sich um den HTML-Code kümmern, der in den toPage()-Methoden der Message- und Inbox-Klassen fest codiert ist. Normalerweise müssen Sie den PHP-Code ändern, um das Design zu ändern.

    Um das erste Problem zu lösen, können Sie einen Puffer erstellen, der das Ergebnis der Inbox-Ausgabe speichert.

    Vielleicht haben wir noch einige ähnliche Dinge (zum Posteingang) und müssen ein Puffersystem erstellen. Um nicht zu verwechseln, wem die Ausgabe gehört, werden wir uns wahrscheinlich mit der Benennung der Puffer befassen. Die Reihenfolge, in der die Puffer ausgegeben werden sollen, werden wir irgendwo ablegen – am besten in einer externen Datei, um Änderungen einfacher zu machen.

    Dieser Lösungsversuch bringt uns bereits auf die Idee, XML als Mittel zur Speicherung von Zwischendaten zu nutzen. Und die Verwendung von XSLT-Stilen hilft, das zweite Problem zu lösen.

    Ich werde nicht näher darauf eingehen, was XML und XSLT ist. Wenn Sie mit diesen Dingen nicht vertraut sind, ist zvon.org ein guter Ort, um mit der Suche zu beginnen.

    Die Idee besteht darin, in den toPage()-Methoden keinen HTML-Code, sondern eine XML-Struktur zu generieren. Das Seitendokument wird als String mit XML-Code erstellt (es dient als „Puffer“) und in der letzten Phase des Skripts verwenden wir eine XSL-Transformation.

    Stellen wir uns zunächst vor, was das Ergebnis des Hauptteils des Codes sein soll.

    Minute 57 Sekunde: 45

    Was es ist, lässt sich leicht erraten – zwei Nachrichten und ein Formular. Bitte beachten Sie, dass das PHP-Skript nur einen solchen String vorbereiten muss – das ist sehr einfach. Darüber hinaus ist die Reihenfolge der Haupt-Tags nicht wichtig – Sie können sie beispielsweise am Anfang platzieren, was für den Programmierer praktisch ist. Wie man es umsetzt. Sie können, ohne etwas zu ändern, die Ausgabepufferung verwenden, XML- statt HTML-Code ausgeben und am Ende die Ausgabe einfach in einem String erfassen. Aber dann verlieren wir an Flexibilität – manchmal möchte man beispielsweise Debugging-Informationen direkt auf der Seite ausgeben (mittels Echo). Gleichzeitig arbeiten PHP-Entwickler an einem DOM-Modul, das eine fortschrittlichere Möglichkeit zum Erstellen und Übergeben von Baumdokumenten bietet. Wenn wir das DOM implementieren möchten, müssen wir die gesamte Anwendung neu entwerfen und die Ausgabe von Zeichenfolgen auf die Erstellung von DOM-Elementen umstellen. Daher bevorzuge ich es, die XML-Darstellung von Objekten in den Objekten selbst zu speichern und nacheinander ein gemeinsames XML-Dokument zusammenzustellen. Es ist nicht so schwierig, es bedarf nur einer kleinen Modifikation. Sie werden sehen, dass diese Technik nicht strikt an eine bestimmte Art der Speicherung von XML-Daten gebunden ist und Sie so mit geringem Aufwand auf die Verwendung des DOM umsteigen können. Beachten Sie zunächst, dass jedes unserer Objekte über eine toPage()-Methode verfügt. Diese Ähnlichkeit sollte uns zum Nachdenken über die Einführung einer neuen gemeinsamen Elternklasse veranlassen. Lassen Sie jede Klasse, die Teile eines XML-Dokuments für eine Seite erstellen kann, von einer Klasse erben, die sich um die XML-Darstellung des Objekts kümmert. Nennen wir es Outputable.

    class Outputable ( /** * XML-Container (String). */ var $output = ""; /** * Geben Sie den Inhalt des Containers an und leeren Sie den Container. * * @return a string with XML data */ function getOutput () ( $ out = $this->output; $this->output = ""; return $out; ) /** * Füge einen Teil zum Inhalt des Containers hinzu. * * @param string die Zeichenfolge, die hinzugefügt werden soll * / function appendOutput($string) ( $this ->output .= $string . "n"; ) /** * "Abstract"-Methode. */ function toPage() ( ) )

    Die toPage()-Methode wird leer gemacht – in diesem Fall wird sie als Indikator dafür benötigt, wie externe „Matroschka“-Klassen mit der inneren Klasse kommunizieren sollen. Allerdings könnten wir hier eine Standardimplementierung anbieten, wenn uns auffällt, dass es viele Objekte gibt, die sich auf der Seite auf die gleiche Weise anzeigen.

    Die Klassen „Message“ und „Inbox“ werden sich geringfügig ändern – sie sollten nun beide von Outputable erben, und die Methoden „toPage()“ werden sich ebenfalls ändern
    Nachricht.php

    Klasse Nachricht erweitert Ausgabebar ( /** * Nachrichteninhalt. */ var $content; /** * Konstruktor zum Initialisieren des Nachrichtentextes. * * @param content Nachrichteninhalt */ function Message($content) ( $this->content = $content; ) /** * Eine Nachricht an die Sitzung schreiben. */ function send() ( $_SESSION["session_messages"] = $this->content; ) /** * Eine Nachricht an die Seite ausgeben. * / function toPage() ( $this->appendOutput("".$this->content.""); ) )

    class Inbox erweitert Outputable ( /** * Array empfangener Nachrichten. */ var $messages = array(); /** * Im Konstruktor empfangen wir alle empfangenen Nachrichten * und entfernen sie aus der Sitzung. */ function Inbox( ) ( if (is_array ($_SESSION["session_messages"])) ( $messages = $_SESSION["session_messages"]; $co = sizeof($messages); for ($i = 0; $i< $co; $i++) { $this->Nachrichten = neue Nachricht($messages[$i]); ) ) /* das Nachrichtenarray löschen */ $_SESSION["session_messages"] = array(); ) /** * Zeigt den Inhalt des Posteingangs auf der Seite an. */ function toPage() ( $co = sizeof($this->messages); $this->appendOutput(""); for ($i = 0; $i< $co; $i++) { $this->Nachrichten[$i]->toPage(); $this->appendOutput($this->messages[$i]->getOutput()); ) $this->appendOutput(""); ) )

    Die Ausgabemethode hat sich geändert – statt direkt auf der Seite auszugeben, wird die externe Darstellung nun vorerst in Outputable gespeichert, das in jedem der Objekte „sitzt“. Die Methode appendOutput() dient als Ersatz für das Konstrukt echo(). Um die Ausgabe eines Objekts zu erhalten, wird die Methode getOutput() verwendet.

    Sehen wir uns nun den Client-Teil des Codes an, der das gleiche Problem wie zuvor löst.
    index.php

    Die wichtigste Neuerung liegt im Objekt $global_content, dessen Name für sich spricht. In diesem Fall gehört es zur Klasse „Outputable“; bei realen Aufgaben würden Sie wahrscheinlich eine separate Klasse für den Seiteninhalt erstellen.

    Wenn Sie genau hinschauen, hat sich der Inhalt des Skripts praktisch nicht verändert – der gleiche Posteingang, das gleiche toPage(). Es wurde eine Anweisung hinzugefügt, die den Inhalt der Nachrichtenliste im Seiteninhalt anzeigt. Zur Abwechslung werden nun zwei Meldungen generiert.

    Um das Ergebnis zu betrachten, muss nur noch die XSL-Vorlage vorbereitet werden.
    style.xsl

    XSLT-Beispiel

    Nachricht

    Was haben wir erreicht?

    Erstens können Sie komplexe Projekte sicherer angehen – eine echte Unabhängigkeit der Module ist gewährleistet. Die Reihenfolge, in der Ergebnisse auf der Seite platziert werden, wird jetzt mithilfe einer externen XSL-Vorlage gesteuert und hängt nicht von der Reihenfolge ab, in der die Module ausgeführt werden.

    Jedes Modul, das als Ergebnis seiner Arbeit XML-Daten generiert, kann in einem Projekt verwendet werden. Dies ist übrigens einer der Vorteile gegenüber Template-Engines, bei denen die Datenerstellung aus einer Folge von Aufrufmethoden (Assign usw.) einer bestimmten Engine besteht, für die es keinen gemeinsamen Standard gibt.

    Ein weiterer Vorteil ist die einfache Fehlersuche. Wenn Sie das Skript ausführen, werden Sie feststellen, dass jede Seite eine Debug-Ausgabe enthält – einen XML-Prototyp, der das Debuggen von Anwendungen erheblich vereinfacht.

    Sie müssen außerdem darüber nachdenken, wie Sie Nachrichtenobjekte erstellen. Es ist nicht immer praktisch, new direkt im Clientcode zu verwenden. Aber vielleicht ist dies ein Thema für einen separaten Artikel.

    Zum Schluss noch ein Galopp über die Aussichten:

    * Popup-Fenster für eine Liste wichtiger Nachrichten
    * „Absenderseiten“ und „Zielseiten“ in Nachrichten
    * Protokollierung von Nachrichten in der Datenbank
    * Button „Verlauf meiner Aktionen anzeigen“
    * Statistische Analyse der Benutzeraktionen innerhalb von Sitzungen
    * „Intelligente Assistenten“ in Webanwendungen

    In KP und BUS ist ab Version 11.5 in Editionen, die ein soziales Netzwerk enthalten, ein neues Modul „Web Messenger“ erschienen.
    Bevor das Modul für alle freigegeben wurde, durchlief es eine Feuertaufe in unserem „Social Intranet“ und sammelte bis zu 8 Updates


    In sechs Monaten Entwicklungszeit haben wir viel getan

    Wir haben die bisherige Benutzeroberfläche komplett aufgegeben und eine neue erstellt, die auf den Erfahrungen beliebter Instant Messenger basiert.
    Das Dialogfenster begann sich innerhalb der Seite zu öffnen, Gesichter erschienen darin, Nachrichten wurden farblich gekennzeichnet und es wurde möglich, problemlos ein Gespräch mit mehreren Personen gleichzeitig zu führen.

    Das Verlaufsfenster ist ein eigenes Thema, jeder wollte schon lange eine Verlaufssuche haben, jetzt haben wir sie endlich, wir planen, dort einen Kalender zur schnellen Navigation hinzuzufügen.

    Wir haben ein Benachrichtigungscenter mit verschiedenen Nachrichtentypen erstellt, die Möglichkeit geboten, den Verlauf ihres Empfangs anzuzeigen, und für Entwickler eine einfache API zum Hinzufügen und Abrufen von Benachrichtigungen.

    Und das alles ist auf jeder Seite Ihrer Website verfügbar!

    Leider wurde nicht alles umgesetzt, was geplant war

    Erste Wir hatten keine Zeit, die Nachrichten in unsere Tabellen zu übersetzen.
    Ein solcher Übergang würde es ermöglichen, auf das Modul „soziales Netzwerk“ zu verzichten, was eine größere Freiheit bei der Wahl der Redakteure ermöglichen würde, und es wäre auch möglich, Gruppenchats einzuführen.

    Zweite Dies ist die Umsetzung einer echten „sofortigen“ Kommunikation. Jetzt verwendet das Modul regelmäßiges Pooling und fragt den Server alle n Sekunden ab. Der Abfragezeitraum variiert je nach Kommunikationsaktivität.
    Wir planen, einen separaten Dienst zu schreiben, der ständige Verbindungen aufrechterhält und bei Bedarf Datenaktualisierungen versendet (für den Messenger, für den Live-Feed usw.).

    Dritte Wir planen, die Benutzeroberfläche leicht zu ändern, die separate Kontaktliste und das Dialogfenster aufzugeben und sie zu einem Ganzen zu kombinieren, was es uns in Zukunft ermöglichen wird, den Messenger in eine mobile Anwendung zu verlagern.

    Es gibt noch keine Dokumentation und sie wird auch erst im Herbst erscheinen, weil... Das Modul wird aktiv weiterentwickelt und wir möchten die Möglichkeit lassen, die API zu ändern.
    Ich werde jedoch versuchen, Beispiele für die Arbeit mit dem Teil der API zu veröffentlichen, an dem die Arbeit bereits abgeschlossen ist und Sie sie sicher in Ihren Modulen verwenden können.

    Arbeiten mit Benachrichtigungen (relevant für IM ab Version 11.5.2)

    Wir haben drei Arten von Benachrichtigungen implementiert:
    - personalisierte Benachrichtigung;
    - Benachrichtigung vom System;
    - Bestätigungspflichtige Meldung;

    Bevor Sie die API verwenden, müssen Sie prüfen, ob das Modul auf dem System installiert ist:

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

    Personalisierte Benachrichtigung


    Wenn Nachrichten auf NOTIFY_TAG festgelegt sind, werden sie vom Benutzer gruppiert.

    Benachrichtigung vom System


    $arMessageFields = array(// Empfänger „TO_USER_ID“ => $USER->GetId(), // Absender (kann >0 sein) „FROM_USER_ID“ => 0, // Benachrichtigungstyp „NOTIFY_TYPE“ => IM_NOTIFY_SYSTEM, // Modul, das das Senden einer Benachrichtigung angefordert hat „NOTIFY_MODULE“ => „im“, // symbolisches Tag zur Gruppierung (es wird nur eine Nachricht angezeigt), wenn dies nicht erforderlich ist, setzen Sie den Parameter „NOTIFY_TAG“ => „IM_CONFIG_NOTICE“ nicht. // Benachrichtigungstext auf der Website (HTML- und BB-Codes verfügbar) „NOTIFY_MESSAGE“ => „[b]Achtung: Sie müssen den korrekten Pfad zum sozialen Netzwerk in den Einstellungen des Moduls „Instant Messaging und Benachrichtigungen“ überprüfen und angeben.“ , // Benachrichtigungstext, der per E-Mail (oder XMPP) gesendet werden soll, wenn es keine Unterschiede gibt, setzen Sie den Parameter nicht //"NOTIFY_MESSAGE_OUT" => ""); CIMNotify::Add($arMessageFields); ?>

    Bestätigungspflichtige Meldung (Confirm)


    $arMessageFields = array(// Empfänger „TO_USER_ID“ => $USER->GetId(), // Absender „FROM_USER_ID“ => 2, // Benachrichtigungstyp „NOTIFY_TYPE“ => IM_NOTIFY_CONFIRM, // Modul, das das Senden der Benachrichtigung angefordert hat „NOTIFY_MODULE“ => „calendar“, // symbolisches Tag zur Gruppierung (es wird nur eine Nachricht angezeigt), falls dies nicht erforderlich ist, den Parameter „NOTIFY_TAG“ => „CALENDAR|INVITE|123|“ nicht setzen.$ USER->GetId() , // Benachrichtigungstext auf der Website (HTML- und BB-Codes verfügbar) "NOTIFY_MESSAGE" => "Ich lade Sie ein, am Treffen „Instant Messaging und Benachrichtigungen“ teilzunehmen, das am 15. März stattfinden wird. 2012 um 14:00 Uhr“, // Benachrichtigungstext zum Versenden per E-Mail (oder XMPP), wenn es keine Unterschiede gibt, setzen Sie den Parameter „NOTIFY_MESSAGE_OUT“ nicht => „Benutzer Evgeny Shelenkov lädt Sie zur Teilnahme am Meeting „Instant Nachrichten und Benachrichtigungen“ #BR#, die am 15.03.2012 um 14:00 Uhr stattfinden wird.#BR # #BR# Akzeptieren: http://test.ru/calend.php?CONFIRM=Y&CID=123 #BR# Refuse: http://test.ru/calend.php?CONFIRM=N&CID=123", // Array, das die Benachrichtigungsschaltflächen beschreibt "NOTIFY_BUTTONS" => Array(// 1. Schaltflächenname, 2. Wert, 3. Schaltflächenvorlage , 4. Übergang zur Adresse nach Drücken (optionaler Parameter) Array("TITLE" => "Accept", " VALUE" => "Y", "TYPE" => "accept" /*, "URL" => " http://test.ru/?confirm=Y" */), Array("TITLE" => " Refuse", "VALUE" => "N", "TYPE" => "cancel" /*, "URL " => "http://test.ru/?confirm=N" */),), // symbolischer Code der Briefversandvorlage, wenn nicht angegeben, wird er mit der Benachrichtigungsvorlage gesendet "NOTIFY_EMAIL_TEMPLATE" => " CALENDAR_INVITATION"); CIMNotify::Add($arMessageFields); ?>

    Um mit dieser Art von Benachrichtigung zu arbeiten, reicht es nicht aus, einfach eine Nachricht zu senden; Sie müssen sie auch zuzustellen.

    Service
    Es gibt zwei Möglichkeiten, die einfachste besteht darin, dem Link zu folgen (wenn Sie den 4. Parameter in NOTIFY_BUTTONS festlegen).
    Nachdem Sie dem Link gefolgt sind, müssen Sie den folgenden Code in Ihrem Code aufrufen:
    Achtung: Achten Sie genau auf den Namen des Tags; wenn Sie den Löschvorgang aufrufen, werden alle Nachrichten mit diesem Tag gelöscht.
    Beim Versenden mehrerer Nachrichten muss dies berücksichtigt werden, damit die Ausführung einer Aktion durch einen Benutzer nicht versehentlich die Benachrichtigung an alle löscht (außer an Stellen, an denen eine solche Logik erforderlich ist).

    Die zweite Möglichkeit sind Veranstaltungen.
    Zuerst müssen Sie die Abhängigkeit registrieren

    Vergessen Sie nicht Ihre Funktionen Anfrage bestätigen Und RejectRequest dazu führen, dass die Benachrichtigung gelöscht wird CIMNotify::DeleteByTag()

    Das ist jetzt alles, ich warte auf eure Vorschläge in den Kommentaren, erfolgreiche Umsetzungen!
    Wenn Sie die API vor der Veröffentlichung von 11.5.2 in einem Array mit Parametern ausprobieren möchten, müssen Sie zusätzlich „MESSAGE_TYPE“ => IM_MESSAGE_SYSTEM angeben, außerdem funktioniert die Option mit einem Link in Schaltflächen nicht für Bestätigungsbenachrichtigungen. Aber es ist besser zu warten; Update 11.5.2 erscheint am 23. Mai.

    Besser eine Pechsträhne als ein Delirium tremens...

    PHP AJAX CRUD: Erstellen, Löschen und Bearbeiten von Datensätzen in der MySQL-Datenbank

    In diesem Artikel erfahren Sie, wie Sie mit PHP Datensätze in einer MySQL-Datenbank hinzufügen, bearbeiten und löschen. Wir haben einen JQuery-Handler verwendet, der eine AJAX-Anfrage an ein serverseitiges Skript sendet. Der Handler aktualisiert die Liste der Datensätze.

    AJAX-Formular zum Senden von Anfragen zum Erstellen, Löschen und Bearbeiten

    Beim Hinzufügen eines Datensatzes sendet das Formular Daten über eine AJAX-Anfrage an das PHP-Skript. Bei erfolgreicher Hinzufügung wird die Liste der Einträge neu geladen.

    JQuery AJAX-Funktionen für CRUD-Datenbankabfragen

    In der JQuery AJAX-Funktion haben wir Schalterfälle zum Hinzufügen, Bearbeiten und Löschen. In diesen Fällen werden abhängig von den Datenbankaktionen unterschiedliche Abfrage- und Antwortdatenzeichenfolgen generiert.

    Funktion showEditBox(id) ( $("#frmAdd").hide(); var currentMessage = $("#message_" + id + " .message-content").html(); var editMarkUp = ""+currentMessage+" SaveCancel"; $("#message_" + id + " .message-content").html(editMarkUp); ) function cancelEdit(message,id) ( $("#message_" + id + " .message-content") .html(message); $("#frmAdd").show(); ) function callCrudAction(action,id) ( $("#loaderIcon").show(); var queryString; switch(action) ( 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“, data:queryString, Typ: „POST“, success:function(data)( switch(action) ( case „add“: $(“#comment-list-box“).append(data); break; case "edit": $("#message_" + id + " .message-content").html(data); $("#frmAdd").show(); brechen; case „delete“: $(“#message_“+id).fadeOut(); brechen; ) $("#txtmessage").val(""); $("#loaderIcon").hide(); ), error:function ()() )); )

    PHP-Skript für CRUD-Operationen

    Der folgende Code führt Abfragen für die Datenbank durch. Dieses PHP-Skript aktualisiert nach der Ausführung einer CRUD-Aktion die Datensätze als Ergebnis der AJAX-Antwort.

    require_once("dbcontroller.php"); $db_handle = new DBController(); $action = $_POST["action"]; if(!empty($action)) ( switch($action) ( case "add": $result = mysql_query("INSERT INTO comment(message) VALUES("".$_POST["txtmessage"].")" ) ; if($result)($insert_id = mysql_insert_id(); echo " Bearbeiten Löschen " . $_POST["txtmessage"] . " "; ) break; case "edit": $result = mysql_query("UPDATE comment set message = "".$_POST["txtmessage"]."" WHERE id=".$_POST["message_id"]); if($result) echo $_POST["txtmessage"]; break; case "delete": if ( !empty($_POST["message_id"])) ( mysql_query("DELETE FROM comment WHERE id=".$_POST["message_id"]); ) break; ) )

    An diesem Punkt dieses Kurses wurde die Grundlage unseres Plugins gelegt, ein benutzerdefinierter Hook definiert und eine dauerhafte Nachricht angehängt, die zeigt, wie der Hook funktioniert.

    Das wir Nicht haben sie die Nachrichtentypen und deren Anzeige nicht entsprechend den vom Benutzer eingegebenen Daten implementiert.

    Aber bevor wir beginnen, müssen wir Unterstützung für verschiedene Nachrichtentypen, eine Klassenschnittstelle, die jeden Nachrichtentyp unterstützt, und die Datenstruktur hinzufügen, die zum Speichern solcher Nachrichten erforderlich ist.

    Bereit anzufangen?

    Ich freue mich darauf, das Tutorial fortzusetzen, aber es gibt ein paar Dinge, die wir bedenken müssen, bevor wir uns kopfüber in den Quellcode stürzen. Stellen Sie sicher, dass die folgende Software auf Ihrem System installiert ist:

    • PHP 5.6.25 und MySQL 5.6.28
    • Apache oder Nginx
    • WordPress 4.6.1
    • Ihre bevorzugte IDE oder Ihr bevorzugter Editor

    Und wenn Sie nach einer Komplettlösung suchen, vergessen Sie nicht, MAMP auszuprobieren.

    Wir sind fortgeschritten

    Wie bereits erwähnt, befinden wir uns genau in der Mitte dieses Kurses. Wenn Sie eine der ersten Lektionen verpasst haben, finden Sie hier, was wir bisher behandelt haben:

  • Im ersten Tutorial haben wir uns auf die Mindestgrundlagen für die Erstellung unseres Plugins konzentriert und darauf, was Sie für den Einstieg benötigen.
  • Im zweiten Teil haben wir das Plugin weiter entwickelt und die grundlegende Verwaltungsseite in WordPress ein wenig erweitert. Wir haben auch einen benutzerdefinierten Hook zugewiesen, den wir verwenden, und ihn auf der Serverseite ausgeführt. Wir legen auch die Grundparameter für unseren Settings Messenger fest.
  • Und das werden wir in der letzten Ausbildungsphase berücksichtigen:

  • Wir verknüpfen alles miteinander, sehen es in Aktion und machen das Plugin öffentlich zum Download verfügbar.
  • Derzeit haben wir andere Aufgaben, auf die wir uns konzentrieren werden.

    Machen wir uns wieder an die Arbeit

    Da wir uns der Arbeit zugewandt haben (und wie in den vorherigen Lektionen angegeben), sind wir bestrebt, die Aufgaben in diesem Teil weiter umzusetzen:

    In diesem Tutorial werden wir unseren Settings Messenger weiterentwickeln, indem wir Unterstützung für Erfolgs- und Fehlermeldungen hinzufügen und Sicherheitsprobleme ansprechen.

    Im vorherigen Artikel haben wir mit Settings Messenger begonnen, allerdings nur bis zur Einrichtung einer Funktion, die kontinuierlich eine Erfolgsmeldung anzeigt, während die Benutzerseite geladen wird.

    In diesem Tutorial werden wir Unterstützung für Fehler-, Warn- und Erfolgsmeldungen hinzufügen. Anschließend zeigen wir sie auf dem Bildschirm an, um eine Vorstellung davon zu bekommen, wie der Messenger funktionieren wird.

    Darüber hinaus werden wir eine weitere Änderung vornehmen, die das Ablehnen von Benachrichtigungen nach Ermessen des Benutzers unterstützt.

    Dies ist der gesamte Plan der notwendigen Arbeit für diese Lektion. Lasst uns beginnen.

    Einstellungen Messenger-Erweiterung

    Denken Sie daran, dass der Sinn und Zweck von Settings Messenger darin besteht, unsere Arbeitsweise mit benutzerdefinierten Nachrichten, benutzerdefinierten Hooks und der nativen WordPress-API zum Anzeigen von Nachrichten im Kontext des WordPress-Admin-Panels zu definieren.

    Dazu bauen wir auf der Arbeit der letzten Lektion auf und beginnen hier.

    Erfolgreiche Nachrichten

    Da wir in der vorherigen Lektion mit erfolgreichen Nachrichten begonnen haben, fahren wir mit ihnen fort. Jetzt haben wir eine hartcodierte Methode, die eine einzelne Technik anzeigt: