Dynamické naplnění formuláře

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

Potřeboval bych dynamicky naplnit formulář (řekněme podle zvolené hodnoty selectboxu – ale není to dogma) a podle její hodnoty vytáhnout data z databáze (umím). Jsem schopný to udělat v jQuery / javascriptu a input po inputu to ručně naplnit. Zajímá mě ale, zda to nejde i v nette v presenteru, že bych např přes ajaxový snippet změnil defaultní hodnoty. Například u takového formuláře:

<?php
{snippet formular}
    {form dodavatele}
    <table>
        <tr>
            <th>{label zkrnaz /}</th>
            <td>{input zkrnaz}</td>
        </tr>
        <tr>
            <th>{label nazev /}</th>
            <td>{input nazev}</td>
            <th>{label ico /} <br /> {label dic /}</th>
            <td>{input ico} <br /> {input dic}</td>
        <tr>
            <th>{label ulice /}</th>
            <td>{input ulice}</td>
            <th>{label banka /}</th>
            <td>{input banka}</td>
        </tr>
        <tr>
            <th>{label obec /}</th>
            <td>{input obec}</td>
            <th>{label ucet /}</th>
            <td>{input ucet} {label kodban /} {input kodban}</td>
        </tr>
        <tr>
            <th>{label psc /}</th>
            <td>{input psc}</td>
        </tr>
        <tr>
            <th>{label tel /} <br /> {label fax /} <br /> {label email /} <br /> {label kontakt /}</th>
            <td>{input tel} <br /> {input fax} <br /> {input email} <br /> {input kontakt}</td>
            <th>{label pozn /}</th>
            <td>{input pozn}</td>
        </tr>
    </table>
    {/form dodavatele}
{/snippet}
?>

volání ajaxového subrequestu nad tímto formulářem jsem schopný zajistit, jen nevím, jak v presenteru v daném signálu přistupovat k tomuto formuláři.

nanuqcz
Člen | 822
+
0
-

Ahoj, něco na tomhle principu nefunguje? (formuláře jsem ajaxově jestě nenačítal)

v presenteru

function renderEdit($dodavatel_id)
{
    $this['dodavatele']->setDefaults( $this->dodavateleModel->getDodavatel($dodavatel_id) );
    $this->invalidateControl('formular');
}

v šabloně

<a href="{Dodavatele:edit, dodavatel_id => 1}" class="ajax">Vložit do formuláře hodnoty pro dodavatele s id=1</a>

EDIT:

jen nevím, jak v presenteru v daném signálu přistupovat k tomuto formuláři

spíš bych to právě udělal normálně ve view

Editoval xxxObiWan (27. 7. 2011 13:25)

castamir
Člen | 629
+
0
-

Opravdu render a ne handle?

Jinak předpokládám, že v modelu v getDodavatele mám vracet řádek databáze (=pole hodnot) jako má formulář.

Každopádně díky za rychlou reakci.

EDIT:
handle je pro ajax, který jsi vlastně ještě u formulářů takto nepoužil, takže zbytečný dotaz…

Editoval castamir (27. 7. 2011 13:38)

castamir
Člen | 629
+
0
-

vyzkoušel jsem výše zmíněnou radu a ani po různých obměnách mi to zatím nefunguje…

presenter:

<?php
public function handleDFirma($id) {
    $this->row = $this->getService('model')->getDodavatele()->where("id", $id);
    if ($this->isAjax()) {
        $this->invalidateControl('pokus');
        $this->invalidateControl('formular');
    }
}

public function renderEditaceDodavatelu() {
    $this->template->row = $this->row;
    $this['dodavatele']->setValues($this->row);
}
?>

pro kontrolu jsem si udělal ještě jeden snippet, tentokrát neformulářový, kam se vypíše pár položek záznamu tabulky (část formuláře) korektně, sic trochu nešikovně:

<?php
{snippet pokus}
    {foreach $row as $radek}
        {$radek->id}<br />
        {$radek->klient}<br />
        {$radek->zkrnaz}<br />
        {$radek->ico}<br />
    {/foreach}
{/snippet}
?>

Z mě neznámého důvodu to zde neakceptuje $row jako pole obsahující řádek databázové tabulky, ale jako pole takových polí, takže předpokládám, že problém bude zde. Nicméně mi nejde do hlavy, proč se to v šabloně tváří jako pole a v presenteru nikoliv ($this->row[0] háže nečekaně laděnku undefined offset 0).

Nějaké nápady, proč mi to formulář nevyplňuje, ale snippet ‚pokus‘ ano??

EDIT: odstraněny nesouvisející řádky kódu

Editoval castamir (27. 7. 2011 17:00)

ic
Člen | 430
+
0
-

castamir napsal(a):

Zkoušel jsi v šabloně print_r($row) co vlastně obsahuje?

vranacik
Člen | 9
+
0
-

a nebude $row jednoducho DibiRow a tým pádom naozaj nepojde o pole ale objekt a foreach nema nad čím iterovať? skus to bez toho foreach či?