Dialog a následná invalidace snippetu (rozdílné odkazy na handlery ve snippetu)
Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
- Skic
- Člen | 18
Mám vytvořené dialogové okno (ajax) a jeho životní cyklus vypadá následovně:
- kliknu na odkaz, který vede
Presenter:action
- v Presenteru se pak rozhoduju, pokud odkaz přišel z ajaxu, přidávám si do payloadu informace, abych si zobrazil dialogové okno – pokud ne, zobrazím stránku klasicky
- po zavření dialogového okna přenačítám snippet, který byl na stránce
Řeším následující vzorovou situaci:
- Mám zobrazenou stránku
Role:default
, kde je výpis rolí – u každé položky je odkaz na signáldelete!
(Tento odkaz vede na adresu.../default?do=delete
- Otevírám dialogové okno
Role:editor
pro vytvoření nové role – v metoděactionEditor()
si nastavuji do payloadu data k otevření formuláře - V dialogu je formulář, který zpracovávám ajaxově
- Při úspěšném zpracování formuláře nastavuji do payloadu data, aby
se mi dialog zavřel a volám invalidaci snippetu s výpisem
rolí
$this->invalidate('list');
- A jelikož jsem invalidoval z akce
editor
, vytvoří se mi v seznamu rolí jiné odkazy na handler pro smazání.../editor?do=delete
Tím, že se mi vytvoří jiný odkaz, pak po provedení handleru
handleDelete()
se mi provádí metoda actionEditor()
,
jelikož nevolám terminate()
, protože potřebuji invalidovat
snippet list
. (vše podle životního cyklu presenteru).
Vyvoláním této metody zapříčiním, že se mi otevře dialogové okno (viz.
bod 2)
A já bych rád znal váš názor, zda je ideální řešení v tomto
případě volat metodu $this->changeAction('default')
po
zpracování formuláře, aby se mi snippet vygeneroval se „správnými“
odkazy?
class RolePresenter extends UI\Presenter {
public function actionEditor() {
if ($this->isAjax() {
$this->payload->dialog = 'show';
}
// priprava editoru
}
public function actionDuplicate() {
$this->view = 'editor';
// priprava editoru pro duplikaci
}
public function renderEditor() {
// ...
}
public function renderDefault() {
// ...
}
public function editorFormSubmit() {
// zpracovani formu
if ($this->isAjax()) {
$this->payload->dialog = 'close';
// that's the question
$this->changeAction('default');
$this->invalidateControl('list');
}
}
}
Editoval Skic (13. 2. 2013 12:28)