Změna template?

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

Ahoj,
chtěl bych se zeptat jak změnit template? Mám třeba více templatů a každému uživateli chci dát na výběr z různých templatů. Jak mám teda určit který template se použije? Při předpokladu 1 template = 1 složka v /templates

Předem děkuji za odpověď.

Jod
Člen | 701
+
0
-

Cez setView sa dá pred renderovaním nastaviť iný tempalte.

<?php
	function beforeRender()
	{
		$this->setView('default');
		parent::beforeRender();
	}
?>

Ale ty asi myslíš nastaviť iný adresár, že. Na to je nejaká metóda v template, treba pozrieť v dokumentácii.

//edit
Kukám, že to nejak nejde. Možno pridať do view parameter podadresár tak aby sa hľadalo v tom adresári. Niečo ako /admin/default.

Editoval Jod (23. 12. 2008 19:39)

Wamer
Člen | 14
+
0
-

Právě že jsem hledal a nenašel. Je tam jen setFile ale to zjevně také nefunguje.

Jod
Člen | 701
+
0
-

setFile funguje fajn, asi si to nejak zle zapísal.
Ako funguje sa môžeš pozrieť v quick starte DataGrid.
Je to tam takto:

<?php
	$template->setFile(dirname(__FILE__) . '/paginator.phtml');
?>

Nastaví sa súbor paginator, ktorý je v rovnakom adresári ako komponenta.

Editoval Jod (23. 12. 2008 19:43)

Wamer
Člen | 14
+
0
-

Jako funguje, ale asi né pro tohle. No a koukal jsem se do kódu frameworku a zdá se mi, že pro tohle nette není dělané.

Jod
Člen | 701
+
0
-

No musíš si to nejak nastaviť. Cez explode aresára kde sú tempalte a potom nastaviť view adresár a v ňom adresár už aký ty chceš a view súbor. Sprav si nato nejakú funkciu v BasePresenter, alebo prípadne pridaj cez method extension čo je v Nette/Object

Wamer
Člen | 14
+
0
-

Vyřešeno:

<?php
protected function setTemplate($dir)
		{
			Environment::setVariable('templatesDir', '%appDir%/templates/' . $dir, TRUE);
		}
?>
Wamer
Člen | 14
+
0
-

Oprava: Nevyřešeno. Nefunguje.

Ola
Člen | 385
+
0
-

Divný, mě to funguje :)

Wamer
Člen | 14
+
0
-

Teda jako funguje ale nějak se mi teď zasekly filtry a cachování. Vypíše mi to:

{?$content->render()}

<?php
$this->setTemplates('test');
$this->template->registerFilter('CurlyBracketsFilter::invoke');
?>

Tak nějak nechápu kde jsem udělal chybu.

Jan Tvrdík
Nette guru | 2595
+
0
-

A co?

<?php
        protected function beforeRender()
        {
                $this->template->setFile(Environment::expand('%templatesDir%/sablona.phtml'));
                parent::beforeRender();
        }
?>

Editoval Jan Tvrdík (23. 12. 2008 21:32)

Wamer
Člen | 14
+
0
-

Bevim, ale teď to mám nějak ve funkčním stavu, takže to tak chci i nechat ..

romansklenar
Člen | 655
+
0
-

Wamer napsal(a):

Ahoj,
chtěl bych se zeptat jak změnit template? Mám třeba více templatů a každému uživateli chci dát na výběr z různých templatů. Jak mám teda určit který template se použije? Při předpokladu 1 template = 1 složka v /templates

Předem děkuji za odpověď.

Pokud myslíš něco jako změna vzhledu na stránkách, tzn. změna více šablon, něco podobného jsem nedávno řešil, jen ale na teoretické rovině.

To jaké šablony použít půjde jednoduše změnit proměnnou %templatesDir% z výchozího %appDir%/templates na %appDir%/templates/<theme-name>. Budeš muset přeučit presenter aby dohledával cesty k šablonám presenterů jinak (modifikace metody methodformatLayoutTemplateFiles() a methodformatTemplateFiles).

/**
 * Formats layout template file names.
 * @param  string
 * @param  string
 * @return array
 */
public function formatLayoutTemplateFiles($presenter, $layout)
{
	$root = Environment::getVariable('templatesDir');
	$presenter = str_replace(':', 'Module/', $presenter);
	$module = substr($presenter, 0, (int) strrpos($presenter, '/'));
	$base = '';

	$theme = Environment::getVariable('templatesTheme'); // přidám jen tenhle řádek

	if ($root === Environment::getVariable('presentersDir')) {
		$base = 'templates/';
		if ($module === '') {
			$presenter = 'templates/' . $presenter;
		} else {
			$presenter = substr_replace($presenter, '/templates', strrpos($presenter, '/'), 0);
		}
	}

	return array(
		"$root/$theme/$presenter/@$layout.phtml", // pak si jen upravíme cesty pro dohledávání dle libosti
		"$root/$theme/$presenter.@$layout.phtml",
		"$root/$presenter/@$layout.phtml",
		"$root/$presenter.@$layout.phtml",
		"$root/$module/$base@$layout.phtml",
		"$root/$base@$layout.phtml",
	);
}

Šablony tématu pak mohou být umístěny v app/templates/<theme-name>/* (vyžaduje jen nastavení %templatesTheme%).

Stejným způsobem se upraví metoda methodformatTemplateFiles.

Pokud by byly v presenteru tyto 2 pole, které určují dohledávání cest k layoutům a šablonám, statické nemusel bys nic v presenteru modifikovat, jen by sis pak v bootstrapu doupravil cesty dle libosti. Jen zatím to tak není, je na Davidovi jestli se rozhodne to tam zapracovat, úprava to není veliká.

Já bych to rozhodně uvítal.

phx
Člen | 651
+
0
-

Tvoje metoda neni dokonala. Parametr $theme je tam v podstate na nic:)

RaR
Člen | 42
+
0
-

Ahoj
vycházím z examples Akrabat, mám několik presenterů, každý pro práci s jinou tabulkou. Každý presenter má renderAdd, renderEdit, renderDelete a každý z nich se vykresluje pomocí šablony add.phtml, edit.phtml, delete.phtml, které jsou ale stejné

<?php
<h1>{$title}</h1>
{!$form}
?>

Pro 10 presenterů 10*3 stejných šablon. Jde nějak nastavit, aby se volala pořád stejná šablona ze všech presenterů pro renderAdd, renderEdit, renderDelete ale pro renderDefaul (bo je pro každý presenter jiná) by se volání nezměnilo.
Zkoušel jsem setFile(), ale vynechalo to zase @layout (v něm je hlava {include $content} pata).
Dík za tip.

stpnkcrk
Generous Backer | 190
+
0
-

Zkus

<?php
$this->setView('add');
?>

A soubor potom do /templates/@global.add.phtml a obdobně.

RaR
Člen | 42
+
0
-

V renderAdd() presenteru Admin_TerminesPresenter nastavím

<?php
$this->setView('../Default.form');
?>

Laděnka hlásí:

Page not found. Missing template '/httpd/html/www/document_root/../app/presenters/AdminModule/templates/Termines/../Default.form.phtml'.

Pokud založím prázdný adresář Termines, je to OK. (=zbytečné prázdné adresáře)

Pokud bych šablonu pojmenoval Termines.form.phtml, mohl bych ji použít pro presenter TerminesPresenter $this->setView(‚form‘) v renderAdd, renderDelete, renderEdit; (= pořád hodně stejných souborů)

Jod
Člen | 701
+
0
-

To @global by malo fungovať, myslím, že to tam David pridával. Nemáš nejakú starú revíziu?
Inak ten setView môžeš volať v BasePresenteru beforeRender (a pod.). Viac uśetreného kódu =)

Ola
Člen | 385
+
0
-

Musíš dát $this->setView('form'); a pak ve složce templates (bez modulů!) vytvořit soubor @global.form.phtml .. Nebo si můžeš přepsat metodu formatTemplateFiles tak aby prohledávala i moduly..

Editoval Ola (12. 3. 2009 10:50)

RaR
Člen | 42
+
0
-

pokud šablonu umístím do
app/presenters/templates/@global.form.phtml
tak se najde ale hlásí

Notice: Undefined variable: form in /temp/cache-nette.Template%001bd5f93205e9dc1eb1957406bedc9b6d.%40global.form.phtml on line 8

Podle níže uvedeného by se měla hledat i v modulech?

<?php
Debug::dump($this->formatLayoutTemplateFiles($this->getName(), $this->getLayout()));
?>
array(4) {
  0 => string(112) "/document_root/../app/presenters/AdminModule/templates/Termines/@layout.phtml"
  1 => string(112) "/document_root/../app/presenters/AdminModule/templates/Termines.@layout.phtml"
  2 => string(103) "/document_root/../app/presenters/AdminModule/templates/@layout.phtml"
  3 => string(91) "/document_root/../app/presenters/templates/@layout.phtml"
}
kravčo
Člen | 721
+
0
-

RaR napsal(a):

pokud šablonu umístím do
app/presenters/templates/@global.form.phtml
tak se najde ale hlásí

Notice: Undefined variable: form in /temp/cache-nette.Template%001bd5f93205e9dc1eb1957406bedc9b6d.%40global.form.phtml on line 8

Hlási nedefinovanú premennú form – čo znamená, že ju zrejme v niektorom z viacerých prípadov nenaplníš.

Podle níže uvedeného by se měla hledat i v modulech?

<?php
Debug::dump($this->formatLayoutTemplateFiles($this->getName(), $this->getLayout()));
?>

Nižšie uvedené je hľadanie súboru s layoutom, o hľadanie súboru so šablónou obsahu sa stará metóda Presenter::formatTemplateFiles()

array(4) {
  0 => string(112) "/document_root/../app/presenters/AdminModule/templates/Termines/@layout.phtml"
  1 => string(112) "/document_root/../app/presenters/AdminModule/templates/Termines.@layout.phtml"
  2 => string(103) "/document_root/../app/presenters/AdminModule/templates/@layout.phtml"
  3 => string(91) "/document_root/../app/presenters/templates/@layout.phtml"
}
RaR
Člen | 42
+
0
-

Jod napsal(a):

To @global by malo fungovať, myslím, že to tam David pridával. Nemáš nejakú starú revíziu?
Inak ten setView môžeš volať v BasePresenteru beforeRender (a pod.). Viac uśetreného kódu =)

Jsem si chtěl ušetřit kód a dal do BasePresenteru beforeRender()

<?php
if (in_array($this->getAction(), array('add','edit','delete'))) $this->setView('form');
?>

a v presenteru v renderAdd()

<?php
$this->template->form = $form;
?>

tím jsem asi ten form předal někomu jinýmu.
Pokud si kód neušetřím a do renderAdd() dám

<?php
$this->setView('form');
$this->template->form = $form;
?>

tak to funguje

Editoval RaR (12. 3. 2009 14:45)

stpnkcrk
Generous Backer | 190
+
0
-

Protože pokud uděláš

<?php
if (in_array($this->getAction(), array('add','edit','delete'))) $this->setView('form');
?>

tak pokud se nemýlím, metoda renderAdd() je již irelevantní, protože metody jsou render{view} a tu chvíli máš jako view nastavený form.

Ola
Člen | 385
+
0
-

Za toto chování podle mne může zpětná kompatibilita s funkcí setView, která dříve sloužila pro změnu action (dříve view) .. Můžeš zkusit $this->changeScene, bude Ti to ale do logu zapisovat, že používáš zastaralé metody (resp. mělo by).

Editoval Ola (12. 3. 2009 15:57)

kravčo
Člen | 721
+
0
-

skocourek napsal(a):

Protože pokud uděláš

<?php
if (in_array($this->getAction(), array('add','edit','delete'))) $this->setView('form');
?>

tak pokud se nemýlím, metoda renderAdd() je již irelevantní, protože metody jsou render{view} a tu chvíli máš jako view nastavený form.

Áno, chyba bude zrejme tu. Vyriešiť by to mohlo napríklad zameniť renderAdd() za prepareAdd(), ktoré sa vykoná pred zmenou pohľadu, ktoré robíš až v beforeRender().

RaR
Člen | 42
+
0
-

pokud změním render za prepare, tak u prepareEdit($id=0) nefunguje odkaz z renderDefault, kde jsou řádky tabulky. U prepareAdd to funguje, protože nemá žádný parametr.
<a href="{link edit, $termine->termineId}"> Error:Extra parametr for 'Admin:termines:edit'.

pmg
Člen | 372
+
0
-

Zkouší se jen metody actionEdit a renderEdit. Jestli chceš problém vyřešit, mělo by pomoct jednu z nich přidat:

public function actionEdit($id = 0)
{
}

Odkaz na inkriminovaný kód v Presenter::createRequest.