Browse Source

Added a type GET parameter to the /packages.json and /packages/ website to retrieve a list of packages filtered by type

Mike van Riel 13 years ago
parent
commit
a00c805e37

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

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

+ 32 - 13
src/Packagist/WebBundle/Controller/WebController.php

@@ -61,27 +61,46 @@ class WebController extends Controller
      */
     public function browseAction(Request $req)
     {
+        $repository = $this->getDoctrine()->getRepository('PackagistWebBundle:Package');
+        $packages = $repository->getBaseQueryBuilder();
+        $view = 'PackagistWebBundle:Web:browse.html.twig';
+        $extra_view_options = array();
+
         if ($tag = $req->query->get('tag')) {
             $packages = $this->getDoctrine()
                 ->getRepository('PackagistWebBundle:Package')
                 ->findByTag($tag);
-
-            $paginator = new Pagerfanta(new DoctrineORMAdapter($packages, true));
-            $paginator->setMaxPerPage(15);
-            $paginator->setCurrentPage($req->query->get('page', 1), false, true);
-
-            return $this->render('PackagistWebBundle:Web:tag.html.twig', array('packages' => $paginator, 'tag' => $tag));
+            $view               = 'PackagistWebBundle:Web:tag.html.twig';
+            $extra_view_options = array('tag' => $tag);
+        } elseif ($type = $req->query->get('type')) {
+            $packages->where('p.type=:type')->setParameter('type', $type);
+            $view               = 'PackagistWebBundle:Web:type.html.twig';
+            $extra_view_options = array('type' => $type);
         }
 
-        $packages = $this->getDoctrine()
-            ->getRepository('PackagistWebBundle:Package')
-            ->getBaseQueryBuilder();
+        $page = $req->query->get('page', 1);
+        return $this->render(
+            $view,
+            array_merge(
+                array('packages' => $this->setupPager($packages, $page)),
+                $extra_view_options
+            )
+        );
+    }
 
-        $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);
-
-        return $this->render('PackagistWebBundle:Web:browse.html.twig', array('packages' => $paginator));
+        $paginator->setCurrentPage($page, false, true);
+        return $paginator;
     }
 
     /**

+ 5 - 1
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, $filter_fields = array())
     {
         $qb = $this->getEntityManager()->createQueryBuilder();
         $qb->select('p', 'v', 't', 'a', 'req', 'devReq', 'sug', 'rep', 'con', 'pro')
@@ -139,6 +139,10 @@ class PackageRepository extends EntityRepository
         if (null !== $ids) {
             $qb->where($qb->expr()->in('p.id', $ids));
         }
+        foreach ($filter_fields as $name => $value) {
+            $qb->andWhere('p.' . $name . ' = :' . $name);
+        }
+        $qb->setParameters($filter_fields);
 
         return $qb->getQuery()->getResult();
     }

+ 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 with type "{{ type }}"</h1>
+{% endblock %}