Mittlerweile haben wir es umgebaut, dass unbenannte Objekte tatsächlich einen leeren Namen haben anstatt „Unnamed Object (ID: 12345)“ heißen. Aber die alte App schaut halt auf den Namen und prüft ob da die ID drin steckt. Falls ja, gilt die Variable als unbenannt. Um das auf die alte App zu münzen müsstest du also einfach die ID in den Namen hängen.
Da die Umbenennung eine ganz blöde Aufgabe ist, habe ich mir ein Skript geschrieben:
<?php
declare(strict_types=1);
const START_CATEGORY = 20827;
foreach (findUnnamedLinks(START_CATEGORY) as $linkId) {
IPS_SetName($linkId, sprintf('Unnamed Object (ID: %d)', $linkId));
}
/*
foreach (findLegacyNamedLinks(START_CATEGORY) as $linkId) {
IPS_SetName($linkId, '');
}
/*
/**
* Ein Generator, der rekursiv alle unbenannten Links findet.
* @return Generator<int>
*/
function findUnnamedLinks(int $parentId): Generator
{
$children = IPS_GetChildrenIDs($parentId);
foreach ($children as $id) {
$object = IPS_GetObject($id);
// Wenn es ein unbenannter Link ist, geben wir die ID zurück
if ($object['ObjectType'] === OBJECTTYPE_LINK && $object['ObjectName'] === '') {
yield $id;
}
// Rekursion: Wenn Kinder da sind, delegieren wir an den Generator der nächsten Ebene
if ($object['HasChildren']) {
yield from findUnnamedLinks($id);
}
}
}
/**
* Ein Generator, der rekursiv alle Links findet, die dem Schema
* "Unnamed Object (ID: 12345)" entsprechen.
*
* @return Generator<int>
*/
function findLegacyNamedLinks(int $parentId): Generator
{
$children = IPS_GetChildrenIDs($parentId);
foreach ($children as $id) {
$object = IPS_GetObject($id);
// Prüfung: Ist es ein Link UND passt der Name zum Legacy-Muster?
if ($object['ObjectType'] === OBJECTTYPE_LINK &&
preg_match('/^Unnamed Object \(ID: \d+\)$/', $object['ObjectName'])
) {
yield $id;
}
// Rekursion: Wenn Kinder da sind, delegieren wir an den Generator der nächsten Ebene
if ($object['HasChildren']) {
yield from findLegacyNamedLinks($id);
}
}
}
Der Fehler ist, dass du die Ziel-ID des Links in den Namen packst und nicht die ObjektID. Wenn du in der Hauptschleife einfach $linkId statt $targetId verwendest, dann sollte alles passen.
Tatsächlich. Da habe ich viel zu kompliziert gedacht
Ich habe das Skript oben entsprechend korrigiert. Vielen Dank!
@paresy: wäre es nicht besser, die Überprüfung in der alten App um leere Namen zu erweitern? Das würde diese Art von Irritationen erst gar nicht aufkommen lassen.
Ich habe gerade gemerkt, dass beim Verlinken von Variablen die Links mit dem Namen „Unnamed Object (ID: 12345)“ angelegt werden und bin nun komplett verwirrt.
Sollten und wurden sie nicht mit einem leeren Namen angelegt?
Dann wurde Verlinken wahrscheinlich einfach nicht angepasst Wie gesagt, Unnamed Object war früher immer die Variante, wir haben das „kürzlich“ erst auf einen leeren String angepasst. Und scheinbar einfach da einen Fall übersehen.
So sieht es aus. Nur wenn ich einen Link neu anlege über „Objekt hinzufügen“ ist der Name wohl leer. Mich hat nur gewundert, dass bei mir so viele dieser Fälle auftraten, obwohl ich den diesen Weg fast nie nutze.
Beim Anlegen über „Objekt hinzufügen“ wird bei leerem Namensfeld IPS_SetName mit einem leeren String aufgerufen. Früher gab es dafür einen Fallback, sodass auf „Unnamed Object“ zurückgesprungen wird, den gibt es nicht mehr
Beim Verlinken wird einfach kein Name gesetzt und der Standardname der bei der Erstellung gesetzt wird bleibt halt einfach. Und da ist halt noch „Unnamed Object“ drin.