* @license http://www.contenido.org/license/LIZENZ.txt * @link http://www.4fb.de * @link http://www.contenido.org * @since file available since contenido release <= 4.6 * * {@internal * created 2002-03-02 * modified 2008-06-26, Frederic Schneider, add security fix * modified 2008-08-29, Murat Purc, add new chain execution * modified 2008-09-03, Hotfix recursive call more than 200 times exit script on hosteurope Timo.Trautmann (strRemakeTreeTableFindNext) * modified 2008-10-29, delete from cat_tree only for one Cliente OliverL (strRemakeTreeTable) * modified 2008-11-03, Add cat_tree only for one Cliente OliverL (strRemakeTreeTable) * modified 2009-05-05, Timo Trautmann - optional use for copy label on copy proccess * modified 2009-10-14, Dominik Ziegler - changed functionality of strMoveSubtree and strMoveCatTargetallowed to prevent crashing tree on moving * modified 2009-10-23, Murat Purc, removed deprecated function (PHP 5.3 ready), commenting code and some formatting * modified 2009-10-27, Murat Purc, fixed/modified CEC_Hook, see [#CON-256] * modified 2010-01-30, Ingo van Peeren, modified strRemakeTreeTable() to pass only one INSERT statement to the database, see [#CON-299] * modified 2010-03-12, Ingo van Peeren, fixed a bug with last change if more than one client exist [#CON-299] * modified 2010-06-18, Ingo van Peeren, fixed some issues with next id and order of con_cat_tree entries * modified 2010-09-17, Ingo van Peeren, fixed some issues wrong level information causing garbled tree [#CON-348] * modified 2010-10-13, Dominik Ziegler, No copy label per default when copying articles or categories (CON-352) * * $Id: functions.str.php 312 2014-06-18 11:01:08Z oldperl $: * }} * */ if(!defined('CON_FRAMEWORK')) { die('Illegal call'); } /********************************************************************************* Functions strNewTree($catname) strNewCategory($tmp_parentid, $catname) strOrderedPostTreeList ($idcat, $poststring) strRemakeTreeTable() strNextDeeper($tmp_idcat) strNextPost($tmp_idcat) strNextBackwards($tmp_idcat) strRemakeTreeTableFindNext($tmp_idcat,$tmp_level) strShowTreeTable() strRenameCategory ($idcat, $lang, $newcategoryname) strMakeVisible ($idcat, $lang, $visible) strMakePublic ($idcat, $lang, $public) strDeleteCategory ($idcat) strMoveUpCategory ($idcat) strMoveDownCategory ($idcat) strMoveSubtree ($idcat, $parentid_new) strMoveCatTargetallowed($idcat, $source) ********************************************************************************/ cInclude("includes", "functions.con.php"); cInclude("includes", "functions.database.php"); global $db_str; global $db_str2; if (class_exists("DB_ConLite")) { $db_str = new DB_ConLite(); $db_str2 = new DB_ConLite(); } /** * Creates a new category tree (root category item). * * @param string $catname The category name * @param string $catalias Alias of category * @param bool $bVisible Flag about visible status * @param bool $bPublic Flag about public status * @param int $iIdtplcfg Id of template configuration * @return (int|void) Id of new generated category or nothing on failure */ function strNewTree($catname, $catalias = '', $bVisible = 0, $bPublic = 1, $iIdtplcfg = 0) { global $db; global $client; global $lang; global $cfg; global $area_tree; global $sess; global $perm; global $area_rights; global $item_rights; global $_SESSION; // Flag to rebuild the category table global $remakeCatTable; global $remakeStrTable; global $auth; $remakeCatTable = true; $remakeStrTable = true; $db2= new DB_ConLite; if (trim($catname) == "") { return; } $catalias = trim($catalias); if ($catalias == "") { $catalias = trim($catname); } $tmp_newid = $db->nextid($cfg["tab"]["cat"]); if ($tmp_newid == 0) { return; } if ($perm->have_perm_area_action("str_tplcfg", "str_tplcfg")) { $iIdtplcfg = (int) $iIdtplcfg; } else { $iIdtplcfg = 0; } $bVisible = (int) $bVisible; if (! (($bVisible == 0 || $bVisible == 1) && $perm->have_perm_area_action('str', "str_makevisible")) ) { $bVisible = 0; } $bPublic = (int) $bPublic; if (! (($bPublic == 0 || $bPublic == 1) && $perm->have_perm_area_action('str', "str_makepublic")) ) { $bPublic = 1; } $sql = "SELECT idcat FROM ".$cfg["tab"]["cat"]." WHERE parentid='0' AND postid='0' AND idclient='".Contenido_Security::toInteger($client)."'"; $db->query($sql); $db->next_record(); $tmp_id = $db->f("idcat"); $a_languages[] = $lang; if (is_array($a_languages)) { if (!$tmp_id) { //********** Entry in 'cat'-table ************ $sql = "INSERT INTO ".$cfg["tab"]["cat"]." (idcat, preid, postid, idclient, author, created, lastmodified) VALUES('".Contenido_Security::toInteger($tmp_newid)."', '0', '0', '".Contenido_Security::toInteger($client)."', '".Contenido_Security::escapeDB($auth->auth['uname'], $db)."', '".date("Y-m-d H:i:s")."', '".date("Y-m-d H:i:s")."')"; $db->query($sql); //********* enter name of cat in 'cat_lang'-table ****** foreach ($a_languages as $tmp_lang) { if ($tmp_lang == $lang) { $sql = "INSERT INTO ".$cfg["tab"]["cat_lang"]." (idcatlang, idcat, idlang, name, visible, public, idtplcfg, urlname, author, created, lastmodified) VALUES('".Contenido_Security::toInteger($db->nextid($cfg["tab"]["cat_lang"]))."', '".Contenido_Security::toInteger($tmp_newid)."', '".Contenido_Security::toInteger($tmp_lang)."', '".clHtmlSpecialChars($catname, ENT_QUOTES)."', '".Contenido_Security::toInteger($bVisible)."', '".Contenido_Security::toInteger($bPublic)."', '0', '".clHtmlSpecialChars(capiStrCleanURLCharacters($catalias), ENT_QUOTES)."', '".Contenido_Security::escapeDB($auth->auth['uname'], $db)."', '".date("Y-m-d H:i:s")."', '".date("Y-m-d H:i:s")."')"; $db->query($sql); } else { $sql = "INSERT INTO ".$cfg["tab"]["cat_lang"]." (idcatlang, idcat, idlang, name, visible, public, idtplcfg, urlname, author, created, lastmodified) VALUES('".Contenido_Security::toInteger($db->nextid($cfg["tab"]["cat_lang"]))."', '".Contenido_Security::toInteger($tmp_newid)."', '".Contenido_Security::toInteger($tmp_lang)."', '".clHtmlSpecialChars($catname, ENT_QUOTES)."', '".Contenido_Security::toInteger($bVisible)."', '".Contenido_Security::toInteger($bPublic)."', '0', '".clHtmlSpecialChars(capiStrCleanURLCharacters($catalias), ENT_QUOTES)."', '".Contenido_Security::escapeDB($auth->auth['uname'], $db)."', '".date("Y-m-d H:i:s")."', '".date("Y-m-d H:i:s")."')"; $db->query($sql); } } } else { //********** Entry in 'cat'-table ************ $sql = "UPDATE ".$cfg["tab"]["cat"]." SET postid='$tmp_newid' WHERE idcat='".Contenido_Security::toInteger($tmp_id)."'"; $db->query($sql); //********** Entry in 'cat'-table ************ $sql = "INSERT INTO ".$cfg["tab"]["cat"]." (idcat, preid, postid, idclient, author, created, lastmodified) VALUES('".Contenido_Security::toInteger($tmp_newid)."', '".Contenido_Security::toInteger($tmp_id)."', '0', '".Contenido_Security::toInteger($client)."', '".Contenido_Security::escapeDB($auth->auth['uname'], $db)."', '".date("Y-m-d H:i:s")."', '".date("Y-m-d H:i:s")."')"; $db->query($sql); //********* enter name of cat in 'cat_lang'-table ****** foreach ($a_languages as $tmp_lang) { if ($tmp_lang == $lang) { $sql = "INSERT INTO ".$cfg["tab"]["cat_lang"]." (idcatlang, idcat, idlang, name, visible, public, idtplcfg, urlname, author, created, lastmodified) VALUES('".Contenido_Security::toInteger($db->nextid($cfg["tab"]["cat_lang"]))."', '".Contenido_Security::toInteger($tmp_newid)."', '".Contenido_Security::toInteger($tmp_lang)."', '".clHtmlSpecialChars($catname, ENT_QUOTES)."', '".Contenido_Security::toInteger($bVisible)."', '".Contenido_Security::toInteger($bPublic)."', '0', '".clHtmlSpecialChars(capiStrCleanURLCharacters($catalias), ENT_QUOTES)."', '".Contenido_Security::escapeDB($auth->auth['uname'], $db)."', '".date("Y-m-d H:i:s")."', '".date("Y-m-d H:i:s")."')"; $db->query($sql); } else { $sql = "INSERT INTO ".$cfg["tab"]["cat_lang"]." (idcatlang, idcat, idlang, name, visible, public, idtplcfg, urlname, author, created, lastmodified) VALUES('".Contenido_Security::toInteger($db->nextid($cfg["tab"]["cat_lang"]))."', '".Contenido_Security::toInteger($tmp_newid)."', '".Contenido_Security::toInteger($tmp_lang)."', '".clHtmlSpecialChars($catname, ENT_QUOTES)."', '".Contenido_Security::toInteger($bVisible)."', '".Contenido_Security::toInteger($bPublic)."', '0', '".clHtmlSpecialChars(capiStrCleanURLCharacters($catalias), ENT_QUOTES)."', '".Contenido_Security::escapeDB($auth->auth['uname'], $db)."', '".date("Y-m-d H:i:s")."', '".date("Y-m-d H:i:s")."')"; $db->query($sql); } } } // set correct rights for element cInclude ("includes", "functions.rights.php"); foreach ($a_languages as $tmp_lang) { createRightsForElement("str", $tmp_newid, $tmp_lang); createRightsForElement("con", $tmp_newid, $tmp_lang); } } /* Search for default template */ $templateCollection = new cApiTemplateCollection("defaulttemplate = '1' AND idclient = '".Contenido_Security::toInteger($client)."'"); if ($template = $templateCollection->next()) { $idtpl = $template->get("idtpl"); if ($iIdtplcfg > 0) { $idtpl = $iIdtplcfg; } /* Assign template, if default template exists */ $catCollection = new cApiCategoryLanguageCollection("idcat = '".Contenido_Security::toInteger($tmp_newid)."'"); while ($cat = $catCollection->next()) { $cat->assignTemplate($idtpl); } } else { //2008-06-25 timo.trautmann also set default template if it is selcted by user and there is no default template if ($iIdtplcfg > 0) { $idtpl = $iIdtplcfg; $catCollection = new cApiCategoryLanguageCollection("idcat = '$tmp_newid'"); while ($cat = $catCollection->next()) { $cat->assignTemplate($idtpl); } } } return ($tmp_newid); } /** * Creates a new category. * * @param int $tmp_parentid Id of parent category * @param string $catname The category name * @param bool $remakeTree Flag to rebuild category tree structure * @param string $catalias Alias of category * @param bool $bVisible Flag about visible status * @param bool $bPublic Flag about public status * @param int $iIdtplcfg Id of template configuration * @return (int|void) Id of new generated category or nothing on failure */ function strNewCategory($tmp_parentid, $catname, $remakeTree = true, $catalias = '', $bVisible = 0, $bPublic = 1, $iIdtplcfg = 0) { global $db; global $client; global $lang; global $cfg; global $area_tree; global $perm; // Flag to rebuild the category table global $remakeCatTable; global $remakeStrTable; global $auth; global $tmp_area; $db2= new DB_ConLite; if (trim($catname) == "") { return; } $catalias = trim($catalias); if ($catalias == "") { $catalias = trim($catname); } if ($perm->have_perm_area_action("str_tplcfg", "str_tplcfg")) { $iIdtplcfg = (int) $iIdtplcfg; } else { $iIdtplcfg = 0; } $bVisible = (int) $bVisible; if (! (($bVisible == 0 || $bVisible == 1) && $perm->have_perm_area_action('str', "str_makevisible")) ) { $bVisible = 0; } $bPublic = (int) $bPublic; if (! (($bPublic == 0 || $bPublic == 1) && $perm->have_perm_area_action('str', "str_makepublic")) ) { $bPublic = 1; } $tmp_newid = $db->nextid($cfg["tab"]["cat"]); if ($tmp_newid == 0) { return; } $remakeCatTable = true; $remakeStrTable = true; $sql = "SELECT idcat FROM ".$cfg["tab"]["cat"]." WHERE parentid='".Contenido_Security::toInteger($tmp_parentid)."' AND postid=0"; $db->query($sql); $db->next_record(); $tmp_id = $db->f("idcat"); if (!$tmp_id) { //********** Entry in 'cat'-table ************ $sql = "INSERT INTO ".$cfg["tab"]["cat"]." (idcat, parentid, preid, postid, idclient, author, created, lastmodified) VALUES('".Contenido_Security::toInteger($tmp_newid)."', '".Contenido_Security::toInteger($tmp_parentid)."', '0', '0', '".Contenido_Security::toInteger($client)."', '".Contenido_Security::escapeDB($auth->auth['uname'], $db)."', '".date("Y-m-d H:i:s")."', '".date("Y-m-d H:i:s")."')"; $db->query($sql); //********* enter name of cat in 'cat_lang'-table ****** $a_languages[] = $lang; foreach ($a_languages as $tmp_lang) { if ($tmp_lang == $lang) { $sql = "INSERT INTO ".$cfg["tab"]["cat_lang"]." (idcatlang, idcat, idlang, name, visible, public, idtplcfg, urlname, author, created, lastmodified) VALUES('".Contenido_Security::toInteger($db->nextid($cfg["tab"]["cat_lang"]))."', '".Contenido_Security::toInteger($tmp_newid)."', '".Contenido_Security::toInteger($tmp_lang)."', '".clHtmlSpecialChars($catname, ENT_QUOTES)."', '".Contenido_Security::toInteger($bVisible)."', '".Contenido_Security::toInteger($bPublic)."', '0', '".clHtmlSpecialChars(capiStrCleanURLCharacters($catalias), ENT_QUOTES)."', '".Contenido_Security::escapeDB($auth->auth['uname'], $db)."', '".date("Y-m-d H:i:s")."', '".date("Y-m-d H:i:s")."')"; $db->query($sql); } else { $sql = "INSERT INTO ".$cfg["tab"]["cat_lang"]." (idcatlang, idcat, idlang, name, visible, public, idtplcfg, urlname, author, created, lastmodified) VALUES('".Contenido_Security::toInteger($db->nextid($cfg["tab"]["cat_lang"]))."', '".Contenido_Security::toInteger($tmp_newid)."', '".Contenido_Security::toInteger($tmp_lang)."', '".clHtmlSpecialChars($catname, ENT_QUOTES)."', '".Contenido_Security::toInteger($bVisible)."', '".Contenido_Security::toInteger($bPublic)."', '0', '".clHtmlSpecialChars(capiStrCleanURLCharacters($catalias), ENT_QUOTES)."', '".Contenido_Security::escapeDB($auth->auth['uname'], $db)."', '".date("Y-m-d H:i:s")."', '".date("Y-m-d H:i:s")."')"; $db->query($sql); } } } else { //********** Entry in 'cat'-table ************ $sql = "UPDATE ".$cfg["tab"]["cat"]." SET postid='$tmp_newid', lastmodified = '".date("Y-m-d H:i:s")."' WHERE idcat='".Contenido_Security::toInteger($tmp_id)."'"; $db->query($sql); //********** Entry in 'cat'-table ************ $sql = "INSERT INTO ".$cfg["tab"]["cat"]." (idcat, parentid, preid, postid, idclient, author, created, lastmodified) VALUES('".Contenido_Security::toInteger($tmp_newid)."', '".Contenido_Security::toInteger($tmp_parentid)."', '".Contenido_Security::toInteger($tmp_id)."', '0', '".Contenido_Security::toInteger($client)."', '".Contenido_Security::escapeDB($auth->auth['uname'], $db)."', '".date("Y-m-d H:i:s")."', '".date("Y-m-d H:i:s")."')"; $db->query($sql); //********* enter name of cat in 'cat_lang'-table ****** $a_languages[] = $lang; foreach ($a_languages as $tmp_lang) { if ($tmp_lang == $lang) { $sql = "INSERT INTO ".$cfg["tab"]["cat_lang"]." (idcatlang, idcat, idlang, name, visible, public, idtplcfg, urlname, author, created, lastmodified) VALUES('".Contenido_Security::toInteger($db->nextid($cfg["tab"]["cat_lang"]))."', '".Contenido_Security::toInteger($tmp_newid)."', '".Contenido_Security::toInteger($tmp_lang)."', '".clHtmlSpecialChars($catname, ENT_QUOTES)."', '".Contenido_Security::toInteger($bVisible)."', '".Contenido_Security::toInteger($bPublic)."', '0', '".clHtmlSpecialChars(capiStrCleanURLCharacters($catalias), ENT_QUOTES)."', '".Contenido_Security::escapeDB($auth->auth['uname'], $db)."', '".date("Y-m-d H:i:s")."', '".date("Y-m-d H:i:s")."')"; $db->query($sql); } else { $sql = "INSERT INTO ".$cfg["tab"]["cat_lang"]." (idcatlang, idcat, idlang, name, visible, public, idtplcfg, urlname, author, created, lastmodified) VALUES('".Contenido_Security::toInteger($db->nextid($cfg["tab"]["cat_lang"]))."', '".Contenido_Security::toInteger($tmp_newid)."', '".Contenido_Security::toInteger($tmp_lang)."', '".clHtmlSpecialChars($catname, ENT_QUOTES)."', '".Contenido_Security::toInteger($bVisible)."', '".Contenido_Security::toInteger($bPublic)."', '0', '".clHtmlSpecialChars(capiStrCleanURLCharacters($catalias), ENT_QUOTES)."', '".Contenido_Security::escapeDB($auth->auth['uname'], $db)."', '".date("Y-m-d H:i:s")."', '".date("Y-m-d H:i:s")."')"; $db->query($sql); } } } // set correct rights for element cInclude ("includes", "functions.rights.php"); foreach ($a_languages as $tmp_lang) { copyRightsForElement("str", $tmp_parentid, $tmp_newid, $tmp_lang); copyRightsForElement("con", $tmp_parentid, $tmp_newid, $tmp_lang); } if ($remakeTree == true) { strRemakeTreeTable(); } /* Search for default template */ $templateCollection = new cApiTemplateCollection("defaulttemplate = '1' AND idclient = '$client'"); if ($template = $templateCollection->next()) { $idtpl = $template->get("idtpl"); if ($iIdtplcfg > 0) { $idtpl = $iIdtplcfg; } /* Assign template, if default template exists */ $catCollection = new cApiCategoryLanguageCollection("idcat = '".Contenido_Security::toInteger($tmp_newid)."'"); while ($cat = $catCollection->next()) { $cat->assignTemplate($idtpl); } } else { //2008-06-25 timo.trautmann also set default template if it is selcted by user and there is no default template if ($iIdtplcfg > 0) { $idtpl = $iIdtplcfg; $catCollection = new cApiCategoryLanguageCollection("idcat = '".Contenido_Security::toInteger($tmp_newid)."'"); while ($cat = $catCollection->next()) { $cat->assignTemplate($idtpl); } } } return($tmp_newid); } function strOrderedPostTreeList($idcat, $poststring) { global $db; global $client; global $lang; global $cfg; $sql = "SELECT idcat FROM ".$cfg["tab"]["cat"]." WHERE parentid=0 AND preid='".Contenido_Security::toInteger($idcat)."' AND idcat!=0"; $db->query($sql); if ($db->next_record()) { $tmp_idcat = $db->f("idcat"); $poststring = $poststring.",".$tmp_idcat; $poststring = strOrderedPostTreeList($tmp_idcat, $poststring); } return $poststring; } /** * Remakes the category tree structure in category tree table. * * @return void */ function strRemakeTreeTable() { global $db; global $client; global $lang; global $cfg; // Flag to rebuild the category table global $remakeCatTable; global $remakeStrTable; $remakeCatTable = true; $remakeStrTable = true; $poststring = ""; $sql = "SELECT idcat FROM ".$cfg["tab"]["cat"]." WHERE idclient = '".$client."'"; $db->query($sql); $idcats = array(); while ($db->next_record()) { $idcats[] = $db->f("idcat"); } $sql = "DELETE FROM ".$cfg["tab"]["cat_tree"]." WHERE idcat IN ('".implode("', '",$idcats)."')"; // empty 'cat_tree'-table $db->query($sql); $sql = "DELETE FROM ".$cfg["tab"]["cat"]." WHERE idcat='0'"; $db->query($sql); $sql = "DELETE FROM ".$cfg["tab"]["cat_lang"]." WHERE idcat='0'"; $db->query($sql); $sql = "SELECT idcat, parentid, preid, postid FROM ".$cfg["tab"]["cat"]." WHERE idclient = '".$client."' ORDER BY parentid ASC, preid ASC, postid ASC"; $db->query($sql); // build cat_tree $aCategories = array(); while($db->next_record()) { if ($db->f('parentid') == 0) { $aCategories[0][$db->f('idcat')] = array( 'idcat' => $db->f('idcat'), 'parentid' => $db->f('parentid'), 'preid' => $db->f('preid'), 'postid' => $db->f('postid') ); } else { $aCategories[$db->f('parentid')][$db->f('idcat')] = array( 'idcat' => $db->f('idcat'), 'parentid' => $db->f('parentid'), 'preid' => $db->f('preid'), 'postid' => $db->f('postid') ); } } $iNextTreeId = $db->nextid($cfg["tab"]["cat_tree"]); // build INSERT statement $sInsertQuery = "INSERT INTO ".$cfg["tab"]["cat_tree"]." (idtree, idcat, level) VALUES "; $sInsertQuery = recCats($aCategories[0], $sInsertQuery, $iNextTreeId, $aCategories); $sInsertQuery = rtrim($sInsertQuery, " ,"); // lock db table and execute INSERT query $db->lock($cfg["tab"]["cat_tree"]); $db->query($sInsertQuery); $db->nextid('cat_tree'); dbUpdateSequence($cfg["tab"]["sequence"], $cfg["tab"]["cat_tree"], $db); $db->unlock($cfg["tab"]["cat_tree"]); } function sort_pre_post($arr) { $firstElement = null; foreach ($arr as $row) { if ($row['preid'] == 0) $firstElement = $row['idcat']; } $curId = $firstElement; $array = array(); while ($curId != 0) { $array[] = $arr[$curId]; $curId = $arr[$curId]['postid']; } return $array; } function recCats ($aCats, $sInsertQuery, &$iNextTreeId, &$aAllCats, $iLevel = 0) { if (is_array($aCats)) { $aCats = sort_pre_post($aCats); foreach ($aCats as $aCat) { $sInsertQuery .= "(" . (int) $iNextTreeId . ", ".(int) $aCat['idcat'].", ". (int) $iLevel ."), "; $iNextTreeId++; if (is_array($aAllCats[$aCat['idcat']])) { $iSubLevel = $iLevel + 1; $sInsertQuery = recCats($aAllCats[$aCat['idcat']], $sInsertQuery, $iNextTreeId, $aAllCats, $iSubLevel); } } } return $sInsertQuery; } function strNextDeeper($tmp_idcat, $ignore_lang = false) { global $cfg, $db_str, $lang; $sql = "SELECT idcat FROM ".$cfg["tab"]["cat"]." WHERE parentid='".Contenido_Security::toInteger($tmp_idcat)."' AND preid='0'"; $db_str->query($sql); if ($db_str->next_record()) { $midcat = $db_str->f("idcat"); if ($ignore_lang == true) { return $midcat; } //******deeper element exists /* Check for language dependent part */ $sql = "SELECT idcatlang FROM ".$cfg["tab"]["cat_lang"]." WHERE idcat='".Contenido_Security::toInteger($midcat)."' AND idlang='".Contenido_Security::toInteger($lang)."'"; $db_str->query($sql); if ($db_str->next_record()) { return $midcat; } else { return 0; } } else { //******deeper element does not exist return 0; } } /** * Checks, if passed category cotains any articles * * @param int $tmp_idcat ID of category * @return bool */ function strHasArticles($tmp_idcat) { global $cfg, $db_str; global $lang; $sql = "SELECT b.idartlang AS idartlang FROM ".$cfg["tab"]["cat_art"]." AS a, ".$cfg["tab"]["art_lang"]." AS b WHERE a.idcat='".Contenido_Security::toInteger($tmp_idcat)."' AND a.idart = b.idart AND b.idlang = '".Contenido_Security::toInteger($lang)."'"; $db_str->query($sql); if ($db_str->next_record()) { //******post element exists return true; } else { //******post element does not exist return false; } } function strNextPost($tmp_idcat) { global $db; global $cfg; $sql = "SELECT idcat FROM ".$cfg["tab"]["cat"]." WHERE preid='".Contenido_Security::toInteger($tmp_idcat)."'"; $db->query($sql); if ($db->next_record()) { //******post element exists $tmp_idcat = $db->f("idcat"); $sql = "SELECT parentid FROM ".$cfg["tab"]["cat"]." WHERE idcat='".Contenido_Security::toInteger($tmp_idcat)."'"; $db->query($sql); if ($db->next_record()) { //******parent from post must not be 0 $tmp_parentid = $db->f("parentid"); if ($tmp_parentid != 0) { return $tmp_idcat; } else { return 0; } } else { return 99; } } else { //******post element does not exist return 0; } } function strNextBackwards($tmp_idcat) { global $db; global $cfg; $sql = "SELECT parentid FROM ".$cfg["tab"]["cat"]." WHERE idcat='".Contenido_Security::toInteger($tmp_idcat)."'"; $db->query($sql); if ($db->next_record()) { //******parent exists $tmp_idcat = $db->f("parentid"); if ($tmp_idcat != 0) { $sql = "SELECT idcat FROM ".$cfg["tab"]["cat"]." WHERE preid='".Contenido_Security::toInteger($tmp_idcat)."'"; $db->query($sql); if ($db->next_record()) { //******parent has post $tmp_idcat = $db->f("idcat"); $sql = "SELECT parentid FROM ".$cfg["tab"]["cat"]." WHERE idcat='".Contenido_Security::toInteger($tmp_idcat)."'"; $db->query($sql); if ($db->next_record()) { //******parent from post must not be 0 $tmp_parentid = $db->f("parentid"); if ($tmp_parentid != 0) { return $tmp_idcat; } else { return 0; } } else { return 99; } } else { //******parent has no post return strNextBackwards($tmp_idcat); } } else { return 0; } } else { //******no parent return 0; } } /** * Hotfix recursive call more than 200 times exit script on hosteurope Timo.Trautmann (strRemakeTreeTableFindNext) * @deprecated **/ function strRemakeTreeTableFindNext($tmp_idcat,$tmp_level) { global $db; global $cfg; //************* Insert Element in 'cat_tree'-table ************** $sql = "INSERT INTO ".$cfg["tab"]["cat_tree"]." (idtree, idcat, level) VALUES ('".$db->nextid($cfg["tab"]["cat_tree"])."', '".Contenido_Security::toInteger($tmp_idcat)."', '".Contenido_Security::toInteger($tmp_level)."')"; $db->query($sql); //************* dig deeper, if possible ****** $tmp = strNextDeeperAll($tmp_idcat, true); foreach ($tmp as $iCurIdCat) { if (count(strNextDeeperAll($iCurIdCat, true)) > 0 ) { strRemakeTreeTableFindNext($iCurIdCat, ($tmp_level+1)); } else { $sql = "INSERT INTO ".$cfg["tab"]["cat_tree"]." (idtree, idcat, level) VALUES ('".$db->nextid($cfg["tab"]["cat_tree"])."', '".Contenido_Security::toInteger($iCurIdCat)."', '".Contenido_Security::toInteger($tmp_level+1)."')"; $db->query($sql); } } } /** Hotfix recursive call more than 200 times exit script on hosteurope Timo.Trautmann **/ function strNextDeeperAll($tmp_idcat, $ignore_lang = false) { global $cfg, $db_str, $db_str2, $lang; $aCats = array(); $bLoop = true; $sql = "SELECT idcat FROM ".$cfg["tab"]["cat"]." WHERE parentid='".Contenido_Security::toInteger($tmp_idcat)."' and preid = 0"; #echo $sql.'
'; $db_str->query($sql); if ($db_str->next_record()) { while ($bLoop) { $midcat = $db_str->f("idcat"); if ($ignore_lang == true) { array_push($aCats, $midcat); } else { //******deeper element exists /* Check for language dependent part */ $sql = "SELECT idcatlang FROM ".$cfg["tab"]["cat_lang"]." WHERE idcat='".Contenido_Security::toInteger($midcat)."' AND idlang='".Contenido_Security::toInteger($lang)."'"; $db_str2->query($sql); if ($db_str2->next_record()) { array_push($aCats, $midcat); } } $sql = "SELECT preid, postid, idcat FROM ".$cfg["tab"]["cat"]." WHERE parentid='".Contenido_Security::toInteger($tmp_idcat)."' and preid = ".Contenido_Security::toInteger($midcat).""; $db_str->query($sql); if (!$db_str->next_record()) { $bLoop = false; } } } return $aCats; } /** * Renders the category tree a HTML table * * @return void */ function strShowTreeTable() { global $db; global $sess; global $client; global $lang; global $idcat; global $cfg; global $lngStr; echo "
"; $sql = "SELECT * FROM ".$cfg["tab"]["cat_tree"]." AS A, ".$cfg["tab"]["cat"]." AS B, ".$cfg["tab"]["cat_lang"]." AS C WHERE A.idcat=B.idcat AND B.idcat=C.idcat AND C.idlang='".Contenido_Security::toInteger($lang)."' AND B.idclient='".Contenido_Security::toInteger($client)."' ORDER BY A.idtree"; $db->query($sql); while ($db->next_record()) { $tmp_id = $db->f("idcat"); $tmp_name = $db->f("name"); $tmp_level = $db->f("level"); echo ""; echo ""; echo ""; echo ""; } echo "
".$tmp_id." | ".$tmp_name." | ".$tmp_level."url("main.php?action=20&idcat=$tmp_id")."\">".$lngStr["actions"]["20"]."url("main.php?action=30&idcat=$tmp_id")."\">".$lngStr["actions"]["30"]."
"; } /** * Renames a category * * @param int $idcat Category id * @param int $lang Language id * @param string $newcategoryname New category name * @param string $newcategoryalias New category alias * @return void */ function strRenameCategory($idcat, $lang, $newcategoryname, $newcategoryalias) { global $db; global $cfg; global $cfgClient; global $client; // Flag to rebuild the category table global $remakeCatTable; global $remakeStrTable; $remakeCatTable = true; $remakeStrTable = true; if (trim($newcategoryname) != "") { $sUrlname = clHtmlSpecialChars(capiStrCleanURLCharacters($newcategoryname), ENT_QUOTES); $sName = clHtmlSpecialChars($newcategoryname, ENT_QUOTES); if (trim($newcategoryalias) != "") { $sql = "SELECT urlname, name FROM ".$cfg["tab"]["cat_lang"]." WHERE idcat='".Contenido_Security::toInteger($idcat)."' AND idlang='".Contenido_Security::toInteger($lang)."'"; $db->query($sql); $sUrlnameNew = clHtmlSpecialChars(capiStrCleanURLCharacters($newcategoryalias), ENT_QUOTES); if ($db->next_record()) { $sOldAlias = $db->f('urlname'); $sOldName = $db->f('name'); } if ($sOldAlias != $sUrlnameNew) { $sUrlname = $sUrlnameNew; } @unlink($cfgClient[$client]["path"]["frontend"]."cache/locationstring-url-cache-$lang.txt"); } $sql = "UPDATE ".$cfg["tab"]["cat_lang"]." SET urlname='".Contenido_Security::escapeDB($sUrlname, $db)."', name='".Contenido_Security::escapeDB($sName, $db)."', lastmodified = '".date("Y-m-d H:i:s")."' WHERE idcat='".Contenido_Security::toInteger($idcat)."' AND idlang='".Contenido_Security::toInteger($lang)."'"; $db->query($sql); } } /** * Sets the visible status of the category and its childs * * @param int $idcat Category id * @param int $lang Language id * @param int $visible Visible status * @return void */ function strMakeVisible ($idcat, $lang, $visible) { global $db; global $cfg; // Flag to rebuild the category table global $remakeCatTable; global $remakeStrTable; $remakeCatTable = true; $remakeStrTable = true; $a_catstring = strDeeperCategoriesArray($idcat); foreach ($a_catstring as $value) { $sql = "UPDATE ".$cfg["tab"]["cat_lang"]." SET visible='".Contenido_Security::toInteger($visible)."', lastmodified ='".date("Y-m-d H:i:s")."' WHERE idcat='".Contenido_Security::toInteger($value)."' AND idlang='".Contenido_Security::toInteger($lang)."' "; $db->query($sql); } if ($cfg["pathresolve_heapcache"] == true && $visible = 0) { $pathresolve_tablename = $cfg["sql"]["sqlprefix"]."_pathresolve_cache"; $sql = "DELETE FROM %s WHERE idlang = '%s' AND idcat = '%s'"; $db->query(sprintf($sql, Contenido_Security::escapeDB($pathresolve_tablename, $db), Contenido_Security::toInteger($lang), $idcat)); } } /** * Sets the public status of the category and its childs * * @param int $idcat Category id * @param int $lang Language id * @param int $public Public status * @return void */ function strMakePublic($idcat, $lang, $public) { global $db; global $cfg; // Flag to rebuild the category table global $remakeCatTable; global $remakeStrTable; $remakeCatTable = true; $remakeStrTable = true; $a_catstring = strDeeperCategoriesArray($idcat); foreach ($a_catstring as $value) { $sql = "UPDATE ".$cfg["tab"]["cat_lang"]." SET public='$public', lastmodified = '".date("Y-m-d H:i:s")."' WHERE idcat='".Contenido_Security::toInteger($value)."' AND idlang='".Contenido_Security::toInteger($lang)."' "; $db->query($sql); } } function strDeeperCategoriesArray($idcat_start) { global $db; global $client; global $cfg; $sql = "SELECT * FROM ".$cfg["tab"]["cat_tree"]." AS A, ".$cfg["tab"]["cat"]." AS B WHERE A.idcat=B.idcat AND idclient='".Contenido_Security::toInteger($client)."' ORDER BY idtree"; $db->query($sql); $i = 0; while ($db->next_record()) { if ($db->f("parentid") < $idcat_start) { // ending part of tree $i = 0; } if ($db->f("idcat") == $idcat_start) { // starting part of tree $i = 1; } if ($i == 1) { $catstring[] = $db->f("idcat"); } } return $catstring; } /** * Deletes the category and its template configurations. * * Only categories having no child categories and having no articles will be deleted! * * @param int $idcat Id of category to delete * @return void */ function strDeleteCategory($idcat) { global $db; global $lang; global $client; global $lang; global $cfg; // Flag to rebuild the category table global $remakeCatTable; global $remakeStrTable; $remakeCatTable = true; $remakeStrTable = true; $db2 = new DB_ConLite; if (strNextDeeper($idcat)) { return "0201"; // category has subcategories } else { if (strHasArticles($idcat)) { return "0202"; // category has arts } else { $sql = "SELECT idtplcfg FROM ".$cfg["tab"]["cat_lang"]." WHERE idcat='".Contenido_Security::toInteger($idcat)."' AND idlang='".Contenido_Security::toInteger($lang)."'"; $db->query($sql); while ($db->next_record()) { ////// delete entry in 'tpl_conf'-table $sql = "DELETE FROM ".$cfg["tab"]["tpl_conf"]." WHERE idtplcfg='".Contenido_Security::toInteger($db->f("idtplcfg"))."'"; $db2->query($sql); $sql = "DELETE FROM ".$cfg["tab"]["container_conf"]." WHERE idtplcfg = '".Contenido_Security::toInteger($db->f("idtplcfg"))."'"; $db2->query($sql); } /* Delete language dependend part */ $sql = "DELETE FROM ".$cfg["tab"]["cat_lang"]." WHERE idcat='".Contenido_Security::toInteger($idcat)."' AND idlang='".Contenido_Security::toInteger($lang)."'"; $db->query($sql); /* Are there any additional languages? */ $sql = "SELECT idcatlang FROM ".$cfg["tab"]["cat_lang"]." WHERE idcat='".Contenido_Security::toInteger($idcat)."'"; $db->query($sql); if ($db->num_rows() > 0) { // more languages found... // delete rights for element cInclude ("includes", "functions.rights.php"); deleteRightsForElement("str", $idcat, $lang); deleteRightsForElement("con", $idcat, $lang); return; } $sql = "SELECT * FROM ".$cfg["tab"]["cat"]." WHERE idcat='".Contenido_Security::toInteger($idcat)."'"; $db->query($sql); $db->next_record(); $tmp_preid = $db->f("preid"); $tmp_postid = $db->f("postid"); ////// update pre cat set new postid if ($tmp_preid != 0) { $sql = "UPDATE ".$cfg["tab"]["cat"]." SET postid='".Contenido_Security::toInteger($tmp_postid)."' WHERE idcat='".Contenido_Security::toInteger($tmp_preid)."'"; $db->query($sql); } ////// update post cat set new preid if ($tmp_postid != 0) { $sql = "UPDATE ".$cfg["tab"]["cat"]." SET preid='".Contenido_Security::toInteger($tmp_preid)."' WHERE idcat='".Contenido_Security::toInteger($tmp_postid)."'"; $db->query($sql); } ////// delete entry in 'cat'-table $sql = "DELETE FROM ".$cfg["tab"]["cat"]." WHERE idcat='".Contenido_Security::toInteger($idcat)."'"; $db->query($sql); $sql = "SELECT idtplcfg FROM ".$cfg["tab"]["cat_lang"]." WHERE idcat='".Contenido_Security::toInteger($idcat)."'"; $db->query($sql); while ($db->next_record()) { ////// delete entry in 'tpl_conf'-table $sql = "DELETE FROM ".$cfg["tab"]["tpl_conf"]." WHERE idtplcfg='".Contenido_Security::toInteger($db->f("idtplcfg"))."'"; $db2->query($sql); $sql = "DELETE FROM ".$cfg["tab"]["container_conf"]." WHERE idtplcfg = '".Contenido_Security::toInteger($db->f("idtplcfg"))."'"; echo $sql; $db2->query($sql); } ////// delete entry in 'cat_lang'-table $sql = "DELETE FROM ".$cfg["tab"]["cat_lang"]." WHERE idcat='".Contenido_Security::toInteger($idcat)."'"; $db->query($sql); ////// delete entry in 'cat_tree'-table $sql = "DELETE FROM ".$cfg["tab"]["cat_tree"]." WHERE idcat='".Contenido_Security::toInteger($idcat)."'"; $db->query($sql); } // delete rights for element cInclude ("includes", "functions.rights.php"); deleteRightsForElement("str", $idcat); deleteRightsForElement("con", $idcat); } } /** * Moves a category upwards. * * @param int $idcat Id of category to move upwards * @return void */ function strMoveUpCategory($idcat) { global $db; global $sess; global $cfg; // Flag to rebuild the category table global $remakeCatTable; global $remakeStrTable; $remakeCatTable = true; $remakeStrTable = true; $sql = "SELECT idcat, preid, postid FROM ".$cfg["tab"]["cat"]." WHERE idcat='".Contenido_Security::toInteger($idcat)."'"; $db->query($sql); $db->next_record(); $tmp_idcat = $db->f("idcat"); $tmp_preid = $db->f("preid"); $tmp_postid = $db->f("postid"); if ($tmp_preid != 0) { $sql = "SELECT idcat, preid, postid FROM ".$cfg["tab"]["cat"]." WHERE idcat='".Contenido_Security::toInteger($tmp_preid)."'"; $db->query($sql); $db->next_record(); $tmp_idcat_pre = $db->f("idcat"); $tmp_preid_pre = $db->f("preid"); $tmp_postid_pre = $db->f("postid"); $sql = "SELECT idcat, preid, postid FROM ".$cfg["tab"]["cat"]." WHERE idcat='".Contenido_Security::toInteger($tmp_preid_pre)."'"; $db->query($sql); $db->next_record(); $tmp_idcat_pre_pre = $db->f("idcat"); $tmp_preid_pre_pre = $db->f("preid"); $tmp_postid_pre_pre = $db->f("postid"); $sql = "SELECT idcat, preid, postid FROM ".$cfg["tab"]["cat"]." WHERE idcat='".Contenido_Security::toInteger($tmp_postid)."'"; $db->query($sql); $db->next_record(); $tmp_idcat_post = $db->f("idcat"); $tmp_preid_post = $db->f("preid"); $tmp_postid_post = $db->f("postid"); $sql = "UPDATE ".$cfg["tab"]["cat"]." SET postid='".Contenido_Security::toInteger($tmp_idcat)."' WHERE idcat='".Contenido_Security::toInteger($tmp_preid_pre)."'"; $db->query($sql); $sql = "UPDATE ".$cfg["tab"]["cat"]." SET preid='".Contenido_Security::toInteger($tmp_idcat)."', postid='".Contenido_Security::toInteger($tmp_postid)."' WHERE idcat='".Contenido_Security::toInteger($tmp_preid)."'"; $db->query($sql); $sql = "UPDATE ".$cfg["tab"]["cat"]." SET preid='".Contenido_Security::toInteger($tmp_preid_pre)."', postid='".Contenido_Security::toInteger($tmp_preid)."' WHERE idcat='$tmp_idcat'"; $db->query($sql); $sql = "UPDATE ".$cfg["tab"]["cat"]." SET preid='".Contenido_Security::toInteger($tmp_idcat_pre)."' WHERE idcat='$tmp_postid'"; $db->query($sql); } } /** * Moves a category downwards. * * @param int $idcat Id of category to move downwards * @return void */ function strMoveDownCategory($idcat) { global $db; global $sess; global $cfg; // Flag to rebuild the category table global $remakeCatTable; global $remakeStrTable; $remakeCatTable = true; $remakeStrTable = true; $arrLinks = array(); $sql = "SELECT idcat, preid, postid FROM ".$cfg["tab"]["cat"]." WHERE idcat='".Contenido_Security::toInteger($idcat)."'"; $db->query($sql); $db->next_record(); $arrLinks['cur']['idcat'] = $db->f("idcat"); $arrLinks['cur']['pre'] = $db->f("preid"); $arrLinks['cur']['post'] = $db->f("postid"); $sql = "SELECT idcat, preid, postid FROM ".$cfg["tab"]["cat"]." WHERE idcat='".Contenido_Security::toInteger($arrLinks['cur']['pre'])."'"; $db->query($sql); if ($db->next_record()) { $arrLinks['pre']['idcat'] = $db->f("idcat"); $arrLinks['pre']['pre'] = $db->f("preid"); $arrLinks['pre']['post'] = $db->f("postid"); } else { $arrLinks['pre']['idcat'] = 0; $arrLinks['pre']['pre'] = 0; $arrLinks['pre']['post'] = 0; } $sql = "SELECT idcat, preid, postid FROM ".$cfg["tab"]["cat"]." WHERE idcat='".Contenido_Security::toInteger($arrLinks['cur']['post'])."'"; $db->query($sql); if ($db->next_record()) { $arrLinks['post']['idcat'] = $db->f("idcat"); $arrLinks['post']['pre'] = $db->f("preid"); $arrLinks['post']['post'] = $db->f("postid"); } else { $arrLinks['post']['idcat'] = 0; $arrLinks['post']['pre'] = 0; $arrLinks['post']['post'] = 0; } if ($arrLinks['cur']['post'] != 0) { if ($arrLinks['pre']['idcat'] != 0) { $sql = "UPDATE ".$cfg["tab"]["cat"]." SET postid='".Contenido_Security::toInteger($arrLinks['post']['idcat'])."' WHERE idcat='".Contenido_Security::toInteger($arrLinks['pre']['idcat'])."'"; $db->query($sql); } else { $sql = "UPDATE ".$cfg["tab"]["cat"]." SET preid='".Contenido_Security::toInteger($arrLinks['pre']['idcat'])."' WHERE idcat='".Contenido_Security::toInteger($arrLinks['post']['idcat'])."'"; $db->query($sql); } $sql = "UPDATE ".$cfg["tab"]["cat"]." SET preid='".Contenido_Security::toInteger($arrLinks['cur']['post'])."', postid='".Contenido_Security::toInteger($arrLinks['post']['post'])."' WHERE idcat='".Contenido_Security::toInteger($arrLinks['cur']['idcat'])."'"; $db->query($sql); $sql = "UPDATE ".$cfg["tab"]["cat"]." SET preid='".Contenido_Security::toInteger($arrLinks['pre']['idcat'])."', postid='".Contenido_Security::toInteger($arrLinks['cur']['idcat'])."' WHERE idcat='".Contenido_Security::toInteger($arrLinks['post']['idcat'])."'"; $db->query($sql); } if ($arrLinks['post']['post'] != 0) { $sql = "UPDATE ".$cfg["tab"]["cat"]." SET preid='".Contenido_Security::toInteger($arrLinks['cur']['idcat'])."' WHERE idcat='".Contenido_Security::toInteger($arrLinks['post']['post'])."'"; $db->query($sql); } } /** * Moves a subtree to another destination. * * @param int $idcat Id of category * @param int $parentid_new Id of destination parent category * @return void */ function strMoveSubtree($idcat, $parentid_new) { global $db, $cfg, $remakeCatTable, $remakeStrTable, $movesubtreeidcat, $sess; $remakeCatTable = true; $remakeStrTable = true; $idcat = Contenido_Security::toInteger( $idcat ); $iNewParentId = Contenido_Security::toInteger( $parentid_new ); // Check if iNewParentId is 0 and the unescaped value is not null if ( $iNewParentId == 0 && !is_null( $parentid_new ) ) { $movesubtreeidcat = 0; } else if ( $iNewParentId != 0 ) { $sql = "SELECT idcat, preid, postid FROM ".$cfg["tab"]["cat"]." WHERE idcat='" . $idcat . "'"; $db->query($sql); $db->next_record(); $tmp_idcat = $db->f("idcat"); $tmp_preid = $db->f("preid"); $tmp_postid = $db->f("postid"); //****************** update predecessor (pre)********************** if ($tmp_preid != 0) { $sql = "UPDATE ".$cfg["tab"]["cat"]." SET postid='" . $tmp_postid . "' WHERE idcat='" . $tmp_preid . "'"; $db->query($sql); } //****************** update follower (post)********************** if ($tmp_postid != 0) { $sql = "UPDATE ".$cfg["tab"]["cat"]." SET preid='" . $tmp_preid . "' WHERE idcat='" . $tmp_postid . "'"; $db->query($sql); } //****************** find new pre ******************** $sql = "SELECT idcat, preid FROM ".$cfg["tab"]["cat"]." WHERE parentid='" . $iNewParentId . "' AND postid='0'"; $db->query($sql); if ($db->next_record()) { $tmp_new_preid = $db->f("idcat"); $tmp_preid_2 = $db->f("preid"); if ($tmp_new_preid != $idcat) { //******************** update new pre: set post ********************** $sql = "UPDATE ".$cfg["tab"]["cat"]." SET postid='" . $idcat . "' WHERE idcat='" . $tmp_new_preid . "'"; $db->query($sql); } else { $sql = "SELECT idcat FROM ".$cfg["tab"]["cat"]." WHERE idcat='" . $tmp_preid_2 . "'"; $db->query($sql); if ($db->next_record()) { $tmp_new_preid = $db->f("idcat"); //******************** update new pre: set post ********************** $sql = "UPDATE ".$cfg["tab"]["cat"]." SET postid='" . $idcat . "' WHERE idcat='" . $tmp_new_preid . "'"; $db->query($sql); } else { $tmp_new_preid = 0; } } } else { $tmp_new_preid = 0; } //*************** update idcat ******************** $sql = "UPDATE ".$cfg["tab"]["cat"]." SET parentid='" . $iNewParentId . "', preid='" . $tmp_new_preid . "', postid='0' WHERE idcat='" . $idcat . "'"; $db->query($sql); $movesubtreeidcat = 0; } else { // We recoded this function to prevent crashing the cat tree // when a user copies a tree and forget to set the target category // Copy transaction now is only performed by setting the target $movesubtreeidcat = $idcat; } $sess->register('movesubtreeidcat'); $sess->freeze(); } /** * Checks if category is movable. * * @param int $idcat Id of category to move * @param int $source Id of source category * @return bool */ function strMoveCatTargetallowed($idcat, $source) { if ($idcat == $source) { return 0; } else { return 1; } } /** * Synchronizes a category from one language to another language. * * @param int $idcatParam Id of category to synchronize * @param int $sourcelang Id of source language * @param int $targetlang Id of target language * @param bool $bMultiple Flag to synchronize child languages * @return void */ function strSyncCategory($idcatParam, $sourcelang, $targetlang, $bMultiple = false) { global $cfg; $tmpdb = new DB_ConLite; $bMultiple = (bool) $bMultiple; $aCatArray = array(); if ($bMultiple == true) { $aCatArray = strDeeperCategoriesArray($idcatParam); } else { array_push($aCatArray, $idcatParam); } foreach ($aCatArray as $idcat) { /* Check if category already exists */ $sql = "SELECT idcat, idlang, idtplcfg, name, visible, public, status, author, created, lastmodified FROM ".$cfg["tab"]["cat_lang"]." WHERE idcat = '".Contenido_Security::toInteger($idcat)."' AND idlang = '".Contenido_Security::toInteger($targetlang)."'"; $tmpdb->query($sql); if ($tmpdb->next_record()) { return false; } $sql = "SELECT idcat, idlang, idtplcfg, name, visible, public, status, author, created, lastmodified, urlname FROM ".$cfg["tab"]["cat_lang"]." WHERE idcat = '".Contenido_Security::toInteger($idcat)."' AND idlang = '".Contenido_Security::toInteger($sourcelang)."'"; $tmpdb->query($sql); if ($tmpdb->next_record()) { if ($tmpdb->f("idtplcfg") != 0) { /* Copy the template configuration */ $newidtplcfg = tplcfgDuplicate($tmpdb->f("idtplcfg")); } else { $newidtplcfg = 0; } $newidcatlang = $tmpdb->nextid($cfg["tab"]["cat_lang"]); $idcat = $tmpdb->f("idcat"); $idlang = $targetlang; $idtplcfg = $newidtplcfg; $name = $tmpdb->f("name"); $visible = 0; $public = $tmpdb->f("public"); $urlname = $tmpdb->f("urlname"); $status = $tmpdb->f("status"); $author = $tmpdb->f("author"); $created = $tmpdb->f("created"); $lastmodified = $tmpdb->f("lastmodified"); $sql = "INSERT INTO ".$cfg["tab"]["cat_lang"]." (idcatlang, idcat, idlang, idtplcfg, name, visible, public, status, author, created, lastmodified, urlname) VALUES ('".Contenido_Security::toInteger($newidcatlang)."', '".Contenido_Security::toInteger($idcat)."', '".Contenido_Security::toInteger($idlang)."', '".Contenido_Security::toInteger($idtplcfg)."', '".Contenido_Security::escapeDB($name, $tmpdb)."', '".Contenido_Security::toInteger($visible)."', '".Contenido_Security::toInteger($public)."', '".Contenido_Security::toInteger($status)."', '".Contenido_Security::escapeDB($author, $tmpdb)."', '".Contenido_Security::escapeDB($created, $tmpdb)."', '".Contenido_Security::escapeDB($lastmodified, $tmpdb)."', '".Contenido_Security::escapeDB($urlname, $tmpdb)."')"; $tmpdb->query($sql); // execute CEC hook $param = $tmpdb->Record; $param['idlang'] = $idlang; $param['idtplcfg'] = $idtplcfg; $param['visible'] = $visible; CEC_Hook::execute('Contenido.Category.strSyncCategory_Loop', $param); // set correct rights for element cInclude ("includes", "functions.rights.php"); createRightsForElement("str", $idcat, $targetlang); createRightsForElement("con", $idcat, $targetlang); } } } /** * Checks if category has a start article * * @param int $idcat Id of category * @param int $idlang The language id * @return bool */ function strHasStartArticle($idcat, $idlang) { global $cfg, $db_str; if ($cfg["is_start_compatible"] == false) { $sql = "SELECT startidartlang FROM ".$cfg["tab"]["cat_lang"]." WHERE idcat = '".Contenido_Security::toInteger($idcat)."' AND idlang='".Contenido_Security::toInteger($idlang)."' AND startidartlang != 0"; } else { $sql = "SELECT is_start FROM ".$cfg["tab"]["cat_art"]." WHERE idcat = '".Contenido_Security::toInteger($idcat)."' AND is_start = 1"; } $db_str->query($sql); if ($db_str->next_record()) { return true; } return false; } /** * Copies the category and it's existing articles into another category. * * @param int $idcat Id of category to copy * @param int $destidcat Id of destination category * @param bool $remakeTree Flag to rebuild category tree * @param bool $bUseCopyLabel Flag to add copy label to the new categories * @return void */ function strCopyCategory($idcat, $destidcat, $remakeTree = true, $bUseCopyLabel = true) { global $cfg, $client, $lang; $newidcat = strNewCategory($destidcat, "a", $remakeTree); /* Selectors */ $_oldcatlang = new cApiCategoryLanguageCollection; $_newcatlang = new cApiCategoryLanguageCollection; $_oldcatlang->select("idcat = '$idcat' AND idlang = '$lang'"); $oldcatlang = $_oldcatlang->next(); if (!is_object($oldcatlang)) { return; } $_newcatlang->select("idcat = '$newidcat' AND idlang = '$lang'"); $newcatlang = $_newcatlang->next(); if (!is_object($newcatlang)) { return; } /* Worker objects */ $newcat = new cApiCategory($newidcat); $oldcat = new cApiCategory($idcat); /* Copy properties */ if ($bUseCopyLabel == true) { $newcatlang->set("name", sprintf(i18n("%s (Copy)"), $oldcatlang->get("name"))); } else { $newcatlang->set("name", $oldcatlang->get("name")); } $newcatlang->set("public", $oldcatlang->get("public")); $newcatlang->set("visible", 0); $newcatlang->store(); // execute cec hook CEC_Hook::execute('Contenido.Category.strCopyCategory', array( 'oldcat' => $oldcat, 'newcat' => $newcat, 'newcatlang' => $newcatlang )); /* Copy template configuration */ if ($oldcatlang->get("idtplcfg") != 0) { /* Create new template configuration */ $newcatlang->assignTemplate($oldcatlang->getTemplate()); /* Copy the container configuration */ $c_cconf = new cApiContainerConfigurationCollection; $m_cconf = new cApiContainerConfigurationCollection; $c_cconf->select("idtplcfg = '".$oldcatlang->get("idtplcfg")."'"); while ($i_cconf = $c_cconf->next()) { $m_cconf->create($newcatlang->get("idtplcfg"), $i_cconf->get("number"), $i_cconf->get("container")); } } $db = new DB_ConLite; $db2 = new DB_ConLite; /* Copy all articles */ $sql = "SELECT A.idart, B.idartlang FROM ".$cfg["tab"]["cat_art"]." AS A, ".$cfg["tab"]["art_lang"]." AS B WHERE A.idcat = '".Contenido_Security::toInteger($idcat)."' AND B.idart = A.idart AND B.idlang = '".Contenido_Security::toInteger($lang)."'"; $db->query($sql); while ($db->next_record()) { $newidart = conCopyArticle($db->f("idart"), $newidcat, "", $bUseCopyLabel); if ($db->f("idartlang") == $oldcatlang->get("startidartlang")) { $sql = "SELECT idcatart FROM ".$cfg["tab"]["cat_art"]." WHERE idcat = '".Contenido_Security::toInteger($newidcat)."' AND idart = '".Contenido_Security::toInteger($newidart)."'"; $db2->query($sql); if ($db2->next_record()) { conMakeStart($db2->f("idcatart"), 1); } } } return ($newidcat); } /** * Copies the categorytree (category and its childs) to an another category. * * @param int $idcat Id of category to copy * @param int $destcat Id of destination category * @param bool $remakeTree Flag to rebuild category tree * @param bool $bUseCopyLabel Flag to add copy label to the new categories * @return void */ function strCopyTree($idcat, $destcat, $remakeTree = true, $bUseCopyLabel = true) { global $cfg; $newidcat = strCopyCategory($idcat, $destcat, false, $bUseCopyLabel); $db = new DB_ConLite; $db->query("SELECT idcat FROM ".$cfg["tab"]["cat"]." WHERE parentid = '".Contenido_Security::toInteger($idcat)."'"); while ($db->next_record()) { strCopyTree($db->f("idcat"), $newidcat, false, $bUseCopyLabel); } if ($remakeTree == true) { strRemakeTreeTable(); } } ?>