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