Jak vyřešit stránkování při výpisu článků dle kategorií
- jAkErCZ
- Člen | 322
Čau,
hele mám dotaz udělal sem si výpis článků dle kategorií ale těch
článků bývá víc a rád bych k tomu využil i stránkování ale
absolutně nevím jak to lépe řešit aby mi to stránkování fungovalo
jak chci.
Co mám hotového:
public function getArticleWidthCategory($category_id)
{
if ($category_id == null){
$category = $this->database->table(self::TABLE_ART_CAT);
}else{
$category = $this->database->table(self::TABLE_ART_CAT)
->where(self::COLUMN_CAT_ID, $category_id);
}
foreach ($category as $cat){
$article = $this->getArticleWithID($cat->article_id);
$articles[] = [
'data' => $article
];
}
return $articles;
}
Tady mi to vrátí články dle id kategorie
/**
* @param int $category
*/
public function actionArticles(int $category = null)
{
$categories = $this->articleManager->getCategories();
$articles= $this->articleManager->getArticleWidthCategory($category);
$article_count = $this->articleManager->getArticles();
// přístup ke komponentě VisualPaginatoru:
$visualPaginator = $this['visualPaginator'];
// přístup k samotnému paginatoru:
$paginator = $visualPaginator->getPaginator();
// počet položek na stránku
$paginator->itemsPerPage = 10;
// spočítat celkový počet položek
$paginator->itemCount = $article_count->count('*');
foreach ($articles as $article) {
$count = $this->articleManager->getCountComments($article['data']->article_id);
$category = $this->articleManager->getArticleCategories($article['data']->article_id);
$data[$article['data']->article_id] = array(
'comments' => $count,
'category' => $category
);
}
$this->template->home_articles = $articles->limit($paginator->itemsPerPage, $paginator->offset);;
$this->template->categories = $categories;
$this->template->data = $data;
if ($this->isAjax()) {
$this->redrawControl('articles');
$this->redrawControl('cat');
}
}
A tady se snažím rozběhnout paginator ale ten samozřejmě nejede jelikož články z funkce getArticleWidthCategory vracím jako array
Jak chci aby to fungovalo po kliknutí na určitou kategorii vypíše pouze články které v dané kategorii jsou max 10 na stránku a poté bude níž bude klasický stránkování a nebo něco jako načíst další…
Díky všem za radu.
- jAkErCZ
- Člen | 322
CZechBoY napsal(a):
No ty bys hlavně měl vrátit pouze 10 článků z metody
getArticles($offset, $limit);
.
Počet článků bys měl zjišťovat bokem, nevyužívat odpověď dotazu na nastránkovaná data.
Ajo to tam nepatří…
Má to být takto:
/**
* @param int $category
*/
public function actionArticles(int $category = null)
{
$categories = $this->articleManager->getCategories();
$articles= $this->articleManager->getArticleWidthCategory($category);
// přístup ke komponentě VisualPaginatoru:
$visualPaginator = $this['visualPaginator'];
// přístup k samotnému paginatoru:
$paginator = $visualPaginator->getPaginator();
// počet položek na stránku
$paginator->itemsPerPage = 10;
// spočítat celkový počet položek
$paginator->itemCount = $articles->count('*');
bdump($articles);
foreach ($articles as $article) {
$count = $this->articleManager->getCountComments($article['data']->article_id);
$category = $this->articleManager->getArticleCategories($article['data']->article_id);
$data[$article['data']->article_id] = array(
'comments' => $count,
'category' => $category
);
}
$this->template->home_articles = $articles->limit($paginator->itemsPerPage, $paginator->offset);;
$this->template->categories = $categories;
$this->template->data = $data;
if ($this->isAjax()) {
$this->redrawControl('articles');
$this->redrawControl('cat');
}
}
A to mi vrací Call to a member function count() on array Což chápu že medotu count() nemůžeš použít když je to vraceno jako pole ale jak to pořešit aby to vracelo co chci a zároveň fungovalo to stránkování?
Editoval jAkErCZ (7. 1. 2020 15:25)
- David Matějka
- Moderator | 6445
pouzij tam v getArticleWidthCategory backjoin, viz https://doc.nette.org/…ase/explorer#…
- jAkErCZ
- Člen | 322
David Matějka napsal(a):
pouzij tam v getArticleWidthCategory backjoin, viz https://doc.nette.org/…ase/explorer#…
Tak jsem zkusil jak si psal ale stále s tím mám problém.. ale pokročil jsem
public function getArticleWidthCategory($category_id)
{
if ($category_id == null){
$category = $this->database->table(self::TABLE_CAT)->select(':article_category.*');
}else{
$category = $this->database->table(self::TABLE_CAT)->where(self::COLUMN_ID_CAT, $category_id)->select(':article_category.*');
}
return $category;
}
to mi dělá
"SELECT `article_category`.* FROM `category` LEFT JOIN `article_category` ON `category`.`category_id` = `article_category`.`category_id`" (135)
A tabulku article_category mám provázanou přes article_id s tabulkou article takže by logicky mělo fungovat něco jako
$category->article->title
Ale to nefunguje co tedy stále dělám špatně když chci dle kategorie vytáhnout jen články které v ní jsou?