ConLite/conlite/includes/functions.str.php

1437 Zeilen
58 KiB
PHP

<?php
/**
* Project:
* Contenido Content Management System
*
* Description:
* Defines the "str" related functions
*
* Requirements:
* @con_php_req 5.0
*
*
* @package Contenido Backend includes
* @version 1.3.11
* @author Olaf Niemann
* @copyright four for business AG <www.4fb.de>
* @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.'<br>';
$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 "<br><table cellpadding=$cellpadding cellspacing=$cellspacing border=$border >";
$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 "<tr><td>" . $tmp_id . " | " . $tmp_name . " | " . $tmp_level . "</td>";
echo "<td><a class=action href=\"" . $sess->url("main.php?action=20&idcat=$tmp_id") . "\">" . $lngStr["actions"]["20"] . "</a></td>";
echo "<td><a class=action href=\"" . $sess->url("main.php?action=30&idcat=$tmp_id") . "\">" . $lngStr["actions"]["30"] . "</a></td>";
echo "</td></tr>";
}
echo "</table>";
}
/**
* 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();
}
}
?>