View source for Action: Navigation

Status: Implemented, work in progress
version: 0.3 (see repo)

{{toc numerate=1}}

Scroll to the previous or next page
Navigate between predefined pages / chapters
%%(wacko wrapper="shade" wrapper_type="note" wrapper_title="chapter navigation")
{{navigation
  prev="Footnotes"
  next="TemplateBoxes"
  main="/Dev/Release/R6.1"
}}
{{navigation
  prev="Footnotes"
  next="TemplateBoxes"
  main="/Dev/Release/R6.1"
  title=1
}}
%%

For display at the top and bottom of the page.

Static or dynamic, formatter or action.
  * The very moment it loads metadata like the page title via the page tag its dynamic.

``
{{navigation
  prev="ChapterOne"
  next="ChapterTwo"
  main="Overview"
}}
``

===Determination of pages and context===
  * cluster
    * how to define the order
    * subset of pages
  * predefined array, ##pages="Page1, Page2, Page3, ..."##
    * this can also be a ((/Dev/Release/R6.1/CustomizableSecondaryNavigation custom menu))
  * via parameter ##prev="PreviousPage"##, ##next="NextPage"## and ##main="MainPage"##

It is possible to define the navigation on every single page or include a dedicated section as page with dynamic determination.

===Options===
  * noinclude
    * ##""<!--noinclude-->""##, ##""<!--/noinclude-->""##
  * layout
    * ##table=1|0##
  * style
  * link text
    * page title - ##title=1##
    * default
    * custom

CSS
  * no-print

===Action===
====via link()====
source:master/src/action/navigation.php
%%(php)
<?php

if (!defined('IN_WACKO'))
{
	exit;
}

/* navigation action:
 *
 *
TODO:
	- add option to choose custom menu as data source
*/

$info = <<<EOD
Description:
	Generates navigation bars to navigate between chapters of a book.

Usage:
	{{navigation}}

Options:
	[main="Overview"]
		tag of overview
	[prev="PreviousPage"]
		tag of previous chapter
	[next="NextPage"]
		tag of next chapter
	[title=0|1]
		uses page title for links
EOD;

// set defaults
$help		??= 0;
$main		??= '';
$next		??= '';
$prev		??= '';
$table		??= 1;
$title		??= 0;
$track		??= true; // seems to have no effect


if ($help)
{
	$tpl->help	= $this->help($info, 'navigation');
	return;
}

// resolve relative tag
$_main	= $this->unwrap_link($main);
$_next	= $this->unwrap_link($next);
$_prev	= $this->unwrap_link($prev);

// preload link data
$pages	= [$_prev, $_main, $_next];

foreach ($pages as $page)
{
	if ($page != '')
	{
		$q_spages[]		= $this->db->q($page);
	}
}

$pages = $this->db->load_all(
	'SELECT ' . $this->page_meta . ' ' .
	'FROM ' . $this->prefix . 'page ' .
	'WHERE tag IN ( ' . implode(', ', $q_spages) . ' ) '
	, true);

$__main	= null;
$__next	= null;
$__prev	= null;

foreach ($pages as $page)
{
	$this->cache_page($page, true);
	$page_ids[]	= $page['page_id'];
	$this->page_id_cache[$page['tag']] = $page['page_id'];

	if ($page['tag'] == $_prev)
	{
		$__prev = $page;
	}
	if ($page['tag'] == $_main)
	{
		$__main = $page;
	}
	if ($page['tag'] == $_next)
	{
		$__next = $page;
	}
}

// cache acls
$this->preload_acl($page_ids, ['read']);

// fall back to tag
if (!$__prev)
{
	$__prev['tag']		= $_prev;
	$__prev['title']	= '';
}
if (!$__main)
{
	$__main['tag']		= $_main;
	$__main['title']	= '';
}
if (!$__next)
{
	$__next['tag']		= $_next;
	$__next['title']	= '';
}

// link text
$__main['text'] = '↑ ' .	($title ? $__main['title'] : $this->_t('Overview'));
$__prev['text'] = '« ' .	($title ? $__prev['title'] : $this->_t('Back'));
$__next['text'] =			($title ? $__next['title'] : $this->_t('Next'))		. ' »';

$__main['title'] = ($title ? '' : $__main['title']);
$__prev['title'] = ($title ? '' : $__prev['title']);
$__next['title'] = ($title ? '' : $__next['title']);

// define navigation links
$tpl->enter($table ? 'tbl_' : 'div_');
$tpl->main_link			= $this->link('/' . $__main['tag'], '', $__main['text'], $__main['title'], $track, true, false);

if ($prev)
{
	$tpl->prev_link		= $this->link('/' . $__prev['tag'], '', $__prev['text'], $__prev['title'], $track, true, false);
}

if ($next)
{
	$tpl->next_link		= $this->link('/' . $__next['tag'], '', $__next['text'], $__next['title'], $track, true, false);
}

if ($prev & $next)
{
	$tpl->separator	= true;
}

$tpl->leave();

%% 

====via href()====
static, no metadata lookup

%%(php)
<?php

if (!defined('IN_WACKO'))
{
	exit;
}

/* navigation action:
 *
 *
TODO:
	- add option to choose custom menu as data source
*/

$info = <<<EOD
Description:
	Generates navigation bars to navigate between chapters of a book.

Usage:
	{{navigation}}

Options:
	[main="Overview"]
		tag of overview
	[prev="PreviousPage"]
		tag of previous chapter
	[next="NextPage"]
		tag of next chapter
EOD;

// set defaults
$help			??= 0;
$main			??= '';
$next			??= '';
$prev			??= '';

if ($help)
{
	$tpl->help	= $this->help($info, 'navigation');
	return;
}


$tpl->enter('table_');
$tpl->main_href		= $this->href('', $this->unwrap_link($main));
$tpl->prev_href		= $this->href('', $this->unwrap_link($prev));
$tpl->next_href		= $this->href('', $this->unwrap_link($next));
$tpl->leave();
%% 
===Template===
The main goal is to have a customizable standard template for scrolling between pages.

#||
|| « Previous | Content |  Next » ||
|| ← Back to overview | | « Back ""|"" Next » ||
||#

The content section even could hold a drop down or fly-out menu with all available pages / chapters.
The next and previous button should show the page title via ##title="Chapter Two"## of the page.
The link text can be set individually.
  * prev, previous, Previous Chapter, back
  * next, Next Chapter, forward
  * Overview, Index, Content
  * page title, page_tag
  * custom link text
  * «, », ↑, ←, →

source:master/src/action/template/navigation.tpl
%%
[ === main === ]
<!--noinclude-->
	[ ' help ' ] 
	<nav class="nav-chapter no-print">
	[= tbl _ =
		<table>
			<tr>
				<td>
				[= prev _ =
					[ ' link ' ]
				=]
				</td>
				<td>
				[= main _ =
					[ ' link ' ]
				=]
				</td>
				<td>
				[= next _ =
					[ ' link ' ]
				=]
				</td>
			</tr>
		</table>
	=]
	[= div _ =
		[= main _ =
			[ ' link ' ]
		=]
		<div class="pagination">
		[= prev _ =
			[ ' link ' ]
		=]
		[= separator _ =
			[ ' nonstatic ' ]
		 | 
		=]
		[= next _ =
			[ ' link ' ]
		=]
		</div>
	=]
	</nav>
<!--/noinclude-->
%% 

%%
[ === main === ]
<!--noinclude-->
	[ ' help ' ] 
	<nav class="nav-capter no-print">
	[= table _ =
		<table>
			<tr>
				<td>
				[= prev _ =
					<a href="[ ' href ' ]">« [ ' _t: Back ' ]</a>
				=]
				</td>
				<td>
				[= main _ =
					<a href="[ ' href ' ]">↑ [ ' _t: Overview ' ]</a>
				=]
				</td>
				<td>
				[= next _ =
					<a href="[ ' href ' ]">[ ' _t: Next ' ] »</a>
				=]
				</td>
			</tr>
		</table>
	=]
	[= div _ =
		<div class="nav-capter">

		</div>
	=]
	</nav>
<!--/noinclude-->
%%

====CSS====
add to default.css
%%(css)
/* navigation action ------------- */
.nav-chapter {
	background-color: rgb(241, 241, 241);
	padding: 10px 10px;
}
.nav-chapter td:nth-child(1) {
	text-align: left;
	white-space: nowrap;
}
.nav-chapter td:nth-child(2) {
	text-align: center;
	width: 100%;
}
.nav-chapter td:nth-child(3) {
	text-align: right;
	white-space: nowrap;
}
%%


===ToDo===
workout of details
  * track links (?)
  * add option for alternate layout: ##table=1|0## (table|div layout)
  * add option for alternate link text
    * alternate standard text or combination 
    * via parameter, e.g. 
      * ##prev_text="Custom link text"##
      * via delimiter after the tag ##prev="ChapterOne|First Chapter"##
      * ##title=1## - uses page title
    * via sub template
  * add option to choose custom menu as data source
  * simplify and refactor draft
  * naming and wording
  * print handler displays links for hidden action

Add a good enough version (that will do for most cases) to the core, add some examples here for more advanced templates for copy and paste.
===Example===
##/Book/ChapterOne##
%%
{{navigation main="/Book" next="ChapterTwo"}}
%%

##/Book/ChapterTwo##
%%
{{navigation main="/Book" prev="ChapterOne" next="ChapterThree"}}
%%

##/Book/ChapterThree##
%%
{{navigation 
  main="/Book" 
  prev="ChapterTwo" 
  next="ChapterFour"
  title=1
}}
%%

===Changelog===
0.1 Intitial version
0.2 adds ##nav-chapter## class to CSS and message set for 'Overview'
0.3 adds parameter ##title=0|1##, shows page title as link text

===See also===
  * Forum: ((/Forum/Development/Workbench/ChapterNavigation Chapter Navigation))
  * ((/Dev/Release/R6.1/CustomizableSecondaryNavigation Customizable secondary navigation))