Ako ovplivnit blok v layoute z komponenty
- duskohu
- Člen | 778
Caute, akoby ste riesili situaciu ked mate nejaku komponentu a potrebujete vlozit napr. meta tag do head, ale len ked sa ta komponenta zavola? Uvazoval som ze si v komponente urobim static paraneter a na konci layoutu zi zavolam render tej komponenty ktora mi vrati to co ma do header vlozit. Ale velmi sa mi to nepaci. Neriesili ste to niekto?
class MyControl extends Control
{
private static $header = array();
public function render()
{
// render control
// add data for header
$this->header[] = '<meta ...>'
$this->template->render();
}
public function renderHeader()
{
// data for header
$this->emplate->header = $this->header;
$this->template->render();
}
}
<head>
{include #header}
</head>
<body>
{control myControl}
...
{block #header}
{control myControl:header}
{/block}
</body>
- Michal Vyšinský
- Člen | 608
Já bych na to šel asi takto:
- V presenteru si vytvořím array property headers (předpokládejme, že víme, v kterém presenteru budeme komponenty potřebovat/vkládat)
- V render metodě komponenty bych přes $this->presenter->header naplnil data, která chci vložit.
public function render() {
$this->presenter->header[] = "<meta ...>";
}
- Abych zajistil, že se změny pomocí komponent projeví vždy (i když budu komponentu vkládat třeba před </body> tak bych layout upravil takto:
<head>
{capture $html}
</head>
<body>
{control myControl}
...
{block #header}
{control myControl:header}
{/block}
</body>
{/capture}
{foreach $headers as $header}
{!$header}
{/foreach}
{!$html}
Editoval CherryBoss (24. 5. 2013 15:41)
- duskohu
- Člen | 778
To znie celkom fajn. Len som chcel aby to nebolo v presentru, ale aby som mal na vkladanie do header zvlast komponentu ktoru si injectnem kdekolvek do presenteru alebo dalsej komponenty napumpujem ju vsetkym co chcem do header dat a ona sa potom vypise v savlone. Alebo aby to bola funkcionalita danej komponenty ktora si do header potrebuje nieco vlozit.
- Michal Vyšinský
- Člen | 608
Tak není problém místo toho cyklu vložit vlastní komponentu a property dát do komponenty:
class HeaderControl extends Control {
public static $headers = array();
public function render() {
foreach(self::$headers as $header) {
echo $header . "\n";
}
}
}
Šablona:
<head>
{capture $html}
</head>
<body>
{control myControl}
...
{block #header}
{control myControl:header}
{/block}
</body>
{/capture}
{control header}
{!$html}
A pak v některé komponentě jen:
HeaderControl::$headers[] = "<meta...>";
Edit: Možná by pak stálo za to ošetřit vstupy do toho headeru, aby se ti tam nedostal z nějaké komponenty škodlivý kód, ale jestli budeš komponenty tvořit jen ty tak to asi není potřeba.
Editoval CherryBoss (24. 5. 2013 15:52)
- duskohu
- Člen | 778
este som dospel k jednemu problemu ked pouzivam skladanie sablon cez:
<!DOCTYPE html>
<html>
{includeblock head.latte}
<body>
</body>
</html>
// head.latte
<head>
....
</head>
tak pouzitie capture nie je mozne:
<head>
{capture $html}
</head>
<body>
{control myControl}
...
</body>
{/capture}
{control header}
{!$html}
toto tiez nie, lebo include sa zavola skor ako sa vsetko vygeneruje do header
<head>
{include #header}
</head>
<body>
{control myControl}
...
{block #header}
{control myControl:header}
{/block}
</body>
Editoval duskohu (26. 5. 2013 20:56)