-
Doctype auf XHTML-MP 1.2
Hallo zusammen,
ich bin gerade dabei eine Website für mobile Endgeräte zu erstellen und möchte gern den Doctype auf XHTML Basic 1.1, bzw. XHTML-MP 1.2 umändern, damit sie valide, bzw. "ok für mobile Endgeräte" ist. Da muss ich wohl im Template Hand anlegen, oder? Gibt es eine andere Möglichkeit einen anderen Typ zu verwenden? Bei der Doctypeauswahl gibt es ja bisher XHTML Transitional und Strict.
-
Guten Tach,
entweder du machst es händisch im Template, oder du baust eine Erweiterung in welcher du die dca der tl_page um die entsprechenden Optionswerte ausbaust.
Einfacher, schneller aber weniger nachhaltig ist allerdings erstere Variante.
-
..ja, ich dacht's mir.
Dann werd ich mich wohl mal ans Template ranmachen müssen..
(Schade, dass ich kein PHP Programmierer bin. Sonst würd' ich gleich mit der Erweiterung anfangen :p)
Ist denn eigentlich was in der Richtung für zukünftige Versionen geplant?
-
Ich denke in Planung ist da nichts weiter.
Allerdings ist da zum Erweitern nicht soo viel PHP-Kenntnis von Nöten.
Kurz gesagt, lege dir einen Ordner unter system/modules an (z. Bsp. 'zDoctypes' > der z-Präfix garantiert die Ausführung am Ende des Modul-Ladevorgangs) und darin den Ordner 'dca' mit der Datei 'tl_layout.php'.
(Datei > system/modules/zDoctypes/dca/tl_layout.php)
PHP-Code:
<?php if (!defined('TL_ROOT')) die('You can not access this file directly!');
$GLOBALS['TL_DCA']['tl_layout']['fields']['doctype']['options'] = array('xhtml_strict', 'xhtml_trans', 'xhtml_basic', 'xhtml_mp');
?>
'xhtml_strict' und 'xhtml_trans' sind die beizubehaltenden Contao-Voreinstellungen.
Damit das ganze auch sprachlich funktioniert, muss die Sprachdatei, im Beispiel für Deutsch angelegt werden:
(Datei > system/modules/zDoctypes/languages/de/tl_layout.php)
PHP-Code:
<?php if (!defined('TL_ROOT')) die('You can not access this file directly!');
/* Kopie der übersetzten Voreinstellungen */
// $GLOBALS['TL_LANG']['tl_layout']['xhtml_strict'] = 'XHTML Strict';
// $GLOBALS['TL_LANG']['tl_layout']['xhtml_trans'] = 'XHTML Transitional';
/* Ergänzend dazu die eigenen Übersetzungen */
$GLOBALS['TL_LANG']['tl_layout']['xhtml_basic'] = 'XHTML Basic';
$GLOBALS['TL_LANG']['tl_layout']['xhtml_mp'] = 'XHTML MP 1.2';
?>
Jetzt dürfte die Auswahl der Doctype zur Verfügung stehen. Allerdings wird der entsprechende Doctype-String in der PageRegular.php in der Methode createTemplate in einem Switch für das Template erzeugt. Dafür lässt sich der generatePage-Hook verwenden.
Um den Hook zu registrieren muss in der Erweiterung eine config.php angelegt werden.
(Datei > system/modules/zDoctypes/config/config.php)
PHP-Code:
<?php if (!defined('TL_ROOT')) die('You can not access this file directly!');
$GLOBALS['TL_HOOKS']['generatePage'][] = array('zDoctypes', 'generateDoctypes');
?>
Jetzt brauchst du noch zu guter Letzt die Klasse zum Hook
(Datei > system/modules/zDoctypes/zDoctypes.php)
PHP-Code:
<?php if (!defined('TL_ROOT')) die('You can not access this file directly!');
class zDoctypes extends PageRegular {
public function generateDoctypes(Database_Result $objPage, Database_Result $objLayout, PageRegular $objPageRegular) {
// DTD
switch ($objLayout->doctype) {
case 'xhtml_strict':
$objPageRegular->Template->doctype = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">' . "\n";
break;
case 'xhtml_trans':
$objPageRegular->Template->doctype = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">' . "\n";
break;
case 'xhtml_basic':
$objPageRegular->Template->doctype = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML Basic 1.0//EN" "http://www.w3.org/TR/xhtml-basic/xhtml-basic10.dtd">' . "\n";
break;
case 'xhtml_mp':
$objPageRegular->Template->doctype = '<!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.0//EN" "http://www.wapforum.org/DTD/xhtml-mobile10.dtd">' . "\n";
break;
}
}
}
?>
So könnte es gehen, habe es nicht getestet.
Mehr zu HOOKs unter Contao, insbesondere generatePage.
Viel Spass
-
Danke für Deine Anleitung.. hab das auch eben mal getestet (mit 2.9.1):
Es läuft gut bis zur Auswahl der Doctypes.
Wenn man dann aber das Layout (egal mit welchem Doctype - neue oder alte) speichern will, erscheint eine weisse Seite. Auch im Frontend.
-
Mach im Backend in den Einstellungen mal das Häkchen bei 'Fehler anzeigen'.
Wenn du magst, kannst du mir auch gern mal die nötigen Doctypes zukommen lassen, dann schraub ich die Erweiterung gleich mal in die Extension Repository.
EDIT: Erweiterung im Repository verfügbar
-
ok, ich hab die Erweiterung jetzt aus dem ER installiert, es klappt auch soweit ganz gut :)
Man muss nur wissen, dass nun im Backend unter
System > Einstellungen > Frontend-Einstellungen
eine Liste mit den beiden Standard Doctypes XHTML Strict und Transitional auftaucht,
und man dort zuerst die eigenen gewünschten Doctypes hinzufügen muss,
bevor man im Layout welche auswählen kann.
Wenn man die alle anhakt und speichert kann man auch im Layout das gewünschte Doctype einstellen.
Funktioniert super soweit. Vielen 1000 Dank.
Allerdings macht der veränderte Doctype noch keinen dazu passenden Code.
Bei mir wird im W3C MobileOK Checker z.Bsp. noch über das "lang" attribut im Element html gemeckert:
HTML-Code:
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">
und über "name" in a an folgender Stelle:
HTML-Code:
<a name="skipNavigation11" id="skipNavigation11" class="invisible"> </a>
Vermutlich scheint sich hier eine größere Baustelle aufzutun, wenn man nun die Templates an die entsprechenden Spezifikationen anpassen muss.
-
Tjaaa, die Doctypes zu ändern ist noch nicht alles.
Natürlich muss der Rest entsprechend valid sein ;)
Du kommst somit nicht drum herum, das Template anzupassen; womöglich fast alle von dir verwendeten.