Example #1
0
 /**
  * Get Custom Variables for Search Results
  *
  * @param VuFind\Search\Base\Results $results Search results
  *
  * @return array Associative array of custom variables
  */
 protected function getSearchCustomVars($results)
 {
     if (!$this->customVars) {
         return [];
     }
     $vars = parent::getSearchCustomVars($results);
     $facetType = null;
     $facets = [];
     $facetTypes = [];
     $params = $results->getParams();
     if ($params->getSearchType() == 'basic') {
         $vars['SearchHandler'] = $results->getParams()->getQuery()->getHandler();
     }
     $currentType = $vars['SearchType'];
     $backendId = method_exists($results, 'getBackendId') ? $results->getBackendId() : '';
     if ($backendId === 'MetaLib') {
         unset($vars['Facets']);
         unset($vars['FacetTypes']);
         unset($vars['View']);
         unset($vars['Limit']);
         unset($vars['Sort']);
         $vars['SearchType'] = 'MetaLib';
         if ($currentType == 'advanced') {
             $vars['SearchType'] = 'MetaLibAdvanced';
         }
         return $vars;
     } else {
         if ($backendId == 'Primo') {
             unset($vars['View']);
             $vars['SearchType'] = 'PCI';
             if ($currentType == 'advanced') {
                 $vars['SearchType'] = 'PCIAdvanced';
             }
         }
     }
     foreach ($params->getFilterList() as $filterType => $filters) {
         $facetType = null;
         foreach ($filters as $filter) {
             if (!$facetType) {
                 $facetTypes[] = $filter['field'];
             }
             $parts = $filter['value'];
             if ($backendId === 'Solr') {
                 $parts = explode('/', $parts);
                 $parts = array_slice($parts, 1, -1);
                 $facetLevels = [];
                 for ($i = 0; $i < count($parts); $i++) {
                     $facetLevel = "{$i}/";
                     for ($j = 0; $j <= $i; $j++) {
                         $facetLevel .= $parts[$j] . '/';
                     }
                     $facetLevels[] = $this->translator->translate($facetLevel);
                 }
                 $facetStr = implode(' > ', $facetLevels);
             } else {
                 $facetStr = $parts;
             }
             $facets[] = $filter['field'] . '|' . $facetStr;
         }
     }
     $vars['Facets'] = implode("\t", $facets);
     $vars['FacetTypes'] = implode("\t", $facetTypes);
     return $vars;
 }
 /**
  * Send reminders for a user.
  *
  * @param \Finna\Db\Table\Row\User $user        User.
  * @param array                    $remindLoans Loans to be reminded.
  *
  * @return boolean success.
  */
 protected function sendReminder($user, $remindLoans)
 {
     if (!$user->email || trim($user->email) == '') {
         $this->msg("User {$user->username} (id {$user->id})" . ' does not have an email address, bypassing due date reminders');
         return false;
     }
     list($userInstitution, ) = explode(':', $user['username'], 2);
     if (!$this->currentInstitution || $userInstitution != $this->currentInstitution) {
         $templateDirs = ["{$this->baseDir}/themes/finna/templates"];
         if (!($viewPath = $this->resolveViewPath($userInstitution))) {
             $this->err("Could not resolve view path for user {$user->username}" . " (id {$user->id})");
             return false;
         } else {
             $templateDirs[] = "{$viewPath}/themes/custom/templates";
         }
         $this->currentInstitution = $userInstitution;
         $this->currentViewPath = $viewPath;
         $resolver = new AggregateResolver();
         $this->renderer->setResolver($resolver);
         $stack = new TemplatePathStack(['script_paths' => $templateDirs]);
         $resolver->attach($stack);
         $siteConfig = $viewPath . '/local/config/vufind/config.ini';
         $this->currentSiteConfig = parse_ini_file($siteConfig, true);
     }
     $language = isset($this->currentSiteConfig['Site']['language']) ? $this->currentSiteConfig['Site']['language'] : 'fi';
     $validLanguages = array_keys($this->currentSiteConfig['Languages']);
     if (!empty($user->finna_language) && in_array($user->finna_language, $validLanguages)) {
         $language = $user->finna_language;
     }
     $this->translator->addTranslationFile('ExtendedIni', null, 'default', $language)->setLocale($language);
     $key = $this->dueDateReminderTable->getUnsubscribeSecret($this->hmac, $user, $user->id);
     $params = ['id' => $user->id, 'type' => 'reminder', 'key' => $key];
     $unsubscribeUrl = $this->urlHelper->__invoke('myresearch-unsubscribe') . '?' . http_build_query($params);
     $urlParts = explode('/', $this->currentViewPath);
     $urlView = array_pop($urlParts);
     $urlInstitution = array_pop($urlParts);
     $baseUrl = 'https://' . $urlInstitution . '.finna.fi';
     if ($urlView != $this::DEFAULT_PATH) {
         $baseUrl .= "/{$urlView}";
     }
     $params = ['loans' => $remindLoans, 'url' => $baseUrl . $this->urlHelper->__invoke('myresearch-checkedout'), 'unsubscribeUrl' => $baseUrl . $unsubscribeUrl, 'baseUrl' => $baseUrl];
     $subject = $this->translator->translate('due_date_email_subject');
     $message = $this->renderer->render("Email/due-date-reminder.phtml", $params);
     try {
         $to = $user->email;
         $from = $this->currentSiteConfig['Site']['email'];
         $this->serviceManager->get('VuFind\\Mailer')->send($to, $from, $subject, $message);
     } catch (\Exception $e) {
         $this->err("Failed to send due date reminders to user {$user->username} " . " (id {$user->id})");
         $this->err('   ' . $e->getMessage());
         return false;
     }
     foreach ($remindLoans as $loan) {
         $params = ['user_id' => $user->id, 'loan_id' => $loan['loanId']];
         $this->dueDateReminderTable->delete($params);
         $dueDate = new \DateTime($loan['dueDate']);
         $params['due_date'] = $dueDate->format($this::DUE_DATE_FORMAT);
         $params['notification_date'] = gmdate($this::DUE_DATE_FORMAT, time());
         $this->dueDateReminderTable->insert($params);
     }
     return true;
 }