* @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 * * $Id$: */ if(!defined('CON_FRAMEWORK')) { die('Illegal call'); } /** * Generates the code for one * article * * @param int $idcat Id of category * @param int $idart Id of article * @param int $lang Id of language * @param int $client Id of client * @param int $layout Layout-ID of alternate Layout (if false, use associated layout) * * @author Jan Lengowski * @copyright four for business AG */ function conGenerateCode($idcat, $idart, $lang, $client, $layout = false) { global $frontend_debug, $_cecRegistry; $debug = 0; if ($debug) echo "conGenerateCode($idcat, $idart, $lang, $client, $layout);
"; global $db, $db2, $sess, $cfg, $code, $cfgClient, $client, $lang, $encoding; if (!is_object($db2)) $db2 = new DB_ConLite; /* extract IDCATART */ $sql = "SELECT idcatart FROM ".$cfg["tab"]["cat_art"]." WHERE idcat = '".Contenido_Security::toInteger($idcat)."' AND idart = '".Contenido_Security::toInteger($idart)."'"; $db->query($sql); $db->next_record(); $idcatart = $db->f("idcatart"); /* If neither the article or the category is configured, no code will be created and an error occurs. */ $sql = "SELECT a.idtplcfg AS idtplcfg FROM ".$cfg["tab"]["art_lang"]." AS a, ".$cfg["tab"]["art"]." AS b WHERE a.idart = '".Contenido_Security::toInteger($idart)."' AND a.idlang = '".Contenido_Security::escapeDB($lang, $db)."' AND b.idart = a.idart AND b.idclient = '".Contenido_Security::escapeDB($client, $db)."'"; $db->query($sql); $db->next_record(); if ($db->f("idtplcfg") != 0) { /* Article is configured */ $idtplcfg = $db->f("idtplcfg"); if ($debug) echo "configuration for article found: $idtplcfg

"; $a_c = array (); $sql2 = "SELECT * FROM ".$cfg["tab"]["container_conf"]." WHERE idtplcfg = '".Contenido_Security::toInteger($idtplcfg)."' ORDER BY number ASC"; $db2->query($sql2); while ($db2->next_record()) { $a_c[$db2->f("number")] = $db2->f("container"); } } else { /* Check whether category is configured. */ $sql = "SELECT a.idtplcfg AS idtplcfg FROM ".$cfg["tab"]["cat_lang"]." AS a, ".$cfg["tab"]["cat"]." AS b WHERE a.idcat = '".Contenido_Security::toInteger($idcat)."' AND a.idlang = '".Contenido_Security::escapeDB($lang, $db)."' AND b.idcat = a.idcat AND b.idclient = '".Contenido_Security::escapeDB($client, $db)."'"; $db->query($sql); $db->next_record(); if ($db->f("idtplcfg") != 0) { /* Category is configured, extract varstring */ $idtplcfg = $db->f("idtplcfg"); if ($debug) echo "configuration for category found: $idtplcfg

"; $a_c = array (); $sql2 = "SELECT * FROM ".$cfg["tab"]["container_conf"]." WHERE idtplcfg = '".Contenido_Security::toInteger($idtplcfg)."' ORDER BY number ASC"; $db2->query($sql2); while ($db2->next_record()) { $a_c[$db2->f("number")] = $db2->f("container"); } } else { /* Article nor Category is configured. Creation of Code is not possible. Write Errormsg to DB. */ if ($debug) echo "Neither CAT or ART are configured!

"; $code = 'No code was created for this art in this category.'; $sql = "SELECT * FROM ".$cfg["tab"]["code"]." WHERE idcatart='".Contenido_Security::toInteger($idcatart)."' AND idlang='".Contenido_Security::escapeDB($lang, $db)."'"; $db->query($sql); if ($db->next_record()) { $sql = "UPDATE ".$cfg["tab"]["code"]." SET code='".Contenido_Security::escapeDB($code, $db)."', idlang='".Contenido_Security::escapeDB($lang, $db)."', idclient='".Contenido_Security::escapeDB($client, $db)."' WHERE idcatart='".Contenido_Security::toInteger($idcatart)."' AND idlang='".Contenido_Security::escapeDB($lang, $db)."'"; $db->query($sql); } else { $sql = "INSERT INTO ".$cfg["tab"]["code"]." (idcode, idcatart, code, idlang, idclient) VALUES ('".Contenido_Security::toInteger($db->nextid($cfg["tab"]["code"]))."', '".Contenido_Security::toInteger($idcatart)."', '".Contenido_Security::escapeDB($code, $db)."', '".Contenido_Security::escapeDB($lang, $db)."', '".Contenido_Security::escapeDB($client, $db)."')"; $db->query($sql); } return "0601"; } } /* Get IDLAY and IDMOD array */ $sql = "SELECT a.idlay AS idlay, a.idtpl AS idtpl FROM ".$cfg["tab"]["tpl"]." AS a, ".$cfg["tab"]["tpl_conf"]." AS b WHERE b.idtplcfg = '".Contenido_Security::toInteger($idtplcfg)."' AND b.idtpl = a.idtpl"; $db->query($sql); $db->next_record(); $idlay = $db->f("idlay"); if ($layout != false) { $idlay = $layout; } $idtpl = $db->f("idtpl"); if ($debug) echo "Using Layout: $idlay and Template: $idtpl for generation of code.

"; /* List of used modules */ $sql = "SELECT number, idmod FROM ".$cfg["tab"]["container"]." WHERE idtpl = '".Contenido_Security::toInteger($idtpl)."' ORDER BY number ASC"; $db->query($sql); while ($db->next_record()) { $a_d[$db->f("number")] = $db->f("idmod"); } $oLayout = new cApiLayout(Contenido_Security::toInteger($idlay)); $raw_code = $oLayout->getLayout(); $code = AddSlashes($raw_code); /* Create code for all containers */ if ($idlay) { tplPreparseLayout($idlay, $raw_code); $tmp_returnstring = tplBrowseLayoutForContainers($idlay, $raw_code); $a_container = explode("&", $tmp_returnstring); foreach ($a_container as $key => $value) { $sql = "SELECT * FROM ".$cfg["tab"]["mod"]." WHERE idmod='".$a_d[$value]."'"; $db->query($sql); $db->next_record(); if (is_numeric($a_d[$value])) { $thisModule = ''; $thisContainer = ''; } /* dceModFileEdit (c)2009 www.dceonline.de */ if($cfg['dceModEdit']['use'] && ($cfg['dceModEdit']['allModsFromFile'] == true || in_array((int) $a_d[$value], $cfg['dceModEdit']['modsFromFile']))) { cInclude('classes', 'contenido/class.module.php'); $tmpModule = new cApiModule; $tmpModule->loadByPrimaryKey($a_d[$value]); $output = $thisModule.$thisContainer.$tmpModule->get("output"); unset($tmpModule); } else { $output = $thisModule.$thisContainer.$db->f("output"); } /* dceModFileEdit (c)2009 www.dceonline.de */ $output = AddSlashes($output)."\n"; $template = $db->f("template"); $a_c[$value] = preg_replace("/(&\$)/", "", $a_c[$value]); $tmp1 = preg_split("/&/", $a_c[$value]); $varstring = array (); foreach ($tmp1 as $key1 => $value1) { $tmp2 = explode("=", $value1); foreach ($tmp2 as $key2 => $value2) { $varstring["$tmp2[0]"] = $tmp2[1]; } } $CiCMS_Var = '$C'.$value.'CMS_VALUE'; $CiCMS_VALUE = ''; foreach ($varstring as $key3 => $value3) { $tmp = urldecode($value3); $tmp = str_replace("\'", "'", $tmp); $CiCMS_VALUE .= $CiCMS_Var.'['.$key3.']="'.$tmp.'"; '; $output = str_replace("\$CMS_VALUE[$key3]", $tmp, $output); $output = str_replace("CMS_VALUE[$key3]", $tmp, $output); } $output = str_replace("CMS_VALUE", $CiCMS_Var, $output); $output = str_replace("\$".$CiCMS_Var, $CiCMS_Var, $output); $output = preg_replace("/(CMS_VALUE\[)([0-9]*)(\])/i", "", $output); if ($frontend_debug["container_display"] == true) { $fedebug .= "Container: CMS_CONTAINER[$value]".'\\\\n'; } if ($frontend_debug["module_display"] == true) { $fedebug .= "Modul: ".$db->f("name").'\\\\n'; } if ($frontend_debug["module_timing_summary"] == true || $frontend_debug["module_timing"] == true) { $fedebug .= 'Eval-Time: $modtime'.$value.'\\\\n'; $output = ''.$output.''; } if ($fedebug != "") { $output = addslashes('\'; ?'.'>'."
").$output; $output = $output.addslashes('function showmod'.$value.' () { window.alert(\\\'\'. "'.addslashes($fedebug).'".\'\\\');} \'; ?'.'>'); } if ($frontend_debug["module_timing_summary"] == true) { $output .= addslashes(' '); $output .= addslashes(' f("name")).'"; ?>'); } /* Replace new containers */ $code = preg_replace("/(.*)<\/container>/Uis", "CMS_CONTAINER[$value]", $code); $code = preg_replace("//i", "CMS_CONTAINER[$value]", $code); $code = str_ireplace("CMS_CONTAINER[$value]", "\r\n".$output, $code); $fedebug = ""; } } /* Find out what kind of CMS_... Vars are in use */ $sql = "SELECT * FROM ".$cfg["tab"]["content"]." AS A, ".$cfg["tab"]["art_lang"]." AS B, ".$cfg["tab"]["type"]." AS C WHERE A.idtype = C.idtype AND A.idartlang = B.idartlang AND B.idart = '".Contenido_Security::toInteger($idart)."' AND B.idlang = '".Contenido_Security::escapeDB($lang, $db)."'"; $db->query($sql); while ($db->next_record()) { $a_content[$db->f("type")][$db->f("typeid")] = $db->f("value"); } $sql = "SELECT idartlang, pagetitle FROM ".$cfg["tab"]["art_lang"]." WHERE idart='".Contenido_Security::toInteger($idart)."' AND idlang='".Contenido_Security::escapeDB($lang, $db)."'"; $db->query($sql); $db->next_record(); $idartlang = $db->f("idartlang"); $pagetitle = stripslashes($db->f("pagetitle")); if ($pagetitle == '') { CEC_Hook::setDefaultReturnValue($pagetitle); $pagetitle = CEC_Hook::executeAndReturn('Contenido.Content.CreateTitletag'); } /* replace all CMS_TAGS[] */ $sql = "SELECT type, code FROM ".$cfg["tab"]["type"]; $db->query($sql); $match = array (); while ($db->next_record()) { $tmp = preg_match_all("/(".$db->f("type")."\[+\d+\])/i", $code, $match); $a_[strtolower($db->f("type"))] = $match[0]; $success = array_walk($a_[strtolower($db->f("type"))], 'extractNumber'); $search = array (); $replacements = array (); foreach ($a_[strtolower($db->f("type"))] as $val) { eval ($db->f("code")); $search[$val] = $db->f("type")."[$val]"; $replacements[$val] = $tmp; $keycode[$db->f("type")][$val] = $tmp; } $code = str_ireplace($search, $replacements, $code); } /* add/replace title */ if ($pagetitle != "") { $code = preg_replace("/.*?<\/title>/is", "{TITLE}", $code, 1); if (strstr($code, "{TITLE}")) { $code = str_ireplace("{TITLE}", addslashes("<title>$pagetitle"), $code); } else { $code = str_ireplace_once("", addslashes("".$pagetitle."\n"), $code); } } else { $code = str_replace('', '', $code); } // metatags $availableTags = conGetAvailableMetaTagTypes(); $metatags = array (); foreach ($availableTags as $key => $value) { $metavalue = conGetMetaValue($idartlang, $key); if (strlen($metavalue) > 0) { //$metatags[$value["name"]] = array(array("attribute" => $value["fieldname"], "value" => $metavalue), ...); $metatags[] = array ($value["fieldname"] => $value["name"], 'content' => $metavalue); } } // generator tag $aVersion = explode('.', $cfg['version']); $sCLVersion = $aVersion[0] . '.' . $aVersion[1]; $metatags[] = array ('name' => 'generator', 'content' => 'CMS ConLite ' . $sCLVersion); // charset/encoding tag if(getEffectiveSetting('generator', 'html5', "false") == "true") { $metatags[] = array('charset' => $encoding[$lang]); } else if(getEffectiveSetting('generator', 'xhtml', "false") == "true") { $metatags[] = array ('http-equiv' => 'Content-Type', 'content' => 'application/xhtml+xml; charset='.$encoding[$lang]); } else { $metatags[] = array ('http-equiv' => 'Content-Type', 'content' => 'text/html; charset='.$encoding[$lang]); } // check chains $_cecIterator = $_cecRegistry->getIterator("Contenido.Content.CreateMetatags"); if($_cecIterator->count() > 0) { $tmpMetatags = $metatags; if(!is_array($tmpMetatags)) { $tmpMetatags = array(); } while($chainEntry = $_cecIterator->next()) { $tmpMetatags = $chainEntry->execute($tmpMetatags); } //added 2008-06-25 Timo Trautmann //system metatags were merged to user meta tags //and user meta tags were not longer replaced by system meta tags /** @todo recode whole meta tag handling */ if(is_array($tmpMetatags)) { //check for all system meta tags if there is already a user meta tag foreach ($tmpMetatags as $aAutValue) { $bExists = false; //get name of meta tag for search $sSearch = ''; if (array_key_exists('name', $aAutValue)) { $sSearch = $aAutValue['name']; } else if (array_key_exists('http-equiv', $aAutValue)) { $sSearch = $aAutValue['http-equiv']; } //check if meta tag is already in list of user meta tags if (strlen($sSearch) > 0) { foreach ($metatags as $aValue) { if (array_key_exists('name', $aValue)) { if ($sSearch == $aValue['name']) { $bExists = true; break; } } else if (array_key_exists('http-equiv', $aAutValue)) { if ($sSearch == $aValue['http-equiv']) { $bExists = true; break; } } } } //add system meta tag if there is no user meta tag if ($bExists == false && strlen($aAutValue['content']) > 0) { array_push($metatags, $aAutValue); } } } } $sMetatags = ''; foreach ($metatags as $value) { if(getEffectiveSetting('generator', 'html5', "false") == "true") { if($value['name'] == 'date') continue; } if(!empty($value['content'])) { $value['content'] = clHtmlEntityDecode($value['content'], ENT_QUOTES, strtoupper($encoding[$lang])); $value['content'] = htmlspecialchars_decode($value['content'], ENT_QUOTES); } // build up metatag string $oMetaTagGen = new cHTML5Meta(); $oMetaTagGen->updateAttributes($value); /* HTML does not allow ID for meta tags */ $oMetaTagGen->removeAttribute("id"); /*Check if metatag already exists*/ if (preg_match('/(]+)>\r?\n?)/i', $code, $aTmetatagfound)) { $code = str_replace($aTmetatagfound[1], $oMetaTagGen->render()."\n", $code); } else if(array_key_exists ("charset", $value) && preg_match('/(]+)\r?\n?)/i', $code, $aTmetatagfound)) { $code = str_replace($aTmetatagfound[1], $oMetaTagGen->render()."\n", $code); } else { $sMetatags .= $oMetaTagGen->render()."\n"; } } /* Add meta tags */ $code = str_ireplace_once("", $sMetatags."", $code); $code = str_ireplace_once("", "\n", $code); /* write code into the database */ $date = date("Y-m-d H:i:s"); if ($layout == false) { $sql = "SELECT * FROM ".$cfg["tab"]["code"]." WHERE idcatart = '".Contenido_Security::toInteger($idcatart)."' AND idlang = '".Contenido_Security::escapeDB($lang, $db)."'"; $db->query($sql); if ($db->next_record()) { if ($debug) echo "UPDATED code for lang:$lang, client:$client, idcatart:$idcatart"; $sql = "UPDATE ".$cfg["tab"]["code"]." SET code='".Contenido_Security::escapeDB($code, $db, false)."', idlang='".Contenido_Security::escapeDB($lang, $db)."', idclient='".Contenido_Security::escapeDB($client, $db)."' WHERE idcatart='".Contenido_Security::toInteger($idcatart)."' AND idlang='".Contenido_Security::escapeDB($lang, $db)."'"; $db->query($sql); } else { if ($debug) echo "INSERTED code for lang:$lang, client:$client, idcatart:$idcatart"; $sql = "INSERT INTO ".$cfg["tab"]["code"]." (idcode, idcatart, code, idlang, idclient) VALUES ('".Contenido_Security::toInteger($db->nextid($cfg["tab"]["code"]))."', '".Contenido_Security::toInteger($idcatart)."', '".Contenido_Security::escapeDB($code, $db, false)."', '".Contenido_Security::escapeDB($lang, $db)."', '".Contenido_Security::escapeDB($client, $db)."')"; $db->query($sql); } $sql = "UPDATE ".$cfg["tab"]["cat_art"]." SET createcode = '0' WHERE idcatart='".Contenido_Security::toInteger($idcatart)."'"; $db->query($sql); } // execute CEC hook $code = CEC_Hook::executeAndReturn('Contenido.Content.conGenerateCode', $code); return $code; } /** * Returns the idartlang for a given article and language * * @deprecated since version 2.0, use renamed conGetArtLang instead * @param $idart ID of the article * @param $idlang ID of the language * @return mixed idartlang of the article or false if nothing was found */ function getArtLang($idart, $idlang) { return conGetArtLang($idart, $idlang); } /** * Returns the idartlang for a given article and language * * @param $idart ID of the article * @param $idlang ID of the language * @return mixed idartlang of the article or false if nothing was found */ function conGetArtLang($iIdart, $iIdlang) { $oArtLangs = new cApiArticleLanguageCollection(); $iRet = $oArtLangs->getIdArtLang($iIdart, $iIdlang); unset($oArtLangs); // save mem return $iRet; } /** * Returns all available meta tag types * * @return array Array with available meta types */ function conGetAvailableMetaTagTypes() { $oMetaTypes = new cApiMetaTypeCollection(); $aRet = $oMetaTypes->getAvailableMetaTypes(); unset($oMetaTypes); // save mem return $aRet; } /** * Get the meta tag value for a specific article * * @param int $idartlang * @param int $idmetatype * @return string tag value or empty string */ function conGetMetaValue($idartlang, $idmetatype) { if($idartlang == 0) return; $oMetaTags = new cApiMetaTagCollection(); $oMetaTags->setWhere('idartlang', Contenido_Security::toInteger($idartlang)); $oMetaTags->setWhere('idmetatype', Contenido_Security::toInteger($idmetatype)); $oMetaTags->query(); if($oMetaTags->count() > 0) { $sRet = $oMetaTags->next()->get('metavalue'); } else { $sRet = ""; } unset($oMetaTags); // save mem return $sRet; } /** * Set the meta tag value for a specific article * * @param $idartlang ID of the article * @param $idmetatype Metatype-ID * @param $value Value of the meta tag * * @author Timo A. Hummel * @copyright four for business AG 2003 */ function conSetMetaValue($idartlang, $idmetatype, $value) { global $cfg; $db = new DB_ConLite; $sql = "DELETE FROM ".$cfg["tab"]["meta_tag"]." WHERE idartlang = '".Contenido_Security::toInteger($idartlang)."' AND idmetatype = '".Contenido_Security::toInteger($idmetatype)."'"; $db->query($sql); $nextid = $db->nextid($cfg["tab"]["meta_tag"]); $sql = "INSERT INTO ".$cfg["tab"]["meta_tag"]." SET idartlang = '".Contenido_Security::toInteger($idartlang)."', idmetatype = '".Contenido_Security::toInteger($idmetatype)."', idmetatag = '".Contenido_Security::toInteger($nextid)."', metavalue = '".Contenido_Security::escapeDB($value, $db)."'"; $db->query($sql); } /** * (re)generate keywords for all articles of a given client (with specified language) * @param $client Client * @param $lang Language of a client * @return void * * @author Willi Man * Created : 12.05.2004 * Modified : 13.05.2004 * @copyright four for business AG 2003 */ function conGenerateKeywords($client, $lang) { global $cfg; $db_art = new DB_ConLite; $options = array ("img", "link", "linktarget", "swf"); // cms types to be excluded from indexing $sql = "SELECT a.idart, b.idartlang FROM ".$cfg["tab"]["art"]." AS a, ".$cfg["tab"]["art_lang"]." AS b WHERE a.idart = b.idart AND a.idclient = ".Contenido_Security::escapeDB($client, $db)." AND b.idlang = ".Contenido_Security::escapeDB($lang, $db); $db_art->query($sql); $articles = array (); while ($db_art->next_record()) { $articles[$db_art->f("idart")] = $db_art->f("idartlang"); } if (count($articles) > 0) { foreach ($articles as $artid => $article_lang) { $article_content = array (); $article_content = conGetContentFromArticle($article_lang); if (count($article_content) > 0) { $art_index = new Index($db_art); $art_index->lang = $lang; $art_index->start($artid, $article_content, 'auto', $options); } } } } /** * get content from article * @param $article_lang ArticleLanguageId of an article (idartlang) * @return array Array with content of an article indexed by content-types * * @author Willi Man * Created : 12.05.2004 * Modified : 13.05.2004 * @copyright four for business AG 2003 */ function conGetContentFromArticle($article_lang) { global $cfg; $db_con = new DB_ConLite; $sql = "SELECT * FROM ".$cfg["tab"]["content"]." AS A, ".$cfg["tab"]["art_lang"]." AS B, ".$cfg["tab"]["type"]." AS C WHERE A.idtype = C.idtype AND A.idartlang = B.idartlang AND A.idartlang = '".Contenido_Security::escapeDB($article_lang, $db_con)."' "; $db_con->query($sql); while ($db_con->next_record()) { $a_content[$db_con->f("type")][$db_con->f("typeid")] = urldecode($db_con->f("value")); } return $a_content; } ?>