Эх сурвалжийг харах

Refacto WebController.
Hides sort buttons when not on search page.

Benjamin Michalski 10 жил өмнө
parent
commit
935cf22fb2

+ 57 - 31
src/Packagist/WebBundle/Controller/WebController.php

@@ -248,15 +248,12 @@ class WebController extends Controller
     }
 
     /**
-     * @Route("/search/", name="search.ajax")
-     * @Route("/search.{_format}", requirements={"_format"="(html|json)"}, name="search", defaults={"_format"="html"})
+     * @param mixed $orderBys
+     *
+     * @return array
      */
-    public function searchAction(Request $req)
+    protected function getFilteredOrderedBys($orderBys)
     {
-        $form = $this->createSearchForm();
-
-        $orderBys = $req->query->get('orderBys', array());
-
         if ($orderBys) {
             $allowedSorts = array(
                 'downloads' => 1,
@@ -280,37 +277,31 @@ class WebController extends Controller
                     $filteredOrderBys[] = $orderBy;
                 }
             }
-
-            $normalizedOrderBys = array();
-
-            foreach ($filteredOrderBys as $filteredSort) {
-                $normalizedOrderBys[$filteredSort['sort']] = $filteredSort['order'];
-            }
         } else {
             $filteredOrderBys = array();
-            $normalizedOrderBys = array();
         }
 
-        // transform q=search shortcut
-        if ($req->query->has('q') || $req->query->has('orderBys')) {
-            $searchQuery = array();
-
-            $q = $req->query->get('q');
-
-            if ($q !== null) {
-                $searchQuery['query'] = $q;
-            }
+        return $filteredOrderBys;
+    }
 
-            if (!empty($filteredOrderBys)) {
-                $searchQuery['orderBys'] = $filteredOrderBys;
-            }
+    /**
+     * @param array $orderBys
+     *
+     * @return array
+     */
+    protected function getNormalizedOrderBys(array $orderBys)
+    {
+        $normalizedOrderBys = array();
 
-            $req->query->set(
-                'search_query',
-                $searchQuery
-            );
+        foreach ($orderBys as $sort) {
+            $normalizedOrderBys[$sort['sort']] = $sort['order'];
         }
 
+        return $normalizedOrderBys;
+    }
+
+    protected function getOrderBysViewModel(Request $req, $normalizedOrderBys)
+    {
         $makeDefaultArrow = function ($sort) use ($normalizedOrderBys) {
             if (isset($normalizedOrderBys[$sort])) {
                 if (strtolower($normalizedOrderBys[$sort]) === 'asc') {
@@ -347,7 +338,7 @@ class WebController extends Controller
             ));
         };
 
-        $orderBysViewModel = array(
+        return array(
             'downloads' => array(
                 'title' => 'Clic to sort by downloads desc',
                 'class' => 'icon-download',
@@ -361,6 +352,41 @@ class WebController extends Controller
                 'href' => $makeDefaultHref('favers')
             ),
         );
+    }
+
+    /**
+     * @Route("/search/", name="search.ajax")
+     * @Route("/search.{_format}", requirements={"_format"="(html|json)"}, name="search", defaults={"_format"="html"})
+     */
+    public function searchAction(Request $req)
+    {
+        $form = $this->createSearchForm();
+
+        $orderBys = $req->query->get('orderBys', array());
+
+        $filteredOrderBys = $this->getFilteredOrderedBys($orderBys);
+        $normalizedOrderBys = $this->getNormalizedOrderBys($filteredOrderBys);
+        $orderBysViewModel = $this->getOrderBysViewModel($req, $normalizedOrderBys);
+
+        // transform q=search shortcut
+        if ($req->query->has('q') || $req->query->has('orderBys')) {
+            $searchQuery = array();
+
+            $q = $req->query->get('q');
+
+            if ($q !== null) {
+                $searchQuery['query'] = $q;
+            }
+
+            if (!empty($filteredOrderBys)) {
+                $searchQuery['orderBys'] = $filteredOrderBys;
+            }
+
+            $req->query->set(
+                'search_query',
+                $searchQuery
+            );
+        }
 
         $typeFilter = $req->query->get('type');
         $tagsFilter = $req->query->get('tags');

+ 12 - 4
src/Packagist/WebBundle/Resources/public/css/main.css

@@ -437,11 +437,19 @@ form ul {
 
 
 /* Search */
+
 #search_query_query {
+  width: 890px;
+}
+.no-js #search_query_query {
+  width: 780px;
+}
+
+.sortable #search_query_query {
   width: 737px;
   display: inline;
 }
-.no-js #search_query_query {
+.sortable .no-js #search_query_query {
   width: 600px;
 }
 
@@ -449,7 +457,7 @@ form ul {
     display: none;
 }
 
-#order-bys-wrapper {
+.sortable #order-bys-wrapper {
     margin-left: 0.7em;
     display: inline;
     font-size: 24px;
@@ -457,13 +465,13 @@ form ul {
     top: 4px;
 }
 
-#order-bys-wrapper a {
+.sortable #order-bys-wrapper a {
     width: 46px;
     margin-right: 7px;
     display: inline-block;
 }
 
-#order-bys-wrapper a.clear {
+.sortable #order-bys-wrapper a.clear {
     width: auto;
     margin-right: 0px;
 }

+ 13 - 11
src/Packagist/WebBundle/Resources/views/Web/searchForm.html.twig

@@ -1,19 +1,21 @@
 <form id="search-form" action="{{ path('search.ajax') }}" method="GET" {{ form_enctype(searchForm) }} autocomplete="off">
     <p class="submit-wrapper"><input class="submit" type="submit" value="Search" /></p>
-    <div>
+    <div class="{% if orderBys is defined %}sortable{% endif %}">
         {{ form_errors(searchForm.query) }}
         {{ form_widget(searchForm.query, {'attr': {'autocomplete': 'off', 'autofocus': 'autofocus', 'placeholder': 'Search packages...', 'tabindex': 1}}) }}
-        <div id="order-bys-wrapper">
-            {% for sort,param in orderBys %}
-                <a title="{{ param.title }}" href="{{ param.href }}">
-                    <i class="icon {{ param.class }}"></i>
-                    <i class="icon {{ param.arrowClass }}"></i>
+        {% if orderBys is defined %}
+            <div id="order-bys-wrapper">
+                {% for sort,param in orderBys %}
+                    <a title="{{ param.title }}" href="{{ param.href }}">
+                        <i class="icon {{ param.class }}"></i>
+                        <i class="icon {{ param.arrowClass }}"></i>
+                    </a>
+                {% endfor %}
+                <a title="Clear order bys" href="?q={{ searchForm.vars.value.query }}" class="clear">
+                    <i class="icon icon-remove-circle"></i>
                 </a>
-            {% endfor %}
-            <a title="Clear order bys" href="?q={{ searchForm.vars.value.query }}" class="clear">
-                <i class="icon icon-remove-circle"></i>
-            </a>
-        </div>
+            </div>
+        {% endif  %}
         <div
             class="hidden">
             {{ form_widget(searchForm.orderBys) }}