Vlastni validace formularovych prvku a ajax

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

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

tak po obede se mi zadarilo to najit :)

https://forum.nette.org/…ror-messages

ale nejde to nejak lepe? nejak automaticteji? :)

Glottis
Člen | 129
+
0
-

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.

  1. 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.
  2. vykresleny formular se odesle dvakrat. jak ve snippetu win-wrap (cele okno i s formularem) a i formular sam.

delam neco spatne?

dekuju

David Ďurika
Člen | 328
+
0
-

kukni na api invalidateControl ma vstupny parameter

Glottis
Člen | 129
+
0
-

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?