znovupoužitelnost funkcí, jak správně programovat?

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

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

Prostě DibiDataSource případně DibiFluent je way :)

Souhlas, ale podle mě je to teda cesta. :)