91 assert(is_a($this->_application,
'PKPApplication'));
105 $this->_flippedContextList = array_flip($this->_contextList);
113 assert(is_a($this->_dispatcher,
'Dispatcher'));
122 $this->_dispatcher = $dispatcher;
130 $this->_handler = $handler;
169 if (!$this->_contextDepth)
return array();
172 assert(isset($this->_contextDepth) && isset($this->_contextList));
174 $isPathInfoEnabled = $request->isPathInfoEnabled();
179 if (empty($this->_contextPaths)) {
180 if ($isPathInfoEnabled) {
182 if (isset($_SERVER[
'PATH_INFO'])) {
183 $url = $_SERVER[
'PATH_INFO'];
186 $url = $request->getCompleteUrl();
187 $userVars = $request->getUserVars();
191 $this->_contextList, $this->_contextDepth, $userVars);
207 if (!$this->_contextDepth)
return null;
210 assert(isset($this->_contextDepth) && isset($this->_contextList));
211 assert($requestedContextLevel > 0 && $requestedContextLevel <= $this->_contextDepth);
215 assert(isset($this->_contextPaths[$requestedContextLevel - 1]));
216 return $this->_contextPaths[$requestedContextLevel - 1];
226 function &
getContext($request, $requestedContextLevel = 1, $forceReload =
false) {
228 if (!$this->_contextDepth) {
233 if ($forceReload || !isset($this->_contexts[$requestedContextLevel])) {
238 if ($path ==
'index') {
239 $this->_contexts[$requestedContextLevel] =
null;
245 $contextClass = ucfirst($requestedContextName);
246 $daoName = $contextClass.
'DAO';
250 $daoMethod =
'getByPath';
251 assert(method_exists($daoInstance, $daoMethod));
252 $this->_contexts[$requestedContextLevel] = $daoInstance->$daoMethod($path);
256 return $this->_contexts[$requestedContextLevel];
267 if (!$this->_contextDepth) {
276 $returner = $this->
getContext($request, $requestedContextLevel);
286 if (!isset($this->_indexUrl)) {
287 if ($request->isRestfulUrlsEnabled()) {
288 $this->_indexUrl = $request->getBaseUrl();
290 $this->_indexUrl = $request->getBaseUrl() .
'/index.php';
295 return $this->_indexUrl;
316 function route($request) {
333 function url($request, $newContext =
null, $handler =
null,
$op =
null, $path =
null,
334 $params =
null, $anchor =
null, $escape =
false) {
375 if (!is_callable($serviceEndpoint)) $dispatcher->handle404();
378 $serviceEndpoint[0]->setDispatcher($dispatcher);
381 $roleAssignments = $serviceEndpoint[0]->getRoleAssignments();
382 assert(is_array($roleAssignments));
383 if ($serviceEndpoint[0]->authorize($request, $args, $roleAssignments)) {
385 if ($validate) $serviceEndpoint[0]->validate($request, $args);
388 $serviceEndpoint[0]->initialize($request, $args);
391 $result = call_user_func($serviceEndpoint, $args, $request);
395 $authorizationMessage = $serviceEndpoint[0]->getLastAuthorizationMessage();
399 if ($authorizationMessage ==
'') $authorizationMessage =
'user.authorization.accessDenied';
406 if (is_string($result)) echo $result;
407 elseif (is_a($result,
'JSONMessage')) {
408 header(
'Content-Type: application/json');
409 echo $result->getString();
430 if (is_null($newContext)) $newContext = array();
434 if (is_scalar($newContext)) $newContext = array($newContext);
438 $newContextProvided =
false;
439 foreach($newContext as $contextElement) {
440 if(isset($contextElement)) $newContextProvided =
true;
442 if (!$newContextProvided) $newContext = array();
464 $pathInfoEnabled = $request->isPathInfoEnabled();
469 $baseUrlConfigSuffix =
'';
470 $overriddenContextCount = 0;
474 foreach ($contextList as $contextKey => $contextName) {
475 if ($pathInfoEnabled) {
476 $contextParameter =
'';
478 $contextParameter = $contextName.
'=';
481 $newContextValue = array_shift($newContext);
482 if (isset($newContextValue)) {
484 $contextValue = rawurlencode($newContextValue);
489 if ($contextObject) $contextValue = $contextObject->getPath();
490 else $contextValue =
'index';
494 $baseUrlConfigSuffix .=
"[$contextValue]";
495 $newOverriddenBaseUrl =
Config::getVar(
'general',
'base_url' . $baseUrlConfigSuffix);
496 if (!empty($newOverriddenBaseUrl)) {
497 $overriddenContextCount = $contextKey + 1;
498 $overriddenBaseUrl = $newOverriddenBaseUrl;
501 $context[] = $contextParameter.$contextValue;
505 if (!empty($overriddenBaseUrl)) {
506 $baseUrl = $overriddenBaseUrl;
509 while ($overriddenContextCount>0) {
510 array_shift($context);
511 $overriddenContextCount--;
518 $baseUrlAndContext = array_merge(array($baseUrl), $context);
519 return $baseUrlAndContext;
532 $additionalParameters = array();
533 if (!empty($params)) {
534 assert(is_array($params));
535 foreach ($params as $key => $value) {
536 if (is_array($value)) {
537 foreach($value as $element) {
538 $additionalParameters[] = $key.($escape?
'%5B%5D=':
'[]=').rawurlencode($element);
541 $additionalParameters[] = $key.
'='.rawurlencode($value);
546 return $additionalParameters;
558 function _urlFromParts($baseUrl, $pathInfoArray = array(), $queryParametersArray = array(), $anchor =
'', $escape =
false) {
561 if (strpos($baseUrl,
'//')===0) {
562 $baseUrl =
'http:' . $baseUrl;
563 $protocolRelativeWorkaround =
true;
565 $protocolRelativeWorkaround =
false;
569 $baseUrlParts = parse_url($baseUrl);
570 assert(isset($baseUrlParts[
'scheme']) && isset($baseUrlParts[
'host']) && !isset($baseUrlParts[
'fragment']));
574 $baseUrl = $protocolRelativeWorkaround?
'//':($baseUrlParts[
'scheme'].
'://');
575 if (isset($baseUrlParts[
'user'])) {
576 $baseUrl .= $baseUrlParts[
'user'];
577 if (isset($baseUrlParts[
'pass'])) {
578 $baseUrl .=
':'.$baseUrlParts[
'pass'];
582 $baseUrl .= $baseUrlParts[
'host'];
583 if (isset($baseUrlParts[
'port'])) $baseUrl .=
':'.$baseUrlParts[
'port'];
588 if (isset($baseUrlParts[
'path'])) {
589 $pathInfoArray = array_merge(explode(
'/', trim($baseUrlParts[
'path'],
'/')), $pathInfoArray);
594 if (isset($baseUrlParts[
'query'])) {
595 $queryParametersArray = array_merge(explode(
'&', $baseUrlParts[
'query']), $queryParametersArray);
599 $pathInfo = implode(
'/', $pathInfoArray);
602 $amp = ($escape ?
'&' :
'&');
603 $queryParameters = implode($amp, $queryParametersArray);
604 $queryParameters = (empty($queryParameters) ?
'' :
'?'.$queryParameters);
607 return $baseUrl.$pathInfo.$queryParameters.$anchor;
616 assert(isset($this->_contextList[$contextLevel - 1]));
617 return $this->_contextList[$contextLevel - 1];
626 assert(isset($this->_flippedContextList[$contextName]));
627 return $this->_flippedContextList[$contextName] + 1;