Změna template?
- Jod
- Člen | 701
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)
- Jod
- Člen | 701
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)
- Jod
- Člen | 701
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
- Jan Tvrdík
- Nette guru | 2595
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)
- romansklenar
- Člen | 655
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 /templatesPř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.
- RaR
- Člen | 42
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.
- RaR
- Člen | 42
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ů)
- RaR
- Člen | 42
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
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
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)
- kravčo
- Člen | 721
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()
.
- pmg
- Člen | 372
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.