Community
    • Categories
    • Recent
    • Popular
    • Users
    • Search
    • Register
    • Login

    Signal für \isys_cmdb_dao_category::save_data

    Scheduled Pinned Locked Moved Entwicklung
    7 Posts 2 Posters 371 Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • S Offline
      steven_c
      last edited by

      Hallo Zusammen,

      wir würden gerne über ein Signal feststellen, ob und wann \isys_cmdb_dao_category::save_data aufgerufen wurde.

      Leider reichen die vorhandenen Signale,

      mod.cmdb.afterObjectTypeSave

      mod.cmdb.objectChanged

      mod.cmdb.afterCategoryEntrySave,

      nicht, da diese in anderen Kontexten emitted werden.

      Da es aber third-party addons gibt, wie z.B. das viva2 addon, die über

      \isys_cmdb_dao_category::save_data

      bestimmte Daten speichern, gibt es derzeit für uns keine saubere Möglichkeit, in diesen Prozess einzugreifen.

      Die \isys_cmdb_dao_category::save_data Methode emitted zwar ein Signal (mod.cmdb.extendProperties), aber nur ganz zu Anfang um die Properties zu holen.

      Habt ihr sonst noch andere Tipps?

      Danke und viele Grüße

      Steven

      LFischerL 1 Reply Last reply Reply Quote 0
      • LFischerL Offline
        LFischer @steven_c
        last edited by

        Hallo @steven_c24

        ich glaube um dir besser helfen zu können müsste ich zuerst verstehen wieso nur die save_data Methode so wichtig ist 🤔 Was ist dein Use-case? Wenn du nur bei bestimmten Kategorien "reagieren" möchtest kannst du einfach die übergebene "DAO" prüfen (z.B. if ($dao instanceof isys_cmdb_dao_category_g_location) ).

        Wenn du nur in einem bestimmten Kontext reagieren möchtest könntest du auch die Context Komponente nutzen - diese beinhaltet Informationen "von wo" der aktuelle Request kommt. Also von der GUI, aus der API oder einem CLI Command. Zusätzlich sind dort auch Infos hinterlegt welche Funktion genutzt wurde, wie z.B. "Import", "Templates", "LDAP", ...

        Neben den genannten Signalen fällt mir gerade auch nichts ein - aber vielleicht gibt es ja andere Möglichkeiten 🙂

        Viele Grüße
        Leo

        S 1 Reply Last reply Reply Quote 1
        • S Offline
          steven_c @LFischer
          last edited by

          @LFischer Hallo Leo, vielen lieben Dank für deine Antwort!

          Also der Use-Case ist, dass wir gerne Änderungen eines third-party Addons loggen wollen, wenn sich Änderungen ergeben.
          Das Third-Party Addon ist "Viva2".

          Hier sehen wir, dass wenn sich Werte in einer Kategorie Liste ändern, dass das Addon die \isys_cmdb_dao_category::save_data Methode aufruft.

          Und hier würde wir uns dann mittels Signal gerne rein-hooken, um dann einen Log zu erzeugen.
          Im Moment machen wir das "hart" mit einem Patch, also direkte Code-Änderung im Addon.

          Da das aber nicht sauber genug ist, da bei einem Addon Update wir die Datei erneut patchen müssten,
          haben wir unser eigenes Addon geschrieben, das mittels isys_component_signalcollection einfach auf Signale lauscht.
          Das funktioniert auch für Signale an den entsprechenden Stellen, wo sie geworfen werden,
          aber es fehlt halt ein Signal, das bei \isys_cmdb_dao_category::save_data emitted wird.

          Oder wäre es besser, dass das Addon nach dem call auf \isys_cmdb_dao_category::save_data, selbst ein Signal emitten sollte?

          Vielen Dank 🙂

          LFischerL 1 Reply Last reply Reply Quote 0
          • LFischerL Offline
            LFischer @steven_c
            last edited by

            Hallo @steven_c24

            ich habe das VIVA2 Add-on technisch nicht mehr so genau im Kopf - aber wenn es sich um Kategorie DAO-Klassen handelt müsstest du es genau so machen können wie ich das vorgeschlagen habe:

            Du hörst dazu auf das mod.cmdb.afterCategoryEntrySave Signal und fragst den ersten Parameter (die DAO Instanz) ab:

            isys_application::instance()->container->get('signals')
               ->connect('mod.cmdb.afterCategoryEntrySave', function ($dao) {
                  if ($dao instanceof isys_cmdb_dao_category_g_viva2_whatever) {
                     // Do the magic...
                  }
               });
            

            Das könntest du für jede VIVA2 spezifische Klasse machen, oder alternativ auch so, damit du nicht jede Klasse einzeln abfragen musst (was aber sicherer wäre):

            isys_application::instance()->container->get('signals')
               ->connect('mod.cmdb.afterCategoryEntrySave', function ($dao) {
                  if (strpos(get_class($dao), 'isys_cmdb_dao_category_g_viva2_') === 0) {
                     // Do the magic...
                  }
               });
            

            Ich hoffe damit konnte ich dir helfen 🙂

            Viele Grüße
            Leo

            S 1 Reply Last reply Reply Quote 0
            • S Offline
              steven_c @LFischer
              last edited by steven_c

              @LFischer Hallo Leo, vielen Dank für deine Antwort!

              Genau, also so wie du es vorgeschlagen hattest, haben wir es auch probiert, aber da das Viva2 Addon eine Routine durchläuft, wo halt kein Signal emitted wird (parent call zu \isys_cmdb_dao_category::save_data), können wir auf Änderungen in einer Liste nicht reagieren.

              Ändern wir zB bei Schutzbedarf einen Eintrag aus der Liste, dann wird kein Signal emitted, weil das Addon ja über parent::\isys_cmdb_dao_category::save_data geht.

              4501d2dd-b21e-499e-8746-94968b3da41e-image.png

              Ändern wir aber etwas im Reiter "Allgemein" einer Kategorie, dann wird ja generell das Signal (mod.cmdb.afterCategoryEntrySave) emitted und wir können darauf horchen.
              Speziell für Änderungen in der Liste (vom Screenshot) aber, geht das nicht.

              Wir konnten uns jetzt damit Abhilfe schaffen, dass wir im Viva2 Addon selbst ein Signal emitten, sobald \isys_cmdb_dao_category::save_data an die Caller-Methode des Addons returned und auf dieses Signal reagieren wir dann von unserem eigenen Addon auf mittels ->connect. Das funktioniert auch aber wir möchten am Liebsten ungern third-party Code patchen, aber im Moment bietet sich keine andere Möglichkeit für uns, dort reinzuhooken.

              LFischerL 1 Reply Last reply Reply Quote 0
              • LFischerL Offline
                LFischer @steven_c
                last edited by

                Hey @steven_c24

                danke für die Erklärung - langsam verstehe ich das Problem 😄 Was ich aber noch nicht ganz verstehe ist wieso mod.cmdb.afterCategoryEntrySave nicht aufgerufen wird - das müsste eigentlich ganz regulär passieren wenn eine Kategorie gespeichert wird (also auch wenn save_data genutzt wird) 🤔

                Ich bin bei VIVA2 leider nicht so tief im Thema und weiß deswegen nicht ob es sich dabei um eine reguläre i-doit Kategorie (wie z.b. "Allgmein" oder "Buchhaltung") handelt. Ich versuche mich mal etwas schlau zu machen 🙂

                Es könnte sich dabei theoretisch auch um einen Fehler im VIVA2 Add-on handeln, dann müsste das an den Hersteller becon GmbH gemeldet werden. Aber mal schauen ob ich was rausfinden kann.

                Viele Grüße
                Leo

                S 1 Reply Last reply Reply Quote 0
                • S Offline
                  steven_c @LFischer
                  last edited by

                  @LFischer Hallo Leo, vielen Dank für deine Antwort :)!

                  Genau du hast recht, in der Regel sollte dieses Signal emitted werden, aber wird es leider für diese custom Kategorie "Schutzbedarf" des Viva2 Addons nicht.

                  Wir konnten uns jetzt Abhilfe verschaffen, in dem wir über einen Mini-Patch ein Signal emitten, nachdem die Schutzbedarfswerte vom Addon gespeichert wurden.

                  In unserem eigenen Addon connecten wir dann auf das Signal und verarbeiten das für die Zwecke, für die wir die Daten benötigen.

                  Wir werden den Fehler an den Addon Hersteller melden, damit er ein Event zur Verfügung stellt, oder halt von Haus aus ein Logging anbietet.

                  Im Moment passt unsere eigene Lösung für uns.

                  Vielen Dank für deinen Support und einen schönen Tag

                  Steven

                  1 Reply Last reply Reply Quote 1
                  • First post
                    Last post