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

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
hjr
Člen | 24
+
0
-

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.

hjr
Člen | 24
+
0
-

Tak přeci jen ve fóru podobné téma existuje

Tomik
Nette Evangelist | 485
+
0
-

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

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)

Tomik
Nette Evangelist | 485
+
0
-

hjr napsal(a):

BTW ti v BaseControl::setupTemplate() chybí return $template;

Nechybí, jen jsem jej nevykopíroval… :) Mám tam toho totiž mnohem víc. Ale doplním ho tam, aby to někoho nemátlo.

hjr
Člen | 24
+
0
-

Jen jsem se k tomu chtěl vrátit a říct, že jsem to taky nakonec udělal statickou metodou. Mnou popsaný způsob je náchylný k problémům, pokud například vznikne v budoucnu nějaká další vazba na presenter v jeho metodě createTemplate.

David Grudl
Nette Core | 8228
+
0
-

hjr napsal(a):

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é.

To je přece úplně ideální řešení.