Render formulářových komponent do šablony
Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
- cuga
- Člen | 210
Myslel jsem, že jde o problém texy, ale ono to spíš bude Nette.
Do šablony potřebuju dostat komponentu s formulářem, problém je v tom, že obsah šablony definuju v DB a tam stejně chci definovat kam se formulář vloží, takže v šablone napíšu:
Call us on 1800 123 123 or Register with now us :
{{control EmployerFormControl}}
v BasePresenteru jsem si trošku jinak udělal helper pro zpracování texy:
protected function beforeRender()
{
$this->template->registerHelper('texy', array($this, 'texy'));
parent::beforeRender();
}
public function texy($text, $singleLine = false)
{
$texy = new FrontTexy;
$matches = String::match($text, '/{{control (?P<control>\w+)}}/i');
switch($matches['control']) {
case 'EmployerFormControl':
$control = $this['employerForm'];
$text = String::replace($text, '/{{control ' . $matches['control'] . '}}/i', callback($control, 'render'));
break;
}
return $texy->process($text, $singleLine);
}
protected function createComponentEmployerForm($name)
{
return new EmployerFormControl($this, $name);
}
Takhle všechno funguje, formulář se do šablony nahraje, akorát že se nenahraje do místa definovaného v DB, ale na začátek šablony.
Kde může být zakopaný pudl?
Editoval cuga (8. 3. 2011 21:37)
- cuga
- Člen | 210
poresil jsem to mam pocit trosku prasacky, mate nekdo lepsi reseni?
public function renderControl($control)
{
ob_start();
$control->render();
$render = ob_get_contents();
ob_end_clean();
return $render;
}
public function texy($text, $singleLine = false)
{
$texy = new FrontTexy;
$text = $texy->process($text, $singleLine);
$matches = String::match($text, '/{{control (?P<control>\w+)}}/i');
switch($matches['control']) {
case 'EmployerFormControl':
$control = $this['employerForm'];
$text = String::replace($text, '/{{control ' . $matches['control'] . '}}/i', $this->renderControl($control));
break;
}
return $text;
}