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

    Neues Attribute (property) für Listenansicht

    Scheduled Pinned Locked Moved Entwicklung
    5 Posts 2 Posters 336 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 steven_c

      Guten Tag,

      wir möchten gerne ein neues Property (Attribute) hinzufügen zu einer Kategegorie.
      Das geht auch, allerdings kann man für die Datenquelle nur SQL verwenden, auf den ersten Blick:

       protected function   properties()
          {
              return [
                  'some_attribute'         => array_replace_recursive(isys_cmdb_dao_category_pattern::text(), [
                      C__PROPERTY__INFO     => [
                          C__PROPERTY__INFO__TITLE       => 'Something',
                          C__PROPERTY__INFO__DESCRIPTION => 'Something'
                      ],
                      C__PROPERTY__DATA     => [
                          C__PROPERTY__DATA__SOURCE_TABLE => 'xxxx',
                          C__PROPERTY__DATA__SELECT     => idoit\Module\Report\SqlQuery\Structure\SelectSubSelect::factory('field',
                              'field'),
                      ],
                      C__PROPERTY__UI       => [
                          C__PROPERTY__UI__ID     => 'ui_id',
                          C__PROPERTY__UI__PARAMS => [],
                      ],
                      C__PROPERTY__PROVIDES => [
                          C__PROPERTY__PROVIDES__LIST => true,
                      ]
                  ]),
      

      Gibt es eine Möglichkeit die Datenquelle dahingehend zu ändern, dass man zB den Inhalt für C__PROPERTY__DATA aus ner PHP Funktion oder so zu holen?

      Weshalb wir das fragen ist, da wir gerne in der Listenansicht für einen ObjektTyp gerne eine neue Column hinzufügen wollen aber mit Daten die nicht aus der Datenbank kommen:

      c95a1783-941d-460e-891a-4ba59f49e2ac-image.png

      Oder ist unser Ansatz falsch und wir sollten das lieber mit nem Report lösen, der Daten aus einer custom PHP Funktion (o.Ä) zusammenstellt?

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

        Hallo @steven_c24

        verstehe ich es richtig das es sich dabei um ein "virtuelles" Attribut handeln soll? Also eines, das keine eigenen Daten beinhaltet und nur in der Tabelle auftauchen soll?

        Dafür müsstest du das folgendermaßen machen:

        use idoit\Component\Property\Type\DynamicProperty;
        
        protected function dynamic_properties()
        {
            return [
                '_prop' => new DynamicProperty(
                    'LC__CMDB__CATG__GLOBAL_PRICE',
                    'isys_catg_accounting_list__isys_obj__id',
                    'isys_catg_accounting_list',
                    [
                        $this,
                        'dynamic_property_callback_prop'
                    ]
                )
            ];
        }
        

        Diese sogenannten "dynamischen properties" funktionieren mit Code-Callbacks 🙂 Leider ist die Formatierung im Forum etwas kaputt, aber es dürfte trotzdem verständlich sein. Der Callback muss eine public Methode sein, als Parameter wird die komplette Zeile übergeben:

        public function dynamic_property_callback_prop(array $row)
        {
           return 'custom content :)';
        }
        

        Hilft das weiter?

        Viele Grüße
        Leo

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

          @LFischer Hallo Leo,

          vielen Dank für deine Hilfe.
          Ich habe jetzt den Code von dir implementiert und auch den Cache geleert und Kategorie-Attributes neu indeziert, aber leider taucht in der Übersicht kein virtuelles Attribut auf, auch nicht bei der Attribute Auswahl.

          Muss ich noch etwas beachten?

          Viele Grüße

          Steven

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

            Hallo @steven_c24

            Ich fürchte ich habe hier etwas vertauscht und dir den Weg für ein Attribut genannt das nur im Report Manager auftaucht 🙈

            Aktuell gibt es für dein Vorhaben nur die folgende Möglichkeit:
            Jedes Kategorieattribut kann einen eigenen Callback Code für die Objektlisten mitbringen, dafür gibt es aber aktuell keine Schnittstelle - somit ist das nur über Umwege machbar.

            Zur Zeit funktioniert die Logik über den Namen:

            Aus dem Attribut guarantee_status in der Klasse isys_cmdb_dao_category_g_accounting würde der folgende Namespace erstellt werden:

            idoit\Module\Cmdb\Model\Ci\Category\G\Accounting\GuaranteeStatus - die zusammensetzung sieht dabei folgendermaßen aus:

            Kategorie Art: "G" für Global oder "S" für Spezifisch
            Kategorie Identifier in CamelCase "Accounting"
            Attribut Identifier in CamelCase "GuaranteeStatus"

            idoit\Module\Cmdb\Model\Ci\Category\{Kategorie Art}\{Kategorie Identifier}\{Attribut Identifier}

            Wenn diese Klasse existiert und das Interface idoit\Module\Cmdb\Model\Ci\Category\DynamicCallbackInterface implementiert kann es für die Objektliste verwendet werden.

            Diese Klasse benötigt nur eine statische render Methode 🙂 Als Beispiel kannst du dir src/classes/modules/cmdb/src/Model/Ci/Category/G/Accounting/GuaranteeStatus.php ansehen.

            Das einzige Problem stellt also aktuell nur der statische Namespace dar... Im eigenen Add-on könntest du vermutlich sowas machen wie:

            \idoit\Psr4AutoloaderClass::factory()
               ->addNamespace(
                  'idoit\Module\Cmdb\Model\Ci\Category\G\MyCustomCategory', 
                  __DIR__ . '/src/MyCustomCategory'
               );
            

            Ich glaube das sollte funktionieren - ist aber natürlich nicht der "sauberste" Weg 🤔

            Ich habe einen Entwickler-Task erstellt um für diesen Use-Case eine Schnittstelle zu implementieren, damit solche Callbacks auch "von außerhalb" hinzugefügt werden können.

            Ich hoffe das Hilft weiter!

            Viele Grüße
            Leo

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

              @LFischer Lieber Leo,

              vielen Dank heute nochmal für die Dev-Sprechstunde und deinen super Support!
              Mit der Anleitung aus der Sprechstunde und dem Beitrag hier hat es funktioniert 🙂 !

              56fd62f2-1c39-4b0f-a239-ad8b5c16f42b-image.png

              Wir können jetzt von unserem Addon aus ein neues Kategorie Attribut hinzufügen.

              Ich finde die Lösung so gar sauber ^^ (klar ist das mit dem Namespace so ne Sache, aber dafür ist der Autoloader ja da, dass man beliebig Klassen reinladen kann) 🙂

              Vielen Dank für deine Unterstützung, du hast uns sehr geholfen!

              Viele Grüße

              Steven

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