znovupoužitelnost funkcí, jak správně programovat?
- MzK
- Člen | 127
Nechci dibi::dataSource() a MVC paradox, podle mne to zbytečně zatěžuje DB → přenáší se celá tabulka, přestože chci jen některé řádky, možná se ale pletu.
šablona
– chci vypsat poslední články, náhodné
články, poslední komentáře a tagy ke stránce
<?php
<h3>Náhodné články</h3>
<ul>
{foreach $presenter->getRandArticles() as $article}
<li><a href="{plink default:article, $article->url}">{$article->name}</a></li>
{/foreach}
</ul>
<h3>Poslední články</h3>
<ul>
{foreach $presenter->getLastArticles() as $article}
<li><a href="{plink default:article, $article->url}">{$article->name}</a></li>
{/foreach}
</ul>
<h3>Tagy ke stránce</h3>
{foreach $presenter->getRandTags() as $tag}
<span style="font-size:<?php echo rand(6,19);?>px">{$tag->tag}</span>
{/foreach}
<h3>Poslední komentáře</h3>
atd..
?>
Presenter
vypadá takto
<?php
public function getRandTags() {
$model = new TagsModel();
return $this->template->tags = $model->getRandTags();
}
public function getRandArticles() {
$model = new ArticlesModel();
return $this->template->randArticles = $model->getRandArticles();
}
public function getLastArticles() {
$model = new ArticlesModel();
return $this->template->lastArticles = $model->getLastArticles();
}
//atd
?>
No a modely
?
<?php
public function getLastArticles() {
/* posleni clanky, to samé pro náhodné články i pro tagy a komentáře a já nevím co ještě
*/
return dibi::fetchAll('SELECT url,name FROM `blog` WHERE `public` = 1 ORDER BY id DESC LIMIT 10');
}
?>
Přijde mi blbé, dělat pro každý SQL dotaz novou metodu v presenteru i modelu., Jak se taková věc řeší v praxi? Nebo to jinak nejde? Děkuji za nakopnutí správným směrem, s nette a MVC začínám.
- romansklenar
- Člen | 655
Podívej se na DibiFluent, je to SQL builder tzn něco jiného než DibiDataSource, na tento případ je to ideální.
- Honza Kuchař
- Člen | 1662
podle mne to zbytečně zatěžuje DB → přenáší se celá tabulka
To není pravda. MySQL sice má problém se složenými dotazy, ale o tom více zde. Rozhodně tak jako tak, se celý obsah netahá. Dalo by se použít i DibiFluent.
To co tu píšeš, je opravdu u jednoduchých app zbytečné. (potom
někteří slučují model + presenter
) Počítá se s tím, že
budeš mít obecnější model (který může být svým rozsahem
obrovský) a presenter ti z něj vytáhne konkrétní informace (už
jen to co tě opravdu zajímá) a ty poté předá šabloně (vykreslí
to uživateli hezky barevně). (alespoň tak jsem to
pochopil já)
Editoval honzakuchar (18. 11. 2009 22:43)
- iguana007
- Člen | 970
Možná to je od věci, ale zajímalo by mne proč nemůže být jen jedna funkce v modelu v podobě:
public function getArticles($limit, $random=false) {
if ($random) {
return dibi::fetchAll('SELECT url,name FROM `blog` WHERE `public` = 1 ORDER BY RAND() LIMIT '. $limit);
} else {
return dibi::fetchAll('SELECT url,name FROM `blog` WHERE `public` = 1 ORDER BY id DESC LIMIT '. $limit);
}
}
Díky předem za vysvětlení.
igi
- Ondřej Mirtes
- Člen | 1536
iguana007 napsal(a):
Možná to je od věci, ale zajímalo by mne proč nemůže být jen jedna funkce v modelu v podobě…
Může, můžeš si to udělat jak chceš, ale tento způsob není příliš univerzální, ani příliš OOP. Prostě DibiDataSource (případně DibiFluent, které moc rád nemám, hlavně kvůli tomu, že bych nevěděl u spousty věcí, jak je zapsat) je way :)
- Honza Kuchař
- Člen | 1662
Prostě DibiDataSource případně DibiFluent je way :)
Souhlas, ale podle mě je to teda cesta. :)