výpis novinek pomocí služby zaregistrované v config.neon
- Neas
- Člen | 43
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 | 817
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
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 | 817
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
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 | 817
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#…