mirror of
https://github.com/silverstripe/silverstripe-docsviewer
synced 2024-10-22 11:05:56 +02:00
ENHANCEMENT: moved 404 page out to a separate template and altered DocumentationViewer to throw 404s on pages which do not resolve to anything. Fixes: #6616
This commit is contained in:
parent
15244a9934
commit
4830e09bad
@ -335,9 +335,12 @@ class DocumentationService {
|
||||
|
||||
if($modules) {
|
||||
foreach($modules as $key => $module) {
|
||||
if(is_dir(BASE_PATH .'/'. $module) && !in_array($module, self::get_ignored_files(), true)) {
|
||||
$dir = is_dir(Controller::join_links(BASE_PATH, $module));
|
||||
$ignored = in_array($module, self::get_ignored_files(), true);
|
||||
|
||||
if($dir && !$ignored) {
|
||||
// check to see if it has docs
|
||||
$docs = BASE_PATH .'/'. $module .'/docs/';
|
||||
$docs = Controller::join_links($dir, 'docs');
|
||||
|
||||
if(is_dir($docs)) {
|
||||
self::register($module, $docs, '', $module, true);
|
||||
@ -355,7 +358,13 @@ class DocumentationService {
|
||||
* @param String $code code
|
||||
*/
|
||||
public static function get_language_title($lang) {
|
||||
return (isset(self::$language_mapping[$lang])) ? _t("DOCUMENTATIONSERVICE.LANG-$lang", self::$language_mapping[$lang]) : $lang;
|
||||
$map = self::$language_mapping;
|
||||
|
||||
if(isset($map[$lang])) {
|
||||
return _t("DOCUMENTATIONSERVICE.LANG-$lang", $map[$lang]);
|
||||
}
|
||||
|
||||
return $lang;
|
||||
}
|
||||
|
||||
|
||||
|
@ -48,7 +48,7 @@ class DocumentationViewer extends Controller {
|
||||
protected static $link_base = 'dev/docs/';
|
||||
|
||||
/**
|
||||
* @var String|array Optional permssion check
|
||||
* @var String|array Optional permission check
|
||||
*/
|
||||
static $check_permission = 'ADMIN';
|
||||
|
||||
@ -59,12 +59,8 @@ class DocumentationViewer extends Controller {
|
||||
|
||||
// javascript
|
||||
Requirements::javascript(THIRDPARTY_DIR .'/jquery/jquery.js');
|
||||
Requirements::javascript('sapphiredocs/thirdparty/syntaxhighlighter/scripts/shCore.js');
|
||||
Requirements::javascript('sapphiredocs/thirdparty/syntaxhighlighter/scripts/shBrushJScript.js');
|
||||
Requirements::javascript('sapphiredocs/thirdparty/syntaxhighlighter/scripts/shBrushPhp.js');
|
||||
Requirements::javascript('sapphiredocs/thirdparty/syntaxhighlighter/scripts/shBrushXml.js');
|
||||
Requirements::javascript('sapphiredocs/thirdparty/syntaxhighlighter/scripts/shBrushCss.js');
|
||||
Requirements::javascript('sapphiredocs/javascript/shBrushSS.js');
|
||||
|
||||
Requirements::combine_files(
|
||||
'syntaxhighlighter.js',
|
||||
array(
|
||||
@ -97,11 +93,11 @@ class DocumentationViewer extends Controller {
|
||||
}
|
||||
|
||||
/**
|
||||
* Overloaded to avoid "action doesnt exist" errors - all URL parts in this
|
||||
* Overloaded to avoid "action doesn't exist" errors - all URL parts in this
|
||||
* controller are virtual and handled through handleRequest(), not controller methods.
|
||||
*/
|
||||
public function handleAction($request) {
|
||||
try{
|
||||
try {
|
||||
$response = parent::handleAction($request);
|
||||
} catch(SS_HTTPResponse_Exception $e) {
|
||||
if(strpos($e->getMessage(), 'does not exist') !== FALSE) {
|
||||
@ -141,6 +137,7 @@ class DocumentationViewer extends Controller {
|
||||
// allow assets
|
||||
if($firstParam == "assets") return parent::handleRequest($request);
|
||||
|
||||
// check for permalinks
|
||||
if($link = DocumentationPermalinks::map($firstParam)) {
|
||||
// the first param is a shortcode for a page so redirect the user to
|
||||
// the short code.
|
||||
@ -151,8 +148,14 @@ class DocumentationViewer extends Controller {
|
||||
|
||||
}
|
||||
|
||||
// check to see if the module is a valid module. If it isn't, then we
|
||||
// need to throw a 404.
|
||||
if(!DocumentationService::is_registered_module($firstParam)) {
|
||||
return $this->throw404();
|
||||
}
|
||||
|
||||
$this->module = $firstParam;
|
||||
$this->lang = $secondParam;
|
||||
$this->language = $secondParam;
|
||||
|
||||
if(isset($thirdParam) && (is_numeric($thirdParam) || in_array($thirdParam, array('master', 'trunk')))) {
|
||||
$this->version = $thirdParam;
|
||||
@ -166,28 +169,44 @@ class DocumentationViewer extends Controller {
|
||||
}
|
||||
|
||||
// 'current' version mapping
|
||||
$module = DocumentationService::is_registered_module($this->module, null, $this->getLang());
|
||||
|
||||
if($module) {
|
||||
$current = $module->getLatestVersion();
|
||||
$entity = DocumentationService::is_registered_module($this->module, null, $this->getLang());
|
||||
|
||||
if($entity) {
|
||||
$current = $entity->getLatestVersion();
|
||||
$version = $this->getVersion();
|
||||
|
||||
if(!$version || $version == '') {
|
||||
if(!$version) {
|
||||
$this->version = $current;
|
||||
}
|
||||
|
||||
// Check if page exists, otherwise return 404
|
||||
if(!$this->locationExists()) {
|
||||
$body = $this->renderWith(get_class($this));
|
||||
$this->response = new SS_HTTPResponse($body, 404);
|
||||
|
||||
return $this->response;
|
||||
return $this->throw404();
|
||||
}
|
||||
|
||||
|
||||
return parent::handleRequest($request);
|
||||
}
|
||||
|
||||
return parent::handleRequest($request);
|
||||
|
||||
return $this->throw404();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Helper function for throwing a 404 error from the {@link handleRequest}
|
||||
* method.
|
||||
*
|
||||
* @return HttpResponse
|
||||
*/
|
||||
function throw404() {
|
||||
$class = get_class($this);
|
||||
|
||||
$body = $this->renderWith(array("{$class}_error", $class));
|
||||
$this->response = new SS_HTTPResponse($body, 404);
|
||||
|
||||
return $this->response;
|
||||
}
|
||||
|
||||
/**
|
||||
* Custom templates for each of the sections.
|
||||
*/
|
||||
@ -404,6 +423,7 @@ class DocumentationViewer extends Controller {
|
||||
$module = $this->getModule();
|
||||
|
||||
if($module) {
|
||||
|
||||
$has_dir = is_dir(Controller::join_links(
|
||||
$module->getPath($this->getVersion(), $this->getLang()),
|
||||
implode('/', $this->Remaining)
|
||||
@ -567,37 +587,35 @@ class DocumentationViewer extends Controller {
|
||||
if($page) {
|
||||
return DBField::create("HTMLText", $page->getHTML($this->getVersion(), $this->getLang()));
|
||||
}
|
||||
else {
|
||||
// If no page found then we may want to get the listing of the folder.
|
||||
// In case no folder exists, show a "not found" page.
|
||||
$module = $this->getModule();
|
||||
$url = $this->Remaining;
|
||||
|
||||
if($url && $module) {
|
||||
$pages = DocumentationService::get_pages_from_folder(
|
||||
$module,
|
||||
implode('/', $url),
|
||||
false,
|
||||
$this->getVersion(),
|
||||
$this->getLang()
|
||||
);
|
||||
|
||||
// If no pages are found, the 404 is handled in the same template
|
||||
return $this->customise(array(
|
||||
'Title' => DocumentationService::clean_page_name(array_pop($url)),
|
||||
'Pages' => $pages
|
||||
))->renderWith('DocFolderListing');
|
||||
}
|
||||
else {
|
||||
// get all available modules and show a table of contents.
|
||||
|
||||
return $this->customise(array(
|
||||
'Title' => _t('DocumentationViewer.MODULES', 'Modules'),
|
||||
'Pages' => $this->getModules()
|
||||
))->renderWith('DocFolderListing');
|
||||
}
|
||||
}
|
||||
|
||||
// If no page found then we may want to get the listing of the folder.
|
||||
// In case no folder exists, show a "not found" page.
|
||||
$module = $this->getModule();
|
||||
$url = $this->Remaining;
|
||||
|
||||
if($url && $module) {
|
||||
$pages = DocumentationService::get_pages_from_folder(
|
||||
$module,
|
||||
implode('/', $url),
|
||||
false,
|
||||
$this->getVersion(),
|
||||
$this->getLang()
|
||||
);
|
||||
|
||||
return $this->customise(array(
|
||||
'Content' => false,
|
||||
'Title' => DocumentationService::clean_page_name(array_pop($url)),
|
||||
'Pages' => $pages
|
||||
))->renderWith('DocFolderListing');
|
||||
}
|
||||
else {
|
||||
return $this->customise(array(
|
||||
'Content' => false,
|
||||
'Title' => _t('DocumentationViewer.MODULES', 'Modules'),
|
||||
'Pages' => $this->getModules()
|
||||
))->renderWith('DocFolderListing');
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -1,13 +1,13 @@
|
||||
<% if Pages %>
|
||||
<div id="folder-listing">
|
||||
<h2>$Title</h2>
|
||||
|
||||
<div id="folder-listing">
|
||||
<h2>$Title</h2>
|
||||
|
||||
<% if Pages %>
|
||||
<ul>
|
||||
<% control Pages %>
|
||||
<li><a href="$Link">$Title</a></li>
|
||||
<% end_control %>
|
||||
</ul>
|
||||
</div>
|
||||
<% else %>
|
||||
<% include DocNotFound %>
|
||||
<% end_if %>
|
||||
<% else %>
|
||||
<p>No documentation pages found for $Title. If you need help writing documentation please consult the README.</p>
|
||||
<% end_if %>
|
||||
</div>
|
@ -1,24 +0,0 @@
|
||||
<div class="warningBox" id="pageNotFoundWarning">
|
||||
<div class="warningBoxTop">
|
||||
<h1>We're sorry…</h1>
|
||||
<p>The page you are looking for does not exist, or might have moved.
|
||||
<h5>Perhaps you could…</h5>
|
||||
<p>Return to the <a href="$BaseHref">homepage</a> or try searching for the page (see input box on the top right).</p>
|
||||
|
||||
<!--
|
||||
<h5>Search results for similar/related phrases</h5>
|
||||
<ul class="resetStyle">
|
||||
<li><a href="#">Installing</a></li>
|
||||
<li><a href="#">Upgrading</a></li>
|
||||
<li><a href="#">Server-requirements</a></li>
|
||||
<li><a href="#">Suggested-web-hosts</a></li>
|
||||
</ul>
|
||||
-->
|
||||
</div>
|
||||
<!-- <div class="warningBoxBottom">
|
||||
<ul>
|
||||
<li><a href="#">Report a missing link</a></li>
|
||||
<li><a href="#">Report a bug or a concren</a></li>
|
||||
</ul>
|
||||
</div> -->
|
||||
</div>
|
@ -1,10 +1,6 @@
|
||||
<div id="documentation-page">
|
||||
<div id="left-column">
|
||||
<% if Content %>
|
||||
$Content
|
||||
<% else %>
|
||||
<% include DocNotFound %>
|
||||
<% end_if %>
|
||||
$Content
|
||||
</div>
|
||||
|
||||
<% if Content %>
|
||||
|
13
templates/Layout/DocumentationViewer_error.ss
Normal file
13
templates/Layout/DocumentationViewer_error.ss
Normal file
@ -0,0 +1,13 @@
|
||||
<div id="documentation-page" class="documentation-error-page">
|
||||
<div class="warningBox" id="pageNotFoundWarning">
|
||||
<div class="warningBoxTop">
|
||||
<h1>We're sorry…</h1>
|
||||
<p>The page you are looking for does not exist, or might have moved.
|
||||
<h5>Perhaps you could…</h5>
|
||||
<ul>
|
||||
<li>Return to the <a href="$BaseHref">homepage</a></li>
|
||||
<li>Try searching for the page (see input box on the top right).</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
@ -50,8 +50,7 @@ class DocumentationViewerTest extends FunctionalTest {
|
||||
$this->assertEquals($response->getStatusCode(), 200, 'Existing base folder');
|
||||
|
||||
$response = $this->get('dev/docs/DocumentationViewerTests/en/2.4/');
|
||||
$this->assertEquals($response->getStatusCode(), 200, 'Existing base folder');
|
||||
|
||||
$this->assertEquals($response->getStatusCode(), 200, 'Existing base folder');
|
||||
|
||||
$response = $this->get('dev/docs/DocumentationViewerTests/en/2.3/nonexistant-subfolder');
|
||||
$this->assertEquals($response->getStatusCode(), 404, 'Nonexistant subfolder');
|
||||
@ -79,9 +78,14 @@ class DocumentationViewerTest extends FunctionalTest {
|
||||
|
||||
$response = $this->get('dev/docs/DocumentationViewerTests/en/3.0/test/');
|
||||
$this->assertEquals($response->getStatusCode(), 404, 'Missing page');
|
||||
|
||||
$response = $this->get('dev/docs/en');
|
||||
$this->assertEquals($response->getStatusCode(), 404, 'Must include a module');
|
||||
|
||||
$response = $this->get('dev/docs/DocumentationViewerTests/dk/');;
|
||||
$this->assertEquals($response->getStatusCode(), 404, 'Access a language that doesn\'t exist');
|
||||
}
|
||||
|
||||
|
||||
function testRouting() {
|
||||
$response = $this->get('dev/docs/DocumentationViewerTests/en/2.4');
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user