2× invalidateControl(), ale fungue jen jeden
- besir
- Člen | 170
Zdravím,
mam trabl který nejsem schopen vyřešit. Mam ajaxový formulář ve kterém
odešlu data, ty se spracují a uloží do DB. Po zpracování v akci volám
2× invalidateControl() jeden odkazuje na snippet v layout.latte (ten se bez
problémů překreslí. Druhý odkazuje na snippet v šabloně pro danou akci
presenteru a ten se již nepřekreslí. Šablona je {block content}…
Hledal jsem tady na fóru a nalezl toto https://forum.nette.org/…vana-sablona ale nejak mi to nepomohlo. Navíc je to nějaký pátek staré tak se již nejspíš nebude jednat o bug.
Děkuji za pomoc.
- besir
- Člen | 170
Eště sem přišel na to, ře snippet se ve skutečnosti asi odešle ( http://img6.imageshack.us/…601at223.png ), ale prostě se nepřekreslí. Používám jquery.ajaxform.js a jquery.nette.js
Snippet z obrazku
{snippet contactsContainer}
{$test}
{foreach $contacts as $contact}
{snippet contact-$contact->id}
<h2>{$contact->name} <a onclick="$('#removeContactId{$contact->id}').modal()" data-toggle="modal" href="#removeContactId{$contact->id}" class="icon-remove tooltip-right" title="Odstranit kontakt {$contact->name}"></a></h2>
<span class="label label-info">{$contact->position}</span>
{/snippet}
{/foreach}
{/snippet}
A cast v presenteru (vse se vykona jen prekresleni snippetu contactsContainer ne )-:
if ($this->isAjax())
{
$rowId = \pmi\Contacts::addContact($data);
$this->template->contacts = array(\pmi\Contacts::findByContactId($rowId));
$this->template->test = "prošel";
$this->invalidateControl('contactsContainer');
$this->invalidateControl('flashes');
}
Eště se mvypozoroval při zkoušení tu věc, že mám při načtení stránky 0 kontaktů. Odešlu ajaxový formulář a mám stále 0 kontaktů, když ho odešlu podruhé tak se zobrazí 1. kontakt a když ho odešlu potřetí tak se zobrazí 2. kontakt. Nicméně proměnná $test se nepřenastaví :-/
Editoval besir (2. 6. 2012 0:06)
- besir
- Člen | 170
Tak poslední post :-D Už mi to funguje, celou dobu jsem jel podle https://doc.nette.org/…mic-snippets , ale (alespoň pro mě) je z kuchařky špatně pochopitelné, že bez úpravy třeba renderDefault() akce to nefunguje. Já si to nechával až na konec, že to tím vyladím :D Nicméně sem zatím stále nerozchodil dinamické snippety. Jakmile je přidám, tak mi to fungovat přestane :-/
public function handleLike($articleId)
{
...
if ($this->isAjax()) {
...
$this->template->articles = array(
$this->connection->table('articles')->get($articleId)
);
} else {
...
}
public function renderDefault()
{
if (!isset($this->template->articles)) {
$this->template->articles = $this->connection->table('articles');
}
}
Editoval besir (2. 6. 2012 0:26)
- Vojtěch Dobeš
- Gold Partner | 1316
- Zdravím, jak to myslíš, že ti dynamické snippety nefungují?
- Když jsi prováděl invalidaci toho
container
snippetu bez úpravyrenderDefault
metody, co ti to přesně dělalo? Očekáváné chování by bylo, že se znovupošle všechno. - Díky za feedback, pokusím se formulaci v Kuchařce upravit.
Editoval vojtech.dobes (2. 6. 2012 9:07)
- besir
- Člen | 170
vojtech.dobes napsal(a):
- Zdravím, jak to myslíš, že ti dynamické snippety nefungují?
- Když jsi prováděl invalidaci toho
container
snippetu bez úpravyrenderDefault
metody, co ti to přesně dělalo? Očekáváné chování by bylo, že se znovupošle všechno.- Díky za feedback, pokusím se formulaci v Kuchařce upravit.
Ahoj,
ad1) no když je tam přidám dinamické snippety tak se provede vše,
formulář se uloží v pořádku do DB snipet flashes se obnovi, ale statický
snippet contacts který obaluje dinamické se prostě neobnoví.
ad2) To je to chování co jsem tu popisoval v druhém příspěvku… „Odešlu ajaxový formulář a mám stále 0 kontaktů, když ho odešlu podruhé tak se zobrazí 1. kontakt a když ho odešlu potřetí tak se zobrazí 2. kontakt. Nicméně proměnná $test se nepřenastaví“
ad3) Není zač, čerpám, tak také dávám ;-)
Editoval besir (3. 6. 2012 12:31)
- Vojtěch Dobeš
- Gold Partner | 1316
No jasný, jestli provádíš Ajaxový request na jinou action, tak ta bude mít nastavenou jinou šablonu. Buď musíš pro Ajaxový požadavek šablonu manuálně přenastavit:
if ($this->isAjax()) {
$this->template->setFile(...);
}
Nebo použít signál, což je lepší řešení.
- besir
- Člen | 170
vojtech.dobes napsal(a):
No jasný, jestli provádíš Ajaxový request na jinou action, tak ta bude mít nastavenou jinou šablonu. Buď musíš pro Ajaxový požadavek šablonu manuálně přenastavit:
if ($this->isAjax()) { $this->template->setFile(...); }
Nebo použít signál, což je lepší řešení.
Díky, včera jsem si o signálech něco přečetl a cca v půl dvanácté jsem to rozfungoval :-) Přemýšlím, že bych o tom napal nějaký článek, ale zatím nevím jak aby to mělo hlavu a patu, nebo navrhnu rozšíření toho tvého. :-)