->load([$id]);
} catch (BackendException $e) {
if (!$tolerateMissing) {
throw $e;
}
$fallbackRecords = [];
}
if (count($fallbackRecords) == 1) {
return $fallbackRecords[0];
}
}
}
if ($tolerateMissing) {
$record = $this->recordFactory->get('Missing');
$record->setRawData(['id' => $id]);
$record->setSourceIdentifier($source);
return $record;
}
throw new RecordMissingException(
'Record ' . $source . ':' . $id . ' does not exist.'
);
}
/**
* Given an array of IDs and a record source, load a batch of records for
* that source.
*
* @param array $ids Record IDs
* @param string $source Record source
* @param bool $tolerateBackendExceptions Whether to tolerate backend
* exceptions that may be caused by e.g. connection issues or changes in
* subcscriptions
* @param ParamBag $params Search backend parameters
*
* @throws \Exception
* @return array
*/
public function loadBatchForSource($ids, $source = DEFAULT_SEARCH_BACKEND,
$tolerateBackendExceptions = false, ParamBag $params = null
* @param ParamBag $params Search backend parameters
* @param bool $force Set to true to force a reload of the record, even if
* already loaded (useful if loading a record using different parameters)
*
* @return AbstractRecordDriver
*/
protected function loadRecord(ParamBag $params = null, bool $force = false)
{
// Only load the record if it has not already been loaded. Note that
// when determining record ID, we check both the route match (the most
// common scenario) and the GET parameters (a fallback used by some
// legacy routes).
if ($force || !is_object($this->driver)) {
$recordLoader = $this->getRecordLoader();
$cacheContext = $this->getRequest()->getQuery()->get('cacheContext');
if (isset($cacheContext)) {
$recordLoader->setCacheContext($cacheContext);
}
$this->driver = $recordLoader->load(
$this->params()->fromRoute('id', $this->params()->fromQuery('id')),
$this->searchClassId,
false,
$params
);
}
return $this->driver;
}
/**
* Redirect the user to the main record view.
*
* @param string $params Parameters to append to record URL.
* @param string $tab Record tab to display (null for default).
*
* @return mixed
*/
protected function redirectToRecord($params = '', $tab = null)
{
$details = $this->getRecordRouter()
->getTabRouteDetails($this->loadRecord(), $tab);
*
* @return mixed
*/
protected function redirectToRecord($params = '', $tab = null)
{
$details = $this->getRecordRouter()
->getTabRouteDetails($this->loadRecord(), $tab);
$target = $this->url()->fromRoute($details['route'], $details['params']);
return $this->redirect()->toUrl($target . $params);
}
/**
* Support method to load tab information from the RecordTab PluginManager.
*
* @return void
*/
protected function loadTabDetails()
{
$driver = $this->loadRecord();
$request = $this->getRequest();
$manager = $this->getRecordTabManager();
$details = $manager
->getTabDetailsForRecord($driver, $request, $this->fallbackDefaultTab);
$this->allTabs = $details['tabs'];
$this->defaultTab = $details['default'] ? $details['default'] : false;
$this->backgroundTabs = $manager->getBackgroundTabNames($driver);
$this->tabsExtraScripts = $manager->getExtraScripts();
}
/**
* Get default tab for a given driver
*
* @return string
*/
protected function getDefaultTab()
{
// Load default tab if not already retrieved:
if (null === $this->defaultTab) {
$this->loadTabDetails();
$request = $this->getRequest();
$manager = $this->getRecordTabManager();
$details = $manager
->getTabDetailsForRecord($driver, $request, $this->fallbackDefaultTab);
$this->allTabs = $details['tabs'];
$this->defaultTab = $details['default'] ? $details['default'] : false;
$this->backgroundTabs = $manager->getBackgroundTabNames($driver);
$this->tabsExtraScripts = $manager->getExtraScripts();
}
/**
* Get default tab for a given driver
*
* @return string
*/
protected function getDefaultTab()
{
// Load default tab if not already retrieved:
if (null === $this->defaultTab) {
$this->loadTabDetails();
}
return $this->defaultTab;
}
/**
* Get all tab information for a given driver.
*
* @return array
*/
protected function getAllTabs()
{
if (null === $this->allTabs) {
$this->loadTabDetails();
}
return $this->allTabs;
}
/**
* Get names of tabs to be loaded in the background.
*
if ($checkRoute && $config->Collections->collections ?? false) {
$routeConfig = isset($config->Collections->route)
? $config->Collections->route->toArray() : [];
$collectionRoutes
= array_merge(['record' => 'collection'], $routeConfig);
$routeName = $this->event->getRouteMatch()->getMatchedRouteName() ?? '';
if ($collectionRoute = ($collectionRoutes[$routeName] ?? null)) {
$driver = $this->loadRecord();
if (true === $driver->tryMethod('isCollection')) {
$params = $this->params()->fromQuery()
+ $this->params()->fromRoute();
$collectionUrl = $this->url()
->fromRoute($collectionRoute, $params);
return $this->redirect()->toUrl($collectionUrl);
}
}
}
return $this->showTab(
$this->params()->fromRoute('tab', $this->getDefaultTab())
);
}
/**
* AJAX tab action -- render a tab without surrounding context.
*
* @return mixed
*/
public function ajaxtabAction()
{
$this->loadRecord();
// Set layout to render content only:
$this->layout()->setTemplate('layout/lightbox');
return $this->showTab(
$this->params()->fromPost('tab', $this->getDefaultTab()), true
);
}
/**
* ProcessSave -- store the results of the Save action.
*/
public function onDispatch(MvcEvent $e)
{
$routeMatch = $e->getRouteMatch();
if (! $routeMatch) {
/**
* @todo Determine requirements for when route match is missing.
* Potentially allow pulling directly from request metadata?
*/
throw new Exception\DomainException('Missing route matches; unsure how to retrieve action');
}
$action = $routeMatch->getParam('action', 'not-found');
$method = static::getMethodFromAction($action);
if (! method_exists($this, $method)) {
$method = 'notFoundAction';
}
$actionResponse = $this->$method();
$e->setResult($actionResponse);
return $actionResponse;
}
}
}
if ($this->sharedManager) {
foreach ($this->sharedManager->getListeners($this->identifiers, $name) as $priority => $listeners) {
$listOfListenersByPriority[$priority][] = $listeners;
}
}
// Sort by priority in reverse order
krsort($listOfListenersByPriority);
// Initial value of stop propagation flag should be false
$event->stopPropagation(false);
// Execute listeners
$responses = new ResponseCollection();
foreach ($listOfListenersByPriority as $listOfListeners) {
foreach ($listOfListeners as $listeners) {
foreach ($listeners as $listener) {
$response = $listener($event);
$responses->push($response);
// If the event was asked to stop propagating, do so
if ($event->propagationIsStopped()) {
$responses->setStopped(true);
return $responses;
}
// If the result causes our validation callback to return true,
// stop propagation
if ($callback && $callback($response)) {
$responses->setStopped(true);
return $responses;
}
}
}
}
return $responses;
}
$event->setParams($argv);
}
return $this->triggerListeners($event, $callback);
}
/**
* @inheritDoc
*/
public function triggerEvent(EventInterface $event)
{
return $this->triggerListeners($event);
}
/**
* @inheritDoc
*/
public function triggerEventUntil(callable $callback, EventInterface $event)
{
return $this->triggerListeners($event, $callback);
}
/**
* @inheritDoc
*/
public function attach($eventName, callable $listener, $priority = 1)
{
if (! is_string($eventName)) {
throw new Exception\InvalidArgumentException(sprintf(
'%s expects a string for the event; received %s',
__METHOD__,
(is_object($eventName) ? get_class($eventName) : gettype($eventName))
));
}
$this->events[$eventName][(int) $priority][0][] = $listener;
return $listener;
}
/**
* @events dispatch.pre, dispatch.post
* @param Request $request
* @param null|Response $response
* @return Response|mixed
*/
public function dispatch(Request $request, Response $response = null)
{
$this->request = $request;
if (! $response) {
$response = new HttpResponse();
}
$this->response = $response;
$e = $this->getEvent();
$e->setName(MvcEvent::EVENT_DISPATCH);
$e->setRequest($request);
$e->setResponse($response);
$e->setTarget($this);
$result = $this->getEventManager()->triggerEventUntil(function ($test) {
return ($test instanceof Response);
}, $e);
if ($result->stopped()) {
return $result->last();
}
return $e->getResult();
}
/**
* Get request object
*
* @return Request
*/
public function getRequest()
{
if (! $this->request) {
$this->request = new HttpRequest();
}
);
return $this->complete($return, $e);
} catch (\Throwable $exception) {
$return = $this->marshalBadControllerEvent($controllerName, $e, $application, $exception);
return $this->complete($return, $e);
} catch (\Exception $exception) { // @TODO clean up once PHP 7 requirement is enforced
$return = $this->marshalBadControllerEvent($controllerName, $e, $application, $exception);
return $this->complete($return, $e);
}
if ($controller instanceof InjectApplicationEventInterface) {
$controller->setEvent($e);
}
$request = $e->getRequest();
$response = $application->getResponse();
$caughtException = null;
try {
$return = $controller->dispatch($request, $response);
} catch (\Throwable $ex) {
$caughtException = $ex;
} catch (\Exception $ex) { // @TODO clean up once PHP 7 requirement is enforced
$caughtException = $ex;
}
if ($caughtException !== null) {
$e->setName(MvcEvent::EVENT_DISPATCH_ERROR);
$e->setError($application::ERROR_EXCEPTION);
$e->setController($controllerName);
$e->setControllerClass(get_class($controller));
$e->setParam('exception', $caughtException);
$return = $application->getEventManager()->triggerEvent($e)->last();
if (! $return) {
$return = $e->getResult();
}
}
return $this->complete($return, $e);
}
if ($this->sharedManager) {
foreach ($this->sharedManager->getListeners($this->identifiers, $name) as $priority => $listeners) {
$listOfListenersByPriority[$priority][] = $listeners;
}
}
// Sort by priority in reverse order
krsort($listOfListenersByPriority);
// Initial value of stop propagation flag should be false
$event->stopPropagation(false);
// Execute listeners
$responses = new ResponseCollection();
foreach ($listOfListenersByPriority as $listOfListeners) {
foreach ($listOfListeners as $listeners) {
foreach ($listeners as $listener) {
$response = $listener($event);
$responses->push($response);
// If the event was asked to stop propagating, do so
if ($event->propagationIsStopped()) {
$responses->setStopped(true);
return $responses;
}
// If the result causes our validation callback to return true,
// stop propagation
if ($callback && $callback($response)) {
$responses->setStopped(true);
return $responses;
}
}
}
}
return $responses;
}
$event->setParams($argv);
}
return $this->triggerListeners($event, $callback);
}
/**
* @inheritDoc
*/
public function triggerEvent(EventInterface $event)
{
return $this->triggerListeners($event);
}
/**
* @inheritDoc
*/
public function triggerEventUntil(callable $callback, EventInterface $event)
{
return $this->triggerListeners($event, $callback);
}
/**
* @inheritDoc
*/
public function attach($eventName, callable $listener, $priority = 1)
{
if (! is_string($eventName)) {
throw new Exception\InvalidArgumentException(sprintf(
'%s expects a string for the event; received %s',
__METHOD__,
(is_object($eventName) ? get_class($eventName) : gettype($eventName))
));
}
$this->events[$eventName][(int) $priority][0][] = $listener;
return $listener;
}
/**
$response = $result->last();
if ($response instanceof ResponseInterface) {
$event->setName(MvcEvent::EVENT_FINISH);
$event->setTarget($this);
$event->setResponse($response);
$event->stopPropagation(false); // Clear before triggering
$events->triggerEvent($event);
$this->response = $response;
return $this;
}
}
if ($event->getError()) {
return $this->completeRequest($event);
}
// Trigger dispatch event
$event->setName(MvcEvent::EVENT_DISPATCH);
$event->stopPropagation(false); // Clear before triggering
$result = $events->triggerEventUntil($shortCircuit, $event);
// Complete response
$response = $result->last();
if ($response instanceof ResponseInterface) {
$event->setName(MvcEvent::EVENT_FINISH);
$event->setTarget($this);
$event->setResponse($response);
$event->stopPropagation(false); // Clear before triggering
$events->triggerEvent($event);
$this->response = $response;
return $this;
}
$response = $this->response;
$event->setResponse($response);
return $this->completeRequest($event);
}
/**
* Complete the request
$pathParts[] = APPLICATION_PATH . '/vendor';
$pathParts[] = get_include_path();
set_include_path(implode(PATH_SEPARATOR, $pathParts));
// Composer autoloading
if (file_exists('vendor/autoload.php')) {
$loader = include 'vendor/autoload.php';
}
if (!class_exists('Laminas\Loader\AutoloaderFactory')) {
throw new RuntimeException('Unable to load Laminas autoloader.');
}
// Run the application!
$app = Laminas\Mvc\Application::init(require 'config/application.config.php');
if (PHP_SAPI === 'cli') {
return $app->getServiceManager()
->get(\VuFindConsole\ConsoleRunner::class)->run();
} else {
$app->run();
}