Einige Fragen zu Modulen/Zend-Syntax im IcingaWeb2

This forum was archived to /woltlab and is now in read-only mode.
  • Hallo Zusammen,


    Ich bastel zur Zeit an einem Modul für unser IcingaWeb2.
    Dabei sind schon ein paar Fragen bei mir bezüglich des Datenzugriffs aufgekommen.


    Gleich vorweg:
    Ich bin kein gelernter Website-Entwickler und habe mir meine Kenntnisse, soweit vorhanden, durch Selbststudium angeeignet. Und gerade bei Klassen und der objektorientierten Herangehensweise des IcingaWeb2/Zend-Frameworks stoße ich immer wieder an meine Grenzen.


    Aber nun zu den Fragen:



    Datenbank- bzw. Backend-Zugriff


    Mir ist bereits bekannt, dass ich innerhalb der "ModulnameController.php" mit z.B. folgendem auf das Backend zugreifen kann:



    In der "Index.phtml" könnte ich nun die Tabellenwerte mit z.B. folgendem Abrufen:

    PHP
    1. echo $host->host_address;


    • Welche Arten von Datenbank-Abfragen mit "WHERE" bietet Icinga hier noch und wie sehen diese aus?
      z.B: "LIKE", ">", "<", ">=", "<="
    • Kann ich sowas wie "INNER JOIN" benutzen?
    • Wie kann ich historische Daten wie zum Beispiel bereits vergangene Downtimes abrufen?
      Ein Versuch einfach die Tabelle "Hostdowntimeendhistory" bzw. "Hostdowntimestarthistory" zu verwenden, endete in einem Fehler, da unbekannt.
    • Wie kann ich, statt Daten auszulesen, mit Hilfe des Backends, Daten in die DB schrieben?
    • Ist es möglich Funktionen die in der ModulnameController.php definiert wurden dynamisch innerhalb der Index.phtml aufzurufen und dabei eine Variable zu übergeben, anstatt immer auf die GET-Variablen bei Erstaufruf ( IndexAction() ) der Seite angewiesen zu sein? Also zum Beispiel so:



    Authentifizierung / Session-Variablen


    Wie kann ich am besten auf die Session-Variablen zugreifen um zum Beispiel zu ermitteln ob ein bestimmer User angemeldet ist?
    Folgendes funktioniert aufgrund des protected Status nicht:

    PHP
    1. echo $_SESSION['user']->username;



    Danke schon mal im Voraus.


    Gruß Dirk

    The post was edited 2 times, last by _Dirk_ ().

  • Hallo Dirk! Schön zu sehen dass du dich an der Web 2 Modul-Entwicklung versuchst :thumbup:


    Ein Hinweis vorweg: Benutze eine IDE. Funktionen wie auto-completion und Klassen-Navigation sind ein must-have wenn man den Code nicht kennt.



    1. Welche Arten von Datenbank-Abfragen mit "WHERE" bietet Icinga hier noch und wie sehen diese aus?
    z.B: "LIKE", ">", "<", ">=", "<="


    Da lass ich mal ein bisschen Code für sich sprechen:



    2. Kann ich sowas wie "INNER JOIN" benutzen?


    Kannst du. Allerdings würde ich dir empfehlen bereits existierende Query-Implementierungen zu nutzen, falls möglich.


    Parameter sind für alle gleich:

    PHP
    1. $query = $this->backend()->select()->from('hostStatus')->getQuery();
    2. $query->join(<table>, <on>[, <cols>]); // INNER JOIN
    3. $query->joinInner();
    4. $query->joinLeft();
    5. $query->joinRight();
    6. $query->joinFull();



    3. Wie kann ich historische Daten wie zum Beispiel bereits vergangene Downtimes abrufen?
    Ein Versuch einfach die Tabelle "Hostdowntimeendhistory" bzw. "Hostdowntimestarthistory" zu verwenden, endete in einem Fehler, da unbekannt.


    Du kannst auf alle "Tabellen" zugreifen, für die eine DataView existiert: Icinga\Module\Monitoring\DataView\*
    In deinem konkreten Beispiel wäre folgendes möglich:

    PHP
    1. $this->backend->select()->from('eventhistory', <columns>)->where('type', 'dt_start');
    2. $this->backend->select()->from('eventhistory', <columns>)->where('type', 'dt_end');


    Es geht allerdings auch folgendes: (Allerdings würde ich dir das nur empfehlen wenn du mit obigem Beispiel nichts anfangen kannst.)

    PHP
    1. $query = $this->backend->query('Hostdowntimeendhistory', <columns>);



    4. Wie kann ich, statt Daten auszulesen, mit Hilfe des Backends, Daten in die DB schrieben?


    PHP
    1. // getResource liefert Icinga\Data\Db\DbConnection
    2. $this->backend->getResource()->insert(...);
    3. $this->backend->getResource()->update(...);
    4. $this->backend->getResource()->delete(...);


    Aber bitte vermeide es mit einem Web 2 Modul in die IDO zu schreiben. Das sollte allein Icinga überlassen sein.



    5. Ist es möglich Funktionen die in der ModulnameController.php definiert wurden dynamisch innerhalb der Index.phtml aufzurufen und dabei eine Variable zu übergeben, anstatt immer auf die GET-Variablen bei Erstaufruf ( IndexAction() ) der Seite angewiesen zu sein?


    Jain. Natürlich geht das, irgendwie, aber das Resultat ist in jedem Fall nicht "schön". Du solltest derartige Routinen auslagern, also weitere Klassen dafür anlegen. Diese wiederum initialisierst du im Controller und gibst sie mittels $this->view->? an die View weiter. Zum Beispiel:


    Egal was du machst, die View sollte nur Daten verarbeiten, diese allerdings nicht holen oder definieren.



    Wie kann ich am besten auf die Session-Variablen zugreifen um zum Beispiel zu ermitteln ob ein bestimmer User angemeldet ist?
    Folgendes funktioniert aufgrund des protected Status nicht:

    PHP
    1. echo $_SESSION['user']->username;


    Das hängt sehr stark von dem ab was du erreichen willst. Natürlich kannst du alles auch selber erledigen, aber für gewissen Dinge nutzt du besser unsere Routinen.


    Vom view script aus: (*.phtml)

    • $this->hasPermission(<permission>)
    • $this->Auth()

      • ->hasPermission()
      • ->isAuthenticated()
      • ->getGroups()
      • ->getRestrictions()
      • ->getUser()

        • ->getUsername()
        • u.v.m. Siehe: Icinga\User


      • u.v.m. Siehe: Icinga\Authentication\Auth


    Vom Controller aus:

    • $this->hasPermission(<permission>)
    • $this->assertPermission(<permission>)
    • $this->Auth() (Das selbe wie oben)
    • $this->requiresLogin()


    Falls du doch direkt auf die Session zugreifen möchtest:


    PHP
    1. use Icinga\Web\Session;
    2. $session = Session::getSession();
  • Hey,


    Vielen Dank für deine Hilfe.
    Da werde ich mich demnächst mal daran machen deine Vorschläge auszuprobieren :-)

  • Hallo,


    Wie würde ich an die Sache herangehen um eine Gruppe eines Benutzers auslesen zu können.


    Ich habe multiple dinge probiert, in der View, im Controller aber ich bekomme immer einen array to string fehler.

    Vielleicht könnt ihr mir da helfen.

    Ich benutze die Funktion $this->Auth()->getGroups() , aber bekomme irgendwie nicht hin die Gruppennamen nutzbar in Skripten oder in der View zu benutzen.


    Danke schonmal im Voraus,


    Marco

  • Magst du für deine neue Frage auch einen neuen Thread erstellen? Dieser Thread ist von 2015 und deine Frage nicht unbedingt themenbezogen auf die Usprungsfrage.


    Btw - ich sehe du hast auch schon öffentlich gefragt, warum dann die PM und die Wall-Einträge bei mir?