Neues Attribute (property) für Listenansicht
-
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:
Oder ist unser Ansatz falsch und wir sollten das lieber mit nem Report lösen, der Daten aus einer custom PHP Funktion (o.Ä) zusammenstellt?
-
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 -
@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
-
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 Klasseisys_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 dirsrc/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 -
@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 !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