Mandanten kopieren

Fragen zur Installation von CONTENIDO 4.9? Probleme bei der Konfiguration? Hinweise oder Fragen zur Entwicklung des Systemes oder zur Sicherheit?
Antworten
StephanSchmidt
Beiträge: 29
Registriert: Mo 9. Feb 2004, 10:31
Wohnort: Berlin
Kontaktdaten:

Mandanten kopieren

Beitrag von StephanSchmidt » Do 19. Aug 2004, 10:44

Hallo

ich brauche dringend etwas um Mandanten aus einem Template-Mandanten zu kopieren.

Dabei habe ich - basierend auf dem Script von Axel - ein Programm in Java geschrieben, dass mir einen Mandanten kopiert.

Was fehlt, wie der Version von Axels Script die ich habe, ist die Anpassung von parentid, postid, preid in con_cat. Mich verwirrt, dass es parentid, postid, preid auch in con_cat_tree gibt. Welche sind anzupassen? Machen beide das gleiche?

Ich brauche das gleiche zum kopieren von Artikeln, gibt es eine Vorlage zum kopieren aller Artikel von einem Mandanten auf einen anderen?

Danke
bye
-stephan

Axel
Beiträge: 82
Registriert: Di 26. Aug 2003, 08:35
Kontaktdaten:

Hier das korrigierte Script

Beitrag von Axel » Do 19. Aug 2004, 12:07

Du hast es aber eilig..
Hier das korrigierte Script. Hab das die letzten zwei Tage unter der Version 4.4.4 getestet. Klappt nun einwandfrei. Unbedingt die Anleitung im Script lesen und dran halten...
Eins noch:
Wenn das Script fertig ist, sollte man zur Sicherheit im Browser noch das Script updateseqruntime.php (im Ordner Contenido) ausführen. Das passt zur Sicherheit die Werte der Tabelle con_sequence an.
Ist der MAndant nun kopiert, dann wieder an contenido anmelden und den neuen Mandanten auswählen und auf die Kategorien wechseln...NICHT ERSCHRECKEN das hier nicht viel steht, ist alles OK. EInfach mal auf "neuen Baum anlegen" klicken...ahhh die Kategorien erscheinen. Jetzt einfach auf abbrechen.
Der GRund: Jedesmal, wenn man in Contenido die Kategorien bearbeitet, schreibt contenido die Tabelle con_cat_tree neu (In dieser wird die Navigation/Baumstruktur gebastelt). Mit dem Kopieren des Mandanten haben wir nun neue Kategorien in die Datenbank geschrieben, allerdings hat das Backend von contenido davon nichts mitbekommen..deshalb müssen wir irgendeine Aktion bei den Kategorien tätigen, damit contenido die Baumstruktur neu schreibt. Trotz des kleinen Umweges klappt es aber einwandfrei.
(PS: Wenn mir jemand verraten könnte wie die Funktion strRemakeTreeTable() aus der functions.str.php aufrufen könnte, könnte mein Script die Baumstruktur selber neu schreiben. Obige Workaround wäre dann unnötig. Was muss ich alles includen um strRemakeTreeTable() ausführen zu können?)

<?
/* Script um Kunden zu kopieren
* Für Contenido 4.4.x (Getestet mit 4.4.4)
* Autor: Axel Womatschka
* Datum: 21.01.2004
* Zuletzt geändert am: 18.8.2004

* Dieses Script kopiert die Module, Layouts, Templates, Container und auf Wunsch auch Kategorien
* von einem Kunden (Mandanten) ($old_idclient) auf den anderen ($new_idclient)
* Beide müssen bereits existieren.
*/

/* Folgende Tabellen werden vom Script verändert. Diese daher besser vorher sichern.
* con_lang
* con_clients_lang
* con_mod
* con_lay
* con_tpl
* con_tpl_conf
* con_container
* con_container_conf
* con_cat
* con_cat_lang
* con_sequence
* con_cat_tree (wird automatisch von contenido neu erstellt)
*/

/* Anleitung:
* Kopiere die .php-Datei mit diesem Script in ein Unterverzeichnis von Contenido
* z.B. contenido/Kopiere_Mandant/kopieren.php
*
* 1. Melde dich als sysadmin an Contenido an (oder mit einem anderen Account welches das Recht hat Mandanten anzulegen)
* 2. Lege einen neuen Mandanten an
* 3. Unter "Sprachen" nun den neuen Mandanten uas der Liste auswählen und eine neue Sprache anlegen
(Solltest du das vergessen, legt das Script automatisch eine neue Sprache an)
* 4. Merke dir den Index des neuen Mandanten (steht in () dahinter)
* 5. Öffnen dieses Script und setze direkt zu Anfang (Zeile 52) die Variable $new_idclient= Index des neuen Mandanten
Setze (Zeile 56) die Variable $old_idclient= zu kopierender Mandant
* 6. Abmelden von Contenido (falls noch eingeloggt)
* 7. Script starten
* 8. Wenn das Script fertig ist im Ordner contenido das Script im Browser updateseqruntime.php aufrufen (Setzt die Max-Indizes in der Tabelle con_sequence neu)
* FERTIG
*/

/* In der config.php stehen die Basisvariablen von Contenido. In der config.php
* werden zudem via Include noch folgende Dateien geladen
* cfg_sql.inc.php (Hier stehen die Tabellennamen)
* conlib/prepend.php3 (Hier werden weitere Dateien via require geladen, die das Sessions-Managment der MySQL-DB regeln
* unter anderem auch die my_sql.inc)
*
*/

Include "../contenido/includes/config.php"; /* Die braucht man immer */
Include "../contenido/includes/functions.str.php";; /* Brauchen wir um Navigationsbaum für neuen Mandanten zu erzeugen */

/* MACHE DEINE INDIVIDUELLEN ANGABEN HIER*******************************************************/
/* Neuer Kunde auf den kopiert werden soll. Dieser muss vorher angelegt werden*/
$new_idclient=4;
/* Kunde, der kopiert werden soll */
$old_idclient=1;
/*Auch die Kategorien (Menübaum) mit kopieren? */
$CopyKategorien=1; /* 0=Nein, 1=Ja */
$CopyArtikel=0; /* 0=Nein, 1=Ja */
/***********************************************************************************************/

/* Instanz der Klasse DB_Sql (die ist in der Datei my_sql.inc zu finden)*/
$db1 = new DB_Sql();
$db1->Host = $contenido_host;
$db1->Database = $contenido_database;
$db1->User = $contenido_user;
$db1->Password = $contenido_password;

$db2 = new DB_Sql();
$db2->Host = $contenido_host;
$db2->Database = $contenido_database;
$db2->User = $contenido_user;
$db2->Password = $contenido_password;

$new_client_Name="";
$old_client_Name="";

/* Für die Layouts */
$ArrIdxAltLayout=array();
$ArrIdxNeuLayout=array();

/* Für die Module */
$ArrIdxAltModul=array();
$ArrIdxNeuModul=array();

/* Für die Templates */
$ArrIdxAltTpl=array();
$ArrIdxNeuTpl=array();
$ArrIdxAltTplConf=array();
$ArrIdxNeuTplConf=array();

/* Für die Kategorien */
$ArrIdxAltKat=array();
$ArrIdxNeuKat=array();

/* Ermittel Kundennamen und prüfe die Gültigkeit der idclient-Nummern */
$sql = "SELECT idclient, name from ".$cfg["tab"]["clients"]." where (idclient=".$old_idclient." OR idclient=".$new_idclient.")";
$db1->query($sql); /* liefert Zeiger auf Ergebnisliste (Result Set)*/
while ($db1->next_record())
{
if ($db1->Record[0]==$new_idclient) $new_client_Name=trim($db1->Record[1]);
if ($db1->Record[0]==$old_idclient) $old_client_Name=trim($db1->Record[1]);
}
if ($old_client_Name=="" OR $new_client_Name=="")
{
/* Irgendwas stimmt nicht. vermutlich sind die verwendeten idclient-Nummern falsch */
$Meldung="Zu den verwendeten Mandantennummern (idclient) ".$old_idclient." und ".$new_idclient." gibt es keinen Mandanten-Namen. Überprüfen Sie die Mandanten-Nummern (idclient) in Ihrem Script. Die Ausführung wird abgebrochen.";
echo "<hr><h3><font face='Arial' color='#ff0000'>Fehler: <BR>".$Meldung."</font></h3><hr>";
die($Meldung); /* Scriptausführung abbrechen */
}

/* Prüfe nun ob beide Mandanten die gleichen SprachID haben. In einem Forumartikel Timo schrieb Timo am 3.2.2004 (Contenido Entwickler)
das Mandanten eine eigene SprachID haben sollten, weil diese auch in den Tabellen Keywords und Rights übernommen wird */
/* Sehe dazu erst in der Tabelle con_clients_lang nach, ob der zweite Mandant dort existiert */
echo "<h3><font face='Arial' color='#525169'>Ermittel die Spracheinstellung des neuen Mandanten...</font></h3>";

$sql = "SELECT * FROM ".$cfg["tab"]["clients_lang"]." WHERE ((idclient=".$old_idclient.") OR (idclient=".$new_idclient."))";
$db1->query($sql);
$merk_idlang_old=0;
$MandantNeuExist=0;

while($db1->next_record())
{
if ($db1->Record[1]==$old_idclient) $merk_idlang_old=$db1->Record[2]; /*Merke hier die SprachID des alten Mandanten */
if ($db1->Record[1]==$new_idclient)
/* Ja, neuer Mandant existiert in der Tabelle clients_lang...das bedeutet, der Anwender hat über Contenido selbst den Mandanzen sauber angelegt und eine neue
Sprache zugeordnet. Merke hier die SprachID des neuen Mandanten */
{
$MandantNeuExist=1;
$merk_idlang_neu=$db1->Record[2]; /*Merke hier die SprachID des neuen Mandanten */
echo "<h3><font face='Arial' color='#525169'>Spracheinstellung des neuen Mandanten existiert bereits (idlang = ".$merk_idlang_neu."</font></h3>";
echo "<hr>";
} /*End If */
} /* End While */

echo "<h3><font face='Arial' color='#525169'>Spracheinstellung des alten Mandanten: idlang = ".$merk_idlang_old."</font></h3>";

/* Nein, neuer Mandant existiert nicht in der Tabelle clients_lang. Um ihn dort einzutragen brauchen wir erst eine neue SprachID
Erzeuge neue SprachID in Tabelle con_lang und merke diese für den neuen Mandanten */

if ($MandantNeuExist==0) /* Neuer Mandant existiert nicht in Tabelle client_lang */
{
$sql = "SELECT * FROM ".$cfg["tab"]["lang"]." WHERE (idlang=".$merk_idlang_old.")";
/*echo "SQL lautet: ".$sql."<br>";*/
$db1->query($sql);
$MyLangSeq=0;
$sql="Select nextid as MyNextID from ".$cfg["tab"]["sequence"]." where seq_name = '".$cfg["tab"]["lang"]."'";
$db2->query($sql);
if ($db2->next_record()) $MyLangSeq=$db2->Record[0];
$merk_idlang_neu=$MyLangSeq++; /* erhöhe um 1 */
$sql = "INSERT INTO ".$cfg["tab"]["lang"]." VALUES ('".$merk_idlang_neu."'";
$db1->next_record();
for ($i=1;$i<$db1->num_fields();$i++)
{
$sql = $sql .",";
$cont = $db1->Record[$i];
$cont = str_replace('\\','\\\\',$cont);
$cont = str_replace('"','\"',$cont);

$sql = $sql ."\"".$cont."\"";
}
$sql = $sql .")";
/*echo "SQL lautet: ".$sql."<br>";*/
$db2->query($sql); /* Erzeuge hier neuen Datensatz in Tabelle con_lang */
/*Korrigiere nun noch die Werte in der Tabelle con_sequences */
$sql="Update ".$cfg["tab"]["sequence"]." set nextid=".$merk_idlang_neu." where seq_name = '".$cfg["tab"]["lang"]."'";
$db2->query($sql);

/* Nun der neue Eintrag in con_clients_lang */
$sql="Select nextid as MyNextID from ".$cfg["tab"]["sequence"]." where seq_name = '".$cfg["tab"]["clients_lang"]."'";
$db2->query($sql);
if ($db2->next_record()) $MyClientsLangSeq=$db2->Record[0];
$MyClientsLangSeq++; /* erhöhe um 1 */
$sql = "INSERT INTO ".$cfg["tab"]["clients_lang"]." VALUES ('".$MyClientsLangSeq."', '".$new_idclient."', '".$merk_idlang_neu."')";

/*echo "SQL lautet: ".$sql."<br>";*/
$db2->query($sql); /* Erzeuge hier neuen Datensatz in Tabelle con_lang */
/*Korrigiere nun noch die Werte in der Tabelle con_sequences */
$sql="Update ".$cfg["tab"]["sequence"]." set nextid=".$MyClientsLangSeq." where seq_name = '".$cfg["tab"]["clients_lang"]."'";
$db2->query($sql);

echo "<h3><font face='Arial' color='#ff0000'>Spracheinstellung des neuen Mandanten existierte nicht und wurde deshalb erzeugt (idlang = ".$merk_idlang_neu.")</font></h3>";
echo "<hr>";
} /*End If*/



/* Alles OK....leg los */
echo "<hr><h1><font face='Arial' color='#525169'>Kopiere den Mandanten >".$old_client_Name."< (idclient ".$old_idclient.") auf den Mandanten >".$new_client_Name."< (idclient ".$new_idclient."):</font></h1><hr>";

/*****************************************************************************************/
/*Module KOPIEREN*/
/* ermittel alle Module des zu kopierenden Kunden */
$sql = "SELECT * from ".$cfg["tab"]["mod"]." where idclient=".$old_idclient;
$db1->query($sql); /* liefert Zeiger auf Ergebnisliste (Result Set)*/

/* In der Tabelle con_sequence stehen die Werte der Indizes der Primärschlüssel !
Lese daher erst hier den aktuelen Index-Wert für die Tabelle con_mod aus */
$MyModSeq=0;
$sql="Select nextid as MyNextID from ".$cfg["tab"]["sequence"]." where seq_name = '".$cfg["tab"]["mod"]."'";
$db2->query($sql);
if ($db2->next_record())
{
$MyModSeq=$db2->Record[0];
}

$sql="";
$lauf=0;
/* $db1->next_record() liefert Zeiger auf nächsten Datensatz, der noch nicht
ausgelesen wurde und gibt ein Array in der Eigenschaft Record zurück */
echo "<hr><h2><font face='Arial' color='#525169'>Kopiere die folgenden Module:</font></h2>";
while($db1->next_record())
{
echo "<font face='Arial' color='#000000'>".$db1->Record[2]."</font><BR>"; /* Index 2 des Arrays. Entspricht dem Inhalt der 2.ten Datenspalte der Tabelle con_mod..das ist der Modulname */

$lauf++;
$sql = "INSERT INTO ".$cfg["tab"]["mod"]." VALUES ('".$MyModSeq."','".$new_idclient."'";

$db1->Record[4]="YES"; /* Spalte deletable der Tabelle con_mod */

/*Merke im Array $ArrIdxAltModule[] den Index (idmod) der Module des alten Mandanten */
$ArrIdxAltModule[]=$db1->Record[0];
/*Merke im Array $ArrIdxNeuModule[] den Index (idmod) der Module des neuen Mandanten */
$ArrIdxNeuModule[]=$MyModSeq;
/*Das Merken im Array ist nötig um später noch zu wissen welcher alte idmod welchem neuen idmod entspricht*/

for ($i=2;$i<$db1->num_fields();$i++)
{
$sql = $sql .",";
$cont = $db1->Record[$i];
$cont = str_replace('\\','\\\\',$cont);
$cont = str_replace('"','\"',$cont);

$sql = $sql ."\"".$cont."\"";
}

$sql = $sql .")";
$db2->query($sql);

/* erhöhe um eins um den neuen maximalen Index-Wert zu merken, der wieder in die Tabelle con_Sequence geschrieben werden muss */
$MyModSeq++; /* erhöhe um 1 */
}

/* schreibe nun den letzten wert von $MyModSeq bei con_mod in die Tabelle con_sequence */
$MyModSeq=$MyModSeq-1;
$sql="Update ".$cfg["tab"]["sequence"]." set nextid=".$MyModSeq." where seq_name = '".$cfg["tab"]["mod"]."'";
$db2->query($sql);
echo "<h3><font face='Arial' color='#525169'>Es wurden ".$lauf." Module vom Mandanten ".$old_idclient." auf den Mandanten ".$new_idclient." kopiert. Der Eintrag für ".$cfg["tab"]["mod"]." wurde in der Tabelle ".$cfg["tab"]["sequence"]." korrigiert.</font></h3>";
echo "<hr>";

/*****************************************************************************************/
/*LAYOUTS KOPIEREN*/
/* ermittel alle Layouts des zu kopierenden Kunden */
$sql = "SELECT * from ".$cfg["tab"]["lay"]." where idclient=".$old_idclient;
$db1->query($sql); /* liefert Zeiger auf Ergebnisliste (Result Set)*/

/* In der Tabelle con_sequence stehen die Werte der Indizes der Primärschlüssel !
Lese daher erst hier den aktuelen Index-Wert für die Tabelle con_mod aus */
$MyLaySeq=0;
$sql="Select nextid as MyNextID from ".$cfg["tab"]["sequence"]." where seq_name = '".$cfg["tab"]["lay"]."'";
$db2->query($sql);
if ($db2->next_record())
{
$MyLaySeq=$db2->Record[0];
}

$sql="";
$lauf=0;
echo "<hr><h2><font face='Arial' color='#525169'>Kopiere die folgenden Layouts:</font></h2>";
while($db1->next_record())
{
echo "<font face='Arial' color='#000000'>".$db1->Record[2]."</font><BR>"; /* Index 2 des Arrays. Entspricht dem Inhalt der 2.ten Datenspalte der Tabelle con_lay..das ist der Layoutname */

$lauf++;
$sql = "INSERT INTO ".$cfg["tab"]["lay"]." VALUES ('".$MyLaySeq."','".$new_idclient."'";

$db1->Record[4]="YES"; /* Spalte deletable der Tabelle con_lay */

/*Merke im Array $ArrIdxAltLayout[] den Index (idlay) der Layouts des alten Mandanten */
$ArrIdxAltLayout[]=$db1->Record[0];
/*Merke im Array $ArrIdxNeuLayout[] den Index (idlay) der Layouts des neuen Mandanten */
$ArrIdxNeuLayout[]=$MyLaySeq;
/*Das Merken im Array ist nötig um später noch zu wissen welcher alte idlay welchem neuen idlay entspricht*/

for ($i=2;$i<$db1->num_fields();$i++)
{
$sql = $sql .",";
$cont = $db1->Record[$i];
$cont = str_replace('\\','\\\\',$cont);
$cont = str_replace('"','\"',$cont);

$sql = $sql ."\"".$cont."\"";
}

$sql = $sql .")";
$db2->query($sql);

/* erhöhe um eins um den neuen maximalen Index-Wert zu merken, der wieder in die Tabelle con_Sequence geschrieben werden muss */
$MyLaySeq++; /* erhöhe um 1 */
}

/* schreibe nun den letzten wert von $MyLaySeq bei con_lay in die Tabelle con_sequence */
$MyLaySeq=$MyLaySeq-1;
$sql="Update ".$cfg["tab"]["sequence"]." set nextid=".$MyLaySeq." where seq_name = '".$cfg["tab"]["lay"]."'";
$db2->query($sql);
echo "<h3><font face='Arial' color='#525169'>Es wurden ".$lauf." Layouts vom Mandanten ".$old_idclient." auf den Mandanten ".$new_idclient." kopiert. Der Eintrag für ".$cfg["tab"]["lay"]." wurde in der Tabelle ".$cfg["tab"]["sequence"]." korrigiert.</font></h3>";
echo "<hr>";


/*****************************************************************************************/
/*TEMPLATES KOPIEREN*/
/* In der Tabelle con_sequence stehen die Werte der Indizes der Primärschlüssel !
Lese daher erst hier den aktuelen Index-Wert für die Tabelle con_template aus */
$MyTplSeq=1;
$sql="Select nextid as MyNextID from ".$cfg["tab"]["sequence"]." where seq_name = '".$cfg["tab"]["tpl"]."'";
$db2->query($sql);
if ($db2->next_record()) $MyTplSeq=$db2->Record[0];
$MyTplSeq++;

$MyTplConfSeq=1;
$sql="Select nextid as MyNextID from ".$cfg["tab"]["sequence"]." where seq_name = '".$cfg["tab"]["tpl_conf"]."'";
$db2->query($sql);
if ($db2->next_record())
{
$MyTplConfSeq=$db2->Record[0];
$MyTplConfSeq++;
}

/* ermittel alle Templates des zu kopierenden Kunden */
$sql = "SELECT * from ".$cfg["tab"]["tpl"]." where idclient=".$old_idclient." order by idtpl";
$db1->query($sql); /* liefert Zeiger auf Ergebnisliste (Result Set)*/

/*Lese die idtpl der Templates erst mal in ein Array um sich die alten Indizes zu merken */
while($db1->next_record())
{
/*Merke im Array $ArrIdxAltLayout[] den Index (idlay) der Layouts des alten Mandanten */
$ArrIdxAltTpl[]=$db1->Record[2]; /* Spalte idtpl */
$ArrIdxNeuTpl[]=$MyTplSeq;
$MyTplSeq++; /* erhöhe um 1 */

$ArrIdxAltTplConf[]=$db1->Record[3]; /* Spalte idtplcfg */
$ArrIdxNeuTplConf[]=$MyTplConfSeq;
$MyTplConfSeq++; /* erhöhe um 1 */
}

/*Hinweis:
$MyTplSeq ist der Wert, der für nextid con_tpl in con_sequence eingetragen werden muss
$MyTplConfSeq-1 ist der Wert, der für nextid con_tplConf in con_sequence eingetragen werden muss
*/

/* Nun sind alle ID's, die alten und die neuen bekannt. Kopiere nun die Daten der Tabelle con_Templates */
$sql = "SELECT * from ".$cfg["tab"]["tpl"]." where idclient=".$old_idclient." order by idtpl";
$db1->query($sql); /* liefert Zeiger auf Ergebnisliste (Result Set)*/

echo "<hr><h2><font face='Arial' color='#525169'>Kopiere die folgenden Templates:</font></h2>";
$lauf=0;
while($db1->next_record())
{
$lauf++;
/* Lese nun idlay aus und stelle fest, wo dieser idlay im Array der alten Indizes steht (in ArrIdxAltLayer[]) */
$ArrPosLay=array_search($db1->Record[1], $ArrIdxAltLayout);

/* Lese nun idtpl aus und stelle fest, wo dieser idtpl im Array der alten Indizes steht (in ArrIdxAltTpl[]) */
$ArrPosTpl=array_search($db1->Record[2], $ArrIdxAltTpl);

/* dito für idtplconf */
$ArrPosTplConf=array_search($db1->Record[3], $ArrIdxAltTplConf);

$sql = "INSERT INTO ".$cfg["tab"]["tpl"]." VALUES ('".$new_idclient."'";
$db1->Record[1]=$ArrIdxNeuLayout[$ArrPosLay];
$db1->Record[2]=$ArrIdxNeuTpl[$ArrPosTpl];
$db1->Record[3]=$ArrIdxNeuTplConf[$ArrPosTplConf];

echo "<font face='Arial' color='#000000'>".$db1->Record[4]."</font><BR>";

for ($i=1;$i<$db1->num_fields();$i++)
{
$sql = $sql .",";
$cont = $db1->Record[$i];
$cont = str_replace('\\','\\\\',$cont);
$cont = str_replace('"','\"',$cont);

$sql = $sql ."\"".$cont."\"";
}

$sql = $sql .")";
$db2->query($sql);

/*Neuen Datensatz auch in Tabelle tplconf */
$sql = "INSERT INTO ".$cfg["tab"]["tpl_conf"]." (idtplcfg, idtpl, author) VALUES ('".$ArrIdxNeuTplConf[$ArrPosTplConf]."', '".$ArrIdxNeuTpl[$ArrPosTpl]."', 'admin')";
$db2->query($sql);
}

/*Korrigiere nun noch die Werte in der Tabelle con_sequences */
$sql="Update ".$cfg["tab"]["sequence"]." set nextid=".$MyTplSeq." where seq_name = '".$cfg["tab"]["tpl"]."'";
$db2->query($sql);
$MyTplConfSeq=$MyTplConfSeq-1;
$sql="Update ".$cfg["tab"]["sequence"]." set nextid=".$MyTplConfSeq." where seq_name = '".$cfg["tab"]["tpl_conf"]."'";
$db2->query($sql);
echo "<h3><font face='Arial' color='#525169'>Es wurden ".$lauf." Templates vom Mandanten ".$old_idclient." auf den Mandanten ".$new_idclient." kopiert. Der Eintrag für ".$cfg["tab"]["tpl"]." und für ".$cfg["tab"]["tpl_conf"]." wurde in der Tabelle ".$cfg["tab"]["sequence"]." korrigiert.</font></h3>";
echo "<hr>";

/*CONTAINER kopieren */
/* Die Container sind nur an den Index der Templates gebunden, nicht direkt an die idClient, also nicht direkt an den Mandanten */
echo "<hr><h2><font face='Arial' color='#525169'>Kopiere die Container:</font></h2>";

$sql = "SELECT * from ".$cfg["tab"]["container"]." order by idtpl";
$db1->query($sql); /* liefert Zeiger auf Ergebnisliste (Result Set)*/

/* Ermittel aus der Tabelle sequences den max. Index von con_container */
$MyContainerSeq=1;
$sql="Select nextid as MyNextID from ".$cfg["tab"]["sequence"]." where seq_name = '".$cfg["tab"]["container"]."'";
$db2->query($sql);
if ($db2->next_record()) $MyContainerSeq=$db2->Record[0];

$lauf=0;
while($db1->next_record())
{
/* Lese nun idtpl aus und stelle fest, wo dieser idtpl im Array der alten Indizes steht (in ArrIdxAltTpl[]) */
$ArrPosTpl=array_search($db1->Record[1], $ArrIdxAltTpl);
if ($ArrPosTpl<>False)
{ /* if */
$lauf++;
$ArrPosModul=array_search($db1->Record[3], $ArrIdxAltModul);

$MyContainerSeq++;
$sql = "INSERT INTO ".$cfg["tab"]["container"]." VALUES ('".$MyContainerSeq."'";

$db1->Record[1]=$ArrIdxNeuTpl[$ArrPosTpl];
$db1->Record[3]=$ArrIdxNeuModul[$ArrPosModul];

for ($i=1;$i<$db1->num_fields();$i++)
{
$sql = $sql .",";
$cont = $db1->Record[$i];
$cont = str_replace('\\','\\\\',$cont);
$cont = str_replace('"','\"',$cont);

$sql = $sql ."\"".$cont."\"";
}

$sql = $sql .")";
$db2->query($sql);
} /*End if */
}
/*Korrigiere nun noch die Werte in der Tabelle con_sequences */
$sql="Update ".$cfg["tab"]["sequence"]." set nextid=".$MyContainerSeq." where seq_name = '".$cfg["tab"]["container"]."'";
$db2->query($sql);
echo "<h3><font face='Arial' color='#525169'>Es wurden ".$lauf." Container vom Mandanten ".$old_idclient." auf den Mandanten ".$new_idclient." kopiert. Der Eintrag für ".$cfg["tab"]["container"]." wurde in der Tabelle ".$cfg["tab"]["sequence"]." korrigiert.</font></h3>";
echo "<hr>";

/*CONTAINER CONF kopieren */
echo "<hr><h2><font face='Arial' color='#525169'>Kopiere die Container_Conf:</font></h2>";

$sql="SELECT * FROM ".$cfg["tab"]["container_conf"]." Order by idtplcfg ";
$db1->query($sql); /* liefert Zeiger auf Ergebnisliste (Result Set)*/

/* Ermittel aus der Tabelle sequences den max. Index von con_container_conf */
$MyContainerConfSeq=1;
$sql="Select nextid as MyNextID from ".$cfg["tab"]["sequence"]." where seq_name = '".$cfg["tab"]["container_conf"]."'";
$db2->query($sql);
if ($db2->next_record()) $MyContainerConfSeq=$db2->Record[0];

$lauf=0;
while($db1->next_record())
{
/* Lese nun idtplcfg aus und stelle fest, wo dieser idtplcfg im Array der alten Indizes steht (in ArrIdxAltTplConf[]) */
$ArrPosTplConf=array_search($db1->Record[1], $ArrIdxAltTplConf);
if ($ArrPosTplConf!==False)
{ /* If */
$lauf++;
$MyContainerConfSeq++;
$sql = "INSERT INTO ".$cfg["tab"]["container_conf"]." VALUES ('".$MyContainerConfSeq."'";

$db1->Record[1]=$ArrIdxNeuTplConf[$ArrPosTplConf];

for ($i=1;$i<$db1->num_fields();$i++)
{
$sql = $sql .",";
$cont = $db1->Record[$i];
$cont = str_replace('\\','\\\\',$cont);
$cont = str_replace('"','\"',$cont);

$sql = $sql ."\"".$cont."\"";
}

$sql = $sql .")";
$db2->query($sql);
} /* End if */
}
/*Korrigiere nun noch die Werte in der Tabelle con_sequences */
$sql="Update ".$cfg["tab"]["sequence"]." set nextid=".$MyContainerConfSeq." where seq_name = '".$cfg["tab"]["container_conf"]."'";
$db2->query($sql);
echo "<h3><font face='Arial' color='#525169'>Es wurden ".$lauf." Container Conf-Daten vom Mandanten ".$old_idclient." auf den Mandanten ".$new_idclient." kopiert. Der Eintrag für ".$cfg["tab"]["container_conf"]." wurde in der Tabelle ".$cfg["tab"]["sequence"]." korrigiert.</font></h3>";
echo "<hr>";

if ($CopyKategorien=0) /* 0=Nein */
{
echo "<h1><font face='Arial' color='#525169'>FERTIG</font></h1>";
die("Es wurden alle Templates, Layouts, Container und Module kopiert. Die Kategorien wurden auf Wunsch nicht mit kopiert.");
}
/* Die Container sind nur an den Index der Templates gebunden, nicht direkt an die idClient, also nicht direkt an den Mandanten */

/*KATEGORIEN kopieren */
echo "<hr><h2><font face='Arial' color='#525169'>Kopiere die Kategorien/Men&uuml;s:</font></h2>";
/* lese aus der Tabelle con_cat alle Kategorien des zu kopierenden Mandanten ($old_idclient) aus */
$sql = "SELECT * from ".$cfg["tab"]["cat"]." where idclient=".$old_idclient." order by idcat";
$db1->query($sql); /* liefert Zeiger auf Ergebnisliste (Result Set)*/

/* Ermittel den nächsten gültigen Index für idcat aus der Tabelle con_sequences */
$MyKatSeq=0;
$sql="Select nextid as MyNextID from ".$cfg["tab"]["sequence"]." where seq_name = '".$cfg["tab"]["cat"]."'";
$db2->query($sql);
if ($db2->next_record()) $MyKatSeq=$db2->Record[0];

/* Lese nun die vorhanden Kategorie-IDs in das Array ein und generiere gleichzeitig das Array
* der neuen Kategorie-IDs. Dananch ist bekannt, welche neue idcat welcher alten idcat entsprach
*/
while($db1->next_record())
{
if ($db1->Record[0]==0)
{
$neueCatid=0;
} else {
$neueCatid=$MyKatSeq;
$MyKatSeq++; /* erhöhe um 1 */
}

$ArrIdxAltKat[]=$db1->Record[0]; /* Spalte idcat */
$ArrIdxNeuKat[]=$neueCatid;
/* Neu am 29.7.2004 */
/* Um die Kategorien zu kopieren, reicht es nicht nur die Werte idcat für den neuen Mandanten zu generieren
* Es müssem auch die Werte preid, postid und parentid kopiert und angepasst werden
* denn diese bestimmen später den Aufbau des Navigationsbaumes!
* Die Funktion strRemakeTreeTable der Datei functions.str.php erzeugt die Einträge nach jeder Änderung der Struktur neu.
* Dazu werden die Werte der Tabelle con_cat ausgelesen. Hier steht zu jeder catid (Kategorie bzw. Menüpunkt)
* die Vorgänger-Kategorie (preid) und der Nachfolger (postid). */
/* Ende neu am 29.7.2004 */
$ArrIdxAltParentID[]=$db1->Record[2]; /* Spalte parentid */
$ArrIdxAltPreID[]=$db1->Record[3]; /* Spalte preid */
$ArrIdxAltPostID[]=$db1->Record[4]; /* Spalte postid */

$sql = "INSERT INTO ".$cfg["tab"]["cat"]." VALUES ('".$neueCatid."', '".$new_idclient."'";
for ($i=2;$i<$db1->num_fields();$i++)
{
$sql = $sql .",";
$cont = $db1->Record[$i];
$cont = str_replace('\\','\\\\',$cont);
$cont = str_replace('"','\"',$cont);

$sql = $sql ."\"".$cont."\"";
}

$sql = $sql .")";
$db2->query($sql);
} /*End while */

/* Die neuen idcat wurden in die Datenbank geschrieben, allerdings haben die neuen Kategorien noch die Zuordnungen zu den alten
* parentid, preid und postid
* Das muss nun noch korrigiert werden
* ACHTUNG: Ist parentid, preid oder postid 0, so bleibt er 0 ! */

/* parentid: Für jeden Eintrag in $ArrIdxAltParentID[] */
$lauf=0;
$ArrWerte=array_values($ArrIdxAltParentID);
foreach ($ArrWerte as $value)
{
/* Suche Wert in $ArrIdxAltKat[] und merke Arrayindex $i */
if ($ArrIdxAltParentID[$lauf]==0)
{
$ArrIdxNeuParentID[$lauf]=0;
} else {
/* Hinweis: array_search(suche das, hier drin) */
$i=array_search($ArrIdxAltParentID[$lauf], $ArrIdxAltKat);
/* Setze nun $ArrIdxNeuParentID[]=$ArrIdxNeuKat */
$ArrIdxNeuParentID[$lauf]=$ArrIdxNeuKat[$i];
} /* end if */
$lauf++;
}

/* preid: Für jeden Eintrag in $ArrIdxAltPreID[] */
$lauf=0;
$ArrWerte=array_values($ArrIdxAltPreID);
foreach ($ArrWerte as $value)
{
if ($ArrIdxAltPreID[$lauf]==0)
{
$ArrIdxNeuPreID[$lauf]=0;
} else {
/* Suche Wert in $ArrIdxAltKat[] und merke Arrayindex $i */
$i=array_search($ArrIdxAltPreID[$lauf], $ArrIdxAltKat);
/* Setze nun $ArrIdxNeuPreID[]=$ArrIdxNeuKat */
$ArrIdxNeuPreID[$lauf]=$ArrIdxNeuKat[$i];
} /* end if */
$lauf++;
}

/* postid: Für jeden Eintrag in $ArrIdxAltPostID[] */
$lauf=0;
$ArrWerte=array_values($ArrIdxAltPostID);
foreach ($ArrWerte as $value)
{
if ($ArrIdxAltPostID[$lauf]==0)
{
$ArrIdxNeuPostID[$lauf]=0;
} else {
/* Suche Wert in $ArrIdxAltKat[] und merke Arrayindex $i */
$i=array_search($ArrIdxAltPostID[$lauf], $ArrIdxAltKat);
/* Setze nun $ArrIdxNeuPostID[]=$ArrIdxNeuKat */
$ArrIdxNeuPostID[$lauf]=$ArrIdxNeuKat[$i];
} /* end if */
$lauf++;
}

/* Schreibe diese nun zu den neuen idcat in die Datenbank */
$lauf=0;
$ArrWerte=array_values($ArrIdxNeuKat);
foreach ($ArrWerte as $value)
{
$sql="Update ".$cfg["tab"]["cat"]." set parentid=".$ArrIdxNeuParentID[$lauf].", preid=".$ArrIdxNeuPreID[$lauf].", postid=".$ArrIdxNeuPostID[$lauf]." where idcat = ".$value."";
$db2->query($sql);
$lauf++;
}


/*Korrigiere nun noch die Werte in der Tabelle con_sequences */
$sql="Update ".$cfg["tab"]["sequence"]." set nextid=".$MyKatSeq." where seq_name = '".$cfg["tab"]["cat"]."'";
$db2->query($sql);
echo "<h3><font face='Arial' color='#525169'>Die Kategorien wurden kopiert....kopiere nun deren Baumstruktur...</font></h3>";
echo "<hr>";
/* Die Daten der Tabelle con_cat wurden für den neuen Mandanten kopiert */



echo "<h3><font face='Arial' color='#525169'>Die Daten der Tabelle con_cat (Kategorien) wurde kopiert....kopiere nun deren Bezeichnungen und Sprache...</font></h3>";
echo "<hr>";

/* Nun müssen die Bezeichnungen der Kategorien kopiert werden (steht in Tabelle con_cat_lang) */
$sql = "SELECT * FROM ".$cfg["tab"]["cat_lang"]." where idlang = ".$merk_idlang_old." order by idcat";
$db1->query($sql); /* liefert Zeiger auf Ergebnisliste (Result Set)*/

/* Ermittel den nächsten gültigen Index für idcatlang aus der Tabelle con_sequences */
$MyKatLangSeq=0;
$sql="Select nextid as MyNextID from ".$cfg["tab"]["sequence"]." where seq_name = '".$cfg["tab"]["cat_lang"]."'";
$db2->query($sql);
if ($db2->next_record()) $MyKatLangSeq=$db2->Record[0];

while($db1->next_record())
{
/* Lese nun ids aus und stelle fest, wo diese im Array der alten Indizes stehen */
$ArrPosKat=array_search($db1->Record[1], $ArrIdxAltKat);
$ArrPosTplConf=array_search($db1->Record[3], $ArrIdxAltTplConf);

$sql = "INSERT INTO ".$cfg["tab"]["cat_lang"]." VALUES ('".$MyKatLangSeq."'";

$db1->Record[1]=$ArrIdxNeuKat[$ArrPosKat]; /* Die korrespondierende neue idcat */
if ($ArrPosTplConf!==False) $db1->Record[3]=$ArrIdxNeuTplConf[$ArrPosTplConf]; /* Die korrespondierende neue idtplcfg */

/* Achtung: Einträge der Tabelle cat_lang sind Sprachabhängig. Schreibe daher hier auch die idlang (SprachID) des neuen
Mandanten mit rein...diese wude zu Beginn des Scripts ermittelt und in $merk_idlang_neu gemerkt */
$db1->Record[2]=$merk_idlang_neu;
for ($i=1;$i<$db1->num_fields();$i++)
{
$sql = $sql .",";
$cont = $db1->Record[$i];
$cont = str_replace('\\','\\\\',$cont);
$cont = str_replace('"','\"',$cont);

$sql = $sql ."\"".$cont."\"";
}

$sql = $sql .")";
$db2->query($sql);

$MyKatLangSeq++;

} /* End While */

$MyKatLangSeq=$MyKatLangSeq-1;
/*Korrigiere nun noch die Werte in der Tabelle con_sequences */
$sql="Update ".$cfg["tab"]["sequence"]." set nextid=".$MyKatLangSeq." where seq_name = '".$cfg["tab"]["cat_lang"]."'";
$db2->query($sql);
echo "<h3><font face='Arial' color='#525169'>Die Bezeichnungen der Kategorien wurden kopiert.</font></h3>";
echo "<hr>";

echo "<h1><font face='Arial' color='#0055dd'>FERTIG</font></h1>";
echo "<font face='Arial' color='#525169'>Es wurden alle Module, Templates, Layouts, Container und Kategorien kopiert.</font>";

/* Wenn alles fertig ist sollte man die Datei contenido/updateseqruntime.php ausführen */
echo "<br><font face='Arial' color='#FF0022'>Nun sollte noch das Script ".$contenido_host." contenido/updateseqruntime.php ausgeführt werden. (aktualisiert die Tabelle con_sequence)</font>";

/* Nun muss die Baum-Struktur der Kategorien kopiert werden (steht in Tabelle con_cat_tree) */
strRemakeTreeTable(); /* Contenido Funktion in includes\functions.str.php */
echo "<br><font face='Arial' color='#FF0022'>Die Funktion strRemakeTreeTable() aus functions.str.php wurde ausgeführt (schreibt die Tabelle con_cat_tree neu für die Navigation/Baumstruktur)</font>";
?>

StephanSchmidt
Beiträge: 29
Registriert: Mo 9. Feb 2004, 10:31
Wohnort: Berlin
Kontaktdaten:

Beitrag von StephanSchmidt » Do 19. Aug 2004, 12:34

Hallo Axel,

vielen Dank dir, ich sehe mir das an. Ich habe ein paar user die draengeln :-)

mein aktuelles Java Programm (nur so zum ansehen) sieht so aus:

http://nopaste.php-q.net/79115

bye
-stephan

Antworten