Předání proměnné do @layout.latte

JonatanRek
Člen | 20
+
0
-

Dobrý den,
nedaří se mi předat proměnou title z base presenteru do @layout.latte stále s chybou undefined variable, Mohl bych poprosit o radu jak správně předat proměnou to layoutu ?

final class BasePresenter extends Nette\Application\UI\Presenter
{
	public function beforeRender(Nette\Application\BadRequestException $exception): void
	{
        parent::beforeRender();
		$this->template->title_text = "test";
	}
}
<div class="logo-text center">
	<h1>{$title_text}</h1>
	Blog jedné vysokoškolačky, která se dělí o svůj pohled na svět. Na zdraví!
</div>

Předem děkuji za jakoukoliv radu!

Editoval JonatanRek (10. 3. 2021 11:19)

Ondřej Kubíček
Člen | 494
+
0
-

tohle máš dobře, v tom případě se ti pak nevolá BasePresenter::beforeRender

btw ta expcetion v argumentu beforeRender nemá co dělat

Editoval Ondřej Kubíček (10. 3. 2021 11:23)

JonatanRek
Člen | 20
+
0
-

Ondřej Kubíček napsal(a):

tohle máš dobře, v tom případě se ti pak nevolá BasePresenter::beforeRender

btw ta expcetion v argumentu beforeRender nemá co dělat

Dobrý den,
to si také myslím protože když do něj umístím die(); tak se stejně dostanu na chybu, pochopil jsem to správně že pokud chci předat proměnou do @layout.latte musím tak učinit v BasePresenter.php a funkci beforeRender

Edit: exception jsem z kódu odstranil stále bezezměny.

Ondřej Kubíček
Člen | 494
+
0
-

Nemusíš, můžeš proměnné setovat i v render metodách. Potřebuješ vůbec Base? ten by měl být abstract, né final. Od něj dědí presentery. Ten presenter co ti vykresluje tu stránku určitě nedědí od Basu, jinak by ti to setnulo a umřelo na die.

Ondřej Kubíček
Člen | 494
+
0
-

jinak v té Tracy exception co ti vyskočí, tam vidíš celý stack trace tak hned uvidíš, který presenter se volal a kde se co stalo

JonatanRek
Člen | 20
+
0
-

Ondřej Kubíček napsal(a):

Nemusíš, můžeš proměnné setovat i v render metodách. Potřebuješ vůbec Base? ten by měl být abstract, né final. Od něj dědí presentery. Ten presenter co ti vykresluje tu stránku určitě nedědí od Basu, jinak by ti to setnulo a umřelo na die.

tak chybu jsem odstranil ale nynsí mi nejde se pripojit na db uřcitě to bude zase nějaká školácká chyba

namespace App\Presenters;

use Nette\Application\UI\Presenter;

abstract class BasePresenter extends Presenter
{
    private Nette\Database\Explorer $database;

	public function __construct(Nette\Database\Explorer $database)
	{
		parent::__construct();
		$this->database = $database;
	}

    public function beforeRender(): void
	{
        parent::beforeRender();
		var_dump($this->database); <-- chyba
		die();

		$this->template->title_text = "test";
        $this->template->sub_title_text = "test";
        $this->template->avatar_url = "test";
	}
}

s tím že tracy vyhodí chybu o „Typed property App\Presenters\BasePresenter::$database must not be accessed before initialization“ i když initializuji $database v constructoru stejně jako v kterém koliv jiném construktoru :(

jiri.pudil
Nette Blogger | 1028
+
+1
-

Pak ten konstruktor nevoláš. Pokud potomek konstruktor přepisuje, musí v něm zavolat parent::__construct() a předat mu parametry. Chceš-li se téhle nutnosti vyhnout, můžeš v BasePresenteru místo konstruktoru použít inject metodu či property.

Tomas8698
Člen | 109
+
0
-

Mozno pomôže:

<?php

/** @var Nette\Database\Context */
    private $database;

    public function __construct(Nette\Database\Context $database)
    {
        $this->database = $database;
    }

?>

A ked chceš to robiť cez inject tak musíš si do use dat:

<?php
use Nette\Database\Context;
?>

A v Class HomepagePresenter:

<?php

final class HomepagePresenter extends Nette\Application\UI\Presenter
{


    /** @var Context @inject */
    public $article;

?>
JonatanRek
Člen | 20
+
0
-

Děkuji všem za rady ale nakonec to byla opravdová školácká chyba, měl jsem sice base presenter ale ostatní presentery ho neextendovali po opravě vše funguje jak má :)