Add support for path prefixes like /en for multisite/multilanguage support

This commit is contained in:
Matias Griese
2015-01-10 17:54:09 +02:00
parent 9ddfced969
commit 6e39107d45
5 changed files with 82 additions and 21 deletions

View File

@@ -33,17 +33,41 @@ abstract class Folder
return $last_modified;
}
public static function getRelativePath($to, $from = ROOT_DIR)
/**
* Get relative path between target and base path. If path isn't relative, return full path.
*
* @param string $path
* @param string $base
* @return string
*/
public static function getRelativePath($path, $base = GRAV_ROOT)
{
$from = preg_replace('![\\|/]+!', '/', $from);
$to = preg_replace('![\\|/]+!', '/', $to);
if (strpos($to, $from) === 0) {
$to = substr($to, strlen($from));
if ($base) {
$base = preg_replace('![\\|/]+!', '/', $base);
$path = preg_replace('![\\|/]+!', '/', $path);
if (strpos($path, $base) === 0) {
$path = ltrim(substr($path, strlen($base)), '/');
}
}
return $to;
return $path;
}
/**
* Shift first directory out of the path.
*
* @param string $path
* @return string
*/
public static function shift(&$path)
{
$parts = explode('/', trim($path, '/'), 2);
$result = array_shift($parts);
$path = array_shift($parts);
return $result ?: null;
}
/**
* Recursively find the last modified time under given path by file.
*

View File

@@ -1,6 +1,7 @@
<?php
namespace Grav\Common;
use Grav\Common\Filesystem\Folder;
use Grav\Common\Page\Pages;
use Grav\Common\Service\ConfigServiceProvider;
use Grav\Common\Service\ErrorServiceProvider;
@@ -97,17 +98,22 @@ class Grav extends Container
$container['page'] = function ($c) {
/** @var Pages $pages */
$pages = $c['pages'];
$page = $pages->dispatch($c['uri']->route());
// If base URI is set, we want to remove it from the URL.
$path = '/' . ltrim(Folder::getRelativePath($c['uri']->route(), $pages->base()), '/');
$page = $pages->dispatch($path);
if (!$page || !$page->routable()) {
// special case where a media file is requested
if (!$page) {
$path_parts = pathinfo($c['uri']->route());
$path_parts = pathinfo($path);
$page = $c['pages']->dispatch($path_parts['dirname']);
if ($page) {
$media = $page->media()->all();
$media_file = urldecode($path_parts['basename']);
$media_file = urldecode($path_parts['dirname']);
if (isset($media[$media_file])) {
$medium = $media[$media_file];

View File

@@ -129,7 +129,7 @@ trait MarkdownGravLinkTrait
*/
protected function convertUrl($markdown_url)
{
// if absolue and starts with a base_url move on
// if absolute and starts with a base_url move on
if ($this->base_url != '' && strpos($markdown_url, $this->base_url) === 0) {
$new_url = $markdown_url;
// if its absolute with /
@@ -139,7 +139,7 @@ trait MarkdownGravLinkTrait
$relative_path = rtrim($this->base_url, '/') . $this->page->route();
// If this is a 'real' filepath clean it up
if (file_exists($this->page->path().'/'.parse_url($markdown_url, PHP_URL_PATH))) {
if (file_exists($this->page->path() . '/' . parse_url($markdown_url, PHP_URL_PATH))) {
$relative_path = rtrim($this->base_url, '/') . preg_replace('/\/([\d]+.)/', '/', str_replace(PAGES_DIR, '/', $this->page->path()));
$markdown_url = preg_replace('/^([\d]+.)/', '', preg_replace('/\/([\d]+.)/', '/', trim(preg_replace('/[^\/]+(\.md$)/', '', $markdown_url), '/')));
}

View File

@@ -966,9 +966,13 @@ class Page
*/
public function url($include_host = false)
{
/** @var Pages $pages */
$pages = self::$grav['pages'];
/** @var Uri $uri */
$uri = self::$grav['uri'];
$rootUrl = $uri->rootUrl($include_host);
$rootUrl = $uri->rootUrl($include_host) . $pages->base();
$url = $rootUrl.'/'.trim($this->route(), '/');
// trim trailing / if not root

View File

@@ -10,6 +10,7 @@ use Grav\Common\Data\Blueprint;
use Grav\Common\Data\Blueprints;
use Grav\Common\Filesystem\Folder;
use RocketTheme\Toolbox\Event\Event;
use RocketTheme\Toolbox\ResourceLocator\UniformResourceLocator;
/**
* GravPages is the class that is the entry point into the hierarchy of pages
@@ -34,6 +35,11 @@ class Pages
*/
protected $children;
/**
* @var string
*/
protected $base;
/**
* @var array|string[]
*/
@@ -69,6 +75,22 @@ class Pages
$this->grav = $c;
}
/**
* Get or set base path for the pages.
*
* @param string $path
* @return string
*/
public function base($path = null)
{
if ($path !== null) {
$path = trim($path, '/');
$this->base = $path ? '/' . $path : null;
}
return $this->base;
}
/**
* Class initialization. Must be called before using this class.
*/
@@ -236,8 +258,6 @@ class Pages
// Fetch page if there's a defined route to it.
$page = isset($this->routes[$url]) ? $this->get($this->routes[$url]) : null;
// If the page cannot be reached, look into site wide redirects, routes + wildcards
if (!$all && (!$page || !$page->routable())) {
/** @var Config $config */
@@ -278,7 +298,10 @@ class Pages
*/
public function root()
{
return $this->instances[rtrim(PAGES_DIR, DS)];
/** @var UniformResourceLocator $locator */
$locator = $this->grav['locator'];
return $this->instances[rtrim($locator->findResource('page://'), DS)];
}
/**
@@ -408,6 +431,10 @@ class Pages
/** @var Config $config */
$config = $this->grav['config'];
/** @var UniformResourceLocator $locator */
$locator = $this->grav['locator'];
$pagesDir = $locator->findResource('page://');
if ($config->get('system.cache.enabled')) {
/** @var Cache $cache */
$cache = $this->grav['cache'];
@@ -421,10 +448,10 @@ class Pages
$last_modified = 0;
break;
case 'folder':
$last_modified = Folder::lastModifiedFolder(PAGES_DIR);
$last_modified = Folder::lastModifiedFolder($pagesDir);
break;
default:
$last_modified = Folder::lastModifiedFile(PAGES_DIR);
$last_modified = Folder::lastModifiedFile($pagesDir);
}
$page_cache_id = md5(USER_DIR.$last_modified.$config->checksum());
@@ -432,7 +459,7 @@ class Pages
list($this->instances, $this->routes, $this->children, $taxonomy_map, $this->sort) = $cache->fetch($page_cache_id);
if (!$this->instances) {
$this->grav['debugger']->addMessage('Page cache missed, rebuilding pages..');
$this->recurse();
$this->recurse($pagesDir);
$this->buildRoutes();
// save pages, routes, taxonomy, and sort to cache
@@ -446,7 +473,7 @@ class Pages
$taxonomy->taxonomy($taxonomy_map);
}
} else {
$this->recurse();
$this->recurse($pagesDir);
$this->buildRoutes();
}
}
@@ -460,7 +487,7 @@ class Pages
* @throws \RuntimeException
* @internal
*/
protected function recurse($directory = PAGES_DIR, Page &$parent = null)
protected function recurse($directory, Page &$parent = null)
{
$directory = rtrim($directory, DS);
$iterator = new \DirectoryIterator($directory);