Přesun rozhodující logiky (if, autorizace) ze šablony do presenteru
- baki
- Člen | 21
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
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
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
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
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.