Objekt-Erstellungs-API
-
Hallo,
ich bin gerade dabei eine API zu schreiben, an welche man die nötigen Daten für ein neues Objekt schickt.
Die API legt dann das neue Infrastruktur-Objekt in der Datenbank.
Ich mache das in PHP.Damit auch andere das Thema verstehen:
ein neues Objekt wird in der isys_obj angelegt.
außerdem wird eine neue ID in alle
isys_catg-Tabellen geschrieben welche in der
isys_catg_distributor vermerkt sind.Und dann wird in isys_catg_distributor noch ein Eintrag geschrieben der eine verbindung zwischen den neuen ID's und der Obj-ID herstellt.
Das klappt auch bei fast allen Tabellen.
Die netv Tabelle ist immer NULL, das ist nicht weiter schlimm, lässt man sie halt NULL.Aber die netp-Tabelle hat in der isys_catg_distributor eine ID, also muss man eine anlegen.
Wenn man das tut kommt immer ein Constrains-Fehler. Welcher aber weiter verschachtelt ist.Meine Frage ist nun kann man hier erklären wie die Zusammenhänge der isys_catg_netp sind. Oder ist das ganze doch zu tief verschachtelt um das mal eben nach zu bauen.
Schon mal vielen Dank für eine Antwort.
-
Entwickelst du diese Statements neu? Das ist nämlich leider wie du schon vermutet hast sehr tief verschachtelt und nicht so einfach nachzubilden
Hierfür gibts aber eine Menge Datenzugriffs und Speicher-Klassen (DAO), welche für dich die Anlage/Speicherung und Ausgabe übernehmen.Um auf diese zuzugreifen könntest du dir einfach eine neue Controller Klasse erstellen. Diese befinden sich im Ordner src/handler/ und beginnen mit isys_handler_…class.php.
Dieser handler muss unbedingt die methode init() enthalten. Diese wird beim laden dieses Moduls immer ausgeführt. Eine Objekt Anlage an dieser Stelle würde also ungefähr so funktionieren:
public function init() { global $g_comp_database; $l_dao = new isys_cmdb_dao($g_comp_database); verbose("Creating object..", ISYS_TRUE, "+"); $l_objid = $l_dao->insert_new_obj( C__OBJTYPE__SERVER, ISYS_FALSE, "Name des Objekts", ISYS_NULL, C__RECORD_STATUS__BIRTH ); verbose("Created object-id: ".$l_objid); }
Wenn du einen neuen Handler angelegt hast, musst du diesen in der config.inc.php registrieren.
Ungefähr so:"idoit_api" => array( "class" => "isys_handler_idoit_api"),
Aufgerufen werden diese entweder über die http://i-doitserver/controller.php?load=idoit_api (Get parameter für Objekt-Titel und Type können hier natürlich angefügt und in der init() verarbeitet werden) oder die console (php controller.php -v -m idoit_api).
In Sachen netp und für weitere Kategorien solltest du dir die Klassen in src/classes/cmdb/dao/category/global angucken, welche du ebenfalls in der init ausführen kannst.
Hier eine Liste unserer Standard Objekt-Typen und dessen System-ID's zur Anlage von verschiedenen Typen: http://doc.i-doit.org/wiki/Object-Types
-
Schon mal vielen Dank diese Handler würden mir die Arbeit wirklich erleichtern.
Aber in welcher Variable der /src/config.inc.php muss ich denn den Handler registrieren weil
"idoit_api" => array( "class" => "isys_handler_idoit_api"),
ist ja der Inhalt eines Arrays und kann da nicht eigenständig drin stehen.
-
So es muss NICHT in die /src/config.inc.php
sondern in die
=>/src/config_template.inc.php<= -
Die config_template.inc.php wird vom Setup verarbeitet. Daraus wird dann die config.inc.php erstellt. Wenn du dieses Array in deiner config.inc.php nicht drin hast, solltest du es dir aus dem template kopieren, sonst erkennt i-doit die variablen nicht.
-
Jo jetzt gehts.WUNDERBAR
Muss ich die (hoffentlich nur 2 global/obj) StatusID's noch manuell auf 2/sichtbar setzen oder gibts da auch noch eine Methode für.
Btw. Ich habe i-doit heute nochmal komplett neu auf gesetzt(über den Wizard) und die $g_controller-Variable war wieder nicht in der config_inc.php.
Ich weis ja nicht ob die standardäßig dort drin stehen sollte oder nicht.Aber wenn ja wäre das hiermit eine BugMeldung.
-
So ich hab noch eine Frage zur DB.
Was bedeuten die Felder:
isys_catg_location_list__lft isys_catg_location_list__rgtman kann sich ja etwas denken wie:
Dieses Objekt hat zur Wurzel hin diesen Nachbarn in der Hierarchi.
und zum endgerät hin diesen.Aber welcher wäre dann Links welcher Rechts und auf welche ID bezieht es sich.
Schon mal Danke
-
das mit dem lft und rgt hab ich jetzt auch rausgefunden.
lft und rgt symbolisieren die linke und rechte "klammer" welche ein Obj abgrenzt.
Wenn ein Obj direkt root zugewiesen ist dann steht da zum beispiel
lft:8 rgt:9Ein Container-obj mit Childs schließt alle darunterliegenden Obj mit ein.
z.B. lft:10 rgt:15
die Childs dazwischen haben dann.
lft: rgt:
11 12
13 14. -
Jetzt wieder zu einem Problem:
wenn ich den controller.php?load=handler&…
,von meinem Browser aus, aufrufe funktioniert es.wenn ich das ganze von einem PHP-Script(Http-Request) aus mache,
um die neue Obj-ID auslesen zu können. dann kommt folgender Fehler:\fehler anfang
Fatal error: Argument 1 passed to isys_cmdb_dao::__construct() must not be null, called in /idoit/src/handler/isys_handler_create_obj.class.php on line 39 and defined in /idoit/src/classes/cmdb/dao/isys_cmdb_dao.class.php on line 2237
\fehler endeline 39:
$l_dao = new isys_cmdb_dao($g_comp_database);Das gleiche passiert aber auch wenn ich das ganze über die Console mache mit:
php controller.php -v -m create_objIch habe beim dem Aufruf über den Http-Request auch alle nötigen Session inhalte in diese geschrieben, und selbst wenn ich auch noch ein Cookie mit übergeben hab, geht es nicht.
Wenn $g_comp_database fehlt. Heist das ja das die ganze i-doit Klassenstruktur nicht läuft.
Woran könnte das liegen?
Schon mal Danke
-
Hi,
das mit den locations hast du schonmal gut hinbekommenEs sieht so aus als hättest du dir die g_comp_database nicht aus dem globalscope gezogen. Hast du "global $g_comp_database" vor deiner Anweisung stehen?
Ansonsten vielleicht ein login Problem? Kommt irgend ein output von dem controller auf der console?
-
Du kannst dir fuer den login übrigens auch eine config anlegen, so dass er sich für zB cronjobs oder aus anderen tools heraus automatisch einloggt:
src/handler/config/isys_handler_create_obj.inc.php
/** * i-doit * * @package i-doit * @subpackage General * @author Dennis Stücken <dstuecken@i-doit.de>* @version 0.9 * @copyright Copyright 2004, 2005 - synetics GmbH * @license http://dev.perl.org/perl6/rfc/346.html Artistic License 2.0 */ define("C__HANDLER__CREATE_OBJ", 1); /** * Automated login configuration */ $g_userconf = array( "user" => "admin", "pass" => "admin", "mandator_id" => 1 ); ?></dstuecken@i-doit.de>
-
Die Console schmeisst sich genau den selben Fehler:
PHP Fatal error: Argument 1 passed to isys_cmdb_dao::__construct() must not be null, called in /idoit/src/handler/isys_handler_create_obj.class.php on line 11 and defined in /idoit/src/classes/cmdb/dao/isys_cmdb_dao.class.php on line 2237
09 global $g_comp_database;
10
11 $l_dao = new isys_cmdb_dao($g_comp_database);Die Login Datei hab ich auch schon angelegt diese ändert aber auch nichts.
ich nehme mal an das mit "mandator_id" , die Systendatenbank-ID gemeint ist und nicht die oben definierte "1"
Kann man dem Script über die Konsole auch Parameter mitgeben, trotzdem es zuerst über den Controller läuft.
Sonst wäre das für mich eh unbrauchbar da man ja verscheidene Objekte-Typen anlegen will. -
Die mandator_id ist die ID deines Mandanten, in dem du das Objekt anlegen willst. Die id findest du in der Tabelle isys_mandator (isys_mandator__id) in der System Datenbank.
Da du ein Problem mit der g_comp_database (Mandaten-Datenbank) hast, nehme ich an, dass du keinen Mandanten mit der id 1 hast und er die DB-Komponente deshalb nicht instantiieren kann -
Falls du dir den Lokations algorithmus übrigens noch einmal genauer anschauen möchtest, kannst du das ganze hier nachlesen: http://www.sitepoint.com/article/hierarchical-data-database/2
Wir verwenden den "Modified Preorder Tree Traversal Algorithmus"