redrowControl formuláře z komponenty v presenteru
- admin@easyweb4u.cz
- Backer | 143
Mám vytvořený formulář v presenteru: protected function createComponentMenuinsertForm(). Dále mám funkci: public function menuinsertFormSucceeded($form, $values). Formulář má select do kterého se načítají položky menu z databáze – dotaz je v oné komponentě. Po odeslání formuláře (AJAX) se do databáze zapíše nová položka menu, v šabloně se překreslí výpis položek včetně nově přidané položky. Nejspíš (no nejsem si tím jist) se překreslí i onen formulář /redrawControl(‚insertMenu‘)/, ale už se nepřidá do selectu nově přidaná položka menu, což bych rád. Co s tím?
- admin@easyweb4u.cz
- Backer | 143
Tady je ten form
protected function createComponentMenuinsertForm() {
$form = new Form;
$form->addText('item', 'Název:')
->setAttribute('class', 'long250');
$select = $this->database->table('menu_top_1')->where('idParent = ', 0)->order('ord')->fetchAll();
$parent[0] = 'První úroveň';
foreach ($select as $s) {
$parent[$s->id] = $s->item;
}
$form->addSelect('idParent', 'Nadřazená položka:', $parent);
$form->addSubmit('send', 'Uložit')
->setAttribute('class', 'btn btn-success');
$form->getElementPrototype()->class('ajax');
$form->onSuccess[] = [$this, 'menuinsertFormSucceeded'];
return $form;
}
- admin@easyweb4u.cz
- Backer | 143
No on asi jede, jenom při redawControl nepřidá tu novou položku menu do selectu. Ale pošlu to.
- admin@easyweb4u.cz
- Backer | 143
v presenteru
public function menuinsertFormSucceeded($form, $values) { // AJAX
if (!$this->isAjax()) {
$this->flashMessage('Error');
} else {
if (empty($values->item)) {
$this->flashMessage('Zadejte položku menu!');
} else {
try {
$ord = $this->database->table('menu_top_1')->max('ord') + 1;
$this->database->query('INSERT INTO menu_top_1', [
'item' => $values->item,
'idParent' => $values->idParent,
'ord' => $ord,
'active' => 1,
'slider' => 1
]);
// other languages
$row = $this->database->table('menu_top_1')->order('id DESC')->limit(1, 0)->fetch();
$itemid = $row->id;
$item = $row->item;
$select = $this->database->table('language')->where('id > ', 1)->order('id')->fetchAll();
foreach ($select as $s) {
$tb = 'menu_top_' . $s->id;
$this->database->query('INSERT INTO ' . $tb, [
'id' => $itemid,
'item' => $item
]);
}
// text items
$this->database->query('INSERT INTO text_1', [
'idMenu' => $itemid,
'text' => $item
]);
$row = $this->database->table('text_1')->order('id DESC')->limit(1, 0)->fetch();
$textid = $row->id;
foreach ($select as $s) {
$tb = 'text_' . $s->id;
$insert = $this->database->query('INSERT INTO ' . $tb, [
'id' => $textid,
'text' => $item
]);
}
if ($insert) {
$this->flashMessage('Přidání položky bylo úspěšné.');
} else {
$this->flashMessage('Chyba přenosu dat.');
}
} catch (Exception $e) {
echo 'Caught exception: ', $e->getMessage(), "\n";
}
$this->redrawControl('menuInsert');
$this->redrawControl('listMenu');
}
}
$this->redrawControl('flashesAdmin');
}
a šablona
{block content}
{if $user->loggedIn}
<h2>Administrace</h2>
<div class="alert alert-success">
<strong>Uživatel:</strong> {$user->getIdentity()->username}, <a n:href="Sign:out">Odhlásit</a>
</div>
{snippet flashesAdmin}
{foreach $flashes as $flash}
<div class="flash alert alert-danger {$flash->type}">{$flash->message}</div>
{/foreach}
{/snippet}
{control menuadmin}
<h3 n:block=title>Menu</h3>
<a n:href="Menu:default proc=>3"><button class="btn btn-success">přidat položku</button></a>
<div class="spacer"></div>
{if $proc === 1}
{elseif $proc === 2}
<table class="formAdmin">
<tr>
<td id="tdMiddle">
Chcete opravdu smazat položku menu <strong></strong> včetně navázaných dat (texty, slider)?
<td>
{control menudeleteForm}
</td>
<td>
<img class="closeForm" src="{$basePath}/design/admin/delete.gif" alt="zavřít" title="zavřít">
</td>
</tr>
</table>
<div class="spacer"></div>
{elseif $proc === 3}
<table class="formAdmin">
<tr>
<td>
{snippet menuInsert}
{control menuinsertForm}
{/snippet}
</td>
<td>
<img class="closeForm" src="{$basePath}/design/admin/delete.gif" alt="zavřít" title="zavřít">
</td>
</tr>
</table>
{elseif $proc === 4}
{/if}
{if $proc === 5}
{foreach $group as $k => $v}
{var $itemUp = $v[1]}
{/foreach}
{if $itemUp === null}
<h4>První úroveň</h4>
{else}
<h4>Podřízené položky pro: {$itemUp}</h4>
{/if}
<table class="formAdmin">
<tr>
<td>
<ul id="list_of_item" class="ui-sortable">
{foreach $group as $k => $v}
<li id="page_{$k}"><table><tr><td class="us-td-long2">{$v[0]}</td></tr></table></li>
{/foreach}
</ul>
</td>
<td>
<a n:href="Menu:default" title="zavřít"><img class="closeRef" src="{$basePath}/design/admin/delete.gif" alt="zavřít" title="zavřít"></a>
</td>
</tr>
</table>
{else}
{snippet listMenu}
{if $menuArr != null}
{var $arrVt = null}
<ul class="ui-sortable">
{foreach $menuArr as $m=>$mn}
{if $mn[1] == 0}
<li><table><tr><td class="us-td-long2">{$mn[0]}</td><td>editovat</td><td>aktivní</td><td><a n:href="Menu:default proc=>2, menuid=>$m" title="smazat">smazat</a></td><td><a n:href="Menu:default proc=>5, menuid=>$m">pořadí</a></td></tr></table>
{var $i = 0}
{foreach $menuArr as $k=>$kn}
{if $m==$kn[1]}
{var $arrVt[$k] = $kn[0]}
{/if}
{/foreach}
{if $arrVt!=null}
<ul class="ui-sortable valueSec">
<li n:foreach="$arrVt as $l=>$ln">
<table><tr><td class="us-td-long">{$ln}</td><td>editovat</td><td>aktivní</td><td><a n:href="Menu:default proc=>2, menuid=>$l" title="smazat">smazat</a></td><td><a n:href="Menu:default proc=>5, menuid=>$l" title="pořadí">pořadí</a></td></tr></table>
</li>
</ul>
{/if}
</li>
{/if}
{var $arrVt = null}
{/foreach}
</ul>
{/if}
{/snippet}
{/if}
{else}
<div class="alert alert-danger">Nemáte oprávnění nebo vypršel časový limit. <a n:href="Sign:in" title="přihlásit">Přihlásit</a></div>
{/if}
- David Matějka
- Moderator | 6445
@admin@easyweb4u.cz koukni se jak formatovat kod, tedka jsem to jeste za tebe opravil, ale priste uz ne :)
- admin@easyweb4u.cz
- Backer | 143
A já si myslel, že se to naformátuje samo. Příště už to naformátuju.
- admin@easyweb4u.cz
- Backer | 143
Tak jsem se dozvěděl, že bych měl formátovat kódy. Tak to není pro začátek úplně špatné :-(
- David Matějka
- Moderator | 6445
je to tim, ze zpracovani toho formulare (tedy metoda menuinsertFormSucceeded) se provadi az po volani metody createComponentMenuinsertForm, kde ten select plnis. takze v dobe vytvareni formulare tam v db ta polozka nebyla
- admin@easyweb4u.cz
- Backer | 143
To ano, ale v metodě menuinsertFormSucceeded se položka menu do databáze zapíše a poté se v té metodě volá redrawControl pro překreslení toho formuláře s nově zapsanou položkou v databázi. Buď se ten formulář nepřepíše nebo si při tom překreslení nehrábne do té databáze. Ve výčtu položek se ta nová položka objeví /redrawControl(‚listMenu‘)/ (data se posílají z metody render), ve formuláři ne (komponenta v presenteru).
- David Matějka
- Moderator | 6445
ano, vykresleni se provede az po pridani do DB. ale ten formular vcetne naplneni selectu si provedl pred vlozenim do databaze. konkretne tento kod:
$select = $this->database->table('menu_top_1')->where('idParent = ', 0)->order('ord')->fetchAll();
$parent[0] = 'První úroveň';
foreach ($select as $s) {
$parent[$s->id] = $s->item;
}
ten se provedl pred tim, nez si vlozil zaznam do DB a tudiz tam nemuze byt nove pridany zaznam
- admin@easyweb4u.cz
- Backer | 143
No ale pak mi je takové redrawControl k ničemu. Proč se form přepíše tím původním? A proč to u tabulky s položkami jde? Jediné co mě napadá, že z render metody přepsání s aktuálními hodnotami lze a z komponenty ne. Jak by se to teda mělo řešit?
- David Matějka
- Moderator | 6445
No ale pak mi je takové redrawControl k ničemu. Proč se form přepíše tím původním?
Je k něčemu. jen tam mušíš poslat aktuální data (tzn po insertu). přepíše se to tím, co si tam nastavil. jelikož si tam dal data před insertem, tak se tam zobrazeji data před inzertem.
A proč to u tabulky s položkami jde? Jediné co mě napadá, že z render metody přepsání s aktuálními hodnotami lze a z komponenty ne.
ano, je to tím, že je to v render metodě – ta se provádí až po zpracování formuláře a tudíž tam v db ta položka již je (druhá věc je pak to, že nette database vrací kolekce „lazy“ a dotaz se provede, až když nad ním iteruješ, tedy až v šabloně)
Jak by se to teda mělo řešit?
Jak by se to teda mělo řešit?Jak by se to teda mělo řešit?
nejsnažší bude po insertu aktualizovat ty položky v selectu
tedy přes
$form['idParent']->setItems($items);
ty items pak sestavis stejne, jako to delas v createComponent