Změna action ve formuláři via Ajax

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

Zdravím,

určitě půjde o lehce řešitelný problém, ale marně si s ním lámu hlavu.
Na stránce s uživatelem mám výpis skupin, jíž je uživatel součástí, včetně odkazu, který uživatele ze skupiny odmaže.
Pod touto tabulkou mám formulář se select boxem, který naopak umožňuje uživatele přidat do těch skupin, ve kterých ještě není.

Vše obsluhuji skrze AJAX takovým způsobem, že pokud odmažu skupinu uživateli, ajaxem se překreslí jeho aktuální skupiny, a také formulář do kterých ho mohu přidat ( tedy v selectboxu přibyde ta skupina, z níž jsem ho právě odmazal ), to samé i naopak.

Problém mám s tím, že když uživatele odmažu ze skupiny ajaxem ( zavolá se např. /user/discard/?idUser=5&idGroup=x ) a nechám si vrátít obnovený formulář, změní se mi prefix v action formuláře.
Tedy pokud tam bylo např. action="user/edit/5?doSomething…
změní se hodnota na /user/discard/?idUser=5&idGroup=5?doSomething

což sebou nese problém s odesláním formuláře, který v Presenteru projde action metodou discard, což působí neplechu.
Díky za nakopnutí.

voda
Člen | 561
+
0
-

Udělej odstranění skupiny signálem:

public function handleDiscard($user, $group) {
	$this->model...
	if ($this->isAjax()) {
		$this->validateControl(..);
	} else {
		$this->redirect('this');
	}
}

a odkaz z šablony bude

<a n:href="!discard ...">..</a>
autumnLeaf
Člen | 2
+
0
-

voda napsal(a):

Udělej odstranění skupiny signálem:

public function handleDiscard($user, $group) {
	$this->model...
	if ($this->isAjax()) {
		$this->validateControl(..);
	} else {
		$this->redirect('this');
	}
}

a odkaz z šablony bude

<a n:href="!discard ...">..</a>

Jop, to je ono. Díky moc ;)

tomask
Člen | 9
+
0
-

Mám podobný problém.

Situace: jednoduchý admin s přehledem záznamů a paginátorem umístěným ve snippetu ‚list‘. Ve společné metodě beforeRender mám:

public function beforeRender()
{
  if ($this->isAjax()) {
    $this->invalidateControl('flashes');
    $this->invalidateControl('list');
  }
}

Po přechodu na editaci záznamu vykreslím formulář pomocí továrničky. Formulář je opět odeslán ajaxem a zpracovává ho připravený callback přidaný jako

$form->onSuccess[] = callback($this, 'productEditFormSubmitted');

Callback aktualizuje model, nastaví hlášku. Změní view na default. Invalidují se potřebné snippety (beforeRender), vypíše se správně hláška a aktualizovaný seznam. Problém je, že odkazy v paginatoru se negenerují pro view ‚default‘, ale pro ‚edit‘. Proč komponenta VisualPaginator generuje odkazy pro jiný view? Jak jí sdělím, že už jsem v jiném view? Děkuji za popostrčení.

public function productEditFormSubmitted(Form $form)
{
  if ($form->isSubmitted()) {

    try {
      $update = $this->model->update($this->getParam('id'), $form->values);
      $this->flashMessage('Update ok');
      $this->setView('default');
    } catch (\Exception $e) {
      $this->flashMessage('Chyba: ' . $e->getMessage(), 'error');
    }

    if (!$this->isAjax()) {
      $this->redirect('Presenter:default');
    }

  }
}