ako nastavit html id atribut pre widget?

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

Zdravim,

vytvoril som si komponentu na hlasovanie prispevkov, a teda sa na stranke zobrazuje x-krat. Generuje sa vsak vzdy rovnake id pre <div> obalujuci danu komponentu, cim sa kod stava nevalidnym. Da sa toto id nejako nastavit alebo to bola blbost spravit si na toto komponentu? :)

Panda
Člen | 569
+
0
-

Nenapsal jsi, jak konkrétně je komponenta řešená, takže budu předpokládat, že jde o div zapsaný v šabloně komponenty. V takovém případě stačí ID v šabloně složit z jedinečného názvu komponenty v hierarchii komponent a vlastního identifikátoru:

<div id="{$control->getUniqueId()}__myId">
{* ... *}
</div>

Jinak pokud ID vyloženě nepotřebuješ, tak bych zauvažoval nad použitím class místo ID.

Matúš Matula
Člen | 257
+
0
-

:-) problem bol v tom, ze mam 2 sablony pre komponentu a obsah kazdej bol obaleny v znackach

{snippet} obsah {/snippet}

a tam sa generoval id ako „nazovKomponenty__nazovSablony“. Vdaka za nakopnutie.

S Nette len zacinam a chcel som si ‚zajaxit‘ komponentu, preto som to obalil ako snippet, nacital som potrebne .js subory a v sablone layoutu som volal @{control nazovKomponenty} . Kod v sablone vyzera nasledovne:

{block #content}
<div class="articles">
{foreach $articles as $article}
	<div>
		<div class="heading"><a href="{link Articles:show $article->id_article}">{$article->heading}</a></div>
		<div class="date">{$article->created|date:'j.n.Y'}</div>
		<div class="author">{$article->autor}</div>
		<div class="data"><a href="{link Articles:show $article->id_article}">{$article->data|html|truncate:300}</a></div>
		<div class="rating">Hodnotenie: @{control rating, $article->rating,$article->id_article, $article->user_rated}</div>
	</div>
{/foreach}
</div>

vyhodi sa chyba „syntax error, unexpected ‚}‘“, t.z. ze komponentu nemozem vykreslovat ako ajaxovu v ramci nejakej podmienky alebo bloku? bez zavinaca to ide.

Dik za kazdu radu

Panda
Člen | 569
+
0
-

Viz Zavináčová magie v praxi – zavináč musí být před každou řídící strukturou, ve které se snippet (resp. komponenta se snippetem) nachází:

@{block #content}
<div class="articles">
@{foreach $articles as $article}
        <div>
                <div class="heading"><a href="{link Articles:show $article->id_article}">{$article->heading}</a></div>
                <div class="date">{$article->created|date:'j.n.Y'}</div>
                <div class="author">{$article->autor}</div>
                <div class="data"><a href="{link Articles:show $article->id_article}">{$article->data|html|truncate:300}</a></div>
                <div class="rating">Hodnotenie: @{control rating, $article->rating,$article->id_article, $article->user_rated}</div>
        </div>
@{/foreach}
</div>
Matúš Matula
Člen | 257
+
0
-

Diky moc!

Teraz mam vsak dalsi problem. Kedze mam tych komponent na stranke viac a zahlasujem napr. na 4. vykreslenej v HTML v poradi, pricom mam v kode

<?php
$this->invalidateControl();
?>

tak mi invaliduje a prekresli prave tu 1. vykreslenu… [lebo ma ta komponenta stale rovnake meno?]
skusal som strielat naslepo v tovarnicke na danu komponentu, ale bez uspechu.
Da sa to nejako vyriesit?

Panda
Člen | 569
+
0
-

Problém je v tom, že v kódu těch komponent nemáš víc, ale jen jednu, která je několikrát vykreslovaná. Pokud zavoláš v komponentě $this->invalidateControl(), invaliduješ tím celou komponentu včetně všech snippetů, takže se překreslí všechny. Pokud ale v šabloně komponenty máš jeden název snippetu bez ohledu na parametry renderování (tzn. začínáš např. {snippet}, {snippet main}…), tak se pořád jedná v podstatě o jeden snippet a tak se to i projeví ve stránce.

Řešením by mohlo být si název snippetu sestavit podle parametrů, např.

{snippet main_$id}
{* ... *}
{/snippet}

a pak v komponentě invalidovat jen ten jeden konkrétní snippet:

$this->invalidateControl('main_' . $id);

Dalším řešením by mohlo být si vytvořit v metodě action<action>() několik instancí komponenty pod názvy rating_$id a pak je vykreslovat k příslušným článkům. To může mít negativa (například vytvoření jedné instance je šetrnější než vytvoření několika), ale i pozitiva (například parametry se předají už při vytváření komponenty a jsou pak dostupné, takže není potřeba v signálu už zvlášť kontrolovat, zda už uživatel hlasoval nebo ne).

Matúš Matula
Člen | 257
+
0
-

Ach, ja som taky blbec :-)

Snippety som mal pomenovane jedinecne, aj som ich invalidoval jednotlivo, akurat som zabudol v 1 sablone na zavinac :-)

Sry a este raz dakujem za tvoj cas.