viele von euch werden sicherlich wissen, wie der Code für eine Frontendseite in Contenido generiert wird.
Trotzdem mache ich eine kleine Zusammenfassung...
Zuerst gibt es das Layout, in der die Modulcontainer definiert werden. Hier ein vereinfachtes Beispiel mit einem Modulcontainer:
Code: Alles auswählen
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>Layout</title>
</head>
<body>
<container id="10" name="MyContentModule" types="Content" mode="fixed" default="">Content module</container>
</body>
</html>
Dazu kann man ein Modul implementieren, das sich um die Ausgabe kümmert. Hier ein einfaches Moduloutput-Beispiel zum obrigen Modul "MyContentModule":
Code: Alles auswählen
<?php
echo '
<div class="loremIpsum">
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt
ut labore et dolore magna aliquyam erat, sed diam voluptua.
</div>
';
?>
Der Code der Seite wird beim Generieren aus Layout + Modul zusammmengefügt. Es kommt dann folgendes raus:
Code: Alles auswählen
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>Layout</title>
</head>
<body>
<?php
echo '
<div class="loremIpsum">
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt
ut labore et dolore magna aliquyam erat, sed diam voluptua.
</div>
';
?>
</body>
</html>
Alternative Codegenerierung
Nun möchte ich eine andere Variante der Codegenerierung vorstellen, die Möglichkeit zur Verarbeitung der Module vor der Ausgabe.
Wenn der PHP-Code der Module vor der Ausgabe der Seite ausgeführt wird, also schon vor dem Layout, könnte man folgende Features realisieren, sofern diese Möglichkeiten implementiert sind:
- Module könnten CSS-/ oder JS-Dateien hinzufügen.
Code: Alles auswählen
<?php Contenido_FePage::getInstance()->addCSS('/path/to/styles.css'); Contenido_FePage::getInstance()->addJS('/path/to/javascript.js'); ?>
- Module könnten CSS-/ oder JS-Code in den head-Bereich hinzufügen
Code: Alles auswählen
<?php Contenido_FePage::getInstance()->addCSSCode('* {margin:0; padding:0;}'); Contenido_FePage::getInstance()->addJSCode('alert("foobar");'); ?>
- In Modulen könnte man auf die Metatags einfluss nehmen.
Code: Alles auswählen
<?php Contenido_FePage::getInstance()->setMetatag('description', 'Foobar'); ?>
- In Modulen könnte man weitere zusätzliche Elemente in den head-Bereich einfügen.
Code: Alles auswählen
<?php Contenido_FePage::getInstance()->addLink(array( 'rel' => 'alternate', 'type' => 'application/rss+xml', 'title' => 'RSS Feed', 'href' => 'http://domain/path/to/rssfeed' )); ?>
- Man könnte die Ausgabe eines Modulcodes, das vorher ausgeführt wurde, nachträglich modifizieren
Code: Alles auswählen
<?php $page = Contenido_FePage::getInstance(); $output = $page->getModuleOutput('10'); // get moduleputput by container id $output = strip_tags($output); $output = $page->setModuleOutput('10', $output); ?>
- Man könnte sogar im letzten Modul einen HTTP-header setzen oder gar einen richtigen Redirect mit der head-Direktive machen
Code: Alles auswählen
<?php $page = Contenido_FePage::getInstance(); // HTTP 404 ausgeben $page->setHttpHeader('HTTP/1.0 404 Not Found'); // HTTP 302 ausgeben $url = Contenido_Url::getInstance()->build(array('idart' => 123, 'lang' => $lang)); $page->redirect($url); ?>
- Wenn der Modulcode aus einer zentralen Stelle kommt, kann man an dieser Stelle sogar einen Modul Cachingmechanismus implementieren oder sogar auf Modulebene die Ausgabe abhängig vom angemeldeten Frontend-Benutzer machen.
Dann wäre es möglich, dass man das sogar über den Modulcontainer steuertCode: Alles auswählen
<container id="10" name="MyContentModule" types="Content" mode="fixed" default="" cachelifetime="60" cacheoptions="get,post,session" feusergroup="Contenidos">Content module</container>
- Viele weitere Möglichkeiten sind denkbar, z. B. dass jeder Modulcode einen preInit und einen postProcess Hook bekommt...
Um das realisieren zu können, musste im Core nur die Erstellung des Codes angepasst werden, die Funktion conGenerateCode().
Der generierte Code der Startseite des Beispielmandanten unter 4.8.12 sieht, etwas bereinigt, folgendermaßen aus:
Code: Alles auswählen
<?php
// ####################### start module "1" #######################
$C1CMS_VALUE[]="";
ob_start();
?>
<?php $cCurrentModule = 3;$cCurrentContainer = 1; ?><?php
if (!isset($tpl) || !is_object($tpl) || strtolower(get_class($tpl)) != 'template') {
$tpl = new Template();
}
$tpl->reset();
$tpl->generate('templates/contenido_header.html');
?>
<?php
$modOut = ob_get_contents();
ob_end_clean();
ConMp_FePage::getInstance()->addModuleOutput("1", $modOut);
// ######################## end module "1" ########################
?><?php
// ####################### start module "10" #######################
$C10CMS_VALUE[]="";
ob_start();
?>
<?php $cCurrentModule = 22;$cCurrentContainer = 10; ?><?php
cInclude('classes', 'Contenido_FrontendNavigation/Contenido_FrontendNavigation_Breadcrumb.class.php');
try {
$oBread = new Contenido_FrontendNavigation_Breadcrumb($db, $cfg, $client, $lang, $cfgClient);
$oBreadCats = $oBread->get($idcat, 1);
$sBread = 'Contenido - ';
$aBread = array();
foreach ($oBreadCats as $oConCat) {
$aBread[] = $oConCat->getCategoryLanguage()->getName();
}
$sBread .= implode(' - ', $aBread);
$oArticle = new Article($idart, $client, $lang);
$sHeadline = strip_tags($oArticle->getContent('CMS_HTMLHEAD', 1));
if ($sHeadline != '') {
$sBread .= ' - '.$sHeadline;
}
echo $sBread;
} catch (InvalidArgumentException $eI) {
echo 'Contenido';
} catch (Exception $e) {
echo 'Contenido';
}
?>
<?php
$modOut = ob_get_contents();
ob_end_clean();
ConMp_FePage::getInstance()->addModuleOutput("10", $modOut);
// ######################## end module "10" ########################
?><?php
// ####################### start module "20" #######################
$C20CMS_VALUE[]="";
ob_start();
?>
<?php $cCurrentModule = 5;$cCurrentContainer = 20; ?><?php
cInclude('classes', 'Contenido_Category/Contenido_Category.class.php');
// get start idcat
$iIdcatStart = (int) getEffectiveSetting('navigation', 'idcat-home', '1');
try {
// get headline
$oConCat = new Contenido_Category($db, $cfg);
$oConCat->load($idcat, true, $lang);
$sImgEdit = "";
$sImg = "";
$sHeadline = $iIdcatStart != intval($idcat)
? $oConCat->getCategoryLanguage()->getName()
: mi18n("Willkommen!");
$sCssStyle = '';
if ($contenido && $edit) {
echo '<div id="modHeaderImgEdit">'.$sImgEdit.'</div>';
}
if ($sImg != '') {
$sCssStyle = ' style="background-image:url('.$sImg.');"';
}
$tpl->reset();
$tpl->set('s', 'css-style', $sCssStyle);
$tpl->set('s', 'url', 'front_content.php');
$tpl->set('s', 'title', mi18n("Zur Contenido Homepage"));
$tpl->set('s', 'headline', $sHeadline);
$tpl->generate('templates/header.html');
} catch (InvalidArgumentException $eI) {
echo 'Some error occured: ' . $eI->getMessage() . ': ' . $eI->getFile() . ' at line '.$eI->getLine() . ' ('.$eI->getTraceAsString().')';
} catch (Exception $e) {
echo 'Some error occured: ' . $e->getMessage() . ': ' . $e->getFile() . ' at line '.$e->getLine() . ' ('.$e->getTraceAsString().')';
}
?>
<?php
$modOut = ob_get_contents();
ob_end_clean();
ConMp_FePage::getInstance()->addModuleOutput("20", $modOut);
// ######################## end module "20" ########################
?><?php
// ####################### start module "30" #######################
$C30CMS_VALUE[]="";
ob_start();
?>
<?php $cCurrentModule = 10;$cCurrentContainer = 30; ?><?php
// include Contenido_FrontendNavigation class
cInclude('classes', 'Contenido_FrontendNavigation/Contenido_FrontendNavigation.class.php');
cInclude('classes', 'Contenido_FrontendNavigation/Contenido_FrontendNavigation_Breadcrumb.class.php');
// get start idcat
$iIdcatStart = getEffectiveSetting('navigation', 'idcat-home', 1);
// instantiate 2nd + 3rd template object, reset all
$tpl2 = new Template();
$tpl3 = new Template();
$tpl->reset();
$tpl2->reset();
$tpl3->reset();
// build navigation
try {
$oFeNav = new Contenido_FrontendNavigation($db, $cfg, $client, $lang, $cfgClient);
$oBreadcrumb = new Contenido_FrontendNavigation_Breadcrumb($db, $cfg, $client, $lang, $cfgClient);
$aBreadcrumb = $oBreadcrumb->getAsArray($idcat, 1); // this nav starts at level 1
$oFeNav->setAuth($auth); // to make sure user sees what he's allowed to see
$oContenidoCategories = $oFeNav->getSubCategories($iIdcatStart, true);
if ($oContenidoCategories->count() > 0) {
foreach ($oContenidoCategories as $oContenidoCategory) {
$sSubcats = '';
$tpl2->reset();
$bHasActiveSubCat = false;
// check if we need to load subcategories
$oSubCatsLevel2 = $oFeNav->getSubCategories($oContenidoCategory->getIdCat(), true);
$aSubCatsLevel2 = $oFeNav->getSubCategories($oContenidoCategory->getIdCat(), false);
$bShowSubcatLevel2 = (intval($idcat) == $oContenidoCategory->getIdCat() || in_array(intval($idcat), $aSubCatsLevel2)
|| (isset($aBreadcrumb[2]) && intval($idcat) == $aBreadcrumb[2] && in_array($aBreadcrumb[1], $aSubCatsLevel2)))
? true : false;
if ($bShowSubcatLevel2 === true && $oSubCatsLevel2->count() > 0) {
foreach ($oFeNav->getSubCategories($oContenidoCategory->getIdCat(), true) as $oSubCategory) {
$bHasActiveSubSubCat = false;
// check if we need to load subsubcategories
$oSubCatsLevel3 = $oFeNav->getSubCategories($oSubCategory->getIdCat(), true);
$aSubCatsLevel3 = $oFeNav->getSubCategories($oSubCategory->getIdCat(), false);
$bShowSubcatLevel3 = (intval($idcat) == $oSubCategory->getIdCat() ||
in_array(intval($idcat), $aSubCatsLevel3))
? true : false;
$sSubcats2 = '';
if ($bShowSubcatLevel3 === true) {
foreach ($oSubCatsLevel3 as $oSubSubCategories) {
if ($bHasActiveSubCat === false && intval($idcat) == $oSubSubCategories->getIdCat()) {
$bHasActiveSubCat = true;
}
if ($bHasActiveSubSubCat === false && intval($idcat) == $oSubSubCategories->getIdCat()) {
$bHasActiveSubSubCat = true;
}
toTpl($tpl3, $oSubSubCategories, (intval($idcat) == $oSubSubCategories->getIdCat() ? ' class="active"' : ''), '');
}
$sSubcats2 = $tpl3->generate('templates/navigation_main_item.html', true, false);
$tpl3->reset();
$tpl3->set('s', 'items', $sSubcats2);
$tpl3->set('s', 'css-class', ' class="subSubNavigation"');
$sSubcats2 = $tpl3->generate('templates/navigation_main_container.html', true, false);
}
if ($bHasActiveSubCat === false && intval($idcat) == $oSubCategory->getIdCat()) {
$bHasActiveSubCat = true;
}
toTpl($tpl2, $oSubCategory,
(intval($idcat) == $oSubCategory->getIdCat() || $bHasActiveSubSubCat === true ? ' class="active"' : ''),
$sSubcats2);
}
$sSubcats = $tpl2->generate('templates/navigation_main_item.html', true, false);
$tpl2->reset();
$tpl2->set('s', 'items', $sSubcats);
$tpl2->set('s', 'css-class', ' class="subNavigation"');
$sSubcats = $tpl2->generate('templates/navigation_main_container.html', true, false);
}
toTpl($tpl, $oContenidoCategory, ($bHasActiveSubCat === true || intval($idcat) == $oContenidoCategory->getIdCat() ? ' class="active"' : ''), $sSubcats);
}
$sCats = $tpl->generate('templates/navigation_main_item.html', true, false);
$tpl->reset();
$tpl->set('s', 'css-class', '');
$tpl->set('s', 'items', $sCats);
$tpl->generate('templates/navigation_main_container.html');
}
} catch (Exception $e) {
echo 'Some error occured: ' . $e->getMessage() . ': ' . $e->getFile() . ' at line '.$e->getLine() . ' ('.$e->getTraceAsString().')';
}
function toTpl(&$oTpl, Contenido_Category $oCat, $sActiveCssClass, $sSubcats) {
$oTpl->set('d', 'css-class', $sActiveCssClass);
# $oTpl->set('d', 'url', 'front_content.php?idcat='.$oCat->getIdCat());
$oTpl->set('d', 'url', $GLOBALS['sess']->url('front_content.php?idcat='.$oCat->getIdCat()));
$oTpl->set('d', 'title', $oCat->getCategoryLanguage()->getName());
$oTpl->set('d', 'label', $oCat->getCategoryLanguage()->getName());
$oTpl->set('d', 'subcategories', $sSubcats); // followup level
$oTpl->next();
}
?>
<?php
$modOut = ob_get_contents();
ob_end_clean();
ConMp_FePage::getInstance()->addModuleOutput("30", $modOut);
// ######################## end module "30" ########################
?><?php
// ####################### start module "40" #######################
$C40CMS_VALUE[]="";
ob_start();
?>
<?php $cCurrentModule = 17;$cCurrentContainer = 40; ?><?php
$tpl->reset();
$sTargetIdcat = getEffectiveSetting('search-results', 'idcat', '1');
$sTargetIdart = getEffectiveSetting('search-results', 'idart', '1');
$sFormAction = 'front_content.php?idcat='.$sTargetIdcat.'&idart='.$sTargetIdart;
$tpl->set('s', 'form_action', $sFormAction);
$tpl->set('s', 'label_search', mi18n("Suche"));
$tpl->generate('templates/search_input.html');
?>
<?php
$modOut = ob_get_contents();
ob_end_clean();
ConMp_FePage::getInstance()->addModuleOutput("40", $modOut);
// ######################## end module "40" ########################
?><?php
// ####################### start module "50" #######################
$C50CMS_VALUE[]="";
ob_start();
?>
<?php $cCurrentModule = 6;$cCurrentContainer = 50; ?><?php
$tpl->reset();
if ($contenido && $edit) {
$tpl->set('s', 'text', "Ihre Installation hat geklappt!
");
} else {
$tpl->set('s', 'text', strip_tags("Ihre Installation hat geklappt!
"));
}
$tpl->generate('templates/headline_h1.html');
?>
<?php
$modOut = ob_get_contents();
ob_end_clean();
ConMp_FePage::getInstance()->addModuleOutput("50", $modOut);
// ######################## end module "50" ########################
?><?php
// ####################### start module "51" #######################
$C51CMS_VALUE[]="";
ob_start();
?>
<?php $cCurrentModule = 20;$cCurrentContainer = 51; ?><?php
$sText = "";
$tpl->reset();
if ($contenido && $edit) {
$tpl->set('s', 'text', $sText);
$tpl->generate('templates/subheadline_h2.html');
} else {
if ($sText != '') {
$tpl->set('s', 'text', strip_tags($sText));
$tpl->generate('templates/subheadline_h2.html');
}
}
?>
<?php
$modOut = ob_get_contents();
ob_end_clean();
ConMp_FePage::getInstance()->addModuleOutput("51", $modOut);
// ######################## end module "51" ########################
?><?php
// ####################### start module "60" #######################
$C60CMS_VALUE[0]="http://www.contenido.org/rss/de/news"; $C60CMS_VALUE[1]="teaser_right.html"; $C60CMS_VALUE[2]="3";
ob_start();
?>
<?php $cCurrentModule = 16;$cCurrentContainer = 60; ?><?php
cInclude("pear", "XML/Parser.php");
cInclude("pear", "XML/RSS.php");
if ("http://www.contenido.org/rss/de/news" == "")
{
$sFeed = "http://www.contenido.org/rss/de/news";
} else {
$sFeed = "http://www.contenido.org/rss/de/news";
}
if ("3" == "")
{
$FeedMaxItems = 999;
} else {
$FeedMaxItems = intval("3");
}
/* Preparse feed for an encoding due to the poorly designed
PHP XML parser */
$sFeedContent = substr(@file_get_contents($sFeed),0,1024);
$regExp = "/<\\?xml.*encoding=[\"\'](.*)[\"\']\\?>/i";
preg_match($regExp,trim($sFeedContent),$matches);
if ($matches[1])
{
$rss = new XML_RSS($sFeed, $matches[1]);
} else {
$rss = new XML_RSS($sFeed);
}
$rss->parse();
$tpl = new Template;
$i = 0;
foreach ($rss->getItems() as $item)
{
if ($i < $FeedMaxItems) {
$tpl->set("d", "TITLE", htmlentities($item['title'],ENT_QUOTES));
$tpl->set("d", "LINK", htmlentities($item['link'],ENT_QUOTES));
$tpl->set("d", "DESCRIPTION", htmlentities($item['description'],ENT_QUOTES));
$tpl->set("d", "READ_ON", mi18n("weiterlesen"));
$tpl->next();
}
$i++;
}
$tpl->generate($cfgClient[$client]["path"]["frontend"]."templates/"."teaser_right.html");
?>
<?php
$modOut = ob_get_contents();
ob_end_clean();
ConMp_FePage::getInstance()->addModuleOutput("60", $modOut);
// ######################## end module "60" ########################
?><?php
// ####################### start module "70" #######################
$C70CMS_VALUE[]="";
ob_start();
?>
<?php $cCurrentModule = 8;$cCurrentContainer = 70; ?><?php
$tpl->reset();
$tpl->generate('templates/logo_bottom.html');
?>
<?php
$modOut = ob_get_contents();
ob_end_clean();
ConMp_FePage::getInstance()->addModuleOutput("70", $modOut);
// ######################## end module "70" ########################
?><?php
// ####################### start module "75" #######################
$C75CMS_VALUE[]="";
ob_start();
?>
<?php $cCurrentModule = 11;$cCurrentContainer = 75; ?><?php
// include Contenido_FrontendNavigation class
cInclude('classes', 'Contenido_FrontendNavigation/Contenido_FrontendNavigation.class.php');
// get start idcat
$iIdcatStart = getEffectiveSetting('navigation', 'idcat-meta', 2);
// reset template object
$tpl->reset();
// build navigation
try {
$oFeNav = new Contenido_FrontendNavigation($db, $cfg, $client, $lang, $cfgClient);
$oContenidoCategories = $oFeNav->getSubCategories($iIdcatStart, true);
if ($oContenidoCategories->count() > 0) {
foreach ($oContenidoCategories as $oContenidoCategory) {
$tpl->set('d', 'url', $sess->url('front_content.php?idcat='.$oContenidoCategory->getIdCat()));
$tpl->set('d', 'title', $oContenidoCategory->getCategoryLanguage()->getName());
$tpl->set('d', 'label', $oContenidoCategory->getCategoryLanguage()->getName());
$tpl->next();
}
$sItems = $tpl->generate('templates/navigation_meta_item.html', true, false);
$tpl->reset();
$tpl->set('s', 'items', $sItems);
$tpl->generate('templates/navigation_meta_container.html');
}
} catch (Exception $e) {
echo 'Shit happens: ' . $e->getMessage() . ': ' . $e->getFile() . ' at line '.$e->getLine() . ' ('.$e->getTraceAsString().')';
}
?>
<?php
$modOut = ob_get_contents();
ob_end_clean();
ConMp_FePage::getInstance()->addModuleOutput("75", $modOut);
// ######################## end module "75" ########################
?><?php
// ####################### start module "76" #######################
$C76CMS_VALUE[]="";
ob_start();
?>
<?php $cCurrentModule = 4;$cCurrentContainer = 76; ?><?php
$tpl->reset();
$tpl->generate('templates/footnotes_'.strval($lang).'.html');
?>
<?php
$modOut = ob_get_contents();
ob_end_clean();
ConMp_FePage::getInstance()->addModuleOutput("76", $modOut);
// ######################## end module "76" ########################
?><?php
// ####################### start module "80" #######################
$C80CMS_VALUE[]="";
ob_start();
?>
<?php $cCurrentModule = 7;$cCurrentContainer = 80; ?><?php
$tpl->reset();
if ($auth->auth["uid"] == "nobody") {
$sTargetIdcat = getEffectiveSetting('login', 'idcat', '1');
$sTargetIdart = getEffectiveSetting('login', 'idart', '1');
$sFormAction = 'front_content.php?idcat='.$sTargetIdcat.'&idart='.$sTargetIdart;
$tpl->set('s', 'headline', mi18n("Geschlossener Bereich Login"));
$tpl->set('s', 'form_action', $sFormAction);
$tpl->set('s', 'label_name', mi18n("name"));
$tpl->set('s', 'label_pass', mi18n("pass"));
$tpl->set('s', 'label_login', mi18n("einloggen"));
$tpl->generate('templates/login_form.html');
} else {
cInclude('classes', 'class.frontend.users.php');
cInclude('classes', 'Contenido_Category/Contenido_Category.class.php');
try {
$oConCat = new Contenido_Category($db, $cfg);
$oConCat->load($idcat, true, $lang);
$bCatIsPublic = ($oConCat->getCategoryLanguage()->getVisible() == 1 && $oConCat->getCategoryLanguage()->getPublic() == 1)
? true : false;
} catch (Exception $e) {
echo $e->getMessage();
}
$oFeUserCollection = new FrontendUserCollection();
$oFeUser = $oFeUserCollection->loadItem($auth->auth["uid"]);
$sText = str_replace('[uname]', $oFeUser->get('username'), mi18n("Willkommen <strong>[uname]</strong>, schön, dass Sie wieder bei uns vorbeischauen."));
if ($bCatIsPublic === true) {
$sUrl = 'front_content.php?idcat='.$idcat.'&idart='.$idart.'&logout=true';
} else {
$iIdcatHome = (int) getEffectiveSetting('navigation', 'idcat-home', '1');
$sUrl = 'front_content.php?idcat='.$iIdcatHome.'&logout=true';
}
$tpl->set('s', 'headline', mi18n("Geschlossener Bereich Logout"));
$tpl->set('s', 'text', $sText);
$tpl->set('s', 'url', $sUrl);
$tpl->set('s', 'label_logout', mi18n("ausloggen"));
$tpl->generate('templates/login_form_loggedin.html');
}
?>
<?php
$modOut = ob_get_contents();
ob_end_clean();
ConMp_FePage::getInstance()->addModuleOutput("80", $modOut);
// ######################## end module "80" ########################
?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<?php echo ConMp_FePage::getInstance()->getModuleOutput("1"); ?>
<title><?php echo ConMp_FePage::getInstance()->getModuleOutput("10"); ?></title>
<link rel="stylesheet" href="css/contenido_sample.css" type="text/css" media="all" />
<!--[if lte IE 6]>
<style type="text/css">
.clearfix {height:1px;}
</style>
<![endif]-->
<meta name="generator" content="CMS Contenido 4.8.12" />
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=iso-8859-1" />
<meta name="author" content="Systemadministrator" />
<meta name="date" content="2010-01-08 17:54:10" />
<meta name="description" content="Ihre Installation hat geklappt! " />
<meta name="keywords" content="k&ouml;nnen, contenido, ihnen, seite, einer, diese, anhand, einen" />
</head>
<body>
<div id="outerContainer">
<div id="head">
<?php echo ConMp_FePage::getInstance()->getModuleOutput("20"); ?>
</div>
<div id="contentContainer" class="clearfix">
<div id="navigation">
<?php echo ConMp_FePage::getInstance()->getModuleOutput("30"); ?>
<?php echo ConMp_FePage::getInstance()->getModuleOutput("40"); ?>
</div>
<div id="whiteBg">
<div id="content">
<?php echo ConMp_FePage::getInstance()->getModuleOutput("50"); ?>
<?php echo ConMp_FePage::getInstance()->getModuleOutput("51"); ?>
<img src="images/hr_article.gif" alt="" class="hr" />
</div>
<div id="teasersRight">
<?php echo ConMp_FePage::getInstance()->getModuleOutput("60"); ?>
</div>
</div>
</div>
</div> <!-- /outerContainer -->
<div id="footer">
<div id="footerContainer">
<?php echo ConMp_FePage::getInstance()->getModuleOutput("70"); ?>
<div id="footerContentContainer" class="clearfix">
<div id="footerContentLeft">
<?php echo ConMp_FePage::getInstance()->getModuleOutput("75"); ?>
<?php echo ConMp_FePage::getInstance()->getModuleOutput("76"); ?>
</div>
<div id="footerContentRight">
<?php echo ConMp_FePage::getInstance()->getModuleOutput("80"); ?>
</div>
</div>
</div>
</div>
</body>
</html>
Natürlich gibt es die Möglichkeit, weiterhin die originale Variante (inline Modulcodes) zu verwenden.
Bei Interesse stelle ich den Code dazu gerne zur Verfügung, und würde diesen mit der Commmunity zusammen weiter entwickeln.
Nachtrag:
Damit der Zugriff auf den Head-Bereich im Dokument, also die Möglichkeit zum Setzen der Meta-/Link-Tags usw., möglich ist, müsste die Contenido-Interne Metatag-Generierung auch angepasst werden.
Nachtrag 2:
Nun, den Code für das Ganze habe ich dem Beitrag hinzugefügt. Schaut euch das an, vielleicht ist es brauchbar, vielleicht auch nicht.
Das Ganze ist experimentiell und mehr Prototyp als eine saubere Implementierung.
Grüße
xmurrix