XHTML nejde vypnout, nastaveno správně

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
hubipe
Člen | 26
+
0
-

Dobrý den,
narazil jsem na zajímavou chybu, se kterou si neumím poradit. Mám Nette version 2.0.6 released on 2012–10–01.
V @layout.latte mám

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
	...

ale vygeneruje se z toho

<!DOCTYPE html>
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
		...

Přitom config obsahuje

#
# SECURITY WARNING: it is CRITICAL that this file & directory are NOT accessible directly via a web browser!
#
# If you don't protect this directory from direct web access, anybody will be able to see your passwords.
# https://nette.org/en/security-warning
#
common:
	nette:
		application:
			errorPresenter: Error
			debugger: true
		xhtml: no
		container:
			debugger: true
		debugger:
			strictMode: true

		session:
			expiration: 30 days
			autoStart: smart
			savePath: "%tempDir%/sessions"
			gcProbability: 1

Pokud se podívám do temp/cache/_Nette.Configurator/SystemContainer, metoda initialize() obsahuje Nette\Utils\Html::$xhtml = FALSE; a metoda createNette__latte()

		$service = new Nette\Latte\Engine;
		$service->getCompiler()->defaultContentType = 'html';
		return $service;

Tak proč #@$^! se generuje XHTML?

Díky za odpovědi

hubipe
Člen | 26
+
0
-

Ještě jedna podivuhodnost:
v AdminModule je při generování šablon správně nastaven Nette\Latte\Compiler $defaultContentType v metodě compile nastaven na html, zatímco ve FrontModule na xhtml. Nějaký nápad proč tomu tak je? Kde hledat?

Majkl578
Moderator | 1364
+
0
-

Mělo by stačit mít v configu:

nette:
	xhtml: false

Následně se podle toho nastaví html pro Latte (tady).
Mně to na Nette 2.0.6 funguje (nezapomeň smazat keš).

hubipe
Člen | 26
+
0
-

Už jsem na to přišel :)

V presenteru jsem překryl metodu templatePrepareFilters touto:

	public function templatePrepareFilters($tpl)
	{
		$tpl->registerFilter($latte = new \Nette\Latte\Engine);

		$set = \Nette\Latte\Macros\MacroSet::install($latte->compiler);
		// ... vlastní latté makra
	}

Což zapříčinilo, že se nevolal předek v Nette\Application\UI\Control. A protože jsem latté vytvářel přímo v metodě, nepředávala se nastavení z configu.

Stačí tedy změnit řádek

$tpl->registerFilter($latte = new \Nette\Latte\Engine);

za

$tpl->registerFilter($latte = $this->getContext()->nette->createLatte());

Ale že to stálo úsilí…

ic
Člen | 430
+
0
-

Zaráží mě, že to ještě stále není v defaultu vypnuté.

Majkl578
Moderator | 1364
+
0
-

To bude nejspíš jednak proto, že HTML 5 je kompatibilní s XHTML, ale naopak to neplatí a také kvůli zpětné kompatibilitě.

ic
Člen | 430
+
0
-

To je pravda, ale zase formuláře přenášejí validační pravidla v data-cosi atributu, který s XHTML kompatibilní není a ani nevím jestli existuje nějaká XHTML kompatibilní alternativa formulářů. A takových věci bude asi více (přesto, že mě teď nic nenapadá).
V defaultu bych spíše čekal tohle vypnuté a případně ve skeletonu zápis, který to povoluje a dal by se tak snadno a intuitivně smazat.

EDIT: Nejlepší řešení by bylo, aby se nette kouklo na začátek souboru @layout.latte a tam zjistilo, jestli jde o XHTML a pak ukončovalo i nepárové tagy a jinak nic takového nedělat.

Editoval ic (5. 11. 2012 12:17)