* @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$: * }} * */ 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(); } } ?>