AJAX (snippet) v komponente

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

Zdravim,
priblizeni me situace:
mam aplikaci na prohlizeni fotek, chtel bych, aby kazdy uzivatel mohl fotku ohodnotit (klasicke hvezdicky asi). Pro hodnoceni jsem se rozhodl pouzit komponentu. A chtel bych aby se ohodnoceni provadelo AJAXove (bez znovunacteni cele stranky).
Zacal jsem klasicky do samblony jsem zadal:

{control hodnoceni $fotka['id_fotky']}

a v sablone komponenty mam:

{snippet hlasovani}
.....
{/snippet}

Po kliknuti na hvezdu se zavola fce handleHlas, kde se zjisti, jestli uzivatel hlasuje porve nebo jiz ponekolikate a provede se zmena v databazi.
A tady nastava problem. Zmena v databazi se sice provede, ale uz se neprekresli komponenta. Snazil jsem se prijit na to proc a zjistil jsem, ze se me nejspis tyka chyba popsana zde: https://forum.nette.org/…vana-sablona a zde: https://forum.nette.org/…te-v-include
Zkousel jsem tedy problem resit dedenim sablon a tady bych prave potreboval poradit.
Napsal jsem si tedy mezisablonu (Jednafotka2), do ktere jsem vlozil kod komponenty:

{extends '../@layout.phtml'}
{block hodnoceni}
{snippet hlasovani}
...
{/snippet}
{/block}

A v puvodni sablone (Jednafotka) jsem nad block content pridal nasledujici:

{extends './Jednafotka2.phtml'}
{block content}

a na misto vlozeni komponennty jsem vlozil:

{block #hodnoceni}{include #parent}{/block}

Jenze na kod v mezisablone neni propojen s komponentou, tak jsem v komponente v metode render zmenil cestu k sablone komponenty na mezisablonu:

$this->template->setFile(dirname(__FILE__)."/../templates/Vnitrni/Jednafotka2.phtml");

Jenze ted si pripadam jako chycenej ve smycce, pze se nacte hlavni sablona (@layout.phtml) a ladenka pise: Cannot include undefined block ‚content‘.
Asi jsem zvolil spatnej postup, prosim tedy o radu jak mam zprovoznit snippet v komponente.
Predem diky za rady.
Pouzivam PHP 5.2 a aktualni nette 2 dev

Editoval lvq (5. 3. 2011 18:56)

bojovyletoun
Člen | 667
+
0
-

Já popíšu výchozí situaci V Presenteru nic neměním- request je Bla:default: – –řešení– (workaround) je používat snippety jen v content šabloně- tedy v tomto případě bla.defaul.latte. Ale defakto se tím prohodí obsah souborů, takže spíš demonstruji jen, že to taky nějak jde.

Toto nefunguje. snippet je v includované šabloně

{*Bla.default.phtml*}
{extends none}
<!DOCTYPE html>
<html>
    <head>
	<script type="text/javascript" src="{$baseUri}/js/jquery.js"></script>
	<script type="text/javascript" src="{$basePath}/js/jquery.nette.js"></script>
    </head>
    <body>

{include 'x.phtml'},<a href="{link akce!}" class="ajax">zkus</a>
{*x.phtml*}
***{snippet test}{$testov}{/snippet}***

Toto jde: De facto jen prošlo k prohození obsahu souborů. Ale radši tohle nepoužívej, mě se to vůbec nelíbí. Ještě něco k přečtení je zde!

{*bla.default.phtml*}
{extends "x.phtml"}
{block #x}
***{snippet test}{$testov}{/snippet}***
{*x.phtml*}
<!DOCTYPE html>
<html>
    <head>
	<script type="text/javascript" src="{$baseUri}/js/jquery.js"></script>
	<script type="text/javascript" src="{$basePath}/js/jquery.nette.js"></script>
    </head>
    <body>
snipet: {include #x},<a href="{link akce!}" class="ajax">zkus</a>
lvq
Člen | 47
+
0
-

@bojovyletoun: diky za odpoved, precetl jsem si vlakno, ktere jsi mi poslal a asi 3 dalsi, ktere z neho vedly, ale porad mi to neni jasne. Pises: řešení je používat snippety jen v content šabloně, tady jaksi nerozumim, co je to content sablona. Z prikladu (dolni) me neni jasne, jestli, ktera sablona je ktera, predpokladam, ze bla.default.phtml je sablona presenteru a x.phtml je hlavni sablona @layout.phtml nebo spise nejaka kopie.
Ale jaksi to neresi to, ze ja potrebuju promennou $testov nejak naplnit a kdyz v komponente napisu neco jako:

$this->template->setFile(dirname(__FILE__)."/../templates/Vnitrni/bla.default.phtml");

, tak to nejspise zase nepojede (nezkousel jsem).
Jeste me zarazilo, ze zde: https://forum.nette.org/…nippets-test na prikladu se zda, ze vse funguje a nikomu jinymu to nejede, jak je to mozny?
Omlouvam se, pokud se ptam na triviality, jsem v nette zacatecnik.

bojovyletoun
Člen | 667
+
0
-

Content šablona je ta, kterou určíš v $template->setfile() (v prezenteru je výchozí tedy templates/Presenter/view.latte (a další varianty „viz zdroják“,návod). Vlastně můžeš použít dva směry: buď si určíš content šablonu tu nejvyšší a ta bude obsahovat definice bloků a bude extendovat nižší šablony, které budou extendovat ještě nižší šablony atd.. Nebo půjdeš odspoda, určíš jednu šablonu, do ní dáš include, includnuté šablony budou mít další include atd.

Ověřil jsem si, že snippety se rozeznají v content šabloně, i v extendující šabloně, ale nikoliv v includnuté šabloně.

Ohledně snippetů: snippety jsou docela obsáhlé téma a je spojené s určitou magií(platnost proměnných, šablony, invalidace,…) Sice zavináčová magie už ve verzi v vymizela (zjednodušeně tyhle problémy nebyly, sice člověk musel umět psát zavináče na správná místa, a prý to spousta lidí neumělo)

K řešení: stáhni si ten zdroják spousta věcí jde na tom naučit. Fígl je v tom, že je na stránce N komponent, kde každá má v sobě snippet. A ty vezmeš konretní komponentu a dáš invalidatecontrol().