abstract class BasePresenter nepředává informace do jednoho presenteru → error: Undefined variable: sponsors
- wermaledictos
- Člen | 5
Ahoj,
ve svém @layout.latte mám definovaný footer, který chci zobrazovat napříč celou aplikací.
<div class="footer">
<div class="main-sponsors">
<ul n:inner-foreach="$sponsors as $sponsor">
<li><a href="{$sponsor->url}" target="_blank">
<img src="{$basePath}{$sponsor->image_path}" alt="{$sponsor->name}">
</a></li>
</ul>
</div>
<div class="minor-sponsors">
</div>
</div>
mám proto definovaný BasePresenter.php, který vypadá přibližně takto:
abstract class BasePresenter extends Presenter
{
/** @var SponsorManager */
private $sponsorManager;
public function __construct(SponsorManager $sponsorManager)
{
$this->sponsorManager = $sponsorManager;
}
public function renderDefault(): void
{
$this->template->sponsors = $this->sponsorManager->getActiveSponsors();
}
}
všechny ostatní presentery následně rozšiřují tento BasePresenter… pro tyto se footer renderuje bez chyby
class DummyPresenter_1 extends BasePresenter
{
/** @var DummyManager */
private $dummyManager;
/** @var SponsorManager */
private $sponsorManager;
public function __construct(DummyManager $dummyManager, SponsorManager $sponsorManager)
{
parent::__construct($sponsorManager);
$this->dummyManager = $dummyManager;
}
public function renderDefault(): void
{
parent::renderDefault();
//custom logika pro tento presenter
}
}
popř. dokonce
class DummyPresenter_2 extends BasePresenter
{
}
mám ale presenter pro přihlašování (SignPresenter.php), ve kterém
dostávám tuto chybu: Undefined variable: sponsors
presenter vypadá takto
class SignPresenter extends BasePresenter
{
/** @var SponsorManager */
private $sponsorManager;
protected function createComponentSignInForm(): Form
{
$form = new Form;
$form->addText('username', 'Uživatelské jméno:')
->setRequired('Prosím vyplňte své uživatelské jméno.');
$form->addPassword('password', 'Heslo:')
->setRequired('Prosím vyplňte své heslo.');
$form->addSubmit('send', 'Přihlásit');
$form->onSuccess[] = [$this, 'signInFormSucceeded'];
return $form;
}
public function signInFormSucceeded(Form $form, \stdClass $values): void
{
try {
$this->getUser()->login($values->username, $values->password);
$this->flashMessage('Uživatel ' . $values->username . ' přihlášen.');
$this->redirect('Homepage:');
} catch (Nette\Security\AuthenticationException $e) {
$form->addError('Nesprávné přihlašovací jméno nebo heslo.');
}
}
public function actionOut(): void
{
$this->getUser()->logout();
$this->flashMessage('Odhlášení bylo úspěšné.');
$this->redirect('Homepage:');
}
}
myslím, že chyba vzniká rozdílem v tom, že fungující presentery poskytují výsledky pro …/Presenters/templates/Dummy/default.latte, výsledek SingPresenter.php je ale zobrazený v …Presenters/templates/Sign/in.latte
tuší někdo, co mám upravit/doplnit v SignPresenter.php, abych mi extends BasePresenter zafungovalo správně?
- Kamil Valenta
- Člen | 824
renderDefault() se nezavolá při Sign:in.
Pokud to chceš skutečně ve všech šablonách, dej si to do beforeRender(), ale nepovažuju to za šťastné, protože z toho nikdy nevycouváš. Raději bych si ty sponzory dal do komponenty a každá dílčí šablona buď komponentu vykreslí, nebo ne…