Dynamické naplnění formuláře
- castamir
- Člen | 629
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
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
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
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)