这里会显示出您选择的修订版和当前版本之间的差别。
— |
navi_plugin [2019/12/07 21:07] (当前版本) |
||
---|---|---|---|
行 1: | 行 1: | ||
+ | ====== navi Plugin ====== | ||
+ | |||
+ | ---- plugin ----\\ | ||
+ | description: | ||
+ | author | ||
+ | email : dokuwiki@cosmocode.de\\ | ||
+ | type : syntax\\ | ||
+ | lastupdate : 2019-03-20\\ | ||
+ | compatible : Detritus, Hrun, Elenor Of Tsort\\ | ||
+ | depends | ||
+ | conflicts | ||
+ | similar | ||
+ | tags : navigation, menu\\ | ||
+ | alter : true | ||
+ | |||
+ | sourcerepo : https:// | ||
+ | downloadurl: | ||
+ | bugtracker : https:// | ||
+ | ---- | ||
+ | |||
+ | This plugin allows you to create a nested navigation menu based on a list defined in a Wiki page. Lower navigation levels are shown or hidden dependent on the current page. It is intended for the use in the sidebar of a template supporting one (tested on Arctic). A notable feature is that it allows you to create hierarchical menus without the need of a hierarchical namespace structure. | ||
+ | |||
+ | ===== Download and Install =====\\ | ||
+ | [[https:// | ||
+ | |||
+ | Search and install the plugin using the [[plugin: | ||
+ | |||
+ | \\ | ||
+ | ==== Changes ==== | ||
+ | |||
+ | {{rss> | ||
+ | |||
+ | ===== Usage ===== | ||
+ | |||
+ | In the page defining the sidebar in your template add the following syntax: | ||
+ | |||
+ | {{navi> | ||
+ | |||
+ | where '' | ||
+ | |||
+ | Notes: | ||
+ | |||
+ | * The created menu is completely independent of any [[: | ||
+ | * The navigation menu page should contain exactly one unordered list, other content will be ignored\\ | ||
+ | * The list items should only contain links, any other syntax will be ignored\\ | ||
+ | * Each page linked in the list should occur only once | ||
+ | |||
+ | ==== Control Page Example ==== | ||
+ | |||
+ | The following would create a menu with 4 top level entries: " | ||
+ | \\ | ||
+ | * [[start|Welcome]]\\ | ||
+ | * [[Products|]]\\ | ||
+ | * [[Foomatic 2000|]]\\ | ||
+ | * [[Foomatic 2010|]]\\ | ||
+ | * [[Service|]]\\ | ||
+ | * [[about|About Foo Inc.]]\\ | ||
+ | * [[Contact|]]\\ | ||
+ | * [[syntax|Wiki Syntax]]\\ | ||
+ | |||
+ | </ | ||
+ | |||
+ | This allows you to create hierarchical menus without the need of a hierarchical namespace structure. | ||
+ | |||
+ | ==== Making use of Namespaces ==== | ||
+ | |||
+ | Sometimes the navi plugin is used to create collapsible, | ||
+ | |||
+ | By adding ''? | ||
+ | |||
+ | \\ | ||
+ | ===== Mods ===== | ||
+ | |||
+ | ==== Persistent level2 ==== | ||
+ | |||
+ | If you want the menu to always show the level2 items, and the deeper ones only when on the path, for example: | ||
+ | |||
+ | one\\ | ||
+ | two\\ | ||
+ | three\\ | ||
+ | four\\ | ||
+ | five <- you are here\\ | ||
+ | six\\ | ||
+ | seven\\ | ||
+ | height | ||
+ | |||
+ | You can replace the line 190-192 of syntax.php by : | ||
+ | |||
+ | <code php>\\ | ||
+ | $diff = array_diff($info[' | ||
+ | if (!empty($diff) && isset($diff[1])) {\\ | ||
+ | | ||
+ | }\\ | ||
+ | |||
+ | </ | ||
+ | |||
+ | This is tested and working with the plugin releas of 2016-10-12. | ||
+ | |||
+ | --- [[contact@nliautaud.fr|]] // | ||
+ | |||
+ | ==== Add class if child has item ====\\ | ||
+ | I modified the function render to use it a little bit like a dynamic version,\\ | ||
+ | Menuitems will have '' | ||
+ | If no Child is defined there is no list item.\\ | ||
+ | I add to the '' | ||
+ | --- [[user> | ||
+ | |||
+ | <code css>\\ | ||
+ | div.dokuwiki div.navigation li {\\ | ||
+ | list-style: none;\\ | ||
+ | margin-left: | ||
+ | }\\ | ||
+ | div.dokuwiki div.navigation li.open | ||
+ | div.dokuwiki div.navigation li.close | ||
+ | div.dokuwiki div.navigation li.level1 { margin-left: | ||
+ | div.dokuwiki div.navigation li.level2 { margin-left: | ||
+ | div.dokuwiki div.navigation li.level3 { margin-left: | ||
+ | div.dokuwiki div.navigation li.level4 { margin-left: | ||
+ | div.dokuwiki div.navigation li.level5 { margin-left: | ||
+ | |||
+ | </ | ||
+ | |||
+ | here is the mod | ||
+ | |||
+ | <code php> | ||
+ | |||
+ | /**\\ | ||
+ | * Create output\\ | ||
+ | *\\ | ||
+ | * We handle all modes (except meta) because we pass all output creation back to the parent\\ | ||
+ | * mod by Mark Wolfgruber 20.06.2011\\ | ||
+ | | ||
+ | */\\ | ||
+ | function render($format, | ||
+ | global $INFO;\\ | ||
+ | global $ID;\\ | ||
+ | $fn = $data[0];\\ | ||
+ | $opt = $data[2];\\ | ||
+ | $data = $data[1]; | ||
+ | |||
+ | if($format == ' | ||
+ | $R-> | ||
+ | return true;\\ | ||
+ | } | ||
+ | |||
+ | $R-> | ||
+ | |||
+ | $parent = array();\\ | ||
+ | if(isset($data[$INFO[' | ||
+ | $parent = (array) $data[$INFO[' | ||
+ | array_push($parent, | ||
+ | $current = $INFO[' | ||
+ | }elseif($opt == ' | ||
+ | $ns = $INFO[' | ||
+ | |||
+ | // traverse up for matching namespaces\\ | ||
+ | do {\\ | ||
+ | $ns = getNS($ns); | ||
+ | $try = " | ||
+ | resolve_pageid('', | ||
+ | if(isset($data[$try])){\\ | ||
+ | // got a start page\\ | ||
+ | $parent = (array) $data[$try][' | ||
+ | array_push($parent, | ||
+ | $current = $try;\\ | ||
+ | break;\\ | ||
+ | }else{\\ | ||
+ | // search for the first page matching the namespace\\ | ||
+ | | ||
+ | if(getNS($key) == $ns){\\ | ||
+ | $parent = (array) $data[$key][' | ||
+ | array_push($parent, | ||
+ | $current = $key;\\ | ||
+ | break 2;\\ | ||
+ | } \\ | ||
+ | } \\ | ||
+ | } | ||
+ | |||
+ | } while($ns); | ||
+ | } | ||
+ | |||
+ | // we need the top ID for the renderer\\ | ||
+ | $oldid = $ID;\\ | ||
+ | $ID = $INFO[' | ||
+ | |||
+ | // create a correctly nested list (or so I hope)\\ | ||
+ | // $open = false; /** deacivated by mark **/\\ | ||
+ | $lvl = 1;\\ | ||
+ | $R-> | ||
+ | |||
+ | // read if item has childs and if it is open or closed /** mod by mark **/\\ | ||
+ | $upper=array(); | ||
+ | foreach((array) $data as $pid => $info){\\ | ||
+ | $state=(array_diff($info[' | ||
+ | $countparents=count($info[' | ||
+ | if ( $countparents > ' | ||
+ | for($i=0; $i < $countparents; | ||
+ | $upperlevel=$countparents-1; | ||
+ | $upper[$info[' | ||
+ | }\\ | ||
+ | } \\ | ||
+ | } /** mod by mark **/ \\ | ||
+ | unset($pid); | ||
+ | \\ | ||
+ | // read if item has childs if it is open or closed\\ | ||
+ | foreach((array) $data as $pid => $info){\\ | ||
+ | // only show if we are in the " | ||
+ | if(array_diff($info[' | ||
+ | \\ | ||
+ | if ($upper[$pid]) { /** mod by mark **/\\ | ||
+ | $menuitem=($upper[$pid]==' | ||
+ | } else {\\ | ||
+ | $menuitem=''; | ||
+ | } /** mod by mark **/ | ||
+ | |||
+ | // skip every non readable page\\ | ||
+ | if(auth_quickaclcheck(cleanID($info[' | ||
+ | \\ | ||
+ | if($info[' | ||
+ | // if($open) $R-> | ||
+ | $R-> | ||
+ | // $open = true; /** deacivated by mark **/\\ | ||
+ | }elseif($lvl > $info[' | ||
+ | for($lvl; $lvl > $info[' | ||
+ | // $R-> | ||
+ | // $R-> | ||
+ | }\\ | ||
+ | // $R-> | ||
+ | $R-> | ||
+ | }elseif($lvl < $info[' | ||
+ | // more than one run is bad nesting!\\ | ||
+ | for($lvl; $lvl < $info[' | ||
+ | // $R-> | ||
+ | $R-> | ||
+ | // $open = true; /** deacivated by mark **/\\ | ||
+ | }\\ | ||
+ | }\\ | ||
+ | \\ | ||
+ | $R-> | ||
+ | if(($format == ' | ||
+ | $R-> | ||
+ | if(($format == ' | ||
+ | $R-> | ||
+ | $R-> | ||
+ | }\\ | ||
+ | /* while($lvl > 0){ \\ | ||
+ | $R-> | ||
+ | $R-> | ||
+ | $lvl--;\\ | ||
+ | } /** deacivated by mark **/\\ | ||
+ | $R-> | ||
+ | |||
+ | $ID = $oldid; | ||
+ | |||
+ | return true;\\ | ||
+ | } | ||
+ | |||
+ | |||
+ | </ | ||
+ | |||
+ | ===== BUG =====\\ | ||
+ | ==== first submenu item level1 instead level2 ==== | ||
+ | |||
+ | i tried this plugin and have a problem with the first submenu item. it have to be in the div class level2 but it became level1 after the script did his work --- [[user> | ||
+ | |||
+ | > found the error: | ||
+ | > replace $lvl with $info[' | ||
+ | |||
+ | }elseif($lvl < $info[' | ||
+ | // more than one run is bad nesting!\\ | ||
+ | for($lvl; $lvl < $info[' | ||
+ | $R-> | ||
+ | $R-> | ||
+ | $open = true;\\ | ||
+ | } | ||
+ | |||
+ | |||
+ | </ | ||
+ | |||
+ | ==== Rendering Bugs ==== | ||
+ | |||
+ | The closing of open menu entries does not work. \\ | ||
+ | The open menu child entries are on the same level like the main menu entries.\\ | ||
+ | The user does not see any indicator for child menu items if the main menu is closed. | ||
+ | |||
+ | Tested with the code modifications on this page with Dokuwiki dokuwiki-rc2011-11-10.tgz “Angua”. \\ | ||
+ | HH 29.12.2011 | ||
+ | |||