Jak vyřešit stránkování při výpisu článků dle kategorií

jAkErCZ
Člen | 321
+
0
-

Č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.

CZechBoY
Člen | 3608
+
0
-

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.

jAkErCZ
Člen | 321
+
0
-

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

pouzij tam v getArticleWidthCategory backjoin, viz https://doc.nette.org/…ase/explorer#…

jAkErCZ
Člen | 321
+
0
-

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?