Přesun rozhodující logiky (if, autorizace) ze šablony do presenteru

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

Zdravím,
začínám s Nette a nějak se mu nelíbí kód, který píšu do šablon. Chtěl bych se zeptat, jak by se dal udělat jinak (nejlépe s minimem ifů atd v šabloně, a co nejvíce takové logiky přesunout do presenteru), případně jestli to má smysl. Máme dejme tomu takovýto kód:

<div id="to-do">
  <h5>To Do</h5><br/>
  {if $user->isLoggedIn()}
    {control addForm}
  {/if}
  {if count($toDos)}
    {foreach $toDos as $toDo}
      <br/><span><small class="{if $toDo['done']}done{else}not-done{/if}">{$toDo['text']}</small>
      {if $user->isLoggedIn()}
        | <a href="{link delete $toDo['id']}">smazat
        </a> - <a href="{link changeState $toDo['id'], $toDo['done']}">{if $toDo['done']}odznačit{else}hotovo{/if}</a>
      {/if}
      </span>
    {/foreach}
  {else}
    Zatím není žádná věc k udělání
  {/if}
</div>

díky moc

maarlin
Člen | 207
+
0
-

Nepoužívám sice Nette tak dlouho, ale právě v tomhle spatřuji jednu z největších výhod šablonovacího systému – možnost mít klasické podmínky a cykly přímo v šabloně…

Nevím zda je to ekvivalentní příklad, ale třeba plnit nějaký výpis cyklem už v controlleru a předávat hotové HTML do šablony, mi přijde dost násilné – Od čeho pak ty šablony jsou?

Stejně tak mi přijde trochu ujeté bezdůvodně rozsekávat celou stránku na „podšablony“ header, footer, sidebar-x, sidebar-y…

Editoval maarlin (11. 12. 2010 10:36)

Filip Procházka
Moderator | 4668
+
0
-

V tvém případě by se například dalo udělat to, že odstraníš ten přihlašovací formulář a vytvoříš pro něj samostatný pohled, přece ho nebudeš mít na každé stránce. V presenteru si pak můžeš ověřovat jestli je uživatel přihlášený a případně na pohled s formulářem přesměrovat

Editoval HosipLan (11. 12. 2010 15:41)

baki
Člen | 21
+
0
-

Mno, tohle celé je vlastně Komponenta:

<?php

use Nette\Application\AppForm;

class ToDoControl extends Nette\Application\Control
{

  public function render()
  {
    // nejaka logika, co pracuje s tym parametrom - prisposobi render komponenty
    $this->template->toDos = ToDoModel::fetchAll();
    $this->template->setFile(__DIR__ . '/todo.latte');
    $this->template->render();
  }

  protected function createComponentAddForm($name) {
        $form = new AppForm($this, $name);
        $form->addText('text')
                ->addRule(AppForm::FILLED, 'Musíš zadat');
        $form->addSubmit('send', 'Přidat');
        $form->onSubmit[] = callback($this, 'postFormSubmitted');
        return $form;
  }

  public function postFormSubmitted(AppForm $form) {
        $data = $form->getValues();
        $data['date'] = new DateTime();
        $id = ToDoModel::insert($data);
        $this->redirect('this');
  }

  public function handleDelete($id) {
    		ToDoModel::delete($id);
    		$this->redirect('this');
	}

	public function handleChangeState($id, $data) {
	$data ? $data=0 : $data=1;
        ToDoModel::change($id, $data);
        $this->redirect('this');

  }


}

a addForm značí jen přidání záznamu do tabulky. Tohle je vlastně taková komponenta na ToDo, kde se mi vypisují úkoly a já je mažu, měním jejich stavy a tak :)

Filip Procházka
Moderator | 4668
+
0
-

autorizaci si můžeš přesunou vždycky, ale právě makra jsou velká výhoda šablon nette a byla by chyba je nevyužívat.

baki
Člen | 21
+
0
-

ok a tu autorizaci udělat jak? když se to objevuje na 2 místech (někdy i na více)
a nebo to nechat tam a je to :)