From 98109a4dfd9cc4fc17916843081ad3c425eb7d09 Mon Sep 17 00:00:00 2001
From: Ere Maijala <ere.maijala@helsinki.fi>
Date: Wed, 13 Jan 2016 09:46:06 -0500
Subject: [PATCH] Fixed interaction between hidden tab filters and advanced
 search. - Also added id to tab details array to enable additional
 customizations.

---
 .../VuFind/View/Helper/Root/SearchTabs.php    | 66 +++++++++++++------
 .../templates/search/advanced/layout.phtml    |  7 ++
 .../templates/search/searchbox.phtml          | 12 +++-
 .../templates/search/advanced.phtml           | 10 +++
 4 files changed, 73 insertions(+), 22 deletions(-)

diff --git a/module/VuFind/src/VuFind/View/Helper/Root/SearchTabs.php b/module/VuFind/src/VuFind/View/Helper/Root/SearchTabs.php
index ec6c71dc6d0..605b71ff87d 100644
--- a/module/VuFind/src/VuFind/View/Helper/Root/SearchTabs.php
+++ b/module/VuFind/src/VuFind/View/Helper/Root/SearchTabs.php
@@ -28,7 +28,8 @@
  * @link     http://vufind.org/wiki/vufind2:developer_manual Wiki
  */
 namespace VuFind\View\Helper\Root;
-use VuFind\Search\Results\PluginManager,
+use VuFind\Search\Base\Results,
+    VuFind\Search\Results\PluginManager,
     VuFind\Search\SearchTabsHelper,
     Zend\View\Helper\Url,
     Zend\Http\Request;
@@ -112,7 +113,7 @@ class SearchTabs extends \Zend\View\Helper\AbstractHelper
                 && $this->helper->filtersMatch($class, $hiddenFilters, $filters)
             ) {
                 $matchFound = true;
-                $retVal[] = $this->createSelectedTab($class, $label);
+                $retVal[] = $this->createSelectedTab($key, $class, $label);
             } else if ($type == 'basic') {
                 if (!isset($activeOptions)) {
                     $activeOptions
@@ -121,11 +122,11 @@ class SearchTabs extends \Zend\View\Helper\AbstractHelper
                 $newUrl = $this->remapBasicSearch(
                     $activeOptions, $class, $query, $handler, $filters
                 );
-                $retVal[] = $this->createBasicTab($class, $label, $newUrl);
+                $retVal[] = $this->createBasicTab($key, $class, $label, $newUrl);
             } else if ($type == 'advanced') {
-                $retVal[] = $this->createAdvancedTab($class, $label, $filters);
+                $retVal[] = $this->createAdvancedTab($key, $class, $label, $filters);
             } else {
-                $retVal[] = $this->createHomeTab($class, $label, $filters);
+                $retVal[] = $this->createHomeTab($key, $class, $label, $filters);
             }
         }
         if (!$matchFound && !empty($retVal)) {
@@ -159,14 +160,16 @@ class SearchTabs extends \Zend\View\Helper\AbstractHelper
     /**
      * Create information representing a selected tab.
      *
+     * @param string $id    Tab ID
      * @param string $class Search class ID
      * @param string $label Display text for tab
      *
      * @return array
      */
-    protected function createSelectedTab($class, $label)
+    protected function createSelectedTab($id, $class, $label)
     {
         return [
+            'id' => $id,
             'class' => $class,
             'label' => $label,
             'selected' => true
@@ -209,15 +212,17 @@ class SearchTabs extends \Zend\View\Helper\AbstractHelper
     /**
      * Create information representing a basic search tab.
      *
+     * @param string $id     Tab ID
      * @param string $class  Search class ID
      * @param string $label  Display text for tab
      * @param string $newUrl Target search URL
      *
      * @return array
      */
-    protected function createBasicTab($class, $label, $newUrl)
+    protected function createBasicTab($id, $class, $label, $newUrl)
     {
         return [
+            'id' => $id,
             'class' => $class,
             'label' => $label,
             'selected' => false,
@@ -228,27 +233,23 @@ class SearchTabs extends \Zend\View\Helper\AbstractHelper
     /**
      * Create information representing a tab linking to "search home."
      *
+     * @param string $id      Tab ID
      * @param string $class   Search class ID
      * @param string $label   Display text for tab
      * @param array  $filters Tab filters
      *
      * @return array
      */
-    protected function createHomeTab($class, $label, $filters)
+    protected function createHomeTab($id, $class, $label, $filters)
     {
-        // Set up results object for URL building:
-        $results = $this->results->get($class);
-        $params = $results->getParams();
-        foreach ($filters as $filter) {
-            $params->addHiddenFilter($filter);
-        }
-
         // If an advanced search is available, link there; otherwise, just go
         // to the search home:
+        $results = $this->results->get($class);
         $urlParams = $results->getUrlQuery()->getParams(false);
         $url = $this->url->__invoke($results->getOptions()->getSearchHomeAction())
-            . ($urlParams !== '?' ? $urlParams : '');
+            . $this->buildUrlHiddenFilters($results, $filters);
         return [
+            'id' => $id,
             'class' => $class,
             'label' => $label,
             'selected' => false,
@@ -259,20 +260,25 @@ class SearchTabs extends \Zend\View\Helper\AbstractHelper
     /**
      * Create information representing an advanced search tab.
      *
-     * @param string $class Search class ID
-     * @param string $label Display text for tab
+     * @param string $id      Tab ID
+     * @param string $class   Search class ID
+     * @param string $label   Display text for tab
+     * @param array  $filters Tab filters
      *
      * @return array
      */
-    protected function createAdvancedTab($class, $label)
+    protected function createAdvancedTab($id, $class, $label, $filters)
     {
         // If an advanced search is available, link there; otherwise, just go
         // to the search home:
-        $options = $this->results->get($class)->getOptions();
+        $results = $this->results->get($class);
+        $options = $results->getOptions();
         $advSearch = $options->getAdvancedSearchAction();
         $url = $this->url
-            ->__invoke($advSearch ? $advSearch : $options->getSearchHomeAction());
+            ->__invoke($advSearch ? $advSearch : $options->getSearchHomeAction())
+            . $this->buildUrlHiddenFilters($results, $filters);
         return [
+            'id' => $id,
             'class' => $class,
             'label' => $label,
             'selected' => false,
@@ -280,4 +286,22 @@ class SearchTabs extends \Zend\View\Helper\AbstractHelper
         ];
     }
 
+    /**
+     * Build a hidden filter query fragment from the given filters
+     *
+     * @param Results $results Search results
+     * @param array   $filters Filters
+     *
+     * @return string Query parameters
+     */
+    protected function buildUrlHiddenFilters(Results $results, $filters)
+    {
+        // Set up results object for URL building:
+        $params = $results->getParams();
+        foreach ($filters as $filter) {
+            $params->addHiddenFilter($filter);
+        }
+        $urlParams = $results->getUrlQuery()->getParams(false);
+        return $urlParams !== '?' ? $urlParams : '';
+    }
 }
diff --git a/themes/bootstrap3/templates/search/advanced/layout.phtml b/themes/bootstrap3/templates/search/advanced/layout.phtml
index fd5d4c86c06..40e1c90c3ae 100644
--- a/themes/bootstrap3/templates/search/advanced/layout.phtml
+++ b/themes/bootstrap3/templates/search/advanced/layout.phtml
@@ -23,8 +23,10 @@
     }
     $hasDefaultsApplied = $this->saved->getParams()->hasDefaultsApplied();
     $searchFilters = $this->saved->getParams()->getFilterList();
+    $hiddenFilters = $this->saved->getParams()->getHiddenFilters();
   } else {
     $hasDefaultsApplied = $searchDetails = $searchFilters = $groups = false;
+    $hiddenFilters = $this->searchtabs()->getHiddenFilters($this->searchClassId, true);
   }
 
   // Step 1: Load the javascript
@@ -62,6 +64,11 @@
 <?=$this->flashmessages()?>
 <div role="search">
   <form name="searchForm" id="advSearchForm" method="get" action="<?=$this->url($this->options->getSearchAction())?>">
+    <? foreach ($hiddenFilters as $key => $filter): ?>
+      <? foreach ($filter as $value): ?>
+        <input type="hidden" name="hiddenFilters[]" value="<?=$this->escapeHtmlAttr($key) . ':' . $this->escapeHtmlAttr($value)?>" />
+      <? endforeach; ?>
+    <? endforeach; ?>
     <div class="row">
       <div class="<?=$this->layoutClass('mainbody')?>">
         <input type="hidden" name="sort" value="relevance">
diff --git a/themes/bootstrap3/templates/search/searchbox.phtml b/themes/bootstrap3/templates/search/searchbox.phtml
index 8b06107ba64..8f36858df07 100644
--- a/themes/bootstrap3/templates/search/searchbox.phtml
+++ b/themes/bootstrap3/templates/search/searchbox.phtml
@@ -12,6 +12,7 @@
     );
     $handlerCount = count($handlers);
     $basicSearch = $this->searchbox()->combinedHandlersActive() ? 'combined-searchbox' : $options->getSearchAction();
+    $searchHome = $options->getSearchHomeAction();
     $advSearch = $options->getAdvancedSearchAction();
     $lastSort = $options->getLastSort();
     $lastLimit = $options->getLastLimit();
@@ -48,7 +49,16 @@
     <? endif; ?>
     <button type="submit" class="btn btn-primary"><i class="fa fa-search"></i> <?=$this->transEsc("Find")?></button>
     <? if ($advSearch): ?>
-      <a href="<?=$this->url($advSearch) . ((isset($this->searchId) && $this->searchId) ? '?edit=' . $this->escapeHtmlAttr($this->searchId) : '') ?>" class="btn btn-link" rel="nofollow"><?=$this->transEsc("Advanced")?></a>
+      <?
+        $hiddenFilterParams = [];
+        foreach ($hiddenFilters as $key => $filter) {
+          foreach ($filter as $value) {
+            $hiddenFilterParams[] = urlencode('hiddenFilters[]') . '=' . urlencode("$key:$value");
+          }
+        }
+        $hiddenFilterParams = empty($hiddenFilterParams) ? '' : '?' . implode('&', $hiddenFilterParams);
+      ?>
+      <a href="<?=$this->url($advSearch) . ((isset($this->searchId) && $this->searchId) ? '?edit=' . $this->escapeHtmlAttr($this->searchId) : $hiddenFilterParams) ?>" class="btn btn-link" rel="nofollow"><?=$this->transEsc("Advanced")?></a>
     <? endif; ?>
 
     <? $shards = $options->getShards(); if ($options->showShardCheckboxes() && !empty($shards)): ?>
diff --git a/themes/jquerymobile/templates/search/advanced.phtml b/themes/jquerymobile/templates/search/advanced.phtml
index 36e135d0094..30f80df5ece 100644
--- a/themes/jquerymobile/templates/search/advanced.phtml
+++ b/themes/jquerymobile/templates/search/advanced.phtml
@@ -12,6 +12,11 @@
   $searchHome['action'] = 'Home';
   $lastSort = $options->getLastSort();
   $lastLimit = $options->getLastLimit();
+  if (isset($this->saved) && is_object($this->saved)) {
+    $hiddenFilters = $this->saved->getParams()->getHiddenFilters();
+  } else {
+    $hiddenFilters = $this->searchtabs()->getHiddenFilters($this->searchClassId, true);
+  }
 ?>
 <div data-role="page" id="Search-home">
   <?=$this->mobileMenu()->header(array('hideSearchLink' => true))?>
@@ -56,6 +61,11 @@
           echo '<input type="hidden" name="sort" value="' . $this->escapeHtmlAttr($lastSort) . '" />';
         }
       ?>
+      <? foreach ($hiddenFilters as $key => $filter): ?>
+        <? foreach ($filter as $value): ?>
+          <input type="hidden" name="hiddenFilters[]" value="<?=$this->escapeHtmlAttr($key) . ':' . $this->escapeHtmlAttr($value)?>" />
+        <? endforeach; ?>
+      <? endforeach; ?>
     </form>
   </div>
   <?=$this->mobileMenu()->footer()?>
-- 
GitLab