ako nastavit html id atribut pre widget?
- Matúš Matula
- Člen | 257
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
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
:-) 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
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
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
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
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.