Browse Source

Merge remote-tracking branch 'mvriel/master'

Jordi Boggiano 13 years ago
parent
commit
f37f79a5f5

+ 6 - 1
src/Packagist/WebBundle/Controller/ApiController.php

@@ -37,10 +37,15 @@ class ApiController extends Controller
     {
         $em = $this->get('doctrine')->getEntityManager();
 
+        $filterFields = array();
+        if ($this->getRequest()->get('type')) {
+            $filterFields['type'] = $this->getRequest()->get('type');
+        }
+
         gc_enable();
 
         $packages = $em->getRepository('Packagist\WebBundle\Entity\Package')
-            ->getFullPackages();
+            ->getFullPackages(null, $filterFields);
 
         $notifyUrl = $this->generateUrl('track_download', array('name' => 'VND/PKG'));
 

+ 44 - 12
src/Packagist/WebBundle/Controller/WebController.php

@@ -61,27 +61,59 @@ class WebController extends Controller
      */
     public function browseAction(Request $req)
     {
-        if ($tag = $req->query->get('tag')) {
+        $repository = $this->getDoctrine()->getRepository('PackagistWebBundle:Package');
+        $packages = $repository->getBaseQueryBuilder();
+        $view = 'PackagistWebBundle:Web:browse.html.twig';
+        $extraViewOptions = array();
+
+        $type = $req->query->get('type');
+        $tag = $req->query->get('tag');
+        $page = $req->query->get('page', 1);
+
+        if ($tag) {
             $packages = $this->getDoctrine()
                 ->getRepository('PackagistWebBundle:Package')
-                ->findByTag($tag);
+                ->getQueryBuilderByTag($tag);
+            $view = 'PackagistWebBundle:Web:tag.html.twig';
+            $extraViewOptions['tag'] = $tag;
+        }
 
-            $paginator = new Pagerfanta(new DoctrineORMAdapter($packages, true));
-            $paginator->setMaxPerPage(15);
-            $paginator->setCurrentPage($req->query->get('page', 1), false, true);
+        if ($type) {
+            // this andWhere either tags onto the $packages defined in the $tag
+            // if-statement, or if tags onto the $packages defined at the start
+            // of the method
+            $packages->andWhere('p.type=:type')->setParameter('type', $type);
+            $view = 'PackagistWebBundle:Web:type.html.twig';
+            $extraViewOptions['type'] = $type;
+        }
 
-            return $this->render('PackagistWebBundle:Web:tag.html.twig', array('packages' => $paginator, 'tag' => $tag));
+        if ($tag && $type) {
+            $view = 'PackagistWebBundle:Web:tagAndType.html.twig';
         }
 
-        $packages = $this->getDoctrine()
-            ->getRepository('PackagistWebBundle:Package')
-            ->getBaseQueryBuilder();
+        return $this->render(
+            $view,
+            array_merge(
+                array('packages' => $this->setupPager($packages, $page)),
+                $extraViewOptions
+            )
+        );
+    }
 
-        $paginator = new Pagerfanta(new DoctrineORMAdapter($packages, true));
+    /**
+     * Initializes the pager for a query.
+     *
+     * @param \Doctrine\ORM\QueryBuilder $query Query for packages
+     * @param int                        $page  Pagenumber to retrieve.
+     * @return \Pagerfanta\Pagerfanta
+     */
+    protected function setupPager($query, $page)
+    {
+        $paginator = new Pagerfanta(new DoctrineORMAdapter($query, true));
         $paginator->setMaxPerPage(15);
-        $paginator->setCurrentPage($req->query->get('page', 1), false, true);
+        $paginator->setCurrentPage($page, false, true);
 
-        return $this->render('PackagistWebBundle:Web:browse.html.twig', array('packages' => $paginator));
+        return $paginator;
     }
 
     /**

+ 9 - 3
src/Packagist/WebBundle/Entity/PackageRepository.php

@@ -119,7 +119,7 @@ class PackageRepository extends EntityRepository
         return $qb->getQuery()->getSingleResult();
     }
 
-    public function getFullPackages(array $ids = null)
+    public function getFullPackages(array $ids = null, $filterFields = array())
     {
         $qb = $this->getEntityManager()->createQueryBuilder();
         $qb->select('p', 'v', 't', 'a', 'req', 'devReq', 'sug', 'rep', 'con', 'pro')
@@ -136,14 +136,20 @@ class PackageRepository extends EntityRepository
             ->orderBy('v.development', 'DESC')
             ->addOrderBy('v.releasedAt', 'DESC');
 
+        foreach ($filterFields as $name => $value) {
+            $qb->andWhere('p.' . $name . ' = :' . $name);
+        }
+        $qb->setParameters($filterFields);
+
         if (null !== $ids) {
-            $qb->where($qb->expr()->in('p.id', $ids));
+            $qb->where($qb->expr()->in('p.id', ':ids'))
+                ->setParameter('ids', $ids);
         }
 
         return $qb->getQuery()->getResult();
     }
 
-    public function findByTag($name)
+    public function getQueryBuilderByTag($name)
     {
         return $this->getBaseQueryBuilder()
             // eliminate maintainers & tags from the select, because of the groupBy

+ 5 - 0
src/Packagist/WebBundle/Resources/views/Web/tagAndType.html.twig

@@ -0,0 +1,5 @@
+{% extends "PackagistWebBundle:Web:list.html.twig" %}
+
+{% block content_title %}
+    <h1>Packages of type {{ type }} and tagged with {{ tag }}</h1>
+{% endblock %}

+ 5 - 0
src/Packagist/WebBundle/Resources/views/Web/type.html.twig

@@ -0,0 +1,5 @@
+{% extends "PackagistWebBundle:Web:list.html.twig" %}
+
+{% block content_title %}
+    <h1>Packages of type {{ type }}</h1>
+{% endblock %}