WFC Child-Elemente ermitteln (Für ein Backup and Restore Projekt)

Hallo Gemeinde,

nachdem der RS Project Exporter leider ab IPS V4.X nicht mehr funktioniert und ich für Backup und Transferzwecke sehr gern einen Teil des Projektbaumes extrahieren und z.B. auf einem anderen System wieder installieren möchte, habe ich mich die letzten Tage intensivst hinter das Thema geklemmt.

Das Programmieren geht voran, wobei der Teilbaum der Management-Konsole schon korrekt ausgelesen und wieder neu (mit anderen ID´s) installiert wird. Sozusagen Backup and Restore.

Jetzt habe ich das Problem, dass ich die verlinkte Webfront-Ansicht mit sichern möchte. Dazu durchsuche ich die einzelnen Items des durch WFC_GetItems erhaltenen WFC-Baumes, ob Quell-ObjectID´s des extrahierten Objectbaumes der Management Console enthalten sind (vergleichen des String unter [Configuration]). Anschließend lese ich dann rückwärts die ParentID´s aus und komme letztendlich zum ersten Element unter „roottp“.

Soweit so gut.

Dann dachte ich den Baum wieder vorwärts über eventuell vorhandene Childs auslesen zu können. Allerdings sind diese weder durch WFC_GetItems , noch über ein IPS_GetObject erreichbar :confused:

Hat jemand einen Tipp,wie ich an die jeweiligen Childs komme oder eine andere Idee ?

Mein Testskript zur Aufwärtssuche:

$ObjectIDs = unserialize(GetValue(48107 /*[Test Exporter\Variable\ObjectIDs]*/));
echo("
ObjectIDs:
");         print_r($ObjectIDs);

// ModuleID des WebFront Configurator (WFC) ////////////////////////////////////
$ModulID = "{3565B1F2-8F7B-4311-A4B6-1BF1D868F39E}";

// WebFront Configurator ID herausfinden (erste) ///////////////////////////////
$WFC_ID = IPS_GetInstanceListByModuleID($ModulID)[0];
echo("Die WFC_ID lautet: $WFC_ID");

// WebFront Configurator Items auslesen ////////////////////////////////////////
$WFC_Items = WFC_GetItems($WFC_ID);

// WebFront Configurator Items nach verlinkten ObjectIDs durchsuchen ///////////
// z.B. [0]  => array(...[Configuration] => {"title":"START","baseID":15042 /*[Test Exporter\Variable]*/}...)
foreach($ObjectIDs as $ObjectID)
	{
	//echo("ObjectID: $ObjectID
");

	foreach ($WFC_Items as $WFC_Item)
	   {
	   //print_r($Item);
	   
	   if (strpos(serialize($WFC_Item['Configuration']), "\"baseID\":$ObjectID"))
	      {
		  echo("
ObjectID: $ObjectID im WFC gefunden:
");
	      $WFC_Items_matched[] = $WFC_Item;
	      }
	   }
	}
	
print_r($WFC_Items_matched);

/*//////////////////////////////////////////////////////////////////////////////
Aufwärtssuche im WFC-Baum bis Ursprung mit [ParentID] => 'roottp'
/*//////////////////////////////////////////////////////////////////////////////

foreach ($WFC_Items_matched as $WFC_Item_matched)
	{
	WFC_search_root_origin($WFC_Item_matched, $WFC_Items);   
	}
	  
echo("
WFC_Item_root_origin: "); print_r($WFC_Item_root_origin);
echo("
WFC_Items_related: "); print_r($WFC_Items_related);

function WFC_search_root_origin($WFC_Item_matched, $WFC_Items)
	{
	global $WFC_Item_root_origin;
	global $WFC_Items_related;
	
	foreach ($WFC_Items as $WFC_Item)
		{
		if(($WFC_Item_matched['ParentID'] == $WFC_Item['ID']) && ($WFC_Item['ID'] != "roottp"))
			{
			$WFC_Item_related = $WFC_Item;
			//echo("\r\WFC_Item_related: "); print_r($WFC_Item_related);
			$WFC_Items_related[] = $WFC_Item_related;
			WFC_search_root_origin($WFC_Item_related, $WFC_Items);  
			}
		if(($WFC_Item_matched['ParentID'] == $WFC_Item['ID']) && ($WFC_Item['ParentID'] == "roottp"))
			{
			$WFC_Item_root_origin = $WFC_Item;
			//echo("
WFC_Item_root_origin: "); print_r($WFC_Item_root_origin);  
			}
		}		
	}

Gruß

André

Ich kapiere noch nicht wirklich was du machen magst, aber die Konfiguration die du über WFC_GetItems auslesen willst, ist sauber JSON kodiert. Dein strpos „gefummel“ :rolleyes: ist also echt ganz schlimm :smiley: Ich würde dir dringend raten erstmal diesen Teil sauber umzubauen. Außerdem hat das WebFront mehr Elemente, die du beachten musst. Hier ne Liste:

[ul]
[li]ClassName = [Category, ContentChanger] => baseID[/li][li]ClassName = [InfoWidget, Graph] => variableID[/li][li]ClassName = [InfoWidget] => scriptID[/li][/ul]

Zusätzlich willst du für alle Medien Elemente die Graphen enthalten, die dort enthaltenen Variablen ebenfalls betrachten. Denk dann daran über alle Variablen die benutzerdefinierten Profile zu prüfen.

paresy

Zumal der RS Exporter inzwischen doch auch IPS 4.x kompatibel ist… Oder noch Beta?
Schreib Raketenschneke doch Mal über seine Homepage an.
Michael

@Paresy

ich lese unter anderem alle ObjectID´s der zu exportierenden Elemente und vergleich, ob diese in einem WFC-Item verlinkt sind. So hangle ich mich bis zum ersten Element hoch.

Runterwärts wollte ich ein mehrdimensionales Array mit dem (Teil)Baum im WFC erstellen. Das war die Frage: ob die Childs zu einem WFC-Item bereits hinterlegt sind, oder ob ich das ganze Array aus WFC_GetItems einzeln ‚ID‘ gegen ‚ParentID‘ prüfen muss ???

Zu dem serialize und strpos Gefummel: kann ja sein, soll nur funktionieren. Ich bin Autodidakt und kein Profi, also nimm´s nicht krumm :rolleyes: Ich tue es auch nicht. :smiley: Nun,wie würdest Du es machen ? Sicher json_decode …

Da man sich nach den WFC-Befehlen die Finger wund sucht, kommen die Feinheiten erst Schritt für Schritt.

@Nall-chan

Hatte ich schon …

Gruß

André

Und ? Keine Antwort, oder wie war der Stand.
Ich habe den Exporter für das FritzBox-Project angepasst und das läuft auch unter 4.0.
Du musst mit json_encode und Decode arbeiten, sonst bekommst du den Teilbaum nie sauber aus und in die Settings des WebFront-Konfigurator.
Michael

Hallo Nall-chan,

Raketenschnecke hat offenbar seinen IPS-Input eingestellt. Das ist sehr schade. War ein angenehmer und kompetenter Zeitgenosse. Hatten schon Kontakte bei meinem Multimedia (DLNA)-Projekt.

Tja, der Hinweis mit json ist sicher gut gemeint, aber mit meiner Frage bin ich so schlau wie vorher :wink:

Ich denke mal das Prüfen ID gegen ParentID ist der einzige Weg - oder ?

Wie hast Du ggf. das Teilbaum-auslesen gelöst ?

Gruß

André

Wie gesagt… Ich nutze den RS Exporter :wink:
Einfach dort mal anschauen wie es es umgesetzt hat?
Der Teil vom Exporter läuft ja ohne Änderungen.
Von daher habe ich da gar nichts selbst umgesetzt oder mir genauer angesehen.
Ich meine bei ihm war es so, dass du das WFCitem angeben musst, welches exportiert werden soll. Das Json-Objekt dann extrahiert wurde und über die ObjektID alt-neu Zuordnung wieder hergestellt wurde.
Michael