this->redirect(this & #zalozka (a name)
- MzK
- Člen | 127
Jak přesměruji pomocí $this→ na tu samou stránku navíc s novým
parametrem a záložkou?
Původní URL (po odeslání formuláře je:
document_root/?url=url-nazev-clanku&addnew=1&action=article&do=form1-submit&presenter=Article
a výsledná URL má být
document_root/?url=co-zrovna-bereme-ve-skole&addnew=1&action=article&presenter=Article&byl_pridan_novy_komentar#formular
Chci přesměrovat na ten samý článek + dát informaci o přidaném
komentář + i záložku dolů k formuláři.
$this->redirect('Article:article', array('url'=>$this->getParam('url'), 'addnew'=>'1', '#form'));
- MzK
- Člen | 127
redhead:Díky, to bylo ono..
Ale flashmesages mi nefungují:
<?php
public function form1Submitted(AppForm $form){
//dibi::query('INSERT INTO [comments]', $values); //vlozim kommt do db
$this->flashmessage('Komentář přidán'); // flash message
$this->getPresenter()->flashMessage('komentar pridan.', 'error'); // flash messga 2 pokus
$this->redirect('this#zalozka'); // presmeruji
?>
V sablone mam toto>
<?php
debug::dump($flashes) //vykaze array(0)
{foreach $flashes as $flash}
<div class="flash {$flash->type}">{$flash->message}</div>
{/foreach}
?>
Ale to mi nevypíše NIC.. Flash messages nefungují, do URL přibude
toto: &_fid=668e
- redhead
- Člen | 1313
a nepřepisuješ někde v BasePresenteru (nebo jinde) metodu createTemplate? Dědí se od Control a právě v ní se nastavují flashMessages do šablon. Pokud ano, měl bys volat v ní $template = parent::createTemplate().
Nebo jinak, nevytváříš nějak vlastní šablonu (new Template)?
(btw: to _fid v url má být při flashmessages)
Editoval redhead (21. 1. 2010 19:54)
- MzK
- Člen | 127
Verzi mam 0.9.2-dev.
createTemplate nepřepisuji.
používám class ArticlePresenter extends Presenter {
a šablonu
edituji např takto:
$this->template->article = $model->getArticle($url);
Vlastní šablonu nevytvářím, to si nette bere dle použitého
presenteru,modelu a třeba pohledu tuším.
- redhead
- Člen | 1313
Hmm.. Tak jedině mě ještě napadá jesli máš správně nastavený sessions (složku):
$session = Environment::getSession();
$session->setSavePath(APP_DIR . ‚/sessions/‘);
Ale jesli máš zprovozněnej Debugger ve svém IDE, tak si zkus projít metodu createTemplate ve třídě Control a uvidíš co to dělá..
- MzK
- Člen | 127
$session jsem vůbec neměl nastavené, ale fungovalo (soudím dle
addProtection u formulářů). Teď jsem ho nastavil a objevil se mi tam soubor
sessny.
Ale stejně se mi ty flash zprávy nezobrazí v šabloně.. Už
v control.php.
Podmínka
if ($presenter !== NULL && $presenter->hasFlashSession()) {
není splněná, podmínka
if (!isset($template->flashes) || !is_array($template->flashes)) {
(ta je splněna) ale stejně se nezobrazí.
- MzK
- Člen | 127
iguana007: BasePresenter nepoužívám – jen DefaultPresenter (vypis vsech
clanku) a ArticlePresenter (vypis jednoho).
Přidal jsem fci do ArticlePresenteru, ale žádná změna. Postupoval jsem
podle návodu
Ale flash zprávy se mi nezobrazují (do souboru sesny se uloží), ale stále
tam je array(0)
- MzK
- Člen | 127
Vložím komplet zdrojáky, třeba na něco přijdete, už fakt nevím
presenter: app/presenters/ArticlePresenter.php
<?php
class ArticlePresenter extends Presenter {
public function beforeRender() { // to se tu trpi jenom kvuli formulari, addProtection
if (!Environment::getSession()->isStarted()) {
Environment::getSession()->start();
}
}
public function renderArticle($url) { // vypise jeden clanek.
$model = new ArticlesModel;
$data = $this->template->article = $model->getArticle($url);
}
protected function createComponentForm1($article) {
$form = new AppForm;
$form->addText('nick', 'Your name:')
->addRule(Form::FILLED, 'Enter your name');
$form->addTextArea('text', 'zadej text')
->addRule(Form::FILLED, 'musi byt neco napsano');
//$form->addProtection('vyprsela platnost forumulare', 3600);
$form->addSubmit('odeslat', 'odeslat');
$form->onSubmit[] = array($this, 'form1Submitted');
return $form;
}
public function form1Submitted(AppForm $form){
$form->validate();
if ($form->isValid()) {
$values = $form->getValues();
//dibi::query('INSERT INTO [comments]', $values); // vlozim nabidku do db
$this->flashmessage('Komentář přidán');
$this->getPresenter()->flashMessage('komentar pridan.', 'error');
$this->redirect('this');
}
}
?>
A sablona app/templates/Article/article.phtml
tu:
<?php
//... zkraceno
{foreach $flashes as $flash}
<div class="flash {$flash->type}">{$flash->message}</div>
{/foreach}
// debug::dump($flashes) nula..
{control form1}
?>
Flash mesage se uloží do sesny (soubor).. Ale v šabloně se prostě nezobrazí.. Nemusí se pro to zobrazení v šabloně ještě něco udělat?
- Vyki
- Člen | 388
<?php
abstract class BasePresenter extends Presenter {
public function flashMessage($message, $type = 'info') {
$this->invalidateControl("flashes");
parent::flashMessage($message, $type);
}
}
?>
a kdyz ten snippet flashes das takto do @layout misto do sablony tak to take nejde?
{snippet flashes}
{foreach $flashes as $flash}
<div class="flash {$flash->type}">{!$flash->message}</div>
{/foreach}
{/snippet}
- Vyki
- Člen | 388
Jinak by jsi to musel mit se @, protoze pouzivas snippety. A v layoutu kam nacitas content bys musel mit
@{include #content}
a v sablone kde content definujes bys musel mit:
@{block #content}
{snippet flashes}
{foreach $flashes as $flash}
<div class="flash {$flash->type}">{!$flash->message}</div>
{/foreach}
{/snippet}
@{/block}
Editoval Vyki (22. 1. 2010 16:19)
- MzK
- Člen | 127
@layout
jsem nepoužíval, ale na tvé doporučení jsem ho
zprovoznil (dříve jsem používal include header.phtml
)..
layout mi prve nefungoval (nezobrazoval se, jen samotne article.phtml), tak
jsem aktualizoval na poslední verzi 0.9.3-dev
a šablony najednou
jednou.
Nicméně flashmessages se mi stále nezobrazují, ani {snippe.. ani @{snippe..
Kde může býž chyba?
- MzK
- Člen | 127
uff, takže examples fungují, flash message se předává.. Asi bude problém v návrhu aplikace, protože:
ArticlePresenter.php
<?php
$aa = $this->flashMessage('not Found');
debug::dump($aa); // flashMessage TAM JE.
//die();
$this->redirect('Default:default'); // presmeruji na zakladni pohled.
/////////////////
// DefaultPresenter.php`
// tady uz flash messages neni, ale url je s parametrem OK `?_fid=5725`
?>
jdu na ten debug.
- MzK
- Člen | 127
Řešení problému:
Chyba nalezena.
Ve třídě articlePresenter byla funkce __construct()
, kde jsem do
šablony psal toto:
$this->template->web_name = 'Nazev webu';
A to je celé.. Stačilo smazat uvedenou funkci __construct() (nezapisovat do
šablony) a hle, zprávy fungují a vše se zobrazuje jak má..
Jestli je to bug opravit (nevím) jinak je to moje blbost no.
Děkuji všem za rady..
- Ondřej Mirtes
- Člen | 1536
Jo, konstruktor bys fakt přepisovat neměl – k plnění šablon slouží render metody.
Pokud potřebuješ provést něco co nejdřív v životním cyklu Presenteru, patří to do startup() – ale i tam musíš volat rodiče.
- Ondřej Mirtes
- Člen | 1536
_Martin_ napsal(a):
Především, pokud přepisuješ jakoukoliv metodu v potomkovi – a je úplně jedno, zda jde o konstruktor v Presenteru – tak bys měl dodržet parametry, které si rodičovská funkce žádá, a s těmi bys ji měl zavolat.
To nelze takhle zobecňovat – někdy je při overridingu právě žádoucí, aby se rodič nevolal – když chci jinou implementaci té metody. Ale pokud přepíšu nějakou metodu, která je pro ten objekt životně důležitá – a zároveň v té mé implementaci neudělám pro ten objekt životně důležité záležitosti (jako dělá rodič té metody), tak bych ho volat měl…