Ajax a překreslování snippet-y

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

Zdravím Pánové, zkoušim pochopit fungování s překreslováním snippetu pomoci ajax. A vše by i fungovalo, jen nemohu najit chybu proč se mi překresluje vždy cela stránka a ne jen jedna konkretní část kodu.

jako základ jsem použil příklad: https://gist.github.com/…gern/4672895

Na stránce jsou dvě časové razítka (v komponentě a v presentru) a očekával bych že bude se měnit jen jedno (to které vložené do komponenty a to které je v HomepagePresenter-u zůstane neměnné. Mění se obě ať použijí jakékoliv refrešování a neumím pochopit proč?

com.latte

{* Component template *}
<div style="border-style: solid; border-width: 1px;">
	<h4>Komponenta</h4>

	<p>Jméno komponenty: {$control->name}</p>
	{snippet componenta}
		<p>Čas vykreslení:<?php echo time();?></p>
	{/snippet}
	<p><a n:href="refresh!" class="ajax">REFRESH (invalidování)</a></p>
</div>

com.php

<?php
/**
 * Componenta Com
 */
namespace App\Components;

use Nette;

class Com extends Nette\Application\UI\Control
{
    public function render()
    {
        $this->template->setFile(__DIR__ . '/Com.latte');
        $this->template->render();
    }
    public function handleRefresh()
    {
        if( $this->parent->isAjax() ) {
            $this->redrawControl('componenta');
        } else {
            // redirect může jen presenter, nikoliv komponenta
            $this->parent->redirect('this');
        }
    }
}

default.latte

{* HomepagePresenter:default *}
{block content}

{snippet componentabig}
	{control com}
{/snippet}

<h4>Presenter</h4>
<p>Čas: <?php echo time();?></p>
<p>
	| <a n:href="refresh!" class="ajax">Obnov komponentu</a>
	| <a n:href="refreshDelay!" class="ajax">Obnov komponentu (čeká 25s)</a>
	| </p>

HomepagePresenter.php

<?php
namespace App\Presenters;

use Nette;
use App\Model;

class HomepagePresenter extends BasePresenter
{

	public function renderDefault()
	{
		$this->template->time = date(DATE_RFC822);
	}

	public function handleRefresh()
	{
		if ($this->isAjax())
		{
			$this['com']->redrawControl('componenta');
		} else
		{
			$this->redirect('this');
		}
	}

	public function handleRefreshDelay()
	{
		if ($this->isAjax())
		{
			sleep(25);
			$this['com']->redrawControl('componenta');
		} else
		{
			$this->redirect('this');
		}
	}

	protected function createComponentCom()
	{
		return new \App\Components\Com();
	}

}
CZechBoY
Člen | 3608
+
0
-

Je potřeba mít ten snippet componentabig? Komponenta sama by asi neměla být v snippetu pokud nějaký má.

vlkodlak
Člen | 175
+
0
-

ne, nemusí to byl jen zoufaly test :( o něco co stejně nikam nevedlo

CZechBoY
Člen | 3608
+
0
-

A o co se snažíš?

cendak
Člen | 21
+
0
-

Tak jsem nad tím přemýšlel a nedá se vyloučit to, že máš správně spuštěnou podporu nette ajax a skutečně provádíš ajaxové požadavky. Tedy připojenou nette.ajax.js a provedenou její inicializaci. Jinak kód co jsi uvedl vypadá, že by měl fungovat.

Zkus v jakékoliv metodě ověřit, že opravdu provádíš ajaxový požadavek: v kódu třeba takto \Tracy\Debugger::fireLog($this->isAjax());. Také prozkoumej co ti server vrací, ideálně ve Firebugu, nebo nečem takovém, zda ti vrací skutečně XHR a zda-li je to JSON a obsahuje klíč snippets.

Editoval cendak (25. 4. 2016 10:21)

vlkodlak
Člen | 175
+
0
-

@CZechBoY > Na stránce jsou dvě časové razítka (v komponentě a v presentru) a očekával bych že bude se měnit jen jedno (to které vložené do komponenty a to které je v HomepagePresenter-u zůstane neměnné. Mění se obě ať použijí jakékoliv refrešování a neumím pochopit proč?

@cendak > diky zkusim dam vědět

Editoval vlkodlak (25. 4. 2016 11:13)

vlkodlak
Člen | 175
+
0
-

@cendak > tak, dle konzole to probíhá :( mohl bych Ti poslat složku APP k nahlédnutí např. přes úschovnu? … koukám na to tak dlouho, že již dělám hlouposti

cendak
Člen | 21
+
0
-

vlkodlak napsal(a):

@cendak > tak, dle konzole to probíhá :( mohl bych Ti poslat složku APP k nahlédnutí např. přes úschovnu? … koukám na to tak dlouho, že již dělám hlouposti

jo klidně

vlkodlak
Člen | 175
+
0
-

cendak napsal(a):

vlkodlak napsal(a):

@cendak > tak, dle konzole to probíhá :( mohl bych Ti poslat složku APP k nahlédnutí např. přes úschovnu? … koukám na to tak dlouho, že již dělám hlouposti

jo klidně

v přiloženém příkladu mám dvě časová razítka v komponentě a v hlavní šabloně a čekal bych že překresleni bude se dit na úrovní komponenty, ale překresli se cela web stránka a nevidím proč :( … děkují za ochotu

www.uschovna.cz/…68NLKYY4-LNJ

CZechBoY
Člen | 3608
+
+1
-

Chybí ti

$.nette.init();
GEpic
Člen | 566
+
0
-

Jen tip:

# toto:
<?php echo time();?>

# se dá zapsat v Latte také takto:
{time()}

Jinak je rozdíl v tom, jestli se ti stránka „překreslí“ nebo „redirectne“ (když píšeš, že se překreslí celá). Tracy ti vypíše, pokud se jedná o AJAXový požadavek, nebo ne. Poznáš to tak, že místo nápisu TRACY, bude napsáno AJAX.

Editoval GEpic (25. 4. 2016 21:26)

CZechBoY
Člen | 3608
+
0
-

@GEpic to bude asi nějaká extension… mně to žádný AJAX místo TRACY nepíše

GEpic
Člen | 566
+
+1
-

CZechBoY napsal(a):

@GEpic to bude asi nějaká extension… mně to žádný AJAX místo TRACY nepíše

Přišel jsem na to zrovna včera, když jsem tvořil čistou instalaci (klasicky composer require nette\nette), nic víc, žádná extension.

Samozřejmě poslední dev verzi, nevím, jestli je to ve stable.

EDIT:
Viz. obrázek

Editoval GEpic (25. 4. 2016 21:38)

vlkodlak
Člen | 175
+
0
-

@CZechBoY a @cendak: oběma Vám děkují za tipy, na konec to začalo fungovat dle očekávání :) a byla to kombinace „všeho“ + „zmatek“ při nahrávání jquery :)

vlkodlak
Člen | 175
+
0
-

@GEpic: díky za tip

cendak
Člen | 21
+
+1
-

Jak jsme viděl ten kód shrnul by to takto:

  1. Neprovadí se ajaxový ti požadavek na odkazu s class? Opravdu připojuješ nette.ajax.js a provádíš jeho inicializaci $.nette.init();?
  2. Provádí se ti ajaxový požadavek, ale v JSON odpovědi není klíč snippet? A opravdu máš snippet správně v latte {snippet mujSnippet}...{/snippet} a opravdu provádíš jeho invalidaci v příslušném presenteru či komponentě $this->redrawControl('mujSnippet')?
  3. Zkusil jsi v componentě či presenteru ověřit, že jsi ve správně podmínce if ($this->presenter->isAjax()) { \Tracy\Debugger::fireLog("ajax mode"); }}
vlkodlak
Člen | 175
+
0
-

@cendak Ano, bod č. 1 je hlavní příčina + gramatické nesrovnalosti. Děkují