From 56cc44586d5b396d31cfb125db5c6e34ce8428db Mon Sep 17 00:00:00 2001
From: Demian Katz <demian.katz@villanova.edu>
Date: Thu, 2 Apr 2020 16:10:21 -0400
Subject: [PATCH] Do not require MVC event to initialize theme. (#1600)

- Allows console commands to utilize themes without Laminas-MVC.
---
 .../src/VuFindTheme/Initializer.php           | 47 +++++++++++++------
 1 file changed, 32 insertions(+), 15 deletions(-)

diff --git a/module/VuFindTheme/src/VuFindTheme/Initializer.php b/module/VuFindTheme/src/VuFindTheme/Initializer.php
index 488b654728f..6e8d97eb577 100644
--- a/module/VuFindTheme/src/VuFindTheme/Initializer.php
+++ b/module/VuFindTheme/src/VuFindTheme/Initializer.php
@@ -27,6 +27,7 @@
  */
 namespace VuFindTheme;
 
+use Interop\Container\ContainerInterface;
 use Laminas\Config\Config;
 use Laminas\Console\Console;
 use Laminas\Mvc\MvcEvent;
@@ -96,7 +97,8 @@ class Initializer
     /**
      * Constructor
      *
-     * @param Config   $config Configuration object containing these keys:
+     * @param Config                      $config           Configuration object
+     * containing these keys:
      * <ul>
      *   <li>theme - the name of the default theme for non-mobile devices</li>
      *   <li>mobile_theme - the name of the default theme for mobile devices
@@ -111,16 +113,26 @@ class Initializer
      *   <li>generator - a Generator value to display in the HTML header
      * (optional)</li>
      * </ul>
-     * @param MvcEvent $event  Laminas MVC Event object
+     * @param MvcEvent|ContainerInterface $eventOrContainer Laminas MVC Event object
+     * OR service container object
      */
-    public function __construct(Config $config, MvcEvent $event)
+    public function __construct(Config $config, $eventOrContainer)
     {
         // Store parameters:
         $this->config = $config;
-        $this->event = $event;
 
-        // Grab the service manager for convenience:
-        $this->serviceManager = $this->event->getApplication()->getServiceManager();
+        if ($eventOrContainer instanceof MvcEvent) {
+            $this->event = $eventOrContainer;
+            $this->serviceManager = $this->event->getApplication()
+                ->getServiceManager();
+        } elseif ($eventOrContainer instanceof ContainerInterface) {
+            $this->event = null;
+            $this->serviceManager = $eventOrContainer;
+        } else {
+            throw new \Exception(
+                'Illegal type for $eventOrContainer: ' . get_class($eventOrContainer)
+            );
+        }
 
         // Get the cookie manager from the service manager:
         $this->cookieManager = $this->serviceManager
@@ -150,7 +162,9 @@ class Initializer
         self::$themeInitialized = true;
 
         // Determine the current theme:
-        $currentTheme = $this->pickTheme($this->event->getRequest());
+        $currentTheme = $this->pickTheme(
+            isset($this->event) ? $this->event->getRequest() : null
+        );
 
         // Determine theme options:
         $this->sendThemeOptionsToView();
@@ -178,11 +192,12 @@ class Initializer
     /**
      * Support method for init() -- figure out which theme option is active.
      *
-     * @param Request $request Request object (for obtaining user parameters).
+     * @param Request $request Request object (for obtaining user parameters);
+     * set to null if no request context is available.
      *
      * @return string
      */
-    protected function pickTheme(Request $request)
+    protected function pickTheme(?Request $request)
     {
         // Load standard configuration options:
         $standardTheme = $this->config->theme;
@@ -193,12 +208,14 @@ class Initializer
             ? $this->config->mobile_theme : false;
 
         // Find out if the user has a saved preference in the POST, URL or cookies:
-        $selectedUI = $request->getPost()->get(
-            'ui', $request->getQuery()->get(
-                'ui', isset($request->getCookie()->ui)
-                ? $request->getCookie()->ui : null
-            )
-        );
+        if (isset($request)) {
+            $selectedUI = $request->getPost()->get(
+                'ui', $request->getQuery()->get(
+                    'ui', isset($request->getCookie()->ui)
+                    ? $request->getCookie()->ui : null
+                )
+            );
+        }
         if (empty($selectedUI)) {
             $selectedUI = ($mobileTheme && $this->mobile->detect())
                 ? 'mobile' : 'standard';
-- 
GitLab