výpis novinek pomocí služby zaregistrované v config.neon

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

Ahoj,
vytvořil jsem si v configu služby:

services:
	database: @Nette\Database\Connection
	texy: Texy
	news:
		factory: WHZ\ServiceFactory::createNews(@database::table(news), @texy)
	countNews:
		factory: WHZ\ServiceFactory::createCountNews(@database::table(news))
	articles:
		factory: WHZ\ServiceFactory::createArticles(@database::table(articles), @texy)

s fungováním jsem však narazil na 2 problémy, se kterými bych potřeboval poradit:
Ne stránce mám sekci, ve které vypisuji z databáze všechny články. Tyto články mi dodává služba articles. To funguje, avšak problém nastává se zbylými dvěmi službami.
U novinek potřebuji udělat v zásadě totéž, ale zde používám paginátor a při výběru z databáze potřebuji předat proměnné $limit a $offset, aby mi služba news vrátila správnou „výseč“ novinek. V kódu však službám parametry předávat nemohu.
Poslední zbývající služba, countNews, by měla vrátit počet všech novinek, ale laděnka mi oznámí, že služba může být pouze objekt.
Došlo mi tedy, že na to jdu asi špatně, jen něvím, kudy to vzít správně.
budu vděčný za rady,
děkuji

ViPEr*CZ*
Člen | 813
+
0
-

Zaregistroval bych si model News jako službu a ten model pak bude mít metodu na vrácení požadované výseče novinek v podobě Nette\Database\Selection a metoda se například bude jmenovat getNews($page). Pomocí foreach se pak prolezou jednotlivý řádky a metodou count() se zjistí počet položek ;-)

foreach (…getNews($page) as $value) a …getNews($page)->count();

Editoval ViPEr*CZ* (6. 6. 2012 15:34)

Neas
Člen | 43
+
0
-

to jsem měl původně, jen se mi trochu příčilo mít třídu s jedinou metodou get(), myslel jsem, že přes config.neon to bude správnější. Takže jsem se mýlil?
Jinak tvoje verze počítání novinek je nevyhovující, neboť mi zjistí pouze počet novinek na stránce, já kvůli paginátoru potřebuji počet všech novinek.

PS: službu articles bych měl nechat jako službu, nebo by bylo správné řešení předělat ji také na model Articles podobný modelu News?

ViPEr*CZ*
Člen | 813
+
0
-

S tím počtem máš pravdu. No takhle tam tedy budeš muset mít dvě metody pro get a count. Ještě přemýšlím, protože paginátor ti udělá v url parametry (z hlavy nevím) a ty určitě budeš moci vytáhnout do téhle metody createNews a zjistit si je z url. A aby jsi to udělal přes Nette bude potřeba ještě jeden parametr přidat do createNews a to Nette\DI\Container $container.

A createCountNews by ti mělo vracet objekt na Nette\Database\Selection a až v kódu si volej členskou metodu count().

Editoval ViPEr*CZ* (6. 6. 2012 16:03)

vvoody
Člen | 910
+
0
-

ten model moze mat aj metodu count

public function count(){
	return $this->database->table('news')->count();
}

To je uz na tebe, ci skryt articles do modelu. Je to vhodne ak chces presunut nejaku logiku vyberu dat prec z presenteru. Ak by mal mat model len jednu metodu:

public function get(){
	return $this->database->table('article');
}

tak si urcite vystacis aj s tovarnickou definovanou v configu. Ak budes potrebovat riesit nad tou tabulkou nieco zlozitejsie tak radsej v modely nez to bastlit niekde v action presenteru alebo v onSucces callbacku odoslaneho formu.

ViPEr*CZ*
Člen | 813
+
0
-

Metodu count jsem samozřejmě již zmínil. A právě o tu logiku co popisuješ Neas usiloval. Přišlo mu na jednu metodu mít jen továrničku. Vyzkoušel bych to ještě jak jsem napsal já, i když metoda přes modely určitě není špatná. Například u news se teď potýkáš se dvěma továrničkami a takto by byla třída se dvěma metodami (+ kontruktor), protože nikdy nevíš na co to bude potřeba a jak se to bude rozšiřovat.

PS: Ty továrny navíc vypadaj všechny skoro stejně, asi bych zkusil napsat jednu obecnou a parametrem jen určil do jaké tabulky se mají koukat. A navíc database a Texy by se měli vložit do metody automaticky. https://doc.nette.org/cs/configuring#…

vvoody
Člen | 910
+
0
-

Ja som ten tvoj post este nevidel ked som posielal moj :) chcel som len objasnit, ze ten count musi byt samozrejme nad celou tabulkou a nie len vyberom.

ViPEr*CZ*
Člen | 813
+
0
-

vvoody napsal(a):

Ja som ten tvoj post este nevidel ked som posielal moj :) chcel som len objasnit, ze ten count musi byt samozrejme nad celou tabulkou a nie len vyberom.

Jasný ;-) to samozřejmě byl logický bug co jsem psal ve svém prvním příspěvku.

Neas
Člen | 43
+
0
-

tak jsem udělal i pro articles i pro news samostatné modely, odvozené oba ze stejné třídy. Děkuji za rady.