Předání proměnné do @layout.latte
- JonatanRek
- Člen | 20
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
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
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
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
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
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 | 1032
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
BasePresenter
u místo konstruktoru použít inject
metodu či property.
- Tomas8698
- Člen | 109
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
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á :)