Hat jemand ne gute Idee wie man die Verwendung von einem Script, Variable, Instanz etc. prüfen kann, und zwar über ggf. Links oder als ID in Scripten?
Es passiert mir häufiger das ich Scripte eher austausche als zu verändere, weil es einfach ist, damit mir aber alles mögliche zerschieße… ich will also die Auswirkungen vorher prüfen
Hat wohl keiner das Problem, also hier meine Lösung:
<?
//Startposition
$Kinder = IPS_GetChildrenIDs(0); ;
// Welches Script soll ausgeführt werden
$SID = GetValueInteger( IPS_GetObjectIDByName("ID",$_IPS['SELF']));
print_r ("Gesucht wird nach ID ".$SID."
");
foreach ($Kinder as $kind) {
$objekt = IPS_GetObject($kind);
verarbeiteObject($objekt);
}
function verarbeiteObject($ZObjekt)
{
global $SID;
if ($ZObjekt["ObjectType"] == 6) // Wenn Link prüfe auf Existenz
{
if (IPS_ObjectExists(IPS_GetLink($ZObjekt["ObjectID"])["TargetID"])) {
// Existiert, alles gut
if (IPS_GetLink($ZObjekt["ObjectID"])["TargetID"] == $SID )
{
// Treffer, gesuchter Link
print_r ("ID:".$ZObjekt["ObjectID"]."#Name:".$ZObjekt["ObjectName"]."#Typ:".$ZObjekt["ObjectType"]."#Parent:".$ZObjekt["ParentID"] . " enthält gesuchte ID
");
}
}
else {
// Achtung, kaputter Link
//print_r ("ID:".$ZObjekt["ObjectID"]."#Name:".$ZObjekt["ObjectName"]."#Typ:".$ZObjekt["ObjectType"]."#Parent:".$ZObjekt["ParentID"] . " nicht gefunden
");
}
}
if ($ZObjekt["ObjectType"] == 5) // Media, damit können wir nix machen
{
// nix tun
}
if ($ZObjekt["ObjectType"] == 4) // Ereignis, damit können wir nix machen
{
if (IPS_GetEvent($ZObjekt["ObjectID"])['TriggerVariableID'] == $SID) {
print_r ("ID:".$ZObjekt["ObjectID"]."#Name:".$ZObjekt["ObjectName"]."#Typ:".$ZObjekt["ObjectType"]."#Parent:".$ZObjekt["ParentID"] . " enthält gesuchte ID
");
}
// nix tun
}
if ($ZObjekt["ObjectType"] == 3) // Skript, prüfen ob ID im Script vorkommt
{
$Script = IPS_GetScriptContent ($ZObjekt["ObjectID"] );
if (strpos($Script, strval($SID)) !== false ) {
// Gefunden
print_r ("ID:".$ZObjekt["ObjectID"]."#Name:".$ZObjekt["ObjectName"]."#Typ:".$ZObjekt["ObjectType"]."#Parent:".$ZObjekt["ParentID"] . " enthält gesuchte ID
");
};
}
if ($ZObjekt["ObjectType"] == 2) // Variable,wenn es Integer ist sicherheitshalber schaun ob die ID da drin steht
{
if (strval(GetValue($ZObjekt["ObjectID"])) == strval($SID)) {
print_r ("ID:".$ZObjekt["ObjectID"]."#Name:".$ZObjekt["ObjectName"]."#Typ:".$ZObjekt["ObjectType"]."#Parent:".$ZObjekt["ParentID"] . " enthält gesuchte ID
");
}
}
if ($ZObjekt["ObjectType"] == 1) // Instanz, damit können wir nix machen
{
// nix tun
}
if ($ZObjekt["ObjectType"] == 0) // Kategorie,damit können wir nix tun
{
// nix tun
}
// Egal was es war, mal sehen ob noch was drunter hängt
$UnterKinder = IPS_GetChildrenIDs($ZObjekt["ObjectID"] );
foreach ($UnterKinder as $ukind) {
$objekt = IPS_GetObject($ukind);
verarbeiteObject($objekt);
}
}
?>
Script anlegen, drunter eine Variable mit Namen „ID“ und dort den Wert eintragen von dem Object dessen Verwendung man prüfen will.
Es liefert dann per print_r, also in den Messages oder im Antwortbereich wenn man das Script offen hat, alle Scripte, Links oder Variablen wo die ID drin steht. Ggf. auch mal nen Treffer zu viel, aber besser als zu wenig
zusätzlich schmeisst er auch gleich alle Links (egal welches Ziel drin steht) raus die kaputt sind
Ich würde auch das Eintragen der ID direkt im Skript machen. Also von der ID die man sucht. Extra eine Variable anlegen mit der ID die man suchen will ist doch etwas umständlich
Austausch…wäre ich vorsichtig Wenn dann mit „Test-Mode“ und da dann ausgeben mit echo was genau ersetzt/getauscht werden würde und dann muss man das Skript „scharf“ schalten und dann wird ausgetauscht/ersetzt…