ajax form přes komponentu

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

Zdravím.
Snažím se rozchodit odeslání formu přes ajax v komponentě (app/components/form.php).
Kod:

public function render() {
	$template = $this->template;
	$template->setFile(__DIR__ . '/sablona.latte');
	$template->render();
    }
    public function createComponentUserForm() {
        $form = new \Nette\Application\UI\Form();
        $form->getElementPrototype()->class[] = "ajax";
        $form->setMethod('post');
        $form->addText( 'xname', 'Uživatel' )
             ->setRequired('Zvolte jméno nebo přijmení');
        $form->addSubmit( 'xin', 'Vyhledat');
        $form->onSuccess[] = callback($this, 'addUserForm_Submit');
        return $form;
    }

    public function addUserForm_Submit(\Nette\Application\UI\Form $form) {
        if (!$this->getPresenter()->isAjax()){
            $this->presenter->redirect('this');

            //dump($this->getPresenter()->isAjax()); - vyhodi false

        }
        else {
            $this->invalidateControl('search');
        }

Nevidí v tom někdo něco?
Děkuji předem.

esorimmer
Člen | 23
+
0
-

Mám pocit, že chyba je v jquery. Zkoušel jsem ty verze z doplňků, ale přes ty mě to nefungovalo :-(

22
Člen | 1478
+
0
-

v jQuery problem určitě není, sam jsem dens jeden ajax rozcházel na formulářích..zkontroluj si, co se děje ve Firebugu.. XHR reguest, nainstaluj s Logger 1.1

Nikde není vidět, jak připojuješ komponentu v presentru, ani jak to vypadá v šabloně..

Neprve si zkus ajax na formuláři, který nemáš v komponentě, jestli vůbec postupuješ správně, stačí se držet návodu v doplňku pro jQuery ajax formuláře.. nezapomeň, že k tomu potřebuješ i jQuery Nette ajax pro update snippetů.

Editoval 22 (11. 1. 2012 1:39)

esorimmer
Člen | 23
+
0
-

V presenteru připojuju komponentu takto:

public function createComponentAddUser() {

	return new \components\AddUser();

    }

V šabolně mám pak

{control addUser}

Data mě to posílá, ale klasickým http requestem, prot si myslím, že mám chybu v implementaci toho jquery.

esorimmer
Člen | 23
+
0
-

Díky za radu. Do toho Firebugu už jsem koukal, ale pak jsem na něj pozapoměl a bral jsem to jako že form nereaguje. Ted jsem tam viděl že to data posílá (status 200 ok), ale nebyl update snippetu. Stačilo změnit $this->invalidateControl(‚search‘); na $this->presenter->invalidateControl(‚search‘); a je to ok.
Takže díky a já mám o zkušenost navíc :-)

Tomáš Votruba
Moderator | 1114
+
0
-

Mám stejný problém v komponentě. Zajímavé je, že ajax se odešle, $this->isControlInvalid() hlásí true, nicméně jeho obsah se nezmění.

	public function handleRemoveFromTP($id)
	{
		$this->model->removeDrillFromTp($id);

		if ($this->presenter->isAjax()) {
			$this->invalidateControl("changeStateTP");
		}
		else {
			$this->redirect("this");
		}
	}

A v šabloně komponenty:

{snippet changeStateTP}
	{if $isDrillInPracticePlan}
		<a n:href="removeFromTP!, $id" class="tpAdded ajax">Odebrat</a>
	{else}
		<a n:href="addToTP!, $id" class="noTpAdded ajax">Přidat</a>
	{/if}
{/snippet}

Snad nedělám nic blbě. Nápady?

22
Člen | 1478
+
0
-

Není problém v n makru link <a n:href="removeFromTP!, $id" class="tpAdded ajax">Odebrat</a>? V komponentě je asi třeba použít plink.. i když na handler by to mělo stačit, pokud je v té komponentě.

Editoval 22 (14. 6. 2012 8:04)

boky
Člen | 18
+
+1
-

Pokud používáš konstruktor, tak tam musíš mít parent::__construct(), jinak se signaly do komponenty nedostanou.

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Změna obsahu snippetu bude odvislá jen a jen na proměnné $isDrillInPracticePlan. Kde ji nastavuješ? Ten handler s ní totiž nijak nehýbá.

duskohu
Člen | 778
+
0
-

Caute, viete mi poradit, mam nieco podobne:

mam kompomentu – sablona:

{snippet}
	stav:{$taskTable->status->name}
        {if $taskTable->status->id==1 || $taskTable->status->id==3}
          <a n:href="startTask! $taskTable->id" class="ajax">zacat</a>
        {/if}

        {if $taskTable->status->id==2}
          <a n:href="endTask! $taskTable->id" class="ajax">skoncit</a>
        {/if}
{/snippet}

$taskTable >> posielam sablone cez komponentu z presenteru cez constructor, samozrejme mam:
parent::__construct();

v komponente mam:

// START TASK
public function handleStartTask($taskId)
{
  $this->taskTable->update(array('start_date' => new DateTime(),'status_id' => 2));
  $this->presenter->flashMessage('start', 'success');

  if ($this->presenter->isAjax()) {
    $this->presenter->invalidateControl();
  } else {
      $this->presenter->redirect('this');
  }
}

//END TASK
public function handleEndTask($taskId)
{
  $this->taskTable->update(array('end_date' => new DateTime(),'status_id' => 3));
  $this->presenter->flashMessage('end', 'success');

  if ($this->presenter->isAjax()) {
     $this->presenter->invalidateControl();
  } else {
      $this->presenter->redirect('this');
  }
}

presenter:

public function createComponentTaskAddForm()
{
  return new TaskAddForm(
    $this->context->createUsers(),
    $this->context->createTasks(),
    $this->context->createObserver(),
    $this->context->createExecutor(),
    $this->context->createNode(),
    $this->context->createAttachment(),
    $this->context->createProject(),
    $this->context->createCustomer(),
    $this->context->createPriority()
  );
}

ked poslem signal tak sa aj vykona dokonca aj flash sa zobrazi, ale nebnovi sa snippet
proste musim da refresh aby sa zobrazili aktualne udaje

neviete mi poradit co mam zle?

Editoval duskohu (18. 7. 2012 14:18)

Vojtěch Dobeš
Gold Partner | 1316
+
+1
-

Pokud patří šablona komponentě, a ne aktuálnímu view, tak v komponentě je třeba volat $this->invalidateControl();, nikoliv $this->presenter->invalidateControl();. Delší (špatná) varianta totiž refreshne nepojmenovaný snippet z šablony view, nikoliv z šablony komponenty.

duskohu
Člen | 778
+
0
-

ano sablona patri komponente,

public function render()
{
  $this->template->setFile(__DIR__ . '/taskEditForm.latte');
  $this->template->taskTable = $this->taskTable;
  $this->template->render();
}

a prepisal som aj $this->invalidateControl();

ale stale mi to nejde… :-(
nejake napady????