Dědičnost Control – „naplnění šablony šablonou“

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

Ahoj,
resim tenhle problem, mam abstraktni tridu WindowControl a pak z ni dedim tridy jako CalendarControl nebo AboutControl a chci, aby se do sablony, kterou renderuje metoda render tridy WindowControl pridal obsah sablony podedene tridy – tedy kdyz si vytvorim AboutControl, aby se mi udelal obalovy div z WindowControl a do nej se naplnil obsah sablony z AboutControl, moje reseni z hlediska dedicnosti jede jak ma, ale misto sablony se mi zobrazi „neprelozeny“ text.

<?php
abstract class WindowControl extends Control
{
    private $title;

    protected $content;

    public function __construct($title)
    {
        parent::__construct();

        $this->title = $title;
    }

    abstract protected function getContent();

    public function render()
    {
        $template = $this->template;
        $template->setFile(dirname(__FILE__) . '/WindowControl.phtml');

        $template->title = $this->title;
        $template->content = $this->getContent();

        $template->render();
    }
}
?>

a potom

<?php
class AboutControl extends WindowControl
{
    private $aboutText;

    public function __construct($title = "AboutControl")
    {
        parent::__construct($title);
        $this->aboutText = self::loadAboutText();
    }

    private function loadAboutText()
    {
        $this->aboutText = AboutControlModel::loadAboutText();
    }

    protected function getContent()
    {
        $template = new Template(dirname(__FILE__) . '/AboutControl.phtml');
        $template->aboutText = $this->aboutText;

        return $template;
    }

}
?>

Sablona WindowControl:

`<div class=„window“>
<div class=„window_header“>
<h1 class=„caption“>{$title}</h1>
</div>
<div class=„window_content“>
{$content}
</div>
</div>`

Sablona AboutControl:
`<div class=„aboutControl“>
<div class=„aboutText“>
<p>{$aboutText}</p>
</div>
</div>`

Vystup ale vypada takto:

AboutControl
{$aboutText}

– kde je chyba?

Ola
Člen | 385
+
0
-

V druhé kontrole vytváříš template nestandardně a kvůli tomu nemáš zaregistrovaný LatteFilter. Mimochodem, pokud chceš doplňovat obsah z AboutControl do místa v šabloně WindowControl, můžeš použít dědičnost:

WindowControl.phtml

Text okolo {block #placeholder}{/block} Text okolo

AboutControl.phtml

{extends './WindowControl.phtml'} {* tady si možná bude potřeba upravit cestu*}
{block #placeholder}Text uvnitř{/block}

Při správném nastavení by se mělo vypsat „Text okolo Text uvnitř Text okolo“.

Editoval Ola (1. 3. 2010 7:56)

Ola
Člen | 385
+
0
-

Pro ostatní jsem ten kód obarvil..

suxik napsal(a):

Ahoj,
resim tenhle problem, mam abstraktni tridu WindowControl a pak z ni dedim tridy jako CalendarControl nebo AboutControl a chci, aby se do sablony, kterou renderuje metoda render tridy WindowControl pridal obsah sablony podedene tridy – tedy kdyz si vytvorim AboutControl, aby se mi udelal obalovy div z WindowControl a do nej se naplnil obsah sablony z AboutControl, moje reseni z hlediska dedicnosti jede jak ma, ale misto sablony se mi zobrazi „neprelozeny“ text.

<?php
abstract class WindowControl extends Control
{
    private $title;

    protected $content;

    public function __construct($title)
    {
        parent::__construct();

        $this->title = $title;
    }

    abstract protected function getContent();

    public function render()
    {
        $template = $this->template;
        $template->setFile(dirname(__FILE__) . '/WindowControl.phtml');

        $template->title = $this->title;
        $template->content = $this->getContent();

        $template->render();
    }
}
?>

a potom

<?php
class AboutControl extends WindowControl
{
    private $aboutText;

    public function __construct($title = "AboutControl")
    {
        parent::__construct($title);
        $this->aboutText = self::loadAboutText();
    }

    private function loadAboutText()
    {
        $this->aboutText = AboutControlModel::loadAboutText();
    }

    protected function getContent()
    {
        $template = new Template(dirname(__FILE__) . '/AboutControl.phtml');
        $template->aboutText = $this->aboutText;

        return $template;
    }

}
?>

Sablona WindowControl:

<div class="window">
    <div class="window_header">
        <h1 class="caption">{$title}</h1>
    </div>
    <div class="window_content">
        {$content}
    </div>
</div>

Sablona AboutControl:

<div class="aboutControl">
    <div class="aboutText">
        <p>{$aboutText}</p>
    </div>
</div>

Vystup ale vypada takto:

AboutControl
{$aboutText}

– kde je chyba?

Jan Tvrdík
Nette guru | 2595
+
0
-
class AboutControl extends WindowControl
{
    private $aboutText;

    public function __construct($title = "AboutControl")
    {
        parent::__construct($title);
        self::loadAboutText(); // Zrušeno přiřazení do $this->aboutText, protože metoda loadAboutText nic nevrací
    }

    ...
}
suxik
Člen | 62
+
0
-

Ola napsal(a):

V druhé kontrole vytváříš template nestandardně a kvůli tomu nemáš zaregistrovaný LatteFilter. Mimochodem, pokud chceš doplňovat obsah z AboutControl do místa v šabloně WindowControl, můžeš použít dědičnost:

WindowControl.phtml

Text okolo {block #placeholder}{/block} Text okolo

AboutControl.phtml

{extends './WindowControl.phtml'} {* tady si možná bude potřeba upravit cestu*}
{block #placeholder}Text uvnitř{/block}

Při správném nastavení by se mělo vypsat „Text okolo Text uvnitř Text okolo“.

Predpokladal jsem, ze to je nezaregistrovanym filtrem, protoze to vytvarim jak to vytvarim, ale kdyz podedim sablony, tak to pak nemusim objektove dedit v programu a to ztraci svoji podstatu. Mimoto mi to dedeni sablon nejde, ani ladenka nic nevypise.

2Honza Tvrdik: diky, je to jen draft, prehledl jsem

Nette neznam natolik, abych sam prisel na reseni a spousta dokumentace chybi, jestli to nakonec budu muset udelat dedenim sablon, tak budu docela smutny

Editoval suxik (1. 3. 2010 10:41)

Majkl578
Moderator | 1364
+
0
-

Proč k vytvoření šablony nepoužiješ Control::createTemplate(), resp. Control::getTemplate()?

suxik
Člen | 62
+
0
-

nevedel jsem, jak se to pouziva, jsem jeste newbie :) diky, pomohlo misto new Template dat createTemplate. Bez dedeni sablon!