Dynamických snippety v tabulce a dialogové okno

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

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

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.