Forms a problém s renderom
- branov
- Člen | 18
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.'
'.$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.
- Majkl578
- Moderator | 1364
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)
- Majkl578
- Moderator | 1364
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. ;)