2× invalidateControl(), ale fungue jen jeden

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

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
+
0
-

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
+
0
-

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
+
0
-
  1. Zdravím, jak to myslíš, že ti dynamické snippety nefungují?
  2. Když jsi prováděl invalidaci toho container snippetu bez úpravy renderDefault metody, co ti to přesně dělalo? Očekáváné chování by bylo, že se znovupošle všechno.
  3. Díky za feedback, pokusím se formulaci v Kuchařce upravit.

Editoval vojtech.dobes (2. 6. 2012 9:07)

besir
Člen | 170
+
0
-

vojtech.dobes napsal(a):

  1. Zdravím, jak to myslíš, že ti dynamické snippety nefungují?
  2. Když jsi prováděl invalidaci toho container snippetu bez úpravy renderDefault metody, co ti to přesně dělalo? Očekáváné chování by bylo, že se znovupošle všechno.
  3. 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
+
0
-

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
+
0
-

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. :-)