Šablony: problém s vlastními makry a helpery a šablonami komponent
- hjr
- Člen | 24
Používám vlastní makra a helpery, registrované v
BasePresenter
u v metodách templatePrepareFilters()
(makra) a createTemplate()
(helpery). V šablonách presenterů
také všechno krásně funguje, problém je s komponentami, které mají
vlastní šablony, takže i vlastní templatePrepareFilters()
a
createTemplate()
.
Vyřešil jsem to tak, že jsem si udělal kromě
BasePresenter
u i jakousi DisplayControl
u, která je
předkem všech Control
, které používají vlastní šablony a
registraci maker a helperů vystrčil do zvláštní třídy ven.
Připadá mi to ale takové nepěkné. V jednom starším
tématu jsem našel fintu s tím, že Control
by v metodě
createTemplate()
volala
$this->presenter->createTemplate()
místo
parent::createTemplate()
, ale to má nepříjemný vedlejší
efekt – jako $control
se do šablony dostane
Presenter
. Můžu tu proměnnou samozřejmě přepsat a teď se mi
to jeví elegantněji než moje původní řešení, přesto se ptám, jestli se
to nedá udělat nějak jinak.
- Tomik
- Nette Evangelist | 485
Já to mám udělané takto:
BaseControl.php
<?php
abstract class BaseControl extends Control {
/**
* Creates template
*
* @return ITemplate
*/
protected function createTemplate() {
/** @var ITemplate */
$template = parent::createTemplate();
return BaseControl::setupTemplate($template);
}
/**
* Template setup (also used for BasePresenter)
*
* @param ITemplate $template
* @return ITemplate
*/
static public function setupTemplate(ITemplate $template) {
// Date and time helpers
$template->registerHelper('date', 'DateTimeHelpers::dateHelper');
// další nastavování...
return $template;
}
}
?>
A pak v BasePresenter.php:
<?php
/**
* Base class for all application presenters.
*
* @author Tomas Vitek
* @package Invader
*/
abstract class BasePresenter extends Presenter
{
/**
* Creates template
*
* @return ITemplate
*/
protected function createTemplate()
{
$template = parent::createTemplate();
return BaseControl::setupTemplate($template);
}
}
?>
- hjr
- Člen | 24
Jasně, to je varianta toho, co navrhuju v prvním řešení. Vydal jsem se teď druhou cestou, mám
BasePresenter
:
protected function createTemplate()
{
$template = parent::createTemplate();
// Helpery
$template->registerHelper('...', '...');
return $template;
}
BaseControl
:
protected function createTemplate()
{
$template = $this->presenter->createTemplate();
$template->component = $this; // DEPRECATED
$template->control = $this;
return $template;
}
BTW ti v BaseControl::setupTemplate()
chybí
return $template;
Editoval hjr (2. 10. 2009 17:40)
- David Grudl
- Nette Core | 8228
hjr napsal(a):
Vyřešil jsem to tak, že jsem si udělal kromě
BasePresenter
u i jakousiDisplayControl
u, která je předkem všechControl
, které používají vlastní šablony a registraci maker a helperů vystrčil do zvláštní třídy ven.Připadá mi to ale takové nepěkné.
To je přece úplně ideální řešení.