Ist auch eine gute Möglichkeit
Dummerweise habe ich hier nicht sofort nach der Aufgabenstellung danach gefragt und hatte genug Zeit mir einzureden, ich würde eine automatische Registrierung von Codes brauchen
Daher hatte ich mich doch noch hingesetzt und... Das ist die Lösung die meinem Vorhaben näherkommt, Also:
Code: Alles auswählen
/***********************************************
*
* CONTENIDO-MODUL INPUT
*
* MetaCode
*
* Ermöglicht das registrieren eigener Codeblöcke im Headbereich des Layouts
* Das Modul definiert im Inputbereich die Methode registerMetaCode()
* welche die Codeblöcke in einer Cms Variable (CMS_VAR[1])
* als Textsequenz abspeichert.
* Im Outputbereich wird die gespeicherte Sequenz ausgegeben, das Modul muss
* daher im Headbereich stehen um die Sequenz ebendort einfügen zu können.
*
* Version 1.1.3
* Author Edward Fondis
* Created 16.05.2004
*/
// ========== Anpassung =========================
//Modulname vor der Codesetzung ausgeben
$PrintModulname = TRUE;
// ========== Datensammlung =====================
$MetaCodes = array();
// ========== Jawascript zum beschreiben ========
function registerMetaCode($MetaCode) {
global $MetaCodes, $db, $PrintModulname;
//Auf Dubletten prüfen
$metacode = strtolower(str_replace(array("\n", "\r", "\t", "\v"), ' ', $MetaCode));
if (in_array($metacode, $MetaCodes)) return FALSE;
$MetaCode = trim($MetaCode);
//Zur späteren Prüfung aufnehmen
$MetaCodes[] = $metacode;
//Name das registrierenden Modul, hinzufügen.
if ($PrintModulname) {
$Modulname = $db->Record["name"];
$MetaCode = "<!-- $Modulname -->\n" . $MetaCode;
}
//$MetaCode umformen
$MetaCode = htmlspecialchars($MetaCode, ENT_QUOTES);
$MetaCode = str_replace("\r\n", '\\r\\n', $MetaCode);
$MetaCode = str_replace("\r", '\\r', $MetaCode);
$MetaCode = str_replace("\n", '\\n', $MetaCode);
echo '
<script type="text/javascript">
document.getElementById("MetaCodeArea").value += \''. $MetaCode .'\n\';
</script>';
}
//=========== Ausgabe ===========================
//Die Codesequenz wird zunächst leer voreingestellt..
echo '
<table cellspacing="0" cellpadding="0" border="0" style="width:100%">
<tr><td><input type="hidden" name="CMS_VAR[1]" id="MetaCodeArea" value=""></td></tr>
</table>';
Code: Alles auswählen
<?php
/***********************************************
*
* CONTENIDO-MODUL OUTPUT
*
* MetaCode
*
* Version 1.1.3
* Author Edward Fondis
* Created 16.05.2004
*/
// ========== Datensammlung =====================
$MetaCode = trim ('CMS_VALUE[1]');
$MetaCode = html_entity_decode($MetaCode, ENT_QUOTES);
//=========== Ausgabe ===========================
echo "
<!-- MetaCode Insertion (ver 1.1) -->
$MetaCode
<!-- End MetaCode Insertion -->\n";
?>
Wie in der Beschreibung steht, muss das Modul im Headbereich stehen. Die Module die ihr Code dort haben wollen müssen
im Input die Funktion
registerMetaCode() aufrufen, zB so:
Code: Alles auswählen
/***********************************************
* CONTENIDO-MODUL INPUT
* Text (HTML)
*/
registerMetaCode('<link rel="stylesheet" type="text/css" href="css/text.css">');
Dabei passiert folgendes: Das MetaCode Modul erzeugt daraufhin ein JS-Code, das beim Anzeigen der Konfigurationsseite das Variablenfeld um dieses Codeblock erweitert. Am Ende braucht man nur die Konfiguration mit der fertig aufgebauten Sequenz abzuspeichern.
Vor dem Aufbau des JS wird aber geprüft ob ein ännlicher Code-Eintrag bereits vorliegt (Dublette), wenn ja wird die Registrierung verweigert. Ännlichkeit: Bis auf Leer- und Steuerzeichen und unbeachtet Groß/Kleinschreibung. Die Semantik wird nicht geprüft: Vertauscht man in der obigen Zeile
rel="stylesheet" und
type="text/css", wird die Ännlichkeit nicht erkannt, bitte daher einheitlich schreiben
Je nach dem wie die Variable
$PrintModulname gesetzt ist wird vor dem Codeblock ein Kommentar mit dem Modulname ausgegeben, das das Code registriert hat: Bei TRUE
Code: Alles auswählen
<!-- MetaCode Insertion (ver 1.1) -->
<!-- Newsliste -->
<link rel="stylesheet" type="text/css" href="css/news.css">
<!-- NeustArt -->
<link rel="stylesheet" type="text/css" href="css/neustart.css">
<!-- Headline (HTML) -->
<link rel="stylesheet" type="text/css" href="css/headlines.css">
<!-- Text (HTML) -->
<link rel="stylesheet" type="text/css" href="css/text.css">
<!-- End MetaCode Insertion -->
und bei FALSE
Code: Alles auswählen
<!-- MetaCode Insertion (ver 1.1) -->
<link rel="stylesheet" type="text/css" href="css/news.css">
<link rel="stylesheet" type="text/css" href="css/neustart.css">
<link rel="stylesheet" type="text/css" href="css/headlines.css">
<link rel="stylesheet" type="text/css" href="css/text.css">
<!-- End MetaCode Insertion -->
Eingestellt ist TRUE (erste Variante), damit ist erkennbar wer das falsche Code registriert hat, wer aber nichts verraten will kann auschalten.
Mehrzeilige Codes sind möglich, zB das
Code: Alles auswählen
registerMetaCode('
<style type="text/css">
p {font-size: 11px;}
</style>
');
registerMetaCode('
<script type="text/javascript">
<!--
alert("Hallo Welt!");
//-->
</script>
');
würde zur entsprechenden (bedingt sinnvollen) Ausgabesequenz führen:
Code: Alles auswählen
<!-- MetaCode Insertion (ver 1.1) -->
...
<!-- Login -->
<style type="text/css">
p {font-size: 11px;}
</style>
<!-- Login -->
<script type="text/javascript">
<!--
alert("Hallo Welt!");
//-->
</script>
...
<!-- End MetaCode Insertion -->
Was noch, wenn in einem Modul die Registrierung ein- oder umgebaut wurde, muss die Seite wo es steht bzw. die Kategorie
neu konfigureirt werden, sonst bleibt das alte Code erhalten. So etwas wie
unregisterMetaCode() gibt es nicht weil sobald die Konfigurationsseite angezeigt wird, wird die aktuelle Codesequenz aufgebaut, wurde ein Modul entfernt wird das von ihm registriere Code ebenfalls entfernt, vorausgesetzt man speichert die Konfiguration ab.
Getestet mit IE und 4.4.4
Viel Spass damit.
Edward