Пример #1
0
 /**
  * Create a new Url class representing the given url
  *
  * If $params are given, those will be added to the urls parameters
  * and overwrite any existing parameters
  *
  * @param   string          $url        The string representation of the url to parse
  * @param   array           $params     An array of parameters that should additionally be considered for the url
  * @param   Zend_Request    $request    A request to use instead of the default one
  *
  * @return  Url
  */
 public static function fromPath($url, array $params = array(), $request = null)
 {
     if ($request === null) {
         $request = self::getRequest();
     }
     if (!is_string($url)) {
         throw new ProgrammingError('url "%s" is not a string', $url);
     }
     $urlObject = new Url();
     if ($url === '#') {
         $urlObject->setPath($url);
         return $urlObject;
     }
     $urlParts = parse_url($url);
     if (isset($urlParts['scheme']) && ($urlParts['scheme'] !== $request->getScheme() || isset($urlParts['host']) && $urlParts['host'] !== $request->getServer('SERVER_NAME') || isset($urlParts['port']) && $urlParts['port'] != $request->getServer('SERVER_PORT'))) {
         $urlObject->setIsExternal();
     }
     if (isset($urlParts['path'])) {
         $urlPath = $urlParts['path'];
         if ($urlPath && $urlPath[0] === '/') {
             if ($urlObject->isExternal() || isset($urlParts['user'])) {
                 $urlPath = substr($urlPath, 1);
             } else {
                 $requestBaseUrl = $request->getBaseUrl();
                 if ($requestBaseUrl && $requestBaseUrl !== '/' && strpos($urlPath, $requestBaseUrl) === 0) {
                     $urlPath = substr($urlPath, strlen($requestBaseUrl) + 1);
                     $urlObject->setBasePath($requestBaseUrl);
                 }
             }
         } elseif (!$urlObject->isExternal()) {
             $urlObject->setBasePath($request->getBaseUrl());
         }
         $urlObject->setPath($urlPath);
     } elseif (!$urlObject->isExternal()) {
         $urlObject->setBasePath($request->getBaseUrl());
     }
     // TODO: This has been used by former filter implementation, remove it:
     if (isset($urlParts['query'])) {
         $params = UrlParams::fromQueryString($urlParts['query'])->mergeValues($params);
     }
     if (isset($urlParts['fragment'])) {
         $urlObject->setAnchor($urlParts['fragment']);
     }
     if (isset($urlParts['user']) || $urlObject->isExternal()) {
         if (isset($urlParts['user'])) {
             $urlObject->setUsername($urlParts['user']);
         }
         if (isset($urlParts['host'])) {
             $urlObject->setHost($urlParts['host']);
         }
         if (isset($urlParts['port'])) {
             $urlObject->setPort($urlParts['port']);
         }
         if (isset($urlParts['scheme'])) {
             $urlObject->setScheme($urlParts['scheme']);
         }
         if (isset($urlParts['pass'])) {
             $urlObject->setPassword($urlParts['pass']);
         }
     }
     $urlObject->setParams($params);
     return $urlObject;
 }