Mobilní verze – globální nastavení šablon

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

V persistentním parametru mám uloženo, zda jde o subdoménu „www“ nebo „m“, to je v pohodě.

Nějak globálně bych ale pro celou aplikaci chtěl podle toho nastavovat šablony.

Standardní – Default.default.phtml
Mobilní – Default.default.m.phtml

Myslel jsem, že v presenteru nějak získám Default.default.phtml a regulárem do toho vložím „m“, jenže se mi nedaří získat ten název standardní šablony.

$this->template->getFile() mi nevrací to co jsem čekal :-(

Jistě, můžu v každé akci udělat

$this->template->setFile('Default.default.m.phtml')

ale je to značně neefektivní :) Nebo na to jdu celkově špatně? Díky za nakopnutí.

Michalek
Člen | 211
+
0
-

Ha, člověk se musí zeptat, aby na to přišel.

BasePresenter.php

function startup()
{
 parent::startup();

 if($this->subdomena == 'm')
 {
  $this->setView($this->getView() . '.m');
 };
}
Panda
Člen | 569
+
0
-

// Doplnění: upraveno podle uvedeného kódu

<?php
class BasePresenter extends Presenter
{
	/** @persistent */
	public $subdomena;

	public function formatLayoutTemplateFiles($presenter, $layout)
	{
		$appDir = Environment::getVariable('appDir');
		$path = '/' . str_replace(':', 'Module/', $presenter);
		$pathP = substr_replace($path, '/templates', strrpos($path, '/'), 0);
		$m = ($this->subdomena == 'm' ? '.m' : '');
		$list = array(
			"$appDir$pathP/@$layout$m.phtml",
			"$appDir$pathP.@$layout$m.phtml",
		);
		while (($path = substr($path, 0, strrpos($path, '/'))) !== FALSE) {
			$list[] = "$appDir$path/templates/@$layout$m.phtml";
		}
		return $list;
	}

	public function formatTemplateFiles($presenter, $view)
	{
		$appDir = Environment::getVariable('appDir');
		$path = '/' . str_replace(':', 'Module/', $presenter);
		$pathP = substr_replace($path, '/templates', strrpos($path, '/'), 0);
		$path = substr_replace($path, '/templates', strrpos($path, '/'));
		$m = ($this->subdomena == 'm' ? '.m' : '');
		return array(
			"$appDir$pathP/$view$m.phtml",
			"$appDir$pathP.$view$m.phtml",
			"$appDir$path/@global.$view$m.phtml",
		);
	}


	// ....
}
?>

Editoval Panda (1. 1. 2010 13:20)

Michalek
Člen | 211
+
0
-

Děkuji, takhle nějak jsem to původně chtěl řešit.

Ondřej Mirtes
Člen | 1536
+
0
-

A nestačilo by vzít parent::format(Layout)TemplateFiles a ten upravit regulárem, než to celé psát znova? :)

Michalek
Člen | 211
+
0
-

Popravdě jsem to v BasePresenteru ještě trošku upravil a zatím to vypadá, že to plně splňuje moje představy :) Přepisování funkcí alá Panda se pravděpodobně hodí na nějaké větší vrabce.

if($this->mobile == 'm')
{ // pokud je pristup pres mobilni domenu, nastavime mobilni sablony a layout
 $this->setView($this->getView() . '.mobile');
 $this->setLayout('layout.mobile');
}

složka templates

@layout.phtml
@layout.mobile.phtml
Default.default.phtml
Default.default.mobile.phtml
Ondřej Mirtes
Člen | 1536
+
0
-

Tvoje řešení má nevýhodu v tom, že budeš muset duplikovat metody render* – např. renderDefault a renderDefaultMobile. Tzn. jít cestou překrytí tamtěch metod je správné.