Latte – jak zavolat sablonu s parametrem v cyklu?

MrAndy
Člen | 10
+
0
-

Ahoj,
mel bych zacatecnicky dotaz ale z manualu jsem to nepochopil.
mam sablonu

{foreach $terms as $term}
    <div class="card mb-1">
        <div class="card-header d-flex justify-content-between">
            <span>
                <strong>{$term['cs_term']}</strong>
            </span>
        </div>
        /* zde bych chtel provest dalsi cyklus s vyberem z db, neco jako */
        $termData = $database->fetchAll() // where id = $term->id
        {foreach $termData as $termValue}
            HTML
        {/foreach}
    </div>
{/foreach}

vim ze muzu do term nahrat ty data jeste v Presenteru a pak jiz jen prochazet ale rad bych aktualne spise jine reseni, aby se to dalo rozbit na mensi sablonove bloky.
Predpokladam ze by to melo jit nejakym zpusobem zavolat neco jako kdyz se vytvari link
{link MyTerms:showTerm $term->id}
tak stejne zavolat sablonu?

Pripadne jak se to bezne resi?
Diky za kazdou dobrou radu

m.brecher
Generous Backer | 758
+
0
-

@MrAndy

$termData = $database->fetchAll() // where id = $term->id

Z tohoto kódu není úplně jasné jaká data potřebuješ, protože $database->fetchAll() nedává smysl, kdyby Jsi alespoň jasně napsal jaké tabulky a vazby tam máš – z toho se to všechno odvíjí.

Máš Selection z tabulky term v $terms a potřebuješ v cyklu v šabloně dotáhnout sql dotazem nějaká další data z jednotlivých položek $term – není jasné zda z nadřazené, nebo podřízené tabulky, obojí jde v Nette Database Explorer snadno. + všechno to nějak rozdělit do více šablon.

Dotáhnutí dat z nadřazené tabulky:

{foreach $terms as $term}
    ..... html ...

         $term->ref('reftable')->column  // sloupec z tabulky reftable, sql dotaz vygeneruje Nette automaticky ;)
        ................
         $term->column,  // sloupec z tabulky term
          ... html ...

     ... html ....
{/foreach}

Pokud potřebuješ dotáhnout data z podřízené tabulky relatedtable (odkazuje cizím klíčem do tabulky term) tak použiješ metodu related() která se volá na ActiveRow objektu, který je v proměnné $term – dodá ho tam {foreach}:

{foreach $terms as $term}
    ..... html ...


		$termData = $term->related('relatedtable')->where(...)->order(....)

		{foreach $termData as $data}
			... $data->column....
		{/foreach}

     ... html ....
{/foreach}

Vnitřní foreach není problém přemístit do samostatné šablony a vložit do hlavní šablony pomocí {include ‚sub-file.latte‘}

Je to dost jednoduché díky skvěle vymyšlené Natte Database Explorer knihovně. Knihovna nebude dělat desítky opakujících se sql dotazů tak jak probíhá vnější cyklus přes $terms, ale zoptimalizuje to do jednoho JOIN SELECT, takže je to rychlé.

Tak doufám, že jsem pochopil správně, co potřebuješ udělat.

Editoval m.brecher (22. 3. 2023 5:34)

MajklNajt
Člen | 471
+
0
-

Keď chceš rozbiť šablónu do menších a znovupoužiteľných častí, prečítaj si o komponentách https://doc.nette.org/…n/components

MrAndy
Člen | 10
+
0
-

Zdravim,
dekuji za odpovedi,
to: @mbrecher ano, pochopil jste to spravne,
$terms je je vysledek z sql typu SELECT * FROM tersm WHERE 1
a pod $termData = $database->fetchAll() mam na mysli dotaz typu SELECT * FROM tersm_definitions WHERE parent = $term->id
takze spravne chapu ze dulezite je mit spravne udelanou databazi a nastavene vazby X:Y a kod by vypadal nejak takto?

{foreach $terms as $term}
    <div class="card mb-1">
        <div class="card-header d-flex justify-content-between">
            <span>
                <strong>{$term['cs_term']}</strong>
            </span>
        </div>
        {var $termData = $term->related('tersm_definitions')->order('datum DESC')->limit(5)}
        {include ‚termDefinitions.latte‘}
    </div>
{/foreach}

A jeste, jde to nejak takhe udelat pokud nemam vazby?

Dekuji

Edit: pro upreneni meho dotazu:
rad bych data dostal pomoci funkce do ktere bych predal vice parametru abch mohl vysledek jeste prepracovat pomoci PHP

Editoval MrAndy (22. 3. 2023 11:35)

David Grudl
Nette Core | 8133
+
+2
-

Není nejjednodušší si tu funkci napsat v presenteru a v šabloně jen zavolat? {var $termData = $presenter->mojeFunkce(...parametry...)}

m.brecher
Generous Backer | 758
+
+1
-

@MrAndy

takze spravne chapu ze dulezite je mit spravne udelanou databazi a nastavene vazby X:Y a kod by vypadal nejak takto?

Webové aplikace dnes standardně mají data v databázi, např. MySQL která má tabulky typu InnoDB, které podporují cizí klíče. Můžeš si samozřejmě zkoušet v Nette něco napsat i bez znalosti jak navrhnout správně databázi, ale jenom na úvodní vyzkoušení. Po úvodním vyzkoušení doporučuji navrhovat databázové tabulky s vazbami pomocí cizích klíčů a pro sql dorazy do databáze používat Nette Database Explorer.

Já používám pro tvorbu databáze Adminer Jakuba Vrány, kde se cizí klíče nastavují snadno – buďto automaticky, nebo ručně. Jednoduchý šikovný nástroj pro začátečníka.

Myslím, že v Nette Database Explorer je možné nahradit cizí klíče konvencí názvosloví sloupců, ale já to nepoužívám, cizí klíče jsou preciznější.

Nette je určeno pro tvorbu webových aplikací a ty předpokládají uložení všech dat do databáze. Takže začít s Nette předpokládá nějaké minimální znalosti jak navrhnout strukturu databáze – indexy, unikátní indexy, cizí klíče jsou základ.

MrAndy
Člen | 10
+
0
-

@mbrecher Dekuji, SQL samozrejme znam, spise mne jako zacatecnika v Nette zajima jake ma moznosti to ma a co vse si muzu dovolit

@DavidGrudl Dekuji, tohle je to co jsem potreboval