problem se snippety – návrh

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

Zdravím, měl bych dotaz, jestli je nějak možné mít ve stránce víc stejně pojmenovaných snippetů? Respektive rovnou udám příklad, aby bylo jasné o co jde..Představte si facebook, kde jsou jednotlivé statusy a pokud dám like, tak se vykoná nějaký požadavek a já potřebuji updatovat data kolik je likes a kdo likoval atd..Nechci ale invalidovat celý výpis příspěvků..Jak se tohlo v nette řeší? Mít unikátní snippet pro každý příspěvek je asi blbost, ne?Jako že bych jeho jméno generoval dynamicky..Bez nette bych to asi celý řešil v javascriptu, kde mám pěkně informaci z čeho a kde jsem na co kliknul a můžu měnit DOM, ale když je v nette tenhle systém snippetů, tak mě napadlo, že by to mělo jít uděla nějak jinak.

Tak napůl s tím souvisí třeba možnost přidávat příspěvek aniž bych musel invalidovat celej jejich výpis..Aby se prostě přidanej příspěvek objevil a jinak se nic neměnilo. Zase bych to dělal přes úpravu DOM v javascriptu, ale nedá se to v Nette udělat nějak snadněji?

Díky moc..

JakubJarabica
Gold Partner | 184
+
0
-

Najlogickejšie riešenie sú dynamické snippety. Mať názov snippetu napr. status-{status_id} a ked sa bude davat like, tak vieš v handle* invalidovať snippet s konkrétnym názvom. To isté s formulármi – ak máš okrem like-ovania aj komentovanie, tiež je fajn spraviť dynamický formulár(prípadne mať formulár len jeden a modifikáciou DOM ho zobrazovať pod statusom, pod ktorým treba a automaticky plniť nejaké hidden pole status_id príslušným ID, nech vieš, ku ktorému statusu sa odoslaný formulár bude vzťahovať).

simekadam
Člen | 36
+
0
-

No zkousel jsem to tam nejak narvat, ale vypisuje mi to chybu, „block name must be an alphanumeric string“..Vypada to, ze si to nejak nechce nechat cpat tu promenou do definice snippetu..

Tak to vypada, ze to asi nejde..Minimalne prozatim ne:) https://forum.nette.org/…cke-snippety

Editoval simekadam (27. 12. 2010 21:02)

bojovyletoun
Člen | 667
+
0
-

nyní dynamické snippety nefunjují, možná se to ale bude přidávat.
Co je ale možné, vytvořit si místo 20 snipettů 20 komponent.
V komponentě bude snippet. Na začátku ve startup si buď hromadně vytvoříš komponenty přes for(eaCH).

(for 1 až 5){$c=this['comp'.$i]= new Compo;$c->param=$i}

nebo přtížit createcomponent($name) v presenteru © pekelnik

public function createComponent($name)
	{
		if (preg_match("/^comp/", $name)) {
			$control = new compo($this, $name);
			$control->param =$name bez comp...
		} else {
			return parent::createComponent($name);
		}
	}

a v šabloně

{for $i=1;$i<=5;$i++}
{control "compo".$i}
{/for}

Příklad a inspirace je zde: zde

PS:

  • mám komponentu bez snipettů. Dá se nějak docílit, aby se komponenta překreslila celá například o kliknutí na signál v presenteru, který zavolá this[‚kom‘]->invalidatecontrol()?
  • má nějaký smysl (praktické využití) volat v šabloně komponentu vícekrát {control w}{control w} nebo je to holý nesmysl?
  • když v presenter anotuji @persistent(PersCompo), tak se při prochání stránkou pamatovat stav komponenty PersCompo (a anotace parametrů a komponent na @ persistent zbytečná?). Je toto tvrzení pravdiv?
Filip Procházka
Moderator | 4668
+
0
-

ale fuj fuj…

Víte že snippety se nyní překládají na bloky s podtržítkem?

{snippet muj}{$promenna}{/snippet}

se chová jako

{block _muj}{$promenna}{/block}

a co z toho vyplývá? můžeme hackovat :) samozřejmě není úplně jisté jak dlouho tento způsob bude fungovat, ale na aktuální verzi by fungovat měl (opakuji, že by měl fungovat, nechce se mi to zkoušet) :)

{snippet nejakySnippet}<div class="neco">{$promenna}</div>{/snippet} <!-- tohle bude trošku hack -->

{block #content}
	{foreach $promenne as $promenna}
		{include #_nejakySnippet, 'promenna' => $promenna}
	{/foreach}
{/block}

a před invalidací nezapomenou dosadit svoji hodnotu

$this->template->promenna = $promenne[$ta_kterou_chceme_invalidovat];

Hle! dynamické snippety, bez dynamických snippetů :)

Jenom je potřeba trochu domyslet invalidaci, nejspíš nebude možné invalidovat více snippetů se stejným jménem, ale jako základ by to mohlo stačit.

Samozřejmě by bylo lepší udělat si na to obalovací komponentu, která se o to postará, se vším všudy (nějaká chytřejší, než ta od bojovyletoun)

Tharos
Člen | 1030
+
0
-

HosipLan: Docela hezký hack, ale teď tak nějak nevím, jestli se to „fuj fuj“ vztahuje k předchozímu příspěvku nebo k tomu Tvému :D. Řešení od Pekelnika/bojoveholetouna mi připadá koncepčně rozhodně čistší.

V každém případě díky za tip!

Filip Procházka
Moderator | 4668
+
0
-

Řešení, které připomněl bojovyletoun je taky takový hack, není to o moc čistší…

… Teď jsem se nad tím zamyslel pořádně a došlo mi, že ono to při příjmu signálu ty komponenty taky vytváří až na základě požadavku, každopádně by to chtělo nějakou trošku míň „hranatou“ továrničku.

Na závěr připomenu svoje vykreslení více stejných formulářů a příjem signálu: https://forum.nette.org/…aci-parametr?… taky to není ideální, ale už to není tak „hranaté“

Editoval HosipLan (28. 12. 2010 19:39)