V ErrorPresenteri mi nefunguje link

vladimir.biro
Člen | 163
+
0
-

Ahojte. V ErrorPresenteri mam v pripade 404 urobene presmerovanie na vlastny presneter Error4xxPresenter (tak ako je v sandboxe). Tento presenter zobrazuje zablonu 404.latte (resp podla kodu chyby), no problem je v tom, ze v tejto sablone mi nefunguje link. Konkretne vsade, kde mam poufity filter link mi vygeneruje namiesto odkazu len #.

Ked priamo v Error4xxPresenter → renderDefault napisem:

<?php
echo $this->link('Homepage:default');
?>

tak echo zobrazi tiez len #

http://prntscr.com/kise47http://prntscr.com/kiseg8

Viete mi pls. niekto poradit preco to je a ako spravit, aby mi to generovalo linky normalne? Mal som za to, ze sa jedna o uplne bezny presenter a ze by tam vsetko malo fungovat.

Error4xxPresenter dedi od UI/Presenter
http://prntscr.com/kisf5m

Skusal som vo fore (aj googli) hladat asi hodinu, no podobny pripad som nenasiel.

Vopred dakujem za rady.

Edit: Projekt nie je deleny na moduly.

Editoval vladimir.biro (15. 8. 2018 9:27)

Martk
Člen | 661
+
0
-

Zkus se podívat do logu, třeba tam najdeš nějakou chybu. Nette dává na produkci v případě chyby #

m.brecher
Generous Backer | 870
+
0
-

Ahoj,

udělal jsem si Error4xxPresenter podobně jako ty:

final class Error4xxPresenter extends Nette\Application\UI\Presenter
{
    private App\Model\SectionModel $sectionModel;

    public function startup(): void
	{
		parent::startup();
		if (!$this->getRequest()->isMethod(Nette\Application\Request::FORWARD)) {
			$this->error();
		}
    }

    public function inject(App\Model\SectionModel $sectionModel): void
    {
        $this->sectionModel = $sectionModel;    // pro @layout.latte
    }

	public function renderDefault(Nette\Application\BadRequestException $exception): void
    {

        dump($this->link('Homepage:show'));	// zde testuji Tvůj problém s linkem ;)

        $file = __DIR__ . "/templates/Error/{$exception->getCode()}.latte";
        $file = is_file($file) ? $file : __DIR__ . '/templates/Error/4xx.latte';
        $this->template->setFile($file);

        $this->template->sections = $this->sectionModel->getSectionList();	// pro @layout.latte
    }
}

Tohle řešení ErrorPresenteru se mě osvědčilo. Tvůj link zde funguje OK. Error4xxPresenter dědí z Nette\Application\UI\Presenter a má stejnou funkcionalitu jako normální aplikační presenter včetně generování linků.

Já ale narazil na jinou odlišnost Error4xxPresenteru oproti standardnímu aplikačnímu presenteru a sice, že má zablokováno zpracování signálů – a to si myslím že je dobře a bude to asi z bezpečnostních důvodů, ale nejsem si jistý, neboť jsem nette začátečník. Můj příspěvek o Error4xxPresenteru je zde: https://forum.nette.org/…l-komponenty

Marek Bartoš
Nette Blogger | 1273
+
0
-

A existuje pro ten error presenter routa? Nette zakazuje routování error presenteru který je v configu, takže je nutné udělat forward na jiný „error presenter“, který má svou vlastní url adresu. V něm pak budou signály (a tedy i formuláře) fungovat správně.

m.brecher
Generous Backer | 870
+
0
-

Marek Bartoš napsal(a):

A existuje pro ten error presenter routa? Nette zakazuje routování error presenteru který je v configu, takže je nutné udělat forward na jiný „error presenter“, který má svou vlastní url adresu. V něm pak budou signály (a tedy i formuláře) fungovat správně.

Je to zajímavá myšlenka a budu to muset nějak prozkoumat. Ale dávat routu pro ErrorPresenter – to je dost komplikované a aby to nemělo nějaké nežádoucí vedlejší účinky :(

Zatím jsem to vyřešil jednoduše – místo signálu v ErrorPresenteru použiji obyčejný html odkaz. A žádnou routu nemusím pro Error4xxPresenter dělat.