this->redirect(this & #zalozka (a name)

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

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'));

redhead
Člen | 1313
+
0
-

to s tou informací udělej přes flashmessage

$this->flashmessage('Komentář přidán');
$this->redirect('this#zalozka');
Panda
Člen | 569
+
0
-

Zkusil bych toto:

$this->redirect('Article:article#formular', array('url'=>$this->getParam('url'), 'addnew'=>'1', 'byl_pridan_novy_komentar' => TRUE));
MzK
Člen | 127
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

$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
+
0
-

Když si teď prohlížím vytvořenou sessions (sobour) tak tam ty flash zprávy opravdu jsou..

MzK
Člen | 127
+
0
-

A sesna obsahuje následující:
<?php array(3) {
„__NT“ ⇒ array(3) {
„C“ ⇒ int(3)
„V“ ⇒ string(32) „edb1cf19f091b054e2489a999da07e69“
„B“ ⇒ string(14) „0.578447530911“
}
„__NS“ ⇒ array(0)
„__NM“ ⇒ array(0)
}?>

iguana007
Člen | 970
+
0
-

Já mám ohledně flashmessages v Base presenteru tuto metodu:

public function flashMessage($message,$type="info") {
        $this->invalidateControl("flashes");
        parent::flashMessage($message, $type);
}

Nemůže to být tím, že ji tam nemáš?

igi

MzK
Člen | 127
+
0
-

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
+
0
-

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?

iguana007
Člen | 970
+
0
-

No jediné co mám jinak je tento řádek:

$this->getPresenter()->flashMessage('komentar pridan.', 'error');
//já ho mám takto:
$this->presenter->flashMessage('komentar pridan.', 'error');

ale to na to asi nemá vliv …

igi

MzK
Člen | 127
+
0
-

To nepomohlo, do šablony se žádná flash message nevypíše :(
chyba musí být jinde..

Vyki
Člen | 388
+
0
-
<?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
+
0
-

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
+
0
-

@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
+
0
-
  • Může být problém na serveru? Nějaké chybné konfigurace apache či php?
  • Může mi někdo poslat funkční ukázku toho flash message?
redhead
Člen | 1313
+
0
-

Nevím, je to divné. Ovšem pokud máš Debugger, tak si projdi celou tu metodu createTemplate (včetně zanoření) a dojdi až k místu kde se tahá:

  1. parametr _fid z url
  2. flashmessage ze session

a něco z toho prostě selže.. Ale nevím proč..

Editoval redhead (23. 1. 2010 20:04)

Vyki
Člen | 388
+
0
-

Mrkni se do distribuce do tools na skeleton. Nebo do složky examples. Když rozchodíš příklady z examples v pohodě a flashmessages pojedou tak chyba bude jinde než na serveru :o) Jinak se můžeš mrknout na datagrid. Ten je také ajaxový a flashmessages tam běhaj jak po másle.

MzK
Člen | 127
+
0
-

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
+
0
-

Ř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..

redhead
Člen | 1313
+
0
-

ono přepisovat construktory se u nette nikdy moc nevyplácí. Kdyžtak to dej do startupu nebo beforeRender

Michalek
Člen | 211
+
0
-

Co třeba:

function __construct()
{
 parent::__construct();
 $this->template->web_name = 'Nazev webu';
}

Ale redheadem navrhovaná řešení jsou lepší.

Editoval Michalek (24. 1. 2010 17:45)

Ondřej Mirtes
Člen | 1536
+
0
-

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.

_Martin_
Generous Backer | 679
+
0
-

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.

Ondřej Mirtes
Člen | 1536
+
0
-

_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…

_Martin_
Generous Backer | 679
+
0
-

Máš pravdu, měl jsem napsat „pokud chci rozšířit funkčnost původní metody“.