Generování odkazů v modulu

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

Zdravím, dá se nějakým způsobem generovat odkaz přímo uvnitř modulu?

Mám formulář ve FormPresenter

<?php
...
$form = new AppForm;
...
$form->onValidate[] = callback($this->getFormModel(),'validateRule');
...
?>

Obsah FormModel

<?php
...
public function validateRule(AppForm $form){
    $values=$form->getValues();
    if($this->isItOK($values['field1'],['field2'])){
        return TRUE;
    } else {
        $form->addError("Something is wrong. May I repare it?");
        return FALSE;
    }
}
...
?>

Je to jen příklad, ale do té error zprávy bych chtěl dát odkaz na nějaký presenter s parametrem.

redhead
Člen | 1313
+
0
-

Model by rozhodně neměl nic o formuláři vědět. To je starost presenteru. V presenteru obsluhuj submit formuláře a volej model (s předanými values z formu), pokud je něco nevalidní vyhoď výjimku a tu chytni zas v presenteru, kde ji vykreslíš, jak chceš.

redhead
Člen | 1313
+
0
-

A možná by nebylo na škodu, u tohoto příkladu, využít vlastní validační pravidla přímo u prvků formuláře (addRule s vlastním callbackem)

2bfree
Člen | 248
+
0
-

redhead napsal(a):

A možná by nebylo na škodu, u tohoto příkladu, využít vlastní validační pravidla přímo u prvků formuláře (addRule s vlastním callbackem)

Zde je to řešeno tímto způsobem, protože potřebuji zvalidovat něco na základě dvo parametrů zároveň.

2bfree
Člen | 248
+
0
-

Takže by to správně mělo být následovně?

FormPresenter

<?php
...
protected function createComponentForm(){
    $form = new AppForm;
    ...
    $form->onSubmit[] = callback($this,'processForm');
}

public function processForm(AppForm $form){
    $values=$form->getValues();
    if($this->isItOK($values['field1'],['field2'])){
        ...
    } else {
        $form->addError("Something is wrong. May I repare it?");
    }
}
...
?>
redhead
Člen | 1313
+
0
-

No spíš jsem myslel něco takového (v presenteru by zas rozhodně neměli být modelové metody – isItOk)

protected function createComponentForm(){
    $form = new AppForm;
    ...
    $form->onSubmit[] = callback($this,'processForm');
}

public function processForm(AppForm $form){
    $values = $form->getValues();
    $model = new NejakyMujModelNaValidaci(); //proste nekde si vem ten svuj model
    try {
    	$model->isItOK($values['field1'], $values['field2']);
	...
    } catch(Exception $e) {
	$form->addError($e->getMessage());
	//nebo
	//$form->addError("Something is wrong. May I repare it?");
    }
    //nebo to tvoje, ale přijde mi to s tím booleanem prostě divné:
    /*if($model->isItOK($values['field1'],['field2'])){
        ...
    } else {
        $form->addError("Something is wrong. May I repare it?");
    }*/
}
2bfree
Člen | 248
+
0
-

redhead napsal(a):

No spíš jsem myslel něco takového (v presenteru by zas rozhodně neměli být modelové metody – isItOk)

protected function createComponentForm(){
    $form = new AppForm;
    ...
    $form->onSubmit[] = callback($this,'processForm');
}

public function processForm(AppForm $form){
    $values = $form->getValues();
    $model = new NejakyMujModelNaValidaci(); //proste nekde si vem ten svuj model
    try {
    	$model->isItOK($values['field1'], $values['field2']);
	...
    } catch(Exception $e) {
	$form->addError($e->getMessage());
	//nebo
	//$form->addError("Something is wrong. May I repare it?");
    }
    //nebo to tvoje, ale přijde mi to s tím booleanem prostě divné:
    /*if($model->isItOK($values['field1'],['field2'])){
        ...
    } else {
        $form->addError("Something is wrong. May I repare it?");
    }*/
}

JJ, to jsem v tom jenom zapomněl upravit. ;) Teď se ještě zeptám, jak do Error zprávy dostat odkaz? Protože $this->link(); mi vrací jenom cestu a když to obalím o html v rámci té chybové zprávy, tak se to převede na text a nevykoná se. ;(

westrem
Člen | 398
+
0
-

Ako si myslel, ze to obalujes do HTML?

Vyskusaj toto:

Html::el('a', 'Chybova hlaska')->href($this->link());
gerades
Člen | 40
+
0
-

westrem napsal(a):

Ako si myslel, ze to obalujes do HTML?

Vyskusaj toto:

Html::el('a', 'Chybova hlaska')->href($this->link());

Tohle hazi hlasku „Using $this when not in object context“, mam Nette 2.0dev, PHP 5.3.

bojovyletoun
Člen | 667
+
0
-

máš kód uvnitř metody?

class ... {
  function ...(...){
    Html::el('a', 'Chybova hlaska')->href($this->...);
 }
}

Editoval bojovyletoun (5. 12. 2010 15:27)

Mikulas Dite
Člen | 756
+
0
-

Spíš to voláš ve statické metodě.

Edit: quick&dirty fix \Nette\Environment::getApplication()->presenter->link();, ale radši to udělej čistěji.

Editoval Mikulas Dite (5. 12. 2010 15:37)