Forms a problém s renderom

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
branov
Člen | 18
+
0
-

zdravím,

používam z Nette primárne len komponentu Forms, mám však problém pri vlastnom renderovaní… Kód vyzerá nejak takto

<?php
$form = new Form();
$form->addText('cena', 'Zadajte čiastku v EUR:')
       ->addRule(Form::FILLED, 'Zadajte čiastku - celú sumu, bez centov')
        ->addCondition(Form::FILLED)
         ->addRule(Form::INTEGER, 'Suma musí byť ceé číslo - bez centov, desatinných miest')
          ->addRule(Form::RANGE, 'Minimálna suma kreditu je 5€ a maximálna 100€', array(5, 100));
$form->addSubmit('prevodom', 'Bankovým prevodom');
$form->addSubmit('paypay', 'Platba systémom PayPay');
$form->addSubmit('paypal', 'Platba systémom PayPal');
//$zobrazujeme .= $form;
//$zobrazujeme .= '</fieldset>';
$form->render('begin');
$form->render('errors');
$zobrazujeme .= '<span class="required">'.$form['cena']->label.'&nbsp; &nbsp;
                '.$form['cena']->control.'</span>';
$zobrazujeme .= '<p><table border="0"><tr><td>'.$form['prevodom']->control.'</td>
                                         <td></td>
                                     </tr>
                                     <tr>
                                         <td>'.$form['paypay']->control.'</td>
                                         <td> - K čiastke sa pripočíta 10% poplatok.</td>
                                     </tr>
                                     <tr>
                                         <td>'.$form['paypal']->control.'</td>
                                         <td> - K čiastke sa pripočíta 5% poplatok.</td>
                                     </tr></table></p>';
$zobrazujeme .= '</fieldset>';
$form->render('end');
?>

pričom premenná $zobrazujeme je vložená v html výstupe. Problém je, že takto vytvorený formulár je nefunkčný – vloží sa len <form…></form> na začiatku stránky a inputy sú samostatne, teda nie sú uzavreté vo form.
Keď odstránim $form->render(‚end‘) formuár sa zobrazí, ale zas nefunguje validácia a nie je uzavretý…

Môžem poprosiť o radu?

V podstate mi ide o to, aby každý submit button bol na jednom riadku a pri každom bol veďla neho text…

(Sorry ak to patrí do kategórie Forms)

Vďaka za pomoc.

i.magine
Člen | 81
+
0
-

To bude asi tím, že $form->render(); přímo vypisuje , kdežto $zobrazujeme pak asi vypíšeš až někde dál.

$form->render(‚begin‘);
$form->render(‚errors‘);
a
$form->render(‚end‘);

použiješ až když budeš chtít formulář přímo vypsat.

branov
Člen | 18
+
0
-

skusil som teda premennej $zobrazujeme pridelit hodnoty $form-reder(…) a vysledok bol rovnaky :(

Majkl578
Moderator | 1364
+
0
-

Tak použij buffer (ob_start(), ob_get_clean()).

branov
Člen | 18
+
0
-

chm, tudy to nepude :-((

asi to prepíšem z nette do klasického formu plus spracovanie..

Majkl578
Moderator | 1364
+
0
-

Nabízím ještě jednu alternativu, která by měla fungovat dle očekávání: podědění Nette\Forms\Form a úprava metody render() jejím překrytím.

namespace MyApp;

class Form extends \Nette\Forms\Form
{
	/**
	 * Upravená metoda render, která formulář přímo nevypisuje, ale vrací HTML
	 */
	public function render()
	{
		$args = func_get_args();
		array_unshift($args, $this);
		$s = call_user_func_array(array($this->getRenderer(), 'render'), $args);

		if (strcmp($this->encoding, 'UTF-8')) {
			return mb_convert_encoding($s, 'HTML-ENTITIES', 'UTF-8');
		} else {
			return $s;
		}
	}

	/**
	 * Konverze celého formuláře do HTML
	 */
	public function __toString()
	{
		return $this->render();
	}
}

$form = new Form();
//...
$html = $form->render(/*...*/);

Editoval Majkl578 (29. 4. 2010 11:12)

Honza Kuchař
Člen | 1662
+
0
-

Proč vlastně nepoužíváš ruční render?

branov
Člen | 18
+
0
-

Majkl578: vďaka, skúsim to. ak chápem správne, stačí ak v Nette/Forms/Form nahradím tú časť kódu ?

Honzakuchar: nechápem…? však práve o ručný render sa snažím :-)

Majkl578
Moderator | 1364
+
0
-

Než sahat přímo do Nette, doporučuji aktuální použití – podědit Form.

branov
Člen | 18
+
0
-

ked som to použil priamo v scripte, dostal som výsledok php error s ‚\‘ som to vložil zatial teda priamo do Form.php v Nette a funguje to presne tak ako má :-)

Majkl578
Moderator | 1364
+
0
-

Jaká chyba s \'?
Když nad tím ještě přemýšlím, bylo by vhodnější, aby jsi udělal jinou metodu než render. „Render“ znamená „vykreslit“, což se teď neděje. Metodu render bych nechal beze změny a vytvořil další, která by vracela textovou reprezentaci.
Sahat přímo do Nette je krajní případ, pak to při update zapomeneš změnit a sesype se ti aplikace. ;)