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