diff --git a/_test/tests/inc/pageutils_findnearest.test.php b/_test/tests/inc/pageutils_findnearest.test.php new file mode 100644 index 0000000000000000000000000000000000000000..e129b5e585e2581846d3ff28ba0f16d6170ec640 --- /dev/null +++ b/_test/tests/inc/pageutils_findnearest.test.php @@ -0,0 +1,40 @@ +<?php + +class pageutils_findnearest_test extends DokuWikiTest { + function testNoSidebar() { + global $ID; + + $ID = 'foo:bar:baz:test'; + $sidebar = page_findnearest('sidebar'); + $this->assertEquals(false, $sidebar); + } + + function testExistingSidebars() { + global $ID; + + saveWikiText('sidebar', 'topsidebar-test', ''); + + $ID = 'foo:bar:baz:test'; + $sidebar = page_findnearest('sidebar'); + $this->assertEquals('sidebar', $sidebar); + + $ID = 'foo'; + $sidebar = page_findnearest('sidebar'); + $this->assertEquals('sidebar', $sidebar); + + saveWikiText('foo:bar:sidebar', 'bottomsidebar-test', ''); + + $ID = 'foo:bar:baz:test'; + $sidebar = page_findnearest('sidebar'); + $this->assertEquals('foo:bar:sidebar', $sidebar); + + $ID = 'foo:bar:test'; + $sidebar = page_findnearest('sidebar'); + $this->assertEquals('foo:bar:sidebar', $sidebar); + + $ID = 'foo'; + $sidebar = page_findnearest('sidebar'); + $this->assertEquals('sidebar', $sidebar); + } + +} diff --git a/_test/tests/inc/template_sidebar.test.php b/_test/tests/inc/template_sidebar.test.php new file mode 100644 index 0000000000000000000000000000000000000000..56153894ab47c0e030845d4ee17d627e14d372d1 --- /dev/null +++ b/_test/tests/inc/template_sidebar.test.php @@ -0,0 +1,40 @@ +<?php + +class template_sidebar_test extends DokuWikiTest { + function testNoSidebar() { + global $ID; + + $ID = 'foo:bar:baz:test'; + $sidebar = tpl_sidebar(false); + $this->assertEquals('',$sidebar); + } + + function testExistingSidebars() { + global $ID; + + saveWikiText('sidebar', 'topsidebar-test', ''); + + $ID = 'foo:bar:baz:test'; + $sidebar = tpl_sidebar(false); + $this->assertTrue(strpos($sidebar, 'topsidebar-test') > 0); + + $ID = 'foo'; + $sidebar = tpl_sidebar(false); + $this->assertTrue(strpos($sidebar, 'topsidebar-test') > 0); + + saveWikiText('foo:bar:sidebar', 'bottomsidebar-test', ''); + + $ID = 'foo:bar:baz:test'; + $sidebar = tpl_sidebar(false); + $this->assertTrue(strpos($sidebar, 'bottomsidebar-test') > 0); + + $ID = 'foo:bar:test'; + $sidebar = tpl_sidebar(false); + $this->assertTrue(strpos($sidebar, 'bottomsidebar-test') > 0); + + $ID = 'foo'; + $sidebar = tpl_sidebar(false); + $this->assertTrue(strpos($sidebar, 'topsidebar-test') > 0); + } + +} diff --git a/inc/pageutils.php b/inc/pageutils.php index c94d14624857c7d0fe3166fbc43640b4ad01e22a..f525c44d06952f784de92a471ac86ac117c896fc 100644 --- a/inc/pageutils.php +++ b/inc/pageutils.php @@ -622,3 +622,27 @@ function utf8_decodeFN($file){ return urldecode($file); } +/** + * Find a page in the current namespace (determined from $ID) or any + * higher namespace + * + * Used for sidebars, but can be used other stuff as well + * + * @todo add event hook + * @param string $page the pagename you're looking for + * @return string|false the full page id of the found page, false if any + */ +function page_findnearest($page){ + global $ID; + + $ns = $ID; + do { + $ns = getNS($ns); + $pageid = ltrim("$ns:$page",':'); + if(page_exists($pageid)){ + return $pageid; + } + } while($ns); + + return false; +} diff --git a/inc/template.php b/inc/template.php index a18d7151f66a35dcf8956f209424b47869656cca..c9e899034dfb4f713645af8494b4791bb3662a96 100644 --- a/inc/template.php +++ b/inc/template.php @@ -1394,6 +1394,18 @@ function tpl_include_page($pageid,$print=true){ if(!$print) return $html; echo $html; + return $html; +} + +/** + * Include the sidebar, will check current namespaces first + */ +function tpl_sidebar($print=true){ + global $conf; + + $sidebar = page_findnearest($conf['sidebar']); + if($sidebar) return tpl_include_page($sidebar, $print); + return ''; } /** diff --git a/lib/tpl/dokuwiki/detail.php b/lib/tpl/dokuwiki/detail.php index a3516a7eda19f03d6f787ab9118d63e5cbcc1c31..5fe1a1ad7977e9909a23336530ac084ddee9f5fa 100644 --- a/lib/tpl/dokuwiki/detail.php +++ b/lib/tpl/dokuwiki/detail.php @@ -10,7 +10,7 @@ // must be run from within DokuWiki if (!defined('DOKU_INC')) die(); -$showSidebar = $conf['sidebar'] && page_exists($conf['sidebar']) && ($ACT=='show'); +$showSidebar = page_findnearest($conf['sidebar']) && ($ACT=='show'); ?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<?php echo $conf['lang']?>" diff --git a/lib/tpl/dokuwiki/main.php b/lib/tpl/dokuwiki/main.php index d8e85850fedae046de584bba5e1cc0ad97eebc57..e0b046574b82ec1192ca0a33257408638895eba2 100644 --- a/lib/tpl/dokuwiki/main.php +++ b/lib/tpl/dokuwiki/main.php @@ -10,7 +10,7 @@ if (!defined('DOKU_INC')) die(); /* must be run from within DokuWiki */ -$showSidebar = $conf['sidebar'] && page_exists($conf['sidebar']) && ($ACT=='show'); +$showSidebar = page_findnearest($conf['sidebar']) && ($ACT=='show'); ?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<?php echo $conf['lang'] ?>" @@ -41,7 +41,7 @@ $showSidebar = $conf['sidebar'] && page_exists($conf['sidebar']) && ($ACT=='show <div class="content"> <?php tpl_flush() ?> <?php tpl_includeFile('sidebarheader.html') ?> - <?php tpl_include_page($conf['sidebar']) ?> + <?php tpl_sidebar() ?> <?php tpl_includeFile('sidebarfooter.html') ?> </div> </div></div><!-- /aside -->