Nefunkčí ajax v komponentě
- baki
- Člen | 21
Zdravím,
hraju si s tím už pár dní a ztrácím dech (to by bylo k úvodu :) ).
Mám komponentu control, kterou načítám v BasePresentru:
protected function createComponentToDo() {
$todo = new ToDoControl();
return $todo;
}
V ToDoControl.php mám toto:
<?php
use Nette\Application\AppForm;
class ToDoControl extends Nette\Application\Control
{
public function render()
{
$this->template->toDos = ToDoModel::fetchAll();
$this->template->setFile(__DIR__ . '/todo.latte');
$this->template->render();
}
protected function createComponentAddForm($name) {
$form = new AppForm($this, $name);
$form->getElementPrototype()->class('ajax');
$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);
if (!$this->isAjax())
$this->redirect('this');
else {
$this->invalidateControl('todo');
$form->setValues(array(), TRUE);
}
}
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 v todo.latte toto:
<div id="to-do-block">
{if $user->isLoggedIn()}
{control addForm}
{/if}
{snippet todo}
{if count($toDos)}
{foreach $toDos as $toDo}
<br/><small class="{if $toDo['done']}done{else}not-done{/if}">{$toDo['text']}</small>
{if $user->isLoggedIn()}
<span>
<a href="{link changeState $toDo['id'], $toDo['done']}">{if $toDo['done']}X{else}✓{/if}</a>
| <a href="{link delete $toDo['id']}">smazat</a>
</span>
{/if}
{/foreach}
{else}
Zatím není žádná věc k udělání
{/if}
{/snippet}
</div>
A samozřejmě že to nefunguje. Když ale zkopíruju ty kódy do nějakého třeba DefaulPreseteru a default.latte, tak to funguje (jen změním pár věcí v render).
Prosím, kde je problém :(. Díval jsem se na pár hotových ajax řešení
(nejvíce podobné tomu mému je toto. Ale to je na mě docela dost
složité a nějak jsem se tím ještě neprokousal.
Díky za help
- baki
- Člen | 21
Jo jasně … ty signály jsem neřešil. Jde o to, že když chci přidat něco, tak se mi snippet todo nerefreshne. Firebug zakřičí, ale já těžko poznám, kde je přesně chyba.
Tato chyba : 500 Internal Server Error
A rozdíl je ještě tady:
Content-Type text/html
oproti
Content-Type application/json
- bojovyletoun
- Člen | 667
metodu isAjax() má pouze presenter
presenter dědí až od control a ta ji nemá
viz api