Kategorie incl Unterobjekte per Script löschen möglich?

Hi,

kennt jemand eine (vielleicht einfache) Möglichkeit eine Kategorie inclusive der Unterobjekte zu löschen? Mit IPS_DeleteCategory werden die Unterobjekte ja in Root verschoben.

Mir würde als Workaround nur einfallen erst die Childs mit Typ zu ermittlen und dann per IPS_DeleteScript, IPS_DeleteVariable usw. jeweils zu löschen. Natürlich verdammt umständlich… geht das vielleicht einfacher?

gruß
goran

edit: Mir fällt da gerade ein, vielleicht wäre das in „Skripte, PHP, SQL“ doch besser aufgehoben? Geht ja um ein Skript, wenn auch nicht um normale Php befehle? Wenn dem so sein sollte, dann bitte ich eine Mod das zu verschieben.

Schnell mal die Suche angeworfen:

aaah, Rekursiv… danach hatte ich dann doch nicht gesucht :smiley:

so ungefähr hatte ich mir das auch vorgestellt, aber als Php-legastheniker hätte ich dafür bestimmt 3 Tage gebraucht… So habe ich schon mal eine Vorlage.

Aber Scripte werden damit nicht gelöscht, oder? Macht ja nix, das bekomme sogar ich noch mit reingebastelt…

Dankeeeee.

gruß
goran

Hi, der IPSInstaller hat ebenfalls entsprechende Funktionen drinnen, hier mal der wesentliche Auszug:



	/** Löschen einer Kategory inklusve Inhalt
	 *
	 * Die Funktion löscht eine Kategory, vor dem Löschen werden noch alle beinhaltenden Objekte
	 * aus der Kategory gelöscht.
	 *
	 * @param integer $CategoryId ID der Kategory
	 *
	 */
	function DeleteCategory($CategoryId) {
		EmptyCategory($CategoryId);
		Debug ("Delete Category ID=$CategoryId");
		IPS_DeleteCategory($CategoryId);
	}

	/** Löschen eines beliebigen Objektes
	 *
	 * Die Funktion löscht ein IP-Symcon Object mit der übergebenen ID.
	 *
	 * @param integer $objectId ID des Objektes
	 *
	 */
	function DeleteObject($ObjectId) {
		$Object     = IPS_GetObject($ObjectId);
		$ObjectType = $Object['ObjectType'];
		switch ($ObjectType) {
			case 0: // Category
				DeleteCategory($ObjectId);
				break;
			case 1: // Instance
				EmptyCategory($ObjectId);
				IPS_DeleteInstance($ObjectId);
				break;
			case 2: // Variable
				IPS_DeleteVariable($ObjectId);
				break;
			case 3: // Script
				IPS_DeleteScript($ObjectId, false);
				break;
			case 4: // Event
				IPS_DeleteEvent($ObjectId);
				break;
			case 5: // Media
				IPS_DeleteMedia($ObjectId, true);
				break;
			case 6: // Link
				IPS_DeleteLink($ObjectId);
				break;
			default:
				Error ("Found unknown ObjectType $ObjectType");
		}
	}
	
	
	/** Löschen des Inhalts einer Kategorie inklusve Inhalt
	 *
	 * Die Funktion löscht den gesamtem Inhalt einer Kategorie
	 *
	 * @param integer $CategoryId ID der Kategory
	 *
	 */
	function EmptyCategory($CategoryId) {
		if ($CategoryId==0) {
			Error ("Root Category could NOT ne deleted!!!");
		}

		$ChildrenIds = IPS_GetChildrenIDs($CategoryId);
		foreach ($ChildrenIds as $ObjectId) {
			DeleteObject($ObjectId);
		}
		Debug ("Empty Category ID=$CategoryId");
	}

		function Debug($msg) {
		if (isset($_IPS['MODULEMANAGER'])) {
			$moduleManager = $_IPS['MODULEMANAGER'];
			$moduleManager->LogHandler()->Debug($msg);
		} elseif (isset($_IPS['SENDER']) and $_IPS['SENDER']=='WebFront') {
		} else {
			echo $msg.PHP_EOL;
		}
	}

	function Error($msg) {
		if (isset($_IPS['MODULEMANAGER'])) {
			$moduleManager = $_IPS['MODULEMANAGER'];
			$moduleManager->LogHandler()->Error($msg);
		} else {
			echo $msg.PHP_EOL;
		}
		throw new Exception($msg);
	}

Hi Brownson,

das gefällt mir noch besser :slight_smile: hab ich doch gleich mal 1:1 geklaut und funktioniert.

gruß
goran