Vlastni validace formularovych prvku a ajax
- Glottis
- Člen | 129
hola, mam dotazek a uz hledam snad hodinu a nic. mam komponentu a v ni je formular. formular ma na nekterych prvcich vlastni validaci. formular odesilam ajaxem. odesilani funguje ale kdyz nastane chyba pri validaci, mela by se vypsat chyba. bez ajaxu se vykresli. s ajaxem ale nette posle zpatky celou stranku misto snippetu. kde muzu zajistit invalidaci jen nejakeho snippetu odeslani jen formulare?
dik :)
- Glottis
- Člen | 129
tak po obede se mi zadarilo to najit :)
https://forum.nette.org/…ror-messages
ale nejde to nejak lepe? nejak automaticteji? :)
- Glottis
- Člen | 129
mam stim jeste drobny zadrhel, napovi mi nekdo? :) uvadim kousky kodu co stim maji co delat
sablona pro presenter
<?php
{control win}
?>
sablona komponenty win
<?php
{snippet win-wrap}
{if $display == true}
{snippet win-container}
<div id="{$control->name}" class="window-container">
<div id="win-window-handle" class="window-head-bar">
<span style="float: left; line-height: 24px; font-size: 16px;">
{$caption}
</span>
<span style="float: right; width: 20px; text-align: center; background: red; color: black;"><a href="{link close!}" class="ajax">X</a></span>
</div>
<div class="window-body">
{foreach $control->components as $comp}
{snippet $comp->name}
{control $comp}
<div style="clear: both;"></div>
{/snippet}
{/foreach}
</div>
</div>
{/snippet}
{/if}
{/snippet}
?>
vytvareni komponenty v presenteru
<?php
protected function createComponentWin($name) {
$win = new Glo\Windows();
$form = new Nette\Application\UI\Form();
$form->addText('textfield')->addRule($form::INTEGER)->addRule(
function (Nette\Forms\Controls\TextInput $control) {
return (bool) ($control->getValue() % 2);
}, 'Musíte uvést liché číslo');
$form->addSubmit('testbutton', "Odeslat");
$form->getElementPrototype()->class('ajax');
$win->addComponent($form, 'form');
return $win;
}
?>
odchyceni chyby pri validaci
<?php
public function errorForm(Nette\Application\UI\Form $form) {
$form->lookup('Nette\Application\UI\IRenderable')->invalidateControl();
}
?>
to jsem se docetl v jednom z prispevku v odkazu vysse. to mi ale zinvaliduje dva snippety. jak snippet win-wrap tak dynamicky snippet form. jde nejak udelat, aby se zinvalidovala jen ta komponenta form a tim i ten snippet? ted jak to je tak to funguje ale ma to par nedostatku.
- znovu se vykresli ta nadrazena komponenta a protoze to je okno a da se snim hybat, zmeni se jeho pozice. to se da samozrejme resit ulozenim pozice a navraceni zpet.
- vykresleny formular se odesle dvakrat. jak ve snippetu win-wrap (cele okno i s formularem) a i formular sam.
delam neco spatne?
dekuju
- Glottis
- Člen | 129
achtan napsal(a):
kukni na api invalidateControl ma vstupny parameter
myslis udelat toto jo? :)
<?php
public function errorForm(Nette\Application\UI\Form $form) {
$form->lookup('Nette\Application\UI\IRenderable')->invalidateControl('form');
}
?>
to jsem samozrejme zkousel ale nic se mi neprekresli
kdyz upravim sablonu takto
<?php
{snippet win-body}
{foreach $control->components as $comp}
{$comp->name}
{snippet $comp->name}
{control $comp}
<div style="clear: both;"></div>
{/snippet}
{/foreach}
{/snippet}
?>
a pak udelam
<?php
$win = $this->getComponent('win');
$win->invalidateControl('win-body');
?>
tak se mi prekresli jen ten snippet form a ne win-body.
a kdyz dam invalidovat snippet win-container nebo wrap tak se mi invaliduje ten dany snippet. a ne form. neco mi unika?