Dědičnost Control – „naplnění šablony šablonou“
- suxik
- Člen | 62
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
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
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
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
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)