Aktualisiert: Mandanten kopieren

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

Beitrag von Axel » Do 26. Aug 2004, 09:24

:shock: Ups..das mit <>False hatte ich übersehen.
:?: Du schreibst "die einzigen sachen die jetzt noch nicht drinnen sind ist die zuordnung der idtplcfg bei kategorie und artikel...." - aber die sind doch drin? In meinem Script in Zeile 702 für die idtplcfg der Tabelle cat_lang und in Zeile 793 für die idtplcfg der Tabelle art_lang.

Werde mir deine Anpassungen mal ansehen...hoffe ich komme heute dazu. Wenn das Script dann fertig ist wäre das "Sahnehäubchen" noch ein Frontend wo man aus Listboxen auswählen kann, welcher Kunde kopiert werden soll und zwei Checkboxen für die Angaben "mit Kategorien" und "mit Artikeln". Das nehme ich aber erst am Schluss in Angriff.

emergence
Beiträge: 10641
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Do 26. Aug 2004, 10:02

Axel hat geschrieben::shock: Ups..das mit <>False hatte ich übersehen.
:?: Du schreibst "die einzigen sachen die jetzt noch nicht drinnen sind ist die zuordnung der idtplcfg bei kategorie und artikel...." - aber die sind doch drin? In meinem Script in Zeile 702 für die idtplcfg der Tabelle cat_lang und in Zeile 793 für die idtplcfg der Tabelle art_lang.
ähm ganz so einfach ist das nicht... siehe meine anderes posting betreffend idtplcfg...
bleiben wir bei den kategorien...
momentan gibt es drei werte die gespeichert sein können...
0 -> kategorie ist nicht konfiguriert -> der wert muss 1:1 so eingetragen werden...
die id die du momentan einsetzt -> verwendet die vorkonfiguration
wenn die kategorie jedoch ne andere id hat hat sie eine eigene konfiguration ! basierend auf der vorkonfiguration...
in contenido wurde dies so gelöst das die vorkonfiguration einfach kopiert wurde und ne neue idtplcfg erhalten hat... alle konfigurationsparameter in der container_conf beruhen dann auf diesen einen neuen wert....

bei artikel ist es ähnlich
wenn idtplcfg = 0 ist wird die konfiguration der kategorie verwendet in der sich der artikel befindet...
wenn einem artikel eine idtplcfg zugewiesen ist selbes spielchen wie oben... dann wurde die vorkonfiguration auf ne neue idtplcfg kopiert und die werte in container_conf beruhen dann auf diesen wert...
Axel hat geschrieben:Werde mir deine Anpassungen mal ansehen...hoffe ich komme heute dazu. Wenn das Script dann fertig ist wäre das "Sahnehäubchen" noch ein Frontend wo man aus Listboxen auswählen kann, welcher Kunde kopiert werden soll und zwei Checkboxen für die Angaben "mit Kategorien" und "mit Artikeln". Das nehme ich aber erst am Schluss in Angriff.
den teil nehme ich dir gerne ab... ;-)
*** make your own tools (wishlist :: thx)

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

Beitrag von Axel » Do 26. Aug 2004, 11:56

Hmm..wegen der idtplcfg hab ich was ergänzt. Grundlage ist deine zuletzt gepostete Version 2.1. Die Änderungen sind in Zeile 701 und 793. S
Hab dem Script nun die Version 2.2 verpasst.

Was die Frontend-Seite angeht...Tu dir keinen Zwang an und leg los.

(Konnte das Script noch nicht testen. Muss mir dazu erst mal 'ne zweite Umgebung aufsetzen.)

Code: Alles auswählen

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

* Dieses Script kopiert die Module, Layouts, Templates, Container und auf Wunsch auch Kategorien und Artikel
* von einem Kunden (Mandanten) ($old_idclient) auf einen anderen (neuen) Mandanten ($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)
* Wenn die Artikel kopiert werden auch folgende sichern
* con_art
* con_art_lang
* con_cat_art
*/

/* Anleitung:
* Kopiere die .php-Datei mit diesem Script in das Contenido-Verzeichnis
* z.B. contenido/client_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 50) die Variable $new_idclient= Index des neuen Mandanten
*    Setze (Zeile 52) die Variable $old_idclient= zu kopierender Mandant
* 6. Abmelden von Contenido (falls noch eingeloggt)
* 7. Script starten
* FERTIG
*/

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

include_once ('./includes/config.php');
cInclude ("includes", 'functions.general.php');

$cfg["debug"]["backend_exectime"]["fullstart"]  = getmicrotime();

cInclude ("includes", 'functions.i18n.php');
cInclude ("includes", 'functions.api.php');
cInclude ("includes", 'functions.general.php');

cInclude ("includes", 'functions.database.php');

cInclude ("classes", 'class.xml.php');
cInclude ("classes", 'class.navigation.php');
cInclude ("classes", 'class.template.php');
cInclude ("classes", 'class.backend.php');
cInclude ("classes", 'class.notification.php');
cInclude ("classes", 'class.area.php');
cInclude ("classes", 'class.action.php');

cInclude ("classes", 'class.layout.php');
cInclude ("classes", 'class.treeitem.php');
cInclude ("classes", 'class.user.php');
cInclude ("classes", 'class.group.php');
cInclude ("classes", 'class.cat.php');
cInclude ("classes", 'class.client.php');
cInclude ("classes", 'class.inuse.php');
cInclude ("classes", 'class.table.php');

cInclude ("includes", 'functions.str.php');

page_open(array('sess' => 'Contenido_Session',
                'auth' => 'Contenido_Challenge_Crypt_Auth',
                'perm' => 'Contenido_Perm'));

i18nInit($cfg["path"]["contenido"].$cfg["path"]["locale"], $belang);
cInclude ("includes", 'cfg_language_de.inc.php');

class DB_Upgrade extends DB_Contenido {
}

/* Instanzen der DB_Contenido */
$db = new DB_Contenido;
$db2 = new DB_Contenido;
$db_str = new DB_Contenido;

$cfg["debug"]["backend_exectime"]["start"]  = getmicrotime();

/* con_sequence update */
updateSequence();

?>
<html>
<head>
    <title></title>
    <link rel="stylesheet" type="text/css" href="styles/contenido.css" />
    <script type="text/javascript" src="scripts/general.js"></script>
<style type="text/css">
<!--
/* Cascading Style Sheet */

BODY,P,TD { font-family : verdana, arial, helvetica, sans-serif; }
BODY,P,TD { font-size : 11px; }

A:active,A:link,A:visited { text-decoration : none; }
A:hover { text-decoration : underline; }

P { text-align : justify; line-height: 140%; }

.red  { color : #FF0000; }
.grey  { color : #333333; }
.white { color : #FFFFFF; }

-->
</style>
</head>
<body style="margin: 10px">
<?php

$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();
$ArrIdxNeuParentID=array();
$ArrIdxNeuPostID=array();
$ArrIdxNeuPreID=array();

/* Für die Artikel */
$ArrIdxAltArt=array();
$ArrIdxNeuArt=array();

/* Ermittle 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.")";

$db->query($sql); /* liefert Zeiger auf Ergebnisliste (Result Set)*/
while ($db->next_record())
{
    if ($db->Record[0]==$new_idclient) $new_client_Name=trim($db->Record[1]);
    if ($db->Record[0]==$old_idclient) $old_client_Name=trim($db->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 color='#ff0000'>Fehler: <BR>".$Meldung."</font></h3><hr>";
    page_close();
    die(); /* Scriptausführung abbrechen */
}

if ($CopyArtikel==1 and $CopyKategorien==0)
{
    $Meldung="Artikel können nur kopiert werden wenn auch die Kategorien kopiert werden sollen. Die Ausführung wird abgebrochen.";
    echo "<hr><h3><font color='#ff0000'>Prüfen: <BR>".$Meldung."</font></h3><hr>";
    page_close();
    die(); /* 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 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."))";

$db->query($sql);
$merk_idlang_old=0;
$MandantNeuExist=0;

while($db->next_record())
{
    if ($db->Record[1]==$old_idclient) $merk_idlang_old=$db->Record[2]; /*Merke hier die SprachID des alten Mandanten */
    if ($db->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=$db->Record[2]; /*Merke hier die SprachID des neuen Mandanten */
        echo "<h3><font color='#525169'>Spracheinstellung des neuen Mandanten existiert bereits (idlang = ".$merk_idlang_neu.")</font></h3>";
        echo "<hr>";
    } /*End If */
} /* End While */

echo "<h3><font 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.")";

    $db->query($sql);

    /* Nun der neue Eintrag in con_lang */
    $MyLangSeq = getSequenceId($cfg["tab"]["lang"]);

    $merk_idlang_neu = $MyLangSeq;

    $sql = "INSERT INTO ".$cfg["tab"]["lang"]." VALUES ('".$merk_idlang_neu."'";
    $db->next_record();
    for ($i=1;$i<$db->num_fields();$i++)
    {
        $sql = $sql .",";
        $cont = $db->Record[$i];
        $cont = str_replace('\\','\\\\',$cont);
        $cont = str_replace('"','\"',$cont);

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

    $db2->query($sql); /* Erzeuge hier neuen Datensatz in Tabelle con_lang */

    /*Korrigiere nun noch die Werte in der Tabelle con_sequences */
    updateSequence($cfg["tab"]["lang"]);

    /* Nun der neue Eintrag in con_clients_lang */
    $MyClientsLangSeq = getSequenceId($cfg["tab"]["clients_lang"]);

    $sql = "INSERT INTO ".$cfg["tab"]["clients_lang"]." VALUES ('".$MyClientsLangSeq."', '".$new_idclient."', '".$merk_idlang_neu."')";


    $db2->query($sql); /* Erzeuge hier neuen Datensatz in Tabelle con_lang */

    /*Korrigiere nun noch die Werte in der Tabelle con_sequences */
    updateSequence($cfg["tab"]["clients_lang"]);

    echo "<h3><font 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 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;

$db->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 aktuellen Index-Wert für die Tabelle con_mod aus */
$MyModSeq = getSequenceId($cfg["tab"]["mod"]);

$lauf=0;
/* $db->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 color='#525169'>Kopiere die folgenden Module:</font></h2>";
while($db->next_record())
{
    echo "<font color='#000000'>".$db->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."'";

    /*Merke im Array $ArrIdxAltModul[] den Index (idmod) der Module des alten Mandanten */
    $ArrIdxAltModul[]=$db->Record[0];
    /*Merke im Array $ArrIdxNeuModul[] den Index (idmod) der Module des neuen Mandanten */
    $ArrIdxNeuModul[]=$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<$db->num_fields();$i++)
    {
        $sql = $sql .",";
        $cont = $db->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 */
}

/*Korrigiere nun noch die Werte in der Tabelle con_sequences */
updateSequence($cfg["tab"]["mod"]);

echo "<h3><font 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;

$db->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 aktuellen Index-Wert für die Tabelle con_mod aus */
$MyLaySeq = getSequenceId($cfg["tab"]["lay"]);

$lauf=0;
echo "<hr><h2><font color='#525169'>Kopiere die folgenden Layouts:</font></h2>";
while($db->next_record())
{
    echo "<font color='#000000'>".$db->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."'";

    /*Merke im Array $ArrIdxAltLayout[] den Index (idlay) der Layouts des alten Mandanten */
    $ArrIdxAltLayout[]=$db->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<$db->num_fields();$i++)
    {
        $sql = $sql .",";
        $cont = $db->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 */
}

/*Korrigiere nun noch die Werte in der Tabelle con_sequences */
updateSequence($cfg["tab"]["lay"]);

echo "<h3><font 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 aktuellen Index-Wert für die Tabelle con_template aus */
$MyTplSeq = getSequenceId($cfg["tab"]["tpl"]);
$MyTplConfSeq = getSequenceId($cfg["tab"]["tpl_conf"]);

/* ermittel alle Templates des zu kopierenden Kunden */
$sql = "SELECT * from ".$cfg["tab"]["tpl"]." where idclient=".$old_idclient." order by idtpl";

$db->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($db->next_record())
{
    /*Merke im Array $ArrIdxAltLayout[] den Index (idlay) der Layouts des alten Mandanten */
    $ArrIdxAltTpl[]=$db->Record[2]; /* Spalte idtpl */
    $ArrIdxNeuTpl[]=$MyTplSeq;
    $MyTplSeq++; /* erhöhe um 1 */

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

/* 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";

$db->query($sql); /* liefert Zeiger auf Ergebnisliste (Result Set)*/

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

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

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

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

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

    for ($i=1;$i<$db->num_fields();$i++)
    {
        $sql = $sql .",";
        $cont = $db->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 */
updateSequence($cfg["tab"]["tpl"]);
updateSequence($cfg["tab"]["tpl_conf"]);

echo "<h3><font 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 color='#525169'>Kopiere die Container:</font></h2>";

$sql = "SELECT * from ".$cfg["tab"]["container"]." order by idtpl";

$db->query($sql); /* liefert Zeiger auf Ergebnisliste (Result Set)*/

/* Ermittel aus der Tabelle sequences den max. Index von con_container */
$MyContainerSeq = getSequenceId($cfg["tab"]["container"]);

$lauf=0;

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

    if ($ArrPosTpl!==False)
    { /* if */
        $lauf++;
        $ArrPosModul=array_search($db->Record[3], $ArrIdxAltModul);

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

        $db->Record[1]=$ArrIdxNeuTpl[$ArrPosTpl];
        if ($db->Record[3] != 0) {
            $db->Record[3]=$ArrIdxNeuModul[$ArrPosModul];
        }

        for ($i=1;$i<$db->num_fields();$i++)
        {
            $sql = $sql .",";
            $cont = $db->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 */
updateSequence($cfg["tab"]["container"]);

echo "<h3><font 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 color='#525169'>Kopiere die Container_Conf:</font></h2>";

$sql = "SELECT * FROM ".$cfg["tab"]["container_conf"]." Order by idtplcfg ";

$db->query($sql); /* liefert Zeiger auf Ergebnisliste (Result Set)*/

/* Ermittel aus der Tabelle sequences den max. Index von con_container_conf */
$MyContainerConfSeq = getSequenceId($cfg["tab"]["container_conf"]);

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

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

        for ($i=1;$i<$db->num_fields();$i++)
        {
            $sql = $sql .",";
            $cont = $db->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 */
updateSequence($cfg["tab"]["container_conf"]);

echo "<h3><font 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>";

/* Die Container sind nur an den Index der Templates gebunden, nicht direkt an die idClient, also nicht direkt an den Mandanten */

/*****************************************************************************************/
/*KATEGORIEN kopieren */
if ($CopyKategorien==1)
{

    echo "<hr><h2><font 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";

    $db->query($sql); /* liefert Zeiger auf Ergebnisliste (Result Set)*/

    /* Ermittel den nächsten gültigen Index für idcat aus der Tabelle con_sequences */
    $MyKatSeq = getSequenceId($cfg["tab"]["cat"]);

    /* 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($db->next_record())
    {
        if ($db->Record[0]==0)
        {
            $neueCatid=0;
        } else {
            $neueCatid=$MyKatSeq;
            $MyKatSeq++; /* erhöhe um 1 */
        }

        $ArrIdxAltKat[]=$db->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[]=$db->Record[2]; /* Spalte parentid */
        $ArrIdxAltPreID[]=$db->Record[3]; /* Spalte preid */
        $ArrIdxAltPostID[]=$db->Record[4]; /* Spalte postid */

        $sql = "INSERT INTO ".$cfg["tab"]["cat"]." VALUES ('".$neueCatid."', '".$new_idclient."'";
        for ($i=2;$i<$db->num_fields();$i++)
        {
            $sql = $sql .",";
            $cont = $db->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[i] */
            $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[i] */
            $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[i] */
            $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 */
    updateSequence($cfg["tab"]["cat"]);

    echo "<h3><font 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 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";

    $db->query($sql); /* liefert Zeiger auf Ergebnisliste (Result Set)*/

    /* Ermittel den nächsten gültigen Index für idcatlang aus der Tabelle con_sequences */
    $MyKatLangSeq = getSequenceId($cfg["tab"]["cat_lang"]);

    while($db->next_record())
    {
        /* Lese nun ids aus und stelle fest, wo diese im Array der alten Indizes stehen */
        $ArrPosKat=array_search($db->Record[1], $ArrIdxAltKat);
        $sql = "INSERT INTO ".$cfg["tab"]["cat_lang"]." VALUES ('".$MyKatLangSeq."'";
        $db->Record[1]=$ArrIdxNeuKat[$ArrPosKat]; /* Die korrespondierende neue idcat */
        
        if ($db->Record[3]!=0) /*Wenn idtplcfg=0 dann ist Kategorie nicht konfiguriert, behalte dann die 0*/
        {
            $ArrPosTplConf=array_search($db->Record[3], $ArrIdxAltTplConf);
            if ($ArrPosTplConf!==False) $db->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 */
        $db->Record[2]=$merk_idlang_neu;
        for ($i=1;$i<$db->num_fields();$i++)
        {
            $sql = $sql .",";
            $cont = $db->Record[$i];
            $cont = str_replace('\\','\\\\',$cont);
            $cont = str_replace('"','\"',$cont);

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

        $sql = $sql .")";

        $db2->query($sql);

        $MyKatLangSeq++;

    } /* End While */

    /*Korrigiere nun noch die Werte in der Tabelle con_sequences */
    updateSequence($cfg["tab"]["cat_lang"]);

    echo "<h3><font color='#525169'>Die Bezeichnungen der Kategorien wurden kopiert.</font></h3>";
    echo "<hr>";

    /* 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 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>";

} /* End if von if ($CopyKategorien==1) */

/*****************************************************************************************/
/*ARTIKEL kopieren*/
if ($CopyArtikel==1 and $CopyKategorien==1)
{
    echo "<h3><font color='#525169'>Kopiere nun alle Artikel</font></h3>";
    /* ermittel alle Artikel des zu kopierenden Kunden */
    $sql = "SELECT * from ".$cfg["tab"]["art"]." where idclient=".$old_idclient." order by idart";
    $db->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 aktuellen Index-Wert für die Tabelle con_art aus */
    $MyArtSeq = getSequenceId($cfg["tab"]["art"]);

    $lauf=0;
    /* $db->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 color='#525169'>Kopiere die folgenden Artikel:</font></h2>";
    while($db->next_record())
    {
        $lauf++;
        /*Merke im Array den Index (idart) der Artikel des alten Mandanten */
        $ArrIdxAltArt[]=$db->Record[0];
        /*Merke im Array $ArrIdxNeuArt[] den Index (idart) der Artikel des neuen Mandanten */
        $ArrIdxNeuArt[]=$MyArtSeq;
        /*Das Merken im Array ist nötig um später noch zu wissen welche alte idart welcher neuen idart entspricht*/

        $sql = "INSERT INTO ".$cfg["tab"]["art"]." VALUES (".$MyArtSeq.", ".$new_idclient."";
        $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 */
        $MyArtSeq++; /* erhöhe um 1 */
    }

    /* schreibe nun den letzten wert von $MyArtSeq bei con_mod in die Tabelle con_sequence */
    updateSequence($cfg["tab"]["art"]);

    echo "<h3><font color='#525169'>Es wurden ".$lauf." neue Einträge in der Tabelle >".$cfg["tab"]["art"]."< erzeugt.</font></h3>";
    echo "<hr>";

    /* Jetzt noch die Einträge der Tabelle con_art_lang erzeugen - hier stehen die eigentlichen Artikelinhalte */
    /**************Tabelle CON_ART_LANG************************************************************************************************************/
    echo "<h3><font color='#525169'>Erzeuge nun mit diesen neuen Einträgen die neuen Texte der Artikel (Tabelle >".$cfg["tab"]["art_lang"]."<)</font></h3>";
    /* ermittel alle Einträge des zu kopierenden Kunden */
    $sql = "SELECT * from ".$cfg["tab"]["art_lang"]." where idlang = ".$merk_idlang_old."";
    $db->query($sql); /* liefert Zeiger auf Ergebnisliste (Result Set)*/
    $lauf=0;
    while($db->next_record())
    {

        /* Lese nun idart aus und stelle fest, wo dieser idart im Array der alten Indizes steht (in ArrIdxAltArt[]) */
        $ArrPosArt=array_search($db->Record[1], $ArrIdxAltArt);
        if ($ArrPosArt!==False) /* Nötig, weil in con_art_lang auch Artikel andere Mandanten der gleichen Sprche stehen könnten */
        {
            echo "<font color='#000000'>Kopiere Artikel ".$db->Record[4]."</font><BR>";
            $lauf++;
            if ($db->Record[3]!=0) /*Wenn idtplcfg=0 dann ist Kategorie nicht konfiguriert, behalte dann die 0*/
            {
                /* An welcher Position im Array steht der Wert idtplcfg */
                $ArrPosTplConf=array_search($db->Record[3], $ArrIdxAltTplConf);
                $sql = "INSERT INTO ".$cfg["tab"]["art_lang"]." VALUES (".$ArrIdxNeuArt[$ArrPosArt].", ".$ArrIdxNeuArt[$ArrPosArt].", ".$merk_idlang_neu.", ".$ArrIdxNeuTplConf[$ArrPosTplConf]."";
            } else {
                $sql = "INSERT INTO ".$cfg["tab"]["art_lang"]." VALUES (".$ArrIdxNeuArt[$ArrPosArt].", ".$ArrIdxNeuArt[$ArrPosArt].", ".$merk_idlang_neu.", ".$db->Record[3]."";
            }
            

            /* im Feld time_target_cat steht die Kategorie in die nach Zeitablauf der Artikel verschoben wird. Diese ist für den neuen Mandanten auch noch anzupassen */
            $ArrPosKat=array_search($db->Record[24], $ArrIdxAltKat);
            $db->Record[24]=$ArrIdxNeuKat[$ArrPosKat];
            for ($i=4;$i<$db->num_fields();$i++)
            {
                $sql = $sql .",";
                $cont = $db->Record[$i];
                $cont = str_replace('\\','\\\\',$cont);
                $cont = str_replace('"','\"',$cont);

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

            $db2->query($sql);
        }
    }
    echo "<h3><font color='#525169'>Es wurden ".$lauf." neue Einträge in der Tabelle >".$cfg["tab"]["art_lang"]."< erzeugt.</font></h3><BR>";
    echo "<h3><font color='#525169'>Kopiere nun die Zuordnungen der Artikel zu den Kategorien (Tabelle >".$cfg["tab"]["cat_art"]."<)</font></h3>";
    $sql = "SELECT * from ".$cfg["tab"]["cat_art"]." order by idart";
    $db->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 aktuellen Index-Wert für die Tabelle con_cat_art aus */
    $MyCatArtSeq = getSequenceId($cfg["tab"]["cat_art"]);

    $lauf=0;
    while($db->next_record())
    {
        /* Lese nun idart aus und stelle fest, wo dieser idart im Array der alten Indizes steht (in ArrIdxAltArt[]) */
        $ArrPosArt=array_search($db->Record[2], $ArrIdxAltArt);
        if ($ArrPosArt!==False) /* Nötig, weil in con_cat_art auch Artikel anderer Mandanten der gleichen Sprache stehen könnten */
        {
            $lauf++;
            $ArrPosKat=array_search($db->Record[1], $ArrIdxAltKat);
            $sql = "INSERT INTO ".$cfg["tab"]["cat_art"]." VALUES (".$MyCatArtSeq.", ".$ArrIdxNeuKat[$ArrPosKat].", ".$ArrIdxNeuArt[$ArrPosArt]."";

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

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

            $db2->query($sql);
            $MyCatArtSeq++;
        }
    }

    /*Korrigiere nun noch die Werte in der Tabelle con_sequences */
    updateSequence($cfg["tab"]["cat_art"]);

    echo "<h3><font color='#525169'>Die Artikel wurden kopiert.</font></h3>";
    echo "<hr>";
} /* End if von ($CopyArtikel==1 and $CopyKategorien==1) */


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

/* con_sequence update */
updateSequence();

echo "<br><font color='#FF0022'>con_sequence wurde upgedated.</font>";

?>
</body>
</html>
<?php


// simple function to update con_sequence
function updateSequence($table=false) {

    global $db, $cfg;
    if (!$table) {
        $sql = "SHOW TABLES";
        $db->query($sql);
        while ($db->next_record())
        {
            dbUpdateSequence($cfg['sql']['sqlprefix']."_sequence", $db->f(0));
        }
    } else {
        dbUpdateSequence($cfg['sql']['sqlprefix']."_sequence", $table);
    }
}

// read out next free id
function getSequenceId($table) {

    global $db2, $cfg;

    $sql= "SELECT nextid FROM ".$cfg['sql']['sqlprefix']."_sequence"." where seq_name = '$table'";
    $db2->query($sql);
    if ($db2->next_record()) {
        return $db2->f("nextid");
    } else {
        return 0;
    }
}

$cfg["debug"]["backend_exectime"]["end"] = getmicrotime();

if ($cfg["debug"]["rendering"] == true)
{
    echo "Rendering this page took: " . ($cfg["debug"]["backend_exectime"]["end"] - $cfg["debug"]["backend_exectime"]["start"])." seconds<br>";
    echo "Building the complete page took: " . ($cfg["debug"]["backend_exectime"]["end"] - $cfg["debug"]["backend_exectime"]["fullstart"])." seconds<br>";

    if (function_exists("memory_get_usage"))
    {
        echo "Include memory usage: ".human_readable_size(memory_get_usage()-$cfg["debug"]["oldmemusage"])."<br>";
        echo "Complete memory usage: ".human_readable_size(memory_get_usage())."<br>";

    }

}
page_close();
?>

emergence
Beiträge: 10641
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Do 26. Aug 2004, 12:25

Axel hat geschrieben:Hmm..wegen der idtplcfg hab ich was ergänzt. Grundlage ist deine zuletzt gepostete Version 2.1. Die Änderungen sind in Zeile 701 und 793. S
Hab dem Script nun die Version 2.2 verpasst.
hab ich mir gerade angesehen... und eingebaut...

ähm.. bei der zweiten änderung

Code: Alles auswählen

            if ($db->Record[3]!=0) /*Wenn idtplcfg=0 dann ist Kategorie nicht konfiguriert, behalte dann die 0*/
            {
                /* An welcher Position im Array steht der Wert idtplcfg */
                $ArrPosTplConf=array_search($db->Record[3], $ArrIdxAltTplConf);
                $sql = "INSERT INTO ".$cfg["tab"]["art_lang"]." VALUES (".$ArrIdxNeuArt[$ArrPosArt].", ".$ArrIdxNeuArt[$ArrPosArt].", ".$merk_idlang_neu.", ".$ArrIdxNeuTplConf[$ArrPosTplConf]."";
            } else {
                $sql = "INSERT INTO ".$cfg["tab"]["art_lang"]." VALUES (".$ArrIdxNeuArt[$ArrPosArt].", ".$ArrIdxNeuArt[$ArrPosArt].", ".$merk_idlang_neu.", ".$db->Record[3]."";
            }
besser wäre

Code: Alles auswählen

            if ($db->Record[3]!=0) /*Wenn idtplcfg=0 dann ist Kategorie nicht konfiguriert, behalte dann die 0*/
            {
                $ArrPosTplConf=array_search($db->Record[3], $ArrIdxAltTplConf);
                if ($ArrPosTplConf!==False) $db->Record[3]=$ArrIdxNeuTplConf[$ArrPosTplConf]; /* Die korrespondierende neue idtplcfg */
            }

            $sql = "INSERT INTO ".$cfg["tab"]["art_lang"]." VALUES (".$ArrIdxNeuArt[$ArrPosArt].", ".$ArrIdxNeuArt[$ArrPosArt].", ".$merk_idlang_neu.", ".$db->Record[3]."";
dann läufts immer nach dem gleichen muster ab... ;-)
Axel hat geschrieben:Was die Frontend-Seite angeht...Tu dir keinen Zwang an und leg los.

was brauchen wir alles ?
start und zielclient und ob artikel oder kategorien mit kopiert werden sollen...
noch was ?
*** make your own tools (wishlist :: thx)

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

Beitrag von Axel » Do 26. Aug 2004, 13:25

Müßte reichen...

emergence
Beiträge: 10641
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Do 26. Aug 2004, 13:42

okay bin fertig ganz auf die schnelle

der teil mit * MACHE DEINE INDIVIDUELLEN ANGABEN HIER...
fliegt natürlich komplett raus...

und bei

Code: Alles auswählen

<body style="margin: 10px"> 
<?php 
kommt folgendes rein:

Code: Alles auswählen

<body style="margin: 10px">
<p><b>CLIENT COPY</b></p>
<?php

$SessID = $sess->id;

$sql = "SELECT * FROM ".$cfg["tab"]["clients"]." ORDER BY idclient ASC";

$db->query($sql);
while ($db->next_record()) {
    $ArrClients[$db->f("idclient")] = $db->f("name");
}

$form['table'] = '<table><tr><td width="120" align="right">%s</td><td>%s</td></tr><table>';

$form['header'] = '<select name="%s">'."\n";
$form['footer'] = '</select>';

$form['select'] = '<option value="%s"%s>%s</option>'."\n";
$form['selected'] = ' selected="selected"';

if (is_array($ArrClients)) {
    foreach ($ArrClients as $key => $value) {
        if ($key == $old_idclient)
            $form['source'] .= sprintf($form['select'], $key, $form['selected'], $value);
        else
            $form['source'] .= sprintf($form['select'], $key, "", $value);

        if ($key == $new_idclient)
            $form['target'] .= sprintf($form['select'], $key, $form['selected'], $value);
        else
            $form['target'] .= sprintf($form['select'], $key, "", $value);

    }
}

$stop = false;

if (!isset($old_idclient) || !isset($new_idclient)) {
    echo "Bitte wählen Sie...";
    $stop = true;
}
if ($old_idclient == $new_idclient && !$stop) {
    echo "Man kann den Client nicht auf sich selbst kopieren.";
    $stop = true;
};

if ($stop) {

    echo '<form action="'.$PHP_SELF.'">'."\n";
    echo '<input type="hidden" name="contenido" value="'.$SessID.'">'."\n";

    echo sprintf($form['table'], "SOURCE:" ,sprintf($form['header'],"old_idclient").$form['source'].$form['footer']);
    echo sprintf($form['table'], "TARGET:" ,sprintf($form['header'],"new_idclient").$form['target'].$form['footer']);
    echo sprintf($form['table'], "COPY CATEGORY:" , '<input type="checkbox" name="CopyKategorien" value="1">');
    echo sprintf($form['table'], "COPY ARTICLE:" , '<input type="checkbox" name="CopyArtikel" value="1">');
    echo sprintf($form['table'], "" , '<input type="submit" name="submit" value="Just do it">');

    echo '</form>'."\n";

    page_close();
    die();
}
*** make your own tools (wishlist :: thx)

emergence
Beiträge: 10641
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Do 26. Aug 2004, 16:22

es gibt zeitweise im script konstruktion wie
$db->Record[1]=$blabla;

da ergibt sich nun das problem bei contenido versionen wenn sich die tabellen ändern...
einen großteil der nummerierungsachen kann man durch
$db->f("feldname"); ändern...
die direkte zuweisung kann man so leider nicht nachbessern...

ich überleg mir da noch ein anderes system, dann wäre das script unabhängig der contenido version und der db tabellen konstellation einsetzbar...
*** make your own tools (wishlist :: thx)

emergence
Beiträge: 10641
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Do 26. Aug 2004, 19:24

hier die version mit allen meinen änderungen
konstruktion wie $Record[0]= xx hab ich jetzt anders gelöst...

nun ist es mehr oder minder egal wie die tabelle aussieht...

Code: Alles auswählen

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

 * Dieses Script kopiert die Module, Layouts, Templates, Container und auf Wunsch auch Kategorien und Artikel
 * von einem Kunden (Mandanten) ($old_idclient) auf einen anderen (neuen) Mandanten ($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)
 * Wenn die Artikel kopiert werden auch folgende sichern
 * con_art
 * con_art_lang
 * con_cat_art
 */

/* Anleitung:
 * Kopiere die .php-Datei mit diesem Script in das Contenido-Verzeichnis
 * z.B. contenido/client_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. Abmelden von Contenido (falls noch eingeloggt)
 * 6. Script starten und optionen auswählen
 * FERTIG
 */

include_once ('./includes/config.php');
cInclude ("includes", 'functions.general.php');

$cfg["debug"]["backend_exectime"]["fullstart"]  = getmicrotime();

cInclude ("includes", 'functions.i18n.php');
cInclude ("includes", 'functions.api.php');
cInclude ("includes", 'functions.general.php');

cInclude ("includes", 'functions.database.php');

cInclude ("classes", 'class.xml.php');
cInclude ("classes", 'class.navigation.php');
cInclude ("classes", 'class.template.php');
cInclude ("classes", 'class.backend.php');
cInclude ("classes", 'class.notification.php');
cInclude ("classes", 'class.area.php');
cInclude ("classes", 'class.action.php');

cInclude ("classes", 'class.layout.php');
cInclude ("classes", 'class.treeitem.php');
cInclude ("classes", 'class.user.php');
cInclude ("classes", 'class.group.php');
cInclude ("classes", 'class.cat.php');
cInclude ("classes", 'class.client.php');
cInclude ("classes", 'class.inuse.php');
cInclude ("classes", 'class.table.php');

cInclude ("includes", 'functions.str.php');

page_open(array('sess' => 'Contenido_Session',
                'auth' => 'Contenido_Challenge_Crypt_Auth',
                'perm' => 'Contenido_Perm'));

i18nInit($cfg["path"]["contenido"].$cfg["path"]["locale"], $belang);
cInclude ("includes", 'cfg_language.inc.php');

class DB_Upgrade extends DB_Contenido {
}



/* Instanzen der DB_Contenido */
$db = new DB_Contenido;
$db2 = new DB_Contenido;
$db_str = new DB_Contenido;

$cfg["debug"]["backend_exectime"]["start"]  = getmicrotime();

/* con_sequence update */
updateSequence();

?>
<html>
<head>
    <title></title>
    <link rel="stylesheet" type="text/css" href="styles/contenido.css" />
    <script type="text/javascript" src="scripts/general.js"></script>
<style type="text/css">
<!--
/* Cascading Style Sheet */

BODY,P,TD { font-family : verdana, arial, helvetica, sans-serif; }
BODY,P,TD { font-size : 11px; }

A:active,A:link,A:visited { text-decoration : none; }
A:hover { text-decoration : underline; }

P { text-align : justify; line-height: 140%; }

.red  { color : #FF0000; }
.grey  { color : #333333; }
.white { color : #FFFFFF; }

-->
</style>
</head>
<body style="margin: 10px">
<p><b>CLIENT COPY</b></p>
<?php

$SessID = $sess->id;

$sql = "SELECT * FROM ".$cfg["tab"]["clients"]." ORDER BY idclient ASC";

$db->query($sql);
while ($db->next_record()) {
    $ArrClients[$db->f("idclient")] = $db->f("name");
}

$form['table'] = '<table><tr><td width="120" align="right">%s</td><td>%s</td></tr><table>';

$form['header'] = '<select name="%s">'."\n";
$form['footer'] = '</select>';

$form['select'] = '<option value="%s"%s>%s</option>'."\n";
$form['selected'] = ' selected="selected"';

if (is_array($ArrClients)) {
    foreach ($ArrClients as $key => $value) {
        if ($key == $old_idclient)
            $form['source'] .= sprintf($form['select'], $key, $form['selected'], $value);
        else
            $form['source'] .= sprintf($form['select'], $key, "", $value);

        if ($key == $new_idclient)
            $form['target'] .= sprintf($form['select'], $key, $form['selected'], $value);
        else
            $form['target'] .= sprintf($form['select'], $key, "", $value);

    }
}

$stop = false;

if (!isset($old_idclient) || !isset($new_idclient)) {
    echo "Bitte wählen Sie...";
    $stop = true;
}
if ($old_idclient == $new_idclient && !$stop) {
    echo "Man kann den Client nicht auf sich selbst kopieren.";
    $stop = true;
};

if ($stop) {

    echo '<form action="'.$PHP_SELF.'">'."\n";
    echo '<input type="hidden" name="contenido" value="'.$SessID.'">'."\n";

    echo sprintf($form['table'], "SOURCE:" ,sprintf($form['header'],"old_idclient").$form['source'].$form['footer']);
    echo sprintf($form['table'], "TARGET:" ,sprintf($form['header'],"new_idclient").$form['target'].$form['footer']);
    echo sprintf($form['table'], "COPY CATEGORY:" , '<input type="checkbox" name="CopyKategorien" value="1">');
    echo sprintf($form['table'], "COPY ARTICLE:" , '<input type="checkbox" name="CopyArtikel" value="1">');
    echo sprintf($form['table'], "" , '<input type="submit" name="submit" value="Just do it">');

    echo '</form>'."\n";

    page_close();
    die();
}

$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();
$ArrIdxNeuParentID=array();
$ArrIdxNeuPostID=array();
$ArrIdxNeuPreID=array();

/* Für die Artikel */
$ArrIdxAltArt=array();
$ArrIdxNeuArt=array();

/* Ermittle 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.")";

$db->query($sql); /* liefert Zeiger auf Ergebnisliste (Result Set)*/
while ($db->next_record())
{
    if ($db->f("idclient")==$new_idclient) $new_client_Name=trim($db->f("name"));
    if ($db->f("idclient")==$old_idclient) $old_client_Name=trim($db->f("name"));
}
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 color='#ff0000'>Fehler: <BR>".$Meldung."</font></h3><hr>";
    page_close();
    die(); /* Scriptausführung abbrechen */
}

if ($CopyArtikel==1 and $CopyKategorien==0)
{
    $Meldung="Artikel können nur kopiert werden wenn auch die Kategorien kopiert werden sollen. Die Ausführung wird abgebrochen.";
    echo "<hr><h3><font color='#ff0000'>Prüfen: <BR>".$Meldung."</font></h3><hr>";
    page_close();
    die(); /* 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 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."))";

$db->query($sql);
$merk_idlang_old=0;
$MandantNeuExist=0;

while($db->next_record())
{
    if ($db->f("idclient")==$old_idclient) $merk_idlang_old=$db->f("idlang"); /*Merke hier die SprachID des alten Mandanten */
    if ($db->f("idclient")==$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=$db->f("idlang"); /*Merke hier die SprachID des neuen Mandanten */
        echo "<h3><font color='#525169'>Spracheinstellung des neuen Mandanten existiert bereits (idlang = ".$merk_idlang_neu.")</font></h3>";
        echo "<hr>";
    } /*End If */
} /* End While */

echo "<h3><font 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.")";

    $db->query($sql);

    /* Nun der neue Eintrag in con_lang */
    $MyLangSeq = getSequenceId($cfg["tab"]["lang"]);

    $merk_idlang_neu = $MyLangSeq;

    $sql = "INSERT INTO ".$cfg["tab"]["lang"]." VALUES ('".$merk_idlang_neu."'";
    $db->next_record();
    for ($i=1;$i<$db->num_fields();$i++)
    {
        $sql = $sql .",";
        $cont = $db->Record[$i];
        $cont = str_replace('\\','\\\\',$cont);
        $cont = str_replace('"','\"',$cont);

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

    $db2->query($sql); /* Erzeuge hier neuen Datensatz in Tabelle con_lang */

    /*Korrigiere nun noch die Werte in der Tabelle con_sequences */
    updateSequence($cfg["tab"]["lang"]);

    /* Nun der neue Eintrag in con_clients_lang */
    $MyClientsLangSeq = getSequenceId($cfg["tab"]["clients_lang"]);

    $sql = "INSERT INTO ".$cfg["tab"]["clients_lang"]." VALUES ('".$MyClientsLangSeq."', '".$new_idclient."', '".$merk_idlang_neu."')";


    $db2->query($sql); /* Erzeuge hier neuen Datensatz in Tabelle con_lang */

    /*Korrigiere nun noch die Werte in der Tabelle con_sequences */
    updateSequence($cfg["tab"]["clients_lang"]);

    echo "<h3><font 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 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;

$db->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 aktuellen Index-Wert für die Tabelle con_mod aus */
$MyModSeq = getSequenceId($cfg["tab"]["mod"]);

$lauf=0;
/* $db->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 color='#525169'>Kopiere die folgenden Module:</font></h2>";
while($db->next_record())
{
    echo "<font color='#000000'>".$db->f("name")."</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."'";

    /*Merke im Array $ArrIdxAltModul[] den Index (idmod) der Module des alten Mandanten */
    $ArrIdxAltModul[]=$db->f("idmod");
    /*Merke im Array $ArrIdxNeuModul[] den Index (idmod) der Module des neuen Mandanten */
    $ArrIdxNeuModul[]=$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<$db->num_fields();$i++)
    {
        $sql = $sql .",";
        $cont = $db->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 */
}

/*Korrigiere nun noch die Werte in der Tabelle con_sequences */
updateSequence($cfg["tab"]["mod"]);

echo "<h3><font 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;

$db->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 aktuellen Index-Wert für die Tabelle con_mod aus */
$MyLaySeq = getSequenceId($cfg["tab"]["lay"]);

$lauf=0;
echo "<hr><h2><font color='#525169'>Kopiere die folgenden Layouts:</font></h2>";
while($db->next_record())
{
    echo "<font color='#000000'>".$db->f("name")."</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."'";

    /*Merke im Array $ArrIdxAltLayout[] den Index (idlay) der Layouts des alten Mandanten */
    $ArrIdxAltLayout[]=$db->f("idlay");
    /*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<$db->num_fields();$i++)
    {
        $sql = $sql .",";
        $cont = $db->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 */
}

/*Korrigiere nun noch die Werte in der Tabelle con_sequences */
updateSequence($cfg["tab"]["lay"]);

echo "<h3><font 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 aktuellen Index-Wert für die Tabelle con_template aus */
$MyTplSeq = getSequenceId($cfg["tab"]["tpl"]);
$MyTplConfSeq = getSequenceId($cfg["tab"]["tpl_conf"]);

/* ermittel alle Templates des zu kopierenden Kunden */
$sql = "SELECT * from ".$cfg["tab"]["tpl"]." where idclient=".$old_idclient." order by idtpl";

$db->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($db->next_record())
{
    /*Merke im Array $ArrIdxAltLayout[] den Index (idlay) der Layouts des alten Mandanten */
    $ArrIdxAltTpl[]=$db->f("idtpl");
    $ArrIdxNeuTpl[]=$MyTplSeq;
    $MyTplSeq++; /* erhöhe um 1 */

    $ArrIdxAltTplConf[]=$db->f("idtplcfg");
    $ArrIdxNeuTplConf[]=$MyTplConfSeq;
    $MyTplConfSeq++; /* erhöhe um 1 */
}

/* 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";

$db->query($sql); /* liefert Zeiger auf Ergebnisliste (Result Set)*/

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

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

    /* dito für idtplconf */
    $ArrPosTplConf=array_search($db->f("idtplcfg"), $ArrIdxAltTplConf);

    $sql = "INSERT INTO ".$cfg["tab"]["tpl"]." VALUES ('".$new_idclient."'";

    // new way to modify values
    unset($modifyValue);
    $modifyValue["idlay"] = $ArrIdxNeuLayout[$ArrPosLay];
    $modifyValue["idtpl"] = $ArrIdxNeuTpl[$ArrPosTpl];
    $modifyValue["idtplcfg"] = $ArrIdxNeuTplConf[$ArrPosTplConf];
    changeDbRecord($cfg["tab"]["tpl"], $modifyValue);

    echo "<font color='#000000'>".$db->f("name")."</font><BR>";

    for ($i=1;$i<$db->num_fields();$i++)
    {
        $sql = $sql .",";
        $cont = $db->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 */
updateSequence($cfg["tab"]["tpl"]);
updateSequence($cfg["tab"]["tpl_conf"]);

echo "<h3><font 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 color='#525169'>Kopiere die Container:</font></h2>";

$sql = "SELECT * from ".$cfg["tab"]["container"]." order by idtpl";

$db->query($sql); /* liefert Zeiger auf Ergebnisliste (Result Set)*/

/* Ermittel aus der Tabelle sequences den max. Index von con_container */
$MyContainerSeq = getSequenceId($cfg["tab"]["container"]);

$lauf=0;

while($db->next_record())
{
    /* Lese nun idtpl aus und stelle fest, wo dieser idtpl im Array der alten Indizes steht (in ArrIdxAltTpl[]) */
    $ArrPosTpl=array_search($db->f("idtpl"), $ArrIdxAltTpl);

    if ($ArrPosTpl!==False)
    { /* if */
        $lauf++;
        $ArrPosModul=array_search($db->f("idmod"), $ArrIdxAltModul);

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

        // new way to modify values
        unset($modifyValue);
        $modifyValue["idtpl"] = $ArrIdxNeuTpl[$ArrPosTpl];
        if ($db->f("idmod") != 0) {
            $modifyValue["idmod"] = $ArrIdxNeuModul[$ArrPosModul];
        }
        changeDbRecord($cfg["tab"]["container"], $modifyValue);

        for ($i=1;$i<$db->num_fields();$i++)
        {
            $sql = $sql .",";
            $cont = $db->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 */
updateSequence($cfg["tab"]["container"]);

echo "<h3><font 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 color='#525169'>Kopiere die Container_Conf:</font></h2>";

$sql = "SELECT * FROM ".$cfg["tab"]["container_conf"]." Order by idtplcfg ";

$db->query($sql); /* liefert Zeiger auf Ergebnisliste (Result Set)*/

/* Ermittel aus der Tabelle sequences den max. Index von con_container_conf */
$MyContainerConfSeq = getSequenceId($cfg["tab"]["container_conf"]);

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

        // new way to modify values
        unset($modifyValue);
        $modifyValue["idtplcfg"] = $ArrIdxNeuTplConf[$ArrPosTplConf];
        changeDbRecord($cfg["tab"]["container_conf"], $modifyValue);

        for ($i=1;$i<$db->num_fields();$i++)
        {
            $sql = $sql .",";
            $cont = $db->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 */
updateSequence($cfg["tab"]["container_conf"]);

echo "<h3><font 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>";

/* Die Container sind nur an den Index der Templates gebunden, nicht direkt an die idClient, also nicht direkt an den Mandanten */

/*****************************************************************************************/
/*KATEGORIEN kopieren */
if ($CopyKategorien==1)
{

    echo "<hr><h2><font 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";

    $db->query($sql); /* liefert Zeiger auf Ergebnisliste (Result Set)*/

    /* Ermittel den nächsten gültigen Index für idcat aus der Tabelle con_sequences */
    $MyKatSeq = getSequenceId($cfg["tab"]["cat"]);

    /* 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($db->next_record())
    {
        if ($db->f("idcat")==0)
        {
            $neueCatid=0;
        } else {
            $neueCatid=$MyKatSeq;
            $MyKatSeq++; /* erhöhe um 1 */
        }

        $ArrIdxAltKat[]=$db->f("idcat"); /* 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[]=$db->f("parentid"); /* Spalte parentid */
        $ArrIdxAltPreID[]=$db->f("preid"); /* Spalte preid */
        $ArrIdxAltPostID[]=$db->f("postid"); /* Spalte postid */

        $sql = "INSERT INTO ".$cfg["tab"]["cat"]." VALUES ('".$neueCatid."', '".$new_idclient."'";
        for ($i=2;$i<$db->num_fields();$i++)
        {
            $sql = $sql .",";
            $cont = $db->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[i] */
            $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[i] */
            $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[i] */
            $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 */
    updateSequence($cfg["tab"]["cat"]);

    echo "<h3><font 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 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";

    $db->query($sql); /* liefert Zeiger auf Ergebnisliste (Result Set)*/

    /* Ermittel den nächsten gültigen Index für idcatlang aus der Tabelle con_sequences */
    $MyKatLangSeq = getSequenceId($cfg["tab"]["cat_lang"]);

    while($db->next_record())
    {
        /* Lese nun ids aus und stelle fest, wo diese im Array der alten Indizes stehen */
        $ArrPosKat=array_search($db->f("idcat"), $ArrIdxAltKat);

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

        // new way to modify values
        unset($modifyValue);
        $modifyValue["idcat"] = $ArrIdxNeuKat[$ArrPosKat]; /* Die korrespondierende neue idcat */

        if ($db->f("idtplcfg") != 0) /*Wenn idtplcfg=0 dann ist Kategorie nicht konfiguriert, behalte dann die 0*/
        {
            $ArrPosTplConf=array_search($db->f("idtplcfg"), $ArrIdxAltTplConf);
            if ($ArrPosTplConf!==False) $modifyValue["idtplcfg"] = $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 */
        $modifyValue["idlang"] = $merk_idlang_neu;

        changeDbRecord($cfg["tab"]["cat_lang"], $modifyValue);

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

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

        $sql = $sql .")";

        $db2->query($sql);

        $MyKatLangSeq++;

    } /* End While */

    /*Korrigiere nun noch die Werte in der Tabelle con_sequences */
    updateSequence($cfg["tab"]["cat_lang"]);

    echo "<h3><font color='#525169'>Die Bezeichnungen der Kategorien wurden kopiert.</font></h3>";
    echo "<hr>";

    /* 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 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>";

} /* End if von if ($CopyKategorien==1) */

/*****************************************************************************************/
/*ARTIKEL kopieren*/
if ($CopyArtikel==1 and $CopyKategorien==1)
{
    echo "<h3><font color='#525169'>Kopiere nun alle Artikel</font></h3>";
    /* ermittel alle Artikel des zu kopierenden Kunden */
    $sql = "SELECT * from ".$cfg["tab"]["art"]." where idclient=".$old_idclient." order by idart";
    $db->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 aktuellen Index-Wert für die Tabelle con_art aus */
    $MyArtSeq = getSequenceId($cfg["tab"]["art"]);

    $lauf=0;
    /* $db->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 color='#525169'>Kopiere die folgenden Artikel:</font></h2>";
    while($db->next_record())
    {
        $lauf++;
        /*Merke im Array den Index (idart) der Artikel des alten Mandanten */
        $ArrIdxAltArt[]=$db->f("idart");
        /*Merke im Array $ArrIdxNeuArt[] den Index (idart) der Artikel des neuen Mandanten */
        $ArrIdxNeuArt[]=$MyArtSeq;
        /*Das Merken im Array ist nötig um später noch zu wissen welche alte idart welcher neuen idart entspricht*/

        $sql = "INSERT INTO ".$cfg["tab"]["art"]." VALUES (".$MyArtSeq.", ".$new_idclient."";
        $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 */
        $MyArtSeq++; /* erhöhe um 1 */
    }

    /* schreibe nun den letzten wert von $MyArtSeq bei con_mod in die Tabelle con_sequence */
    updateSequence($cfg["tab"]["art"]);

    echo "<h3><font color='#525169'>Es wurden ".$lauf." neue Einträge in der Tabelle >".$cfg["tab"]["art"]."< erzeugt.</font></h3>";
    echo "<hr>";

    /* Jetzt noch die Einträge der Tabelle con_art_lang erzeugen - hier stehen die eigentlichen Artikelinhalte */
    /**************Tabelle CON_ART_LANG************************************************************************************************************/
    echo "<h3><font color='#525169'>Erzeuge nun mit diesen neuen Einträgen die neuen Texte der Artikel (Tabelle >".$cfg["tab"]["art_lang"]."<)</font></h3>";
    /* ermittel alle Einträge des zu kopierenden Kunden */
    $sql = "SELECT * from ".$cfg["tab"]["art_lang"]." where idlang = ".$merk_idlang_old."";
    $db->query($sql); /* liefert Zeiger auf Ergebnisliste (Result Set)*/
    $lauf=0;
    while($db->next_record())
    {

        /* Lese nun idart aus und stelle fest, wo dieser idart im Array der alten Indizes steht (in ArrIdxAltArt[]) */
        $ArrPosArt=array_search($db->f("idart"), $ArrIdxAltArt);
        if ($ArrPosArt!==False) /* Nötig, weil in con_art_lang auch Artikel andere Mandanten der gleichen Sprche stehen könnten */
        {

            echo "<font color='#000000'>Kopiere Artikel ".$db->f("title")."</font><BR>";
            $lauf++;

            // new way to modify values
            unset($modifyValue);

            if ($db->f("idtplcfg") != 0) /*Wenn idtplcfg=0 dann ist Kategorie nicht konfiguriert, behalte dann die 0*/
            {
                $ArrPosTplConf=array_search($db->f("idtplcfg"), $ArrIdxAltTplConf);
                if ($ArrPosTplConf!==False) $modifyValue["idtplcfg"] = $ArrIdxNeuTplConf[$ArrPosTplConf]; /* Die korrespondierende neue idtplcfg */
            }

            $sql = "INSERT INTO ".$cfg["tab"]["art_lang"]." VALUES (".$ArrIdxNeuArt[$ArrPosArt].", ".$ArrIdxNeuArt[$ArrPosArt].", ".$merk_idlang_neu."";

            /* im Feld time_target_cat steht die Kategorie in die nach Zeitablauf der Artikel verschoben wird. Diese ist für den neuen Mandanten auch noch anzupassen */
            $ArrPosKat=array_search($db->f("time_target_cat"), $ArrIdxAltKat);
            $modifyValue["time_target_cat"] = $ArrIdxNeuKat[$ArrPosKat];

            changeDbRecord($cfg["tab"]["art_lang"], $modifyValue);

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

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

            $db2->query($sql);
        }
    }
    echo "<h3><font color='#525169'>Es wurden ".$lauf." neue Einträge in der Tabelle >".$cfg["tab"]["art_lang"]."< erzeugt.</font></h3><BR>";
    echo "<h3><font color='#525169'>Kopiere nun die Zuordnungen der Artikel zu den Kategorien (Tabelle >".$cfg["tab"]["cat_art"]."<)</font></h3>";
    $sql = "SELECT * from ".$cfg["tab"]["cat_art"]." order by idart";
    $db->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 aktuellen Index-Wert für die Tabelle con_cat_art aus */
    $MyCatArtSeq = getSequenceId($cfg["tab"]["cat_art"]);

    $lauf=0;
    while($db->next_record())
    {
        /* Lese nun idart aus und stelle fest, wo dieser idart im Array der alten Indizes steht (in ArrIdxAltArt[]) */
        $ArrPosArt=array_search($db->f("idart"), $ArrIdxAltArt);
        if ($ArrPosArt!==False) /* Nötig, weil in con_cat_art auch Artikel anderer Mandanten der gleichen Sprache stehen könnten */
        {
            $lauf++;
            $ArrPosKat=array_search($db->f("idcat"), $ArrIdxAltKat);
            $sql = "INSERT INTO ".$cfg["tab"]["cat_art"]." VALUES (".$MyCatArtSeq.", ".$ArrIdxNeuKat[$ArrPosKat].", ".$ArrIdxNeuArt[$ArrPosArt]."";

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

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

            $db2->query($sql);
            $MyCatArtSeq++;
        }
    }

    /*Korrigiere nun noch die Werte in der Tabelle con_sequences */
    updateSequence($cfg["tab"]["cat_art"]);

    echo "<h3><font color='#525169'>Die Artikel wurden kopiert.</font></h3>";
    echo "<hr>";
} /* End if von ($CopyArtikel==1 and $CopyKategorien==1) */


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

/* con_sequence update */
updateSequence();

echo "<br><font color='#FF0022'>con_sequence wurde upgedated.</font>";



?>
</body>
</html>
<?php


// simple function to update con_sequence
function updateSequence($table=false) {

    global $db, $cfg;
    if (!$table) {
        $sql = "SHOW TABLES";
        $db->query($sql);
        while ($db->next_record())
        {
            dbUpdateSequence($cfg['sql']['sqlprefix']."_sequence", $db->f(0));
        }
    } else {
        dbUpdateSequence($cfg['sql']['sqlprefix']."_sequence", $table);
    }
}

// read out next free id
function getSequenceId($table) {

    global $db2, $cfg;

    $sql= "SELECT nextid FROM ".$cfg['sql']['sqlprefix']."_sequence"." where seq_name = '$table'";
    $db2->query($sql);
    if ($db2->next_record()) {
        return $db2->f("nextid");
    } else {
        return 0;
    }
}

// change $db Record by name
//
// modify values of $db record by name
// $table specifies the table name
// $valueArray must be an Array with
// syntax $valueArray["fieldname"] = "new value";
//
// @author horwath@dayside.net
function changeDbRecord($table, $valueArray) {

    global $db, $db2;

    // $db2 muss hier verwendet werden !!
    $values = $db2->metadata($table);

    // get field names and position
    $pos = 0;
    foreach ($values as $key) {
        $thisPosition[$key["name"]] = $pos;
        $pos++;
    }

    if ($pos==0) {
        echo "no field names found in table";
        die();
    }

    // modify $db->Record[]
    foreach ($valueArray as $name => $value) {

        if (!isset($thisPosition[$name])) {
            echo "sorry this $name does not exist in definied table<br>\n";
            echo "available fields in table: <b>".$table."</b><br>\n";
            echo "<pre>";
            print_r($thisPosition);
            echo "</pre>";
            die();
        } else {
            if (isset($db->Record[$thisPosition[$name]])) {
               // change field value
               $db->Record[$thisPosition[$name]] = $value;
            } else {
               echo "\$db->Record[".$thisPosition[$name]."] is not set<br>";
               echo "tried to change table :".$table;
               die();
            }
        }

    }
}

$cfg["debug"]["backend_exectime"]["end"] = getmicrotime();

if ($cfg["debug"]["rendering"] == true)
{
    echo "Rendering this page took: " . ($cfg["debug"]["backend_exectime"]["end"] - $cfg["debug"]["backend_exectime"]["start"])." seconds<br>";
    echo "Building the complete page took: " . ($cfg["debug"]["backend_exectime"]["end"] - $cfg["debug"]["backend_exectime"]["fullstart"])." seconds<br>";

    if (function_exists("memory_get_usage"))
    {
        echo "Include memory usage: ".human_readable_size(memory_get_usage()-$cfg["debug"]["oldmemusage"])."<br>";
        echo "Complete memory usage: ".human_readable_size(memory_get_usage())."<br>";

    }

}
page_close();
?>
*** make your own tools (wishlist :: thx)

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

Beitrag von Axel » Fr 27. Aug 2004, 09:57

Sieht gut aus. Hab im Moment leider keine Zeit zum Testen, bin aber sicher, dass es immer noch läuft :wink:
Die Frontendseite ist doch prima. Hoffe das ich Dienstag zum testen komme...

bartekk
Beiträge: 103
Registriert: Mo 14. Jul 2003, 15:43
Kontaktdaten:

Beitrag von bartekk » Fr 1. Okt 2004, 19:31

Hallo Axel & emergence.

habe gerade das Script benutzt und es sieht gut aus. Top. Habe sowohl Kategorien als auch Artikel mit kopiert.
Ein Problem habe ich noch. Wenn ich die "neue" Frontend Seite auf mache kommt folgender Fehler:

Code: Alles auswählen

Warning: main(!PATH!includes/config.php): failed to open stream: No such file or directory in /home/www/web572/html/test/front_content.php on line 17

Warning: main(): Failed opening '!PATH!includes/config.php' for inclusion (include_path='.') in /home/www/web572/html/test/front_content.php on line 17

Fatal error: Call to undefined function: cinclude() in /home/www/web572/html/test/front_content.php on line 18
wo liegt jetzt das Problem? Kann mir jemand Helfen?

meine Con Umgebung:

Serverbetriebssystem Apache
MySQL Serverversion 4.0.18-standard
Installierte PHP-Version 4.3.9
safe_mode Aktiviert

Außerdem habe ich aus versehen das Script 2 mal ausgeführt und nun sind alle Einträge wie Kategorien, Artikel, Module, templates etc. doppelt da.

Hat jemand ne Idee oder ähnliches Problem gelöst?

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

Beitrag von Axel » Mo 4. Okt 2004, 13:36

Hy bartekk,

Zeile 17 lautet include_once ($contenido_path . "includes/config.php");
Wenn dieser Aufruf den geschilderten Fehler produziert, dann vermute ich ein "simples" Berechtigungsproblem auf dem Webserver (also keine Contenido Benutzerrechte sondern Datei-zugriffsrechte auf dem Server).
Ich bin nicht sicher, welche Rechte zu setzen sind, bin aber ziemlich sicher dass es funktionieren würde wenn du auf das include-Verzeichnis volle Zugriffsrechte setzt.

Das die Einträge doppelt da sind ist eigentlich völlig richtig, denn du hast das Script doppelt ausgeführt und Contenido identifiziert einen Mandanten nicht am Namen sondern am Index...du must wohl bei einem Mandanten alles manuell löschen...

emergence
Beiträge: 10641
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Mo 4. Okt 2004, 14:06

ich denke du musst einfach nur den pfad zu contenido in deinem neuen mandanten verzeichniss anpassen..
mandant/config.php
steht bei dir am anfang der datei vermutlich nur folgendes

Code: Alles auswählen

//path to contenido, for all inclusions
$contenido_path = "!PATH!";

//optional if it isnt set the first language of the client is choose
$load_lang = "!LANG!";
$load_client = "!CLIENT!";
der platzhalter !PATH! sollte ersetzt werden eventuell durch ../contenido/
oder je nachdem wo sich dein backend relativ zum mandanten verzeichniss befindet...
!LANG! -> sprachid deines neuen mandanten
!CLIENT! -> id deines neuen mandanten...

deine fehlermeldung sagt mir nämlich nur, dass du das nicht angepasst hast...
*** make your own tools (wishlist :: thx)

bartekk
Beiträge: 103
Registriert: Mo 14. Jul 2003, 15:43
Kontaktdaten:

Beitrag von bartekk » Mo 4. Okt 2004, 14:15

Danke, das wars.

sowohl der Pfad zu contenido, als auch zu dem Client und Lang war nicht richtig gesetzt.

Danke schön!

@Axel: Zum Glück habe ich ein Backup der Datenbank gemacht und mußte die doppelten Einträge nicht per Hand raus nehmen. Einfach nochmal alles aufgespielt.

bartekk
Beiträge: 103
Registriert: Mo 14. Jul 2003, 15:43
Kontaktdaten:

Beitrag von bartekk » Mo 4. Okt 2004, 15:00

Tja, zu früh gefreut.

ich habe jetzt alles kopiert und nun funktionieren die Pfade nicht.

Also ich habe 2 Mandanten. Und wenn ich irgendetwas im admin bereich verändern will, kommt eine Nachricht der link ist nicht vorhanden. Ich komme bei den Artikeln nicht auf den Editor oder die Vorschau.

Ich denke daß es irgendwie an den Pfadeinstellungen liegt, nur im Errorlog wird nix angezeigt.

Hier meine Einstellungen:

Code: Alles auswählen

Contenido-Version  	                       4.4.4
Contenido-Pfad 	                            /home/www/web572/html/mandant1/contenido/
Contenido-HTML-Pfad 	                   contenido/
Contenido HTML-Pfad 	                   http://www.meineseite.de/mandant1/contenido/
Frontend-Pfad 	                              /home/www/web572/html/mandant1
Contenido PHPLib-Pfad 	                  /home/www/web572/html/mandant1/conlib/
Contenido WYSIWYG-Pfad 	            /home/www/web572/html/mandant1/contenido/external/wysiwyg/spaw/
Contenido WYSIWYG HTML-Pfad 	    http://www.meineseite.de/mandant1/contenido/external/wysiwyg/spaw/
Hostname 	                                  www.meineseite.de
Browser-Pfad 	                              http://www.meineseite.de/mandant1/contenido/


Mandanteninformationen 	Anzahl der Mandanten:2
Mandanten-Einstellungen 	Werte
mandant2
Sprache(n) 	deutsch 
HTM-Pfad 	http://www.meineseite.de/mandant2
frontend-Pfad 	/home/www/web572/html/mandant2/ 
mandant1
Sprache(n) 	deutsch 
HTM-Pfad 	http://www.meineseite.de/mandant1
frontend-Pfad 	/home/www/web572/html/mandant1/ 
Weiß nicht genau welche einstelung dazu führt, daß ich nix mehr machen kann.

Das was auf der Condenido FAQ Seite steht habe ich auch geprüft. Die angaben in der config.php des jeweiligen Mandanten stimmen.
Zuletzt geändert von bartekk am Mo 4. Okt 2004, 18:03, insgesamt 1-mal geändert.

emergence
Beiträge: 10641
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Mo 4. Okt 2004, 15:55

etwas intressante pfad konstellation die du da hast...

dein backend befindet sich im verzeichniss vom mandant 1 ???

im normalfall würd ich es so machen

http://www.meineseite.de/contenido/ * alle backend dateien
contenido/includes/config.php
Contenido path /home/www/web572/html/contenido/
Contenido HTML path ../contenido/
Contenido full HTML path http://www.meineseite.de/contenido/

Contenido frontend path /home/www/web572/html/
Contenido PHPLIB path /home/www/web572/html/conlib/
Contenido wysiwyg path /home/www/web572/html/contenido/external/wysiwyg/spaw/
Contenido wysiwyg HTML path http://www.meineseite.de/contenido/exte ... iwyg/spaw/

http://www.meineseite.de/mandant1/ * nur mandant 1
HTM-Pfad http://www.meineseite.de/mandant1/
frontend-Pfad /home/www/web572/html/mandant1/

http://www.meineseite.de/mandant2/ * nur mandant 2
HTM-Pfad http://www.meineseite.de/mandant2/
frontend-Pfad /home/www/web572/html/mandant2/
*** make your own tools (wishlist :: thx)

Gesperrt