abstract class BasePresenter nepředává informace do jednoho presenteru → error: Undefined variable: sponsors

wermaledictos
Člen | 5
+
0
-

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
+
+2
-

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…