Nefunkčí ajax v komponentě

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

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;
      }

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}&#10003{/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

Aurielle
Člen | 1281
+
0
-

Viděl bych to na to, že handle* metody neprovádějí invalidaci snippetu, ale jen přesměrování.

baki
Člen | 21
+
0
-

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

Aurielle
Člen | 1281
+
0
-

Letí ti tam nějaká exception… takže si zjisti jaká (log, přímej přístup na tu url) a oprav to…

sodae
Nette Evangelist | 250
+
0
-

smazat temp?

baki
Člen | 21
+
0
-

Sorry za zmatení, to byl starý log :)
tady je ten pravý.

EDIT: takže když smažu isAjax(), tak to funguje skvěle :)…jakto? Používám use Nette\Web, které by to mělo zaštiťovat, nebo jsme totálně vedle?

Editoval baki (30. 12. 2010 15:13)

bojovyletoun
Člen | 667
+
0
-

if (!$this->presenter->isAjax()) {

baki
Člen | 21
+
0
-

Díky ;) funguje. Můžeš mi vysvětlit proč?

bojovyletoun
Člen | 667
+
0
-

metodu isAjax() má pouze presenter
presenter dědí až od control a ta ji nemá

viz api

baki
Člen | 21
+
0
-

Gratuluju ke stému příspěvku a díky moc ;)