Šablony: problém s vlastními makry a helpery a šablonami komponent

- hjr
 - Člen | 24
 
Používám vlastní makra a helpery, registrované v
BasePresenteru 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ě
BasePresenteru i jakousi DisplayControlu, 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 | 8285
 
hjr napsal(a):
Vyřešil jsem to tak, že jsem si udělal kromě
BasePresenteru i jakousiDisplayControlu, 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í.