redrowControl formuláře z komponenty v presenteru

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
admin@easyweb4u.cz
Backer | 143
+
0
-

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

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;
}
CZechBoY
Člen | 3608
+
0
-

muzes poslat jeste sablony? komponenty, formulare.. cokoliv kde ten form pouzivas a nejede

admin@easyweb4u.cz
Backer | 143
+
0
-

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

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

@admin@easyweb4u.cz koukni se jak formatovat kod, tedka jsem to jeste za tebe opravil, ale priste uz ne :)

admin@easyweb4u.cz
Backer | 143
+
0
-

A já si myslel, že se to naformátuje samo. Příště už to naformátuju.

admin@easyweb4u.cz
Backer | 143
+
0
-

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

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

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

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

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

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

admin@easyweb4u.cz
Backer | 143
+
0
-

Funguje to. To je (nebo ty jsi?) geniální :-)))