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

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

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;
}
Patrik Votoček
Člen | 2221
+
0
-

použij StringTemplate a klasicky Latte