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

    Objekt-Erstellungs-API

    Scheduled Pinned Locked Moved Entwicklung
    14 Posts 2 Posters 3.1k Views 1 Watching
    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.
    • D Offline
      diplomant_08
      last edited by

      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.

      1 Reply Last reply Reply Quote 0
      • dsD Offline
        ds
        last edited by

        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

        1 Reply Last reply Reply Quote 0
        • D Offline
          diplomant_08
          last edited by

          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.

          1 Reply Last reply Reply Quote 0
          • D Offline
            diplomant_08
            last edited by

            So es muss NICHT in die /src/config.inc.php
            sondern in die
            =>/src/config_template.inc.php<=

            1 Reply Last reply Reply Quote 0
            • dsD Offline
              ds
              last edited by

              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.

              1 Reply Last reply Reply Quote 0
              • D Offline
                diplomant_08
                last edited by

                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.

                1 Reply Last reply Reply Quote 0
                • D Offline
                  diplomant_08
                  last edited by

                  So ich hab noch eine Frage zur DB.

                  Was bedeuten die Felder:
                  isys_catg_location_list__lft isys_catg_location_list__rgt

                  man 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

                  1 Reply Last reply Reply Quote 0
                  • D Offline
                    diplomant_08
                    last edited by

                    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:9

                    Ein 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.

                    1 Reply Last reply Reply Quote 0
                    • D Offline
                      diplomant_08
                      last edited by

                      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 ende

                      line 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_obj

                      Ich 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

                      1 Reply Last reply Reply Quote 0
                      • dsD Offline
                        ds
                        last edited by

                        Hi,
                        das mit den locations hast du schonmal gut hinbekommen 🙂

                        Es 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?

                        1 Reply Last reply Reply Quote 0
                        • dsD Offline
                          ds
                          last edited by

                          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> 
                          
                          1 Reply Last reply Reply Quote 0
                          • D Offline
                            diplomant_08
                            last edited by

                            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.

                            1 Reply Last reply Reply Quote 0
                            • dsD Offline
                              ds
                              last edited by

                              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

                              1 Reply Last reply Reply Quote 0
                              • dsD Offline
                                ds
                                last edited by

                                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"

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