Seite 1 von 4

Insite-Editing: valides XHTML erzeugen

Verfasst: Mo 19. Dez 2005, 21:58
von Dodger77
Da mich die Schwierigkeiten was valides XHTML angeht in Verbindung mit dem Insite-Editing und mehreren CMS_HTML-Containern (oder auch CMS_HTMLHEAD) ziemlich nerven, habe ich mal versucht, den klassischen Problemen beizukommen. Als Ansatz habe ich eine den Contenido Extension Chainer benutzt, weil ich nichts an Contenido selbst ändern wollte und der Inhalt aller o.g. CMS-Typen ja bei jedem Klick auf "Save" oder auch "Text HTML" neu gespeichert wird.

Die neue Chain packt man in die Datei "include.chain.content.html2xhtml.php" im Verzeichnis "contenido/plugins/chains/includes/" mit folgendem Inhalt (zuletzt geändert 30.01.2007 15:53):

Code: Alles auswählen

<?php

function cecContentHtml2Xhtml ($idartlang, $int2, $int3, $string)
{	
global $cfg;


  /* Cache the XHTML setting for performance reasons */
	if (!is_array($cfg) || !array_key_exists("generate_xhtml", $cfg))
	{
	
	if (function_exists("getEffectiveSetting"))
		{
			$cfg["generate_xhtml"] = getEffectiveSetting("generator", "xhtml", false);
		} else {
			$cfg["generate_xhtml"] = false;	
		}
	}

	if ($cfg["generate_xhtml"] === "false")
	{
		$cfg["generate_xhtml"] = false;
	}

  if ($cfg["generate_xhtml"] == true) 
  {
	  $string = preg_replace ("/(<\/?)(\w+)([^>]*>)/me"
						   ,"'\\1'.strtolower('\\2').cecContentHtmlAttr2Xhtml('\\3')"
						   ,$string
						   );

	  $string = preg_replace ("/(<)(area|base|basefont|br|col|frame|hr|img|input|isindex|link|meta|param)([^>]*?)((?<!\/)>)/m"
						   ,"\\1\\2\\3 />"
						   ,$string
						   );
  }
	return $string;
}

function cecContentHtmlAttr2Xhtml ($string)
{
	$string = stripslashes ($string);

	$string = stripslashes (preg_replace ("/(\w+)(\=)([\"|\'])([^\"']+)([\"|\'])(\s)/me"
										 ,'strtolower("\1")."=\"\4\" "'
										 ,$string
										 ));

	$string = stripslashes (preg_replace ("/([\s]([\w]+)[\s]+)(?!\=[\"\'])(?=[\/]?[>]|[\w\s]+[\=])/me"
										 ,' '.strtolower('\\2').'="'.strtolower('\\2').'"'
										 ,$string
										 ));
	$string = stripslashes (preg_replace ("/([\s]([\w]+)[\s]+)(?!\=[\"\'])(?=[\/]?[>]|[\w\s]+[\=])/me"
										 ,' '.strtolower('\\2').'="'.strtolower('\\2').'"'
										 ,$string
										 ));

	return $string;
}

?>
Die Chain muss weiterhin eingebunden werden in der Datei "config.plugin.php" im selben Verzeichnis durch:

Code: Alles auswählen

cInclude("plugins", "chains/includes/include.chain.content.html2xhtml.php");
$_cecRegistry->addChainFunction("Contenido.Content.SaveContentEntry", "cecContentHtml2Xhtml");
Vielleicht hat mal jemand Zeit, das zu testen. Bei meinen Tests macht das zwar keine Probleme mehr, aber ich würde noch vom Einsatz in Live-Systemen abraten.

Zurzeit werden:
  • Tags und Attribute in Kleinschreibung umgewandelt,
  • einzelstehende Tags (br,hr,base,img,input,meta,link) von "<br>" in "<br />" umgewandelt und
  • Attribute ohne Wert (z.B. "selected") in die korrekte Schreibweise (selected="selected") überführt
Anregungen?

Verfasst: Di 20. Dez 2005, 12:32
von emergence

Code: Alles auswählen

global $cfg, $client, $lang, $cfgClient;
tuts in dem fall nicht ?

Verfasst: Di 20. Dez 2005, 12:59
von Dodger77
emergence hat geschrieben:

Code: Alles auswählen

global $cfg, $client, $lang, $cfgClient;
tuts in dem fall nicht ?
Nein, das habe ich schon getestet (in beiden Dateien). "$cfg" steht übrigens zur Verfügung, aber alles, was ich verwerten könnte, fehlt.

Verfasst: Di 20. Dez 2005, 13:06
von emergence
ähm das verwundert mich schon etwas
besonders aufgrund dessen wo die funktion dann eigentlich aufgerufen wird...
functions.con.php -> function conSaveContentEntry
wird folgendes zu beginn auch angefordert...

Code: Alles auswählen

    global $db, $auth, $cfg, $cfgClient, $client, $lang, $_cecRegistry;
und da gehts ?

Verfasst: Di 20. Dez 2005, 14:25
von Dodger77
emergence hat geschrieben:ähm das verwundert mich schon etwas
OK, das habe ich mir nochmal angeschaut. An "$client" kommt man natürlich doch heran. Das habe ich nun soweit oben überarbeitet.

Verfasst: Mi 21. Dez 2005, 23:21
von HerrB
Und $lang, $cfgClient geht nicht?

Gruß
HerrB

Verfasst: Do 22. Dez 2005, 09:32
von Dodger77
HerrB hat geschrieben:Und $lang, $cfgClient geht nicht?
Schon, aber bringen tun die mir nicht viel.
Ich hätte ja gern Zugriff auf "$cfg['generate_xhtml']" gehabt, aber das steht nicht zur Verfügung. Aber ich denke, der eine DB-Query mehr beim Speichern eines Content-Elements wird wohl ok sein.
Jetzt versuche ich halt Bugs in den regulären Ausdrücken zu finden, die dem Interesse, das XHTML valide zu bekommen, nicht so ganz dienlich sind. :wink:

Verfasst: Do 22. Dez 2005, 11:29
von HerrB
Dodger77 hat geschrieben:"$cfg" steht übrigens zur Verfügung, aber alles, was ich verwerten könnte, fehlt.
Dodger77 hat geschrieben:Ich hätte ja gern Zugriff auf "$cfg['generate_xhtml']" gehabt, aber das steht nicht zur Verfügung
Hä?

[Edit: HerrB] Ich versuche gerade, rauszubekommen, ob das ein Bug ist oder nicht. Es wäre schon schön, wenn Du da noch ein wenig ausführlicher im testen und berichten sein könntest... :wink:

Gruß
HerrB

Verfasst: Do 22. Dez 2005, 13:53
von emergence
ähm wer ist wir ?

was anderes
$cfg['generate_xhtml'] wird ja an sich aus den eigenschaften gelesen und erst dann gesetzt... zumindestens hab ich das irgendwo mal gesehen... (glaube somit nicht das dass ein bug ist)

es müsste an sich aber auch funktionieren wenn du

Code: Alles auswählen

$cfg['generate_xhtml'] = getEffectiveSetting('generator', 'xhtml', false);
verwendest...

Verfasst: Do 22. Dez 2005, 15:55
von Dodger77
emergence hat geschrieben:es müsste an sich aber auch funktionieren wenn du

Code: Alles auswählen

$cfg['generate_xhtml'] = getEffectiveSetting('generator', 'xhtml', false);
verwendest...
Ja, im Prinzip habe ich das jetzt so gemacht (s.o.). Abgeschaut habe ich mir den Code aus der "class.htmlelements.php".

Verfasst: Do 22. Dez 2005, 16:17
von Dodger77
HerrB hat geschrieben:
Dodger77 hat geschrieben:"$cfg" steht übrigens zur Verfügung, aber alles, was ich verwerten könnte, fehlt.
Dodger77 hat geschrieben:Ich hätte ja gern Zugriff auf "$cfg['generate_xhtml']" gehabt, aber das steht nicht zur Verfügung
Hä?

[Edit HerrB]: Ich versuche gerade, rauszubekommen, ob das ein Bug ist oder nicht. Es wäre schon schön, wenn Du da noch ein wenig ausführlicher im testen und berichten sein könntest... :wink:
OK. Habe schon ausführlicher getestet, aber halt nicht berichtet. Zurzeit wird "$cfg['generate_xhtml']" nur in der Klasse "cHTML" (Datei "class.htmlelements.php") zugewiesen. Ich gehe davon aus, dass diese aber eben nicht vorher in den Dateien, in denen "conSaveContentEntry" aufgerufen wird (include.con_editcontent.php, include.CMS_HTML.php, ...), instantiiert wurde.
Somit gibt es "$cfg['generate_xhtml']" eben noch nicht. Vielleicht macht es Sinn (ob jetzt ein Bug oder nicht), dies schon vorher zu initialisieren.

Verfasst: Mo 2. Jan 2006, 17:33
von apicalart
Wenn ich dich richtig verstanden habe, versuchst du ja hier eine Lösung für das Problem mehrere Textfelder- eins ändern verwirft xhtml in dem anderen - zu finden.

Ich habe die chain eingebunden. - aber funktionieren tuts nicht. Ich habe immer noch das gleiche Phänomen.

Contenido 4.6.4.
xhtml erzeugen ja
Mandanteneinstellungen
generator xhtml true
wysiwyg tinymce-extended-valid-elements *[*]

Firefox 1.5

Verfasst: Mo 2. Jan 2006, 17:47
von Dodger77
apicalart hat geschrieben:Ich habe die chain eingebunden. - aber funktionieren tuts nicht. Ich habe immer noch das gleiche Phänomen.
Was für Typen nutzt du denn genau (z.B. CMS_HTML)? Und gibt es evtl. einen Beispiellink?

Verfasst: Mi 4. Jan 2006, 18:20
von kypta
Habe das auch eingebunden - auch bei mir tut sich nichts (neues).
Auf einer Seite habe ich vier CMS_HTML. Wie üblich (leider) werden die xhtml-Inhalte der drei nicht im Tiny-MCE editierten Container wieder ent-xhtml-isiert... was vor allem im IE gut zu sehen ist mit all seinen Tags in Grossbuchstaben.

Contenido 4.6.4
PHP 4.3.9
Apache 2.0.46 (CentOS)

Gruss
Thomas

Verfasst: Mi 4. Jan 2006, 19:21
von Dodger77
Thomas hat geschrieben:Habe das auch eingebunden - auch bei mir tut sich nichts (neues).
Auf einer Seite habe ich vier CMS_HTML. Wie üblich (leider) werden die xhtml-Inhalte der drei nicht im Tiny-MCE editierten Container wieder ent-xhtml-isiert... was vor allem im IE gut zu sehen ist mit all seinen Tags in Grossbuchstaben.
Bei apicalart klappt es mittlerweile. Ändere mal bitte die Datei "config.plugin.php" zu:

Code: Alles auswählen

<?php
global $_cecRegistry, $cfg, $client;

$cfg['plugins']['frontendlogic'][] = "category";

cInclude("plugins", "chains/includes/include.chain.frontend.cat_backendaccess.php");
cInclude("plugins", "chains/includes/include.chain.frontend.cat_access.php");

$_cecRegistry->addChainFunction("Contenido.Frontend.CategoryAccess", "cecFrontendCategoryAccess");
$_cecRegistry->addChainFunction("Contenido.Frontend.CategoryAccess", "cecFrontendCategoryAccess_Backend");

cInclude("plugins", "chains/includes/include.chain.content.html2xhtml.php");
$_cecRegistry->addChainFunction("Contenido.Content.SaveContentEntry", "cecContentHtml2Xhtml");

?>