šablona – vypis článků

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

Potřeboval bych udělat šablonu na výpis články, ale asi to zkouším blbě.
v šablonách bych chtěl využívat foreach, ale myslím, že s ní to nepůjde.
Prostě klasika:

<div class="post">
<h2><a href="{$clanek[url]}">{$clanek[name]}</a></h2>
<p>{$clanek[popis]}</p>
</div>

Tedy 3 a více proměnných. Bez frameworku jsem to dělal se šablonama (ale vlastníma) a vypadalo to asi takle:

<?php
//zkraceno
$tpl = '<h2><a href="$url">$clanek</a></h2>
<p>$popis</p>'; //kratka sablona
$clanky_list = ''; //zatim nula clanku

while ($a = myslq_fetch_assoc($sql)) { //sql dotaz vypis clanku
	$clanek = repl($co_array, $cim_array, $tpl); // co_array je '$url', '$clanek' atd. // nahrazuji se v sablone
	$clanky_list .= $clanek; // pripoji se k seznamu clanku

}

//pouzival jsem vlastni sablony takze pokracuji
$template ->replace('clanky_list', $clanky_list);
?>

Jak se toto nejlépe řeší pomocí nette šablon?

Ondřej Mirtes
Člen | 1536
+
0
-

Řešení alá MVP (Nette):

Model:

/app/models/ArticleModel.php

(Doporučuji nastudovat článek MVC paradox, DibiDataSource je hodně praktická věc. Pro jednoduchost ho ale v tomto příkladu nepoužiji.)

class ArticleModel extends BaseModel {

    public function getArticles() {
        //případně dibi::fetchAll, pokud nemáš $db property v BaseModelu
        return $this->db->fetchAll('SELECT url, name, popis FROM [clanky] ORDER BY time DESC');
    }

}

Presenter:

/app/presenters/DefaultPresenter.php

class DefaultPresenter extends BasePresenter {

    public function renderDefault() {
        $model = new ArticleModel;
        $this->template->articles = $model->getArticles();
    }

}

Šablona:

/app/templates/Default.default.phtml

Využívá makro {link} pro tvorbu dotazů pomocí Nette.

{foreach $articles as $article}
<div class="post">
    <h2><a href="{link Default:article $article->url}">{$article->name}</a></h2>
    {!$article->popis |texy} {* vyžaduje použití Texy a registraci 'texy' helperu, doporučeno :)) *}
</div>
{/foreach}

Doporučuji k nastudování seriál o Nette na Zdrojáku, je to dobré čtení :)

Editoval LastHunter (27. 10. 2009 17:52)

MzK
Člen | 127
+
0
-

Díky za nakopnutí správným směrem..
Ale to MVC mi prostě nějak nesedí. Vystačím si, když oddělím HTML a PHP.
Objektově programuji (cache, template, mysql…) ale ty pohledy nechápu ani po přečtení zdrojáku či po webexpové přednášce Davida.

Asi v tom hledám něco co tam není nebo nenacházím něco co tam je :)

Takže, jak uvedený problém vyřeším, když budu používat jenom šablony .?
Bez pohledů.. Chci se nejprve naučit šablony a pak přidat třeba něco dalšího (MVC pohledy).

Honza Marek
Člen | 1664
+
0
-

zacatecnik: Webexpová přednáška znalost MVC už řek bych vyžadovala. Kdybych znal dobrý zdroj, tak odkážu. Články na zdrojáku jsou poměrně dobré, ale stručností a přehledností neoplývají.

LastHunter: https://forum.dibiphp.com/…urce-a-mysql

Ondřej Mirtes
Člen | 1536
+
0
-

Jak použít čistě šablony máš v tom linku, jak jsi odkázal. Použiješ tam něco jako:

$template->articles = nejakaFunkceCoMiVratiClanky();

Pokud ti ale mohu poradit, prostuduj si dokumentaci (a seriál na Zdrojáku) a využij „celé Nette“, tzn. Application, Presenter, Route apod., zkrátka MVP. A s tím i dibi (nebo nějaký jiný databázový layer), protože volání mysql_* funkcí z PHP skutečně není správná cesta.

Přinese ti to jen samé výhody, framework za tebe řeší spoustu věcí a ty se můžeš soustředit jen na samotnou logiku aplikace (výběr dat z DB, co se kde má zobrazit a jak to má fungovat). O bezpečnost a volání toho, co je potřeba, se ti postará Nette.

Honza M.: O tom problému vím, ale skutečně mě nevzrušuje :)

Editoval LastHunter (27. 10. 2009 19:02)

MzK
Člen | 127
+
0
-

No já jsem si představoval něco takového:
V šabloně bude označen blok kódu, který se bude opakovat (x krát)

{foreach $articles as $article}
<div class="post">
<h2><a href="{$clanek[url]}">{$clanek[name]}</a></h2>
<p>{$clanek[popis]}</p>
</div>
{/foreach}

A v PHP by bylo

<?php
while ($a = myslq_fetch_assoc($sql)) {
//kolikrat probehne cyklus while
//prave tolikrat se usek mezi foreach pouzije nebo tak neco..

	$template->clanek[name] = $a['name'];
	$template->clanek[url] = $a['url'];
}
?>

kazdopadne dik za rychle reakce a material ke studovani..

stpnkcrk
Generous Backer | 189
+
0
-

LastHunter: K problému s DibiDataSource a MySQL – na jednom sdíleném hostingu jsem to používal a asi po týdnu mi hoster napsal, že jim nadměrně vytěžuju SQL servery, tak abych s tím něco udělal… :)

Jod
Člen | 701
+
0
-

A prečo nepoužívate dibi fluent :) , to že si nedrží dáta sa dá lahko vyriešiť

David Grudl
Nette Core | 8148
+
0
-

zacatecnik napsal(a):

Díky za nakopnutí správným směrem..
Ale to MVC mi prostě nějak nesedí. Vystačím si, když oddělím HTML a PHP.

Klidně si spoj model a presenter, jak jej ukazoval LastHunter, do jednoho, tj. použe odděl šablonu od PHP. Ničemu to nevadí. Plné MVC můžeš začít používat, až sám objevíš jeho výhody.