Dynamických snippety v tabulce a dialogové okno
- radekBrno
- Člen | 61
Zdravím,
snažím se vytvořit první aplikaci v Nette a mám pár otázek ohledně dynamických snippetů. Jedná se o správu uživatelů – konkrétně o jejich aktivaci, kterou se mi podařilo udělat přes AJAX, ale moc se mi to řešení nelíbí, protože v metodě handleActive() je zbytečný dotaz do DB. Místo celého řádku by stačilo změnit jen jednu buňku tabulky.
No a pak bych rád po kliknutí na odkaz „Block“ zobrazil dialogové okno s formulářem a nějakým doplňkovým textem. To netuším, jak mám udělat.
presenter UsersPresenter.php
class UsersPresenter extends BasePresenter {
private $database;
public function __construct(Nette\Database\Context $database) {
$this->database = $database;
}
public function renderDefault() {
if (!isset($this->template->users)) {
$this->template->users = $this->database
->table('users')
->select('id, username, reg_mail, active')
->order('username');
}
}
public function handleActive($id) {
$this->database->table('users')->where(array('id' => $id))->update(array('active' => 1));
$this->flashMessage("Activated", "success");
$this->template->users = $this->database
->table('users')
->select('id, active')
->where(array('id' => $id));
$this->redrawControl('usersList');
}
public function handleBlockUser($id) {
$this->template->displayDialog = 1;
$this->template->users = $this->database
->table('users')
->select('id')
->where(array('id' => $id));
$this->redrawControl('usersList');
}
}
šablona default.latte
{block content}
<h1>{_users.users.headline}</h1>
{if count($users) > 0}
{snippet usersList}
<table width="100%" border="1">
<tr>
<th>{_users.users.username}</th>
<th>{_users.users.regMail}</th>
<th colspan="4">{_users.users.admin}</th>
</tr>
{foreach $users as $user}
<tr>
<td>{if isset($user->username)}{$user->username}{/if}</td>
<td>{if isset($user->reg_mail)}{$user->reg_mail}{/if}</td>
<td>
{if isset($user->active)}
<div n:snippet="active-$user->id">
{if $user->active == 0}
<a class="ajax" n:href="active! $user->id">Active</a>
{else}
Activated
{/if}
</div>
{/if}
</td>
<td>
<div n:snippet="block-$user->id">
<a class="ajax" n:href="blockUser! $user->id">Block</a>
{if isset($displayDialog)}
{include 'block.latte'}
{/if}
</div>
</td>
</tr>
{/foreach}
</table>
{/snippet}
{else}
{_users.users.noUsers}
{/if}
Editoval radekBrno (23. 4. 2014 20:51)
- sKopheK
- Člen | 207
Místo celého řádku by stačilo změnit jen jednu buňku tabulky.
Zkus si odkaz otevřít v novém okně (např. CTRL+klik, prostřední myšítko apod.) a v Nette Baru se u DB podívej, co se přesně provádí za dotaz. Nette\Database je celkem chytře řešeno, takže by se nic navíc provádět nemělo.
No a pak bych rád po kliknutí na odkaz „Block“ zobrazil dialogové okno s formulářem a nějakým doplňkovým textem. To netuším, jak mám udělat.
Pokud dialogové okno myslíš v JavaScriptu, tak to udělej v JavaScriptu, např. označením odkazů pro blokování nějakou CSS třídou (tady např. ajax-block) a pak pomocí jQuery
$('.ajax-block').click(function() {
return window.confirm('Opravdu zablokovat?');
});
Místo window.confirm()
můžeš použít třeba window.prompt()
.
Ještě koukám, že máš v šabloně snippety, které nevyužíváš –
pro větší efektivitu překresluj v metodách handle*
překresluj jen opravdu potřebné části.