AJAX (snippet) v komponente
- lvq
- Člen | 47
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
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
@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
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().