• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

[Symfony][DOCTRINE] Poddaję ocenie mój kod paginacji [ankieta]

Object Storage Arubacloud
0 głosów
302 wizyt
pytanie zadane 3 grudnia 2015 w Nasze projekty przez makoso Mądrala (7,380 p.)

Chciałem się przetestować i napisałem taki oto teoretyczniedobry kod jak dla mnie do twrozenia paginacji na stronie, próbowałem robić nawet dokumentację na górze ale mój angielski pozostawia bardzo wiele do życzenia, prosiłbym o ocenę i wypowiedzi na ten temat, wiem do symfony są bundle z paginacją jednak udostępniam to w celu oceny własnych umiejętności ;)
 

public function articlesAction( $numPage = 0 )
    {
        ////////////////////CONFIGURATION/////////////////////////////
        // @Param $numPage is getting from route default is set to 0
        // You must set this parametr in Your route with requirements
        // like this:requirements={"numPage": "\d+"}
        // Full route like this:
        // @Route("/articles/{numPage}",
        //      name="articles_list",
        //      requirements={
        //          "numPage": "\d+"
        //      })
        $articlesPerPage = 15;//Num of articles display on single page min 1
        $repository = "AppBundle:Articles";//Database Table like "<NameBundle>:<Entity>"
        $orderBy = "dateinsert";//Order by Column prefer id or Date of insert
        $sortBy = "DESC";//Sort results put ASC or DESC prefer DESC for display first newest records
        $twigTemplatePath = "articles.html.twig";//path to the template like: "articles.html.twig"
        //////////////////END CONFIGURATION///////////////////////////
        $startArticleResult = $numPage * $articlesPerPage;

        $articlesRepository = $this
            ->getDoctrine()
            ->getRepository( $repository );
        $mappedBy = strtolower(explode( ':', $repository)[1][0]);
        $allRecords = count($articlesRepository
            ->createQueryBuilder($mappedBy)
            ->orderBy( $mappedBy.'.'.$orderBy, $sortBy )
            ->getQuery()
            ->getResult()
        );

        $maxNumPage = floor( $allRecords / $articlesPerPage ) + 1;
        $minNumPageDisplay = $numPage - 4;
        $maxNumPageDisplay = $numPage + 5;
        if( $minNumPageDisplay < 1){
            $minNumPageDisplay = 1;
        }
        if( $maxNumPageDisplay > $maxNumPage){
            $maxNumPageDisplay = $maxNumPage;
        }

        $articles = $articlesRepository
            ->createQueryBuilder($mappedBy)
            ->orderBy( $mappedBy.'.'.$orderBy, $sortBy )
            ->setFirstResult( $startArticleResult )
            ->setMaxResults( $articlesPerPage )
            ->getQuery()
            ->getResult();

        $articlesResultRows = count($articles);

       if( $articlesResultRows == 0 ){
           return $this->render($twigTemplatePath,array(
               'error'=> 'true',
               'actualPage' => 'false',
               'articles' => 'false',
               'maxNumPageDisplay' => 'false',
               'minNumPageDisplay' => 'false'
           ));
       }
        return $this->render($twigTemplatePath,array(
            'error' => 'false',
            'actualPage' => $numPage,
            'articles' => $articles,
            'maxNumPageDisplay' => $maxNumPageDisplay,
            'minNumPageDisplay' => $minNumPageDisplay
        ));
    }

 

Możliwe odpowiedzi:
Wszystko ok (0 głosów)
Trochę do poprawy (0 głosów)
Sporo do poprawy (4 głosów, 100%)
Kompletnie do niczego (0 głosów)

1 odpowiedź

0 głosów
odpowiedź 3 grudnia 2015 przez event15 Szeryf (93,790 p.)
Mimo, iż to jeszcze nie jest dobrze rozkręcone i skończone to zapoznaj się:

https://efiku.gitbooks.io/php-kurs/content/czesc-i/podstawy-skladni.html (tak odnośnie złego komentowania)
komentarz 4 grudnia 2015 przez efiku Szeryf (75,160 p.)
Zacznij czytać CookBook i Book Symfony, bo to zła praktyka pchać wszystko do kontrolera.

Powinien Być serwis który jak dostenie konfiguracje paginacji zwróci odpowiednie rekordy z Repozytorium Artykułów, które później Ty zwrócisz w kontrolerze.
komentarz 4 grudnia 2015 przez makoso Mądrala (7,380 p.)
Jak sądzę chodzi o stworzenie czegoś takiego:
http://symfony2-docs-pl.readthedocs.org/pl/latest/book/service_container.html
Jak w struktrurze to ma wygląać?

src/Services/<service>
?
komentarz 5 grudnia 2015 przez makoso Mądrala (7,380 p.)

Udało mi się osiągnąć coś takiego, czy to już jest lepszym rozwiązaniem?

config:
 

services:
     Paginator:
              class: AppBundle\Services\Paginate
              arguments: [ @doctrine.orm.entity_manager ]

articleAction:

public function articlesAction( $numPage = 0 )
    {
        $paginator = $this->get('Paginator');
        $paginator->setRepositoryOnce("AppBundle:Articles");
        $paginator->setArticlesPerPage(15);
        $paginator->setOrderBy("dateinsert");
        $paginator->setNumPage($numPage);

        $data = $paginator->getFinallyArray();

        return $this->render("articles.html.twig",array(
            'error' => $data['error'],
            'actualPage' => $data['actualPage'],
            'articles' => $data['articles'],
            'maxNumPageDisplay' => $data['maxNumPageDisplay'],
            'minNumPageDisplay' => $data['minNumPageDisplay']
        ));
    }

i kod Paginate.php
http://pastebin.com/W5xadWkQ

 

komentarz 5 grudnia 2015 przez efiku Szeryf (75,160 p.)

Już jest dużo lepiej, kontroler wygląda bardziej czytelniej.

Nie zapominaj, że możesz działania na QB zrobić jako repozytorium artykułów, gdzie przez EntityManagera będziesz pobierał to repozytorium i odpalał konkretną metode która zwróci Ci kolekcję Artykułów.   

http://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/tutorials/pagination.html

http://stackoverflow.com/a/15945742 

Wartałoby znać takie interfejsy jak Countable, Iterator. :)


Grunt, że wywaliłeś tyle syfu z kontrolera. Kontrolery mają być małe i przejrzyste..

a serwisy to podstawowa architektura Symfony. :)

komentarz 5 grudnia 2015 przez makoso Mądrala (7,380 p.)

Dzięki za podpowiedź z serwisami :) ale mam jedno pytanie w pl tutku tego nie było a może Ty mi powiesz jak tworzę serwis mogę ustawić mu więcej wymagań ( do konstruktora ) tylko że parametry mogę wsadzić przez yml-a tylko? czy da się jakoś tutaj dołożyć to co wymaga konstruktor: 

$paginator = $this->get('Paginator');

Dzięki serwisowi paginację w galerii mam równie czytelną i zrobioną w nwm 20s :) :D 
Odpalam inne hasła które wysłałeś i czytam :) :D

Podobne pytania

0 głosów
1 odpowiedź 421 wizyt
0 głosów
1 odpowiedź 232 wizyt
pytanie zadane 3 grudnia 2015 w PHP przez makoso Mądrala (7,380 p.)
0 głosów
0 odpowiedzi 630 wizyt
pytanie zadane 6 kwietnia 2016 w PHP przez makoso Mądrala (7,380 p.)

92,551 zapytań

141,399 odpowiedzi

319,531 komentarzy

61,937 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...