<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://docs.moodle.org/dev/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Sethblueearth</id>
	<title>MoodleDocs - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://docs.moodle.org/dev/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Sethblueearth"/>
	<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/Special:Contributions/Sethblueearth"/>
	<updated>2026-08-12T09:33:16Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Navigation_API&amp;diff=33150</id>
		<title>Navigation API</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Navigation_API&amp;diff=33150"/>
		<updated>2012-04-06T19:18:43Z</updated>

		<summary type="html">&lt;p&gt;Sethblueearth: /* Module */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Overview==&lt;br /&gt;
The Navigation API allows for the manipulation of the navigation system used in Moodle.&lt;br /&gt;
&lt;br /&gt;
==What the navigation is==&lt;br /&gt;
It&#039;s very important to understand what the navigation is exactly within Moodle. One of the goals for Moodle 2.0 was to standardise navigation throughout Moodle and try to bring order to the structure of a Moodle site.  Navigation is available through the page object &#039;&#039;&#039;$PAGE&#039;&#039;&#039;, against which you set the heading for the page, the title, any JavaScript requirements, etc.  The navigation structure uses the information $PAGE contains to generate a navigation structure for the site.  The navigation or settings [[blocks]] are interpretations of the navigation structure Moodle creates.&lt;br /&gt;
&lt;br /&gt;
This navigation structure is available through three variables:&lt;br /&gt;
&lt;br /&gt;
; $PAGE-&amp;gt;navigation : This is the main navigation structure, it will contain items that will allow the user to browse to the other available pages.&lt;br /&gt;
; $PAGE-&amp;gt;settingsnav : This is the settings navigation structure contains items that will allow the user to edit settings.&lt;br /&gt;
; $PAGE-&amp;gt;navbar : The navbar is a special structure for page breadcrumbs.&lt;br /&gt;
&lt;br /&gt;
==What the navigation is not==&lt;br /&gt;
The navigation is &#039;&#039;&#039;NOT&#039;&#039;&#039; the navigation block or the settings block!  These two blocks were created to display the navigation structure. The navigation block looks at &#039;&#039;$PAGE-&amp;gt;navigation&#039;&#039;, and the settings block looks at &#039;&#039;$PAGE-&amp;gt;settingsnav&#039;&#039;.  Both blocks interpret their data into an HTML structure and render it.&lt;br /&gt;
&lt;br /&gt;
# The navigation is a back-end structure that is built behind the scenes and has no immediate method of display.&lt;br /&gt;
# The navigation and settings blocks display the back-end navigation structure but add nothing to it at all.&lt;br /&gt;
::In the [[model-view-controller pattern]], $PAGE-&amp;gt;navigation, $PAGE-&amp;gt;settingsnav, and $PAGE-&amp;gt;navbar are the models, and the blocks are views.&lt;br /&gt;
&lt;br /&gt;
The navbar is just the path to the active navigation or settings item. The navbar is not displayed by a block; instead it is added into the theme&#039;s layout files and displayed by the core renderer. &lt;br /&gt;
&lt;br /&gt;
==How the navigation works==&lt;br /&gt;
&lt;br /&gt;
The main navigation structure can be accessed through &#039;&#039;&#039;$PAGE-&amp;gt;navigation&#039;&#039;&#039;.  The navigation and settings are contextual in that they will relate to the page that the user is viewing. This is determined by other $PAGE object properties:&lt;br /&gt;
* &#039;&#039;&#039;$PAGE-&amp;gt;context&#039;&#039;&#039; is a Moodle context that immediately outlines the nature of the page the user is viewing.&lt;br /&gt;
* &#039;&#039;&#039;$PAGE-&amp;gt;course&#039;&#039;&#039; is the course the user is viewing.  This is essential if the context is CONTEXT_COURSE or greater.  However, it is also useful in other contexts such as CONTEXT_USER.&lt;br /&gt;
* &#039;&#039;&#039;$PAGE-&amp;gt;cm&#039;&#039;&#039; is the course module instance.  This is essential if the context is CONTEXT_MODULE or greater.&lt;br /&gt;
* &#039;&#039;&#039;$PAGE-&amp;gt;url&#039;&#039;&#039; is used to match the active navigation item. &lt;br /&gt;
&lt;br /&gt;
Nearly every page sets $PAGE-&amp;gt;url through a call to &#039;&#039;&#039;$PAGE-&amp;gt;set_url&#039;&#039;&#039; however not many explicitly set the context, course, or cm. When you call &#039;&#039;&#039;require_login&#039;&#039;&#039; with a course or cm it automatically calls the following:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
if ($cm) {&lt;br /&gt;
    $PAGE-&amp;gt;set_cm($cm, $course); // set&#039;s up global $COURSE&lt;br /&gt;
} else {&lt;br /&gt;
    $PAGE-&amp;gt;set_course($course);// set&#039;s up global $COURSE&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A page will only be required to explicitly set a context, course, or cm under one of these conditions:&lt;br /&gt;
# &#039;&#039;&#039;require_login&#039;&#039;&#039; is NOT being called correctly&lt;br /&gt;
# The page is using CONTEXT_SYSTEM, CONTEXT_COURSECAT, or CONTEXT_USER (call &#039;&#039;&#039;$PAGE-&amp;gt;set_context&#039;&#039;&#039; ).&lt;br /&gt;
# The page is using a course or cm but it is also using one of the above contexts (call &#039;&#039;&#039;$PAGE-&amp;gt;set_course&#039;&#039;&#039; or &#039;&#039;&#039;$PAGE-&amp;gt;set_cm&#039;&#039;&#039; ).&lt;br /&gt;
&lt;br /&gt;
The navigation structure cannot be generated before the $PAGE object is configured. It is only generated when it is first used, either when something tries to access the structure or when code tries to add to it.  The navigation is initialised in a specific order:&lt;br /&gt;
# Main navigation structure&lt;br /&gt;
# Settings navigation&lt;br /&gt;
# Navbar (does not need to be generated because of its simple contents and rendering)&lt;br /&gt;
&lt;br /&gt;
==Extending the navigation==&lt;br /&gt;
&lt;br /&gt;
===Code extension===&lt;br /&gt;
This method of extending is when the code arbitrarily extends the navigation during its execution. Extending the navigation through this means allows you to extend the navigation anywhere easily, however it will only be shown on pages where your extending code gets called (you should probably put it in a function within lib.php).&lt;br /&gt;
&lt;br /&gt;
These examples are taken from the [http://moodle.org/mod/forum/discuss.php?d=152391 General Developer Forum: Moodle 2 - how to set up breadcrumbs for a module page]. It has further information that is well worth reading.&lt;br /&gt;
====Navigation====&lt;br /&gt;
This is extending the main navigation structure.&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$previewnode = $PAGE-&amp;gt;navigation-&amp;gt;add(get_string(&#039;preview&#039;), new moodle_url(&#039;/a/link/if/you/want/one.php&#039;), navigation_node::TYPE_CONTAINER);&lt;br /&gt;
$thingnode = $previewnode-&amp;gt;add(get_string(&#039;name of thing&#039;), new moodle_url(&#039;/a/link/if/you/want/one.php&#039;));&lt;br /&gt;
$thingnode-&amp;gt;make_active();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
The above lines of code adds a preview node to the bottom of the navigation and then adds a thingnode to the previewnode (adding a leaf to our tree).&lt;br /&gt;
The final line of code makes the thingnode active so that the navbar finds it however if the URL you give it is the same as the url you set for the page it will automatically be marked active and you won&#039;t need this call.&lt;br /&gt;
&lt;br /&gt;
Next extending the navigation for the course.&lt;br /&gt;
For this you will need to know the course id and have called require_login($courseorid); so that the navigation is loaded for the course.&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$coursenode = $PAGE-&amp;gt;navigation-&amp;gt;find($courseid, navigation_node::TYPE_COURSE);&lt;br /&gt;
$thingnode = $coursenode-&amp;gt;add(get_string(&#039;Name of thing&#039;), new moodle_url(&#039;/a/link/if/you/want/one.php&#039;));&lt;br /&gt;
$thingnode-&amp;gt;make_active();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
The new bit of code here really is the first line which simply finds the course node, to do this we give it the course id and the node type in this case TYPE_COURSE.&lt;br /&gt;
What we are doing here is relying on the navigation to generate the navigation up to the course and then just adding to the course.&lt;br /&gt;
====Settings navigation====&lt;br /&gt;
Adding to the settings navigation is very similar to navigation&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$settingnode = $PAGE-&amp;gt;settingsnav-&amp;gt;add(get_string(&#039;setting&#039;), new moodle_url(&#039;/a/link/if/you/want/one.php&#039;), navigation_node::TYPE_CONTAINER);&lt;br /&gt;
$thingnode = $settingnode-&amp;gt;add(get_string(&#039;Name of thing&#039;), new moodle_url(&#039;/a/link/if/you/want/one.php&#039;));&lt;br /&gt;
$thingnode-&amp;gt;make_active();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
====Navbar====&lt;br /&gt;
This is extending the settings navigation.&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$PAGE-&amp;gt;navbar-&amp;gt;ignore_active();&lt;br /&gt;
$PAGE-&amp;gt;navbar-&amp;gt;add(get_string(&#039;preview&#039;), new moodle_url(&#039;/a/link/if/you/want/one.php&#039;));&lt;br /&gt;
$PAGE-&amp;gt;navbar-&amp;gt;add(get_string(&#039;name of thing&#039;), new moodle_url(&#039;/a/link/if/you/want/one.php&#039;));&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
The above code tells the navbar to ignore what ever the active page was and just use what you add, at which point we add two items as shown.&lt;br /&gt;
===Plugin Callbacks===&lt;br /&gt;
These are specific functions that the navigation looks for and calls if they exist for the plugin, presently only three plugin types can extend the navigation through these call-backs.&lt;br /&gt;
====Module====&lt;br /&gt;
Modules have two call-back methods, first to extend the navigation, and second to extend the settings. These call-backs get called when ever the user is viewing a page within the module and should only extend the navigation for the module.&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
function {modulename}_extend_navigation(${modulename}node, $course, $module, $cm)&lt;br /&gt;
function {modulename}_extend_settings_navigation($settings, ${modulename}node)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Course Formats====&lt;br /&gt;
Course formats are able to completely redefine the way in which navigation is generated for a course, as well as this they also have several methods to ensure the navigation is generated correctly.&lt;br /&gt;
====Course Reports====&lt;br /&gt;
By default reports don&#039;t add themselves or anything else to the navigation however there is a call-back that can be implemented to allow them to do so.&lt;br /&gt;
&lt;br /&gt;
==FAQ&#039;s and troubleshooting==&lt;br /&gt;
&#039;&#039;&#039;Q.&#039;&#039;&#039; My page is on the navigation but it doesn&#039;t find it?&lt;br /&gt;
&lt;br /&gt;
The first thing to do here is check the URL you are setting for the page. It should match the URL your page has within the navigation. If it doesn&#039;t you have two options, first change your &#039;&#039;&#039;$PAGE-&amp;gt;set_url&#039;&#039;&#039; call, or second override the URL the navigation is using to find the active node as shown below:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
navigation_node::override_active_url(new moodle_url(&#039;/your/url/here.php&#039;, array(&#039;param&#039;=&amp;gt;&#039;value&#039;)));&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
* [[Core APIs]]&lt;br /&gt;
&lt;br /&gt;
[[Category:API]]&lt;/div&gt;</summary>
		<author><name>Sethblueearth</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Navigation_API&amp;diff=33149</id>
		<title>Navigation API</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Navigation_API&amp;diff=33149"/>
		<updated>2012-04-06T19:18:19Z</updated>

		<summary type="html">&lt;p&gt;Sethblueearth: /* Module */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Overview==&lt;br /&gt;
The Navigation API allows for the manipulation of the navigation system used in Moodle.&lt;br /&gt;
&lt;br /&gt;
==What the navigation is==&lt;br /&gt;
It&#039;s very important to understand what the navigation is exactly within Moodle. One of the goals for Moodle 2.0 was to standardise navigation throughout Moodle and try to bring order to the structure of a Moodle site.  Navigation is available through the page object &#039;&#039;&#039;$PAGE&#039;&#039;&#039;, against which you set the heading for the page, the title, any JavaScript requirements, etc.  The navigation structure uses the information $PAGE contains to generate a navigation structure for the site.  The navigation or settings [[blocks]] are interpretations of the navigation structure Moodle creates.&lt;br /&gt;
&lt;br /&gt;
This navigation structure is available through three variables:&lt;br /&gt;
&lt;br /&gt;
; $PAGE-&amp;gt;navigation : This is the main navigation structure, it will contain items that will allow the user to browse to the other available pages.&lt;br /&gt;
; $PAGE-&amp;gt;settingsnav : This is the settings navigation structure contains items that will allow the user to edit settings.&lt;br /&gt;
; $PAGE-&amp;gt;navbar : The navbar is a special structure for page breadcrumbs.&lt;br /&gt;
&lt;br /&gt;
==What the navigation is not==&lt;br /&gt;
The navigation is &#039;&#039;&#039;NOT&#039;&#039;&#039; the navigation block or the settings block!  These two blocks were created to display the navigation structure. The navigation block looks at &#039;&#039;$PAGE-&amp;gt;navigation&#039;&#039;, and the settings block looks at &#039;&#039;$PAGE-&amp;gt;settingsnav&#039;&#039;.  Both blocks interpret their data into an HTML structure and render it.&lt;br /&gt;
&lt;br /&gt;
# The navigation is a back-end structure that is built behind the scenes and has no immediate method of display.&lt;br /&gt;
# The navigation and settings blocks display the back-end navigation structure but add nothing to it at all.&lt;br /&gt;
::In the [[model-view-controller pattern]], $PAGE-&amp;gt;navigation, $PAGE-&amp;gt;settingsnav, and $PAGE-&amp;gt;navbar are the models, and the blocks are views.&lt;br /&gt;
&lt;br /&gt;
The navbar is just the path to the active navigation or settings item. The navbar is not displayed by a block; instead it is added into the theme&#039;s layout files and displayed by the core renderer. &lt;br /&gt;
&lt;br /&gt;
==How the navigation works==&lt;br /&gt;
&lt;br /&gt;
The main navigation structure can be accessed through &#039;&#039;&#039;$PAGE-&amp;gt;navigation&#039;&#039;&#039;.  The navigation and settings are contextual in that they will relate to the page that the user is viewing. This is determined by other $PAGE object properties:&lt;br /&gt;
* &#039;&#039;&#039;$PAGE-&amp;gt;context&#039;&#039;&#039; is a Moodle context that immediately outlines the nature of the page the user is viewing.&lt;br /&gt;
* &#039;&#039;&#039;$PAGE-&amp;gt;course&#039;&#039;&#039; is the course the user is viewing.  This is essential if the context is CONTEXT_COURSE or greater.  However, it is also useful in other contexts such as CONTEXT_USER.&lt;br /&gt;
* &#039;&#039;&#039;$PAGE-&amp;gt;cm&#039;&#039;&#039; is the course module instance.  This is essential if the context is CONTEXT_MODULE or greater.&lt;br /&gt;
* &#039;&#039;&#039;$PAGE-&amp;gt;url&#039;&#039;&#039; is used to match the active navigation item. &lt;br /&gt;
&lt;br /&gt;
Nearly every page sets $PAGE-&amp;gt;url through a call to &#039;&#039;&#039;$PAGE-&amp;gt;set_url&#039;&#039;&#039; however not many explicitly set the context, course, or cm. When you call &#039;&#039;&#039;require_login&#039;&#039;&#039; with a course or cm it automatically calls the following:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
if ($cm) {&lt;br /&gt;
    $PAGE-&amp;gt;set_cm($cm, $course); // set&#039;s up global $COURSE&lt;br /&gt;
} else {&lt;br /&gt;
    $PAGE-&amp;gt;set_course($course);// set&#039;s up global $COURSE&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A page will only be required to explicitly set a context, course, or cm under one of these conditions:&lt;br /&gt;
# &#039;&#039;&#039;require_login&#039;&#039;&#039; is NOT being called correctly&lt;br /&gt;
# The page is using CONTEXT_SYSTEM, CONTEXT_COURSECAT, or CONTEXT_USER (call &#039;&#039;&#039;$PAGE-&amp;gt;set_context&#039;&#039;&#039; ).&lt;br /&gt;
# The page is using a course or cm but it is also using one of the above contexts (call &#039;&#039;&#039;$PAGE-&amp;gt;set_course&#039;&#039;&#039; or &#039;&#039;&#039;$PAGE-&amp;gt;set_cm&#039;&#039;&#039; ).&lt;br /&gt;
&lt;br /&gt;
The navigation structure cannot be generated before the $PAGE object is configured. It is only generated when it is first used, either when something tries to access the structure or when code tries to add to it.  The navigation is initialised in a specific order:&lt;br /&gt;
# Main navigation structure&lt;br /&gt;
# Settings navigation&lt;br /&gt;
# Navbar (does not need to be generated because of its simple contents and rendering)&lt;br /&gt;
&lt;br /&gt;
==Extending the navigation==&lt;br /&gt;
&lt;br /&gt;
===Code extension===&lt;br /&gt;
This method of extending is when the code arbitrarily extends the navigation during its execution. Extending the navigation through this means allows you to extend the navigation anywhere easily, however it will only be shown on pages where your extending code gets called (you should probably put it in a function within lib.php).&lt;br /&gt;
&lt;br /&gt;
These examples are taken from the [http://moodle.org/mod/forum/discuss.php?d=152391 General Developer Forum: Moodle 2 - how to set up breadcrumbs for a module page]. It has further information that is well worth reading.&lt;br /&gt;
====Navigation====&lt;br /&gt;
This is extending the main navigation structure.&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$previewnode = $PAGE-&amp;gt;navigation-&amp;gt;add(get_string(&#039;preview&#039;), new moodle_url(&#039;/a/link/if/you/want/one.php&#039;), navigation_node::TYPE_CONTAINER);&lt;br /&gt;
$thingnode = $previewnode-&amp;gt;add(get_string(&#039;name of thing&#039;), new moodle_url(&#039;/a/link/if/you/want/one.php&#039;));&lt;br /&gt;
$thingnode-&amp;gt;make_active();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
The above lines of code adds a preview node to the bottom of the navigation and then adds a thingnode to the previewnode (adding a leaf to our tree).&lt;br /&gt;
The final line of code makes the thingnode active so that the navbar finds it however if the URL you give it is the same as the url you set for the page it will automatically be marked active and you won&#039;t need this call.&lt;br /&gt;
&lt;br /&gt;
Next extending the navigation for the course.&lt;br /&gt;
For this you will need to know the course id and have called require_login($courseorid); so that the navigation is loaded for the course.&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$coursenode = $PAGE-&amp;gt;navigation-&amp;gt;find($courseid, navigation_node::TYPE_COURSE);&lt;br /&gt;
$thingnode = $coursenode-&amp;gt;add(get_string(&#039;Name of thing&#039;), new moodle_url(&#039;/a/link/if/you/want/one.php&#039;));&lt;br /&gt;
$thingnode-&amp;gt;make_active();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
The new bit of code here really is the first line which simply finds the course node, to do this we give it the course id and the node type in this case TYPE_COURSE.&lt;br /&gt;
What we are doing here is relying on the navigation to generate the navigation up to the course and then just adding to the course.&lt;br /&gt;
====Settings navigation====&lt;br /&gt;
Adding to the settings navigation is very similar to navigation&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$settingnode = $PAGE-&amp;gt;settingsnav-&amp;gt;add(get_string(&#039;setting&#039;), new moodle_url(&#039;/a/link/if/you/want/one.php&#039;), navigation_node::TYPE_CONTAINER);&lt;br /&gt;
$thingnode = $settingnode-&amp;gt;add(get_string(&#039;Name of thing&#039;), new moodle_url(&#039;/a/link/if/you/want/one.php&#039;));&lt;br /&gt;
$thingnode-&amp;gt;make_active();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
====Navbar====&lt;br /&gt;
This is extending the settings navigation.&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$PAGE-&amp;gt;navbar-&amp;gt;ignore_active();&lt;br /&gt;
$PAGE-&amp;gt;navbar-&amp;gt;add(get_string(&#039;preview&#039;), new moodle_url(&#039;/a/link/if/you/want/one.php&#039;));&lt;br /&gt;
$PAGE-&amp;gt;navbar-&amp;gt;add(get_string(&#039;name of thing&#039;), new moodle_url(&#039;/a/link/if/you/want/one.php&#039;));&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
The above code tells the navbar to ignore what ever the active page was and just use what you add, at which point we add two items as shown.&lt;br /&gt;
===Plugin Callbacks===&lt;br /&gt;
These are specific functions that the navigation looks for and calls if they exist for the plugin, presently only three plugin types can extend the navigation through these call-backs.&lt;br /&gt;
====Module====&lt;br /&gt;
Modules have two call-back methods, first to extend the navigation, and second to extend the settings. These call-backs get called when ever the user is viewing a page within the module and should only extend the navigation for the module.&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
function {modulename}_extend_navigation(${modulename}node, $course, $module, $cm)&lt;br /&gt;
function {modulename}_extend_settings_navigation($settings, ${modulename}node)&lt;br /&gt;
&lt;br /&gt;
====Course Formats====&lt;br /&gt;
Course formats are able to completely redefine the way in which navigation is generated for a course, as well as this they also have several methods to ensure the navigation is generated correctly.&lt;br /&gt;
====Course Reports====&lt;br /&gt;
By default reports don&#039;t add themselves or anything else to the navigation however there is a call-back that can be implemented to allow them to do so.&lt;br /&gt;
&lt;br /&gt;
==FAQ&#039;s and troubleshooting==&lt;br /&gt;
&#039;&#039;&#039;Q.&#039;&#039;&#039; My page is on the navigation but it doesn&#039;t find it?&lt;br /&gt;
&lt;br /&gt;
The first thing to do here is check the URL you are setting for the page. It should match the URL your page has within the navigation. If it doesn&#039;t you have two options, first change your &#039;&#039;&#039;$PAGE-&amp;gt;set_url&#039;&#039;&#039; call, or second override the URL the navigation is using to find the active node as shown below:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
navigation_node::override_active_url(new moodle_url(&#039;/your/url/here.php&#039;, array(&#039;param&#039;=&amp;gt;&#039;value&#039;)));&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
* [[Core APIs]]&lt;br /&gt;
&lt;br /&gt;
[[Category:API]]&lt;/div&gt;</summary>
		<author><name>Sethblueearth</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Navigation_API&amp;diff=33148</id>
		<title>Navigation API</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Navigation_API&amp;diff=33148"/>
		<updated>2012-04-06T19:10:08Z</updated>

		<summary type="html">&lt;p&gt;Sethblueearth: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Overview==&lt;br /&gt;
The Navigation API allows for the manipulation of the navigation system used in Moodle.&lt;br /&gt;
&lt;br /&gt;
==What the navigation is==&lt;br /&gt;
It&#039;s very important to understand what the navigation is exactly within Moodle. One of the goals for Moodle 2.0 was to standardise navigation throughout Moodle and try to bring order to the structure of a Moodle site.  Navigation is available through the page object &#039;&#039;&#039;$PAGE&#039;&#039;&#039;, against which you set the heading for the page, the title, any JavaScript requirements, etc.  The navigation structure uses the information $PAGE contains to generate a navigation structure for the site.  The navigation or settings [[blocks]] are interpretations of the navigation structure Moodle creates.&lt;br /&gt;
&lt;br /&gt;
This navigation structure is available through three variables:&lt;br /&gt;
&lt;br /&gt;
; $PAGE-&amp;gt;navigation : This is the main navigation structure, it will contain items that will allow the user to browse to the other available pages.&lt;br /&gt;
; $PAGE-&amp;gt;settingsnav : This is the settings navigation structure contains items that will allow the user to edit settings.&lt;br /&gt;
; $PAGE-&amp;gt;navbar : The navbar is a special structure for page breadcrumbs.&lt;br /&gt;
&lt;br /&gt;
==What the navigation is not==&lt;br /&gt;
The navigation is &#039;&#039;&#039;NOT&#039;&#039;&#039; the navigation block or the settings block!  These two blocks were created to display the navigation structure. The navigation block looks at &#039;&#039;$PAGE-&amp;gt;navigation&#039;&#039;, and the settings block looks at &#039;&#039;$PAGE-&amp;gt;settingsnav&#039;&#039;.  Both blocks interpret their data into an HTML structure and render it.&lt;br /&gt;
&lt;br /&gt;
# The navigation is a back-end structure that is built behind the scenes and has no immediate method of display.&lt;br /&gt;
# The navigation and settings blocks display the back-end navigation structure but add nothing to it at all.&lt;br /&gt;
::In the [[model-view-controller pattern]], $PAGE-&amp;gt;navigation, $PAGE-&amp;gt;settingsnav, and $PAGE-&amp;gt;navbar are the models, and the blocks are views.&lt;br /&gt;
&lt;br /&gt;
The navbar is just the path to the active navigation or settings item. The navbar is not displayed by a block; instead it is added into the theme&#039;s layout files and displayed by the core renderer. &lt;br /&gt;
&lt;br /&gt;
==How the navigation works==&lt;br /&gt;
&lt;br /&gt;
The main navigation structure can be accessed through &#039;&#039;&#039;$PAGE-&amp;gt;navigation&#039;&#039;&#039;.  The navigation and settings are contextual in that they will relate to the page that the user is viewing. This is determined by other $PAGE object properties:&lt;br /&gt;
* &#039;&#039;&#039;$PAGE-&amp;gt;context&#039;&#039;&#039; is a Moodle context that immediately outlines the nature of the page the user is viewing.&lt;br /&gt;
* &#039;&#039;&#039;$PAGE-&amp;gt;course&#039;&#039;&#039; is the course the user is viewing.  This is essential if the context is CONTEXT_COURSE or greater.  However, it is also useful in other contexts such as CONTEXT_USER.&lt;br /&gt;
* &#039;&#039;&#039;$PAGE-&amp;gt;cm&#039;&#039;&#039; is the course module instance.  This is essential if the context is CONTEXT_MODULE or greater.&lt;br /&gt;
* &#039;&#039;&#039;$PAGE-&amp;gt;url&#039;&#039;&#039; is used to match the active navigation item. &lt;br /&gt;
&lt;br /&gt;
Nearly every page sets $PAGE-&amp;gt;url through a call to &#039;&#039;&#039;$PAGE-&amp;gt;set_url&#039;&#039;&#039; however not many explicitly set the context, course, or cm. When you call &#039;&#039;&#039;require_login&#039;&#039;&#039; with a course or cm it automatically calls the following:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
if ($cm) {&lt;br /&gt;
    $PAGE-&amp;gt;set_cm($cm, $course); // set&#039;s up global $COURSE&lt;br /&gt;
} else {&lt;br /&gt;
    $PAGE-&amp;gt;set_course($course);// set&#039;s up global $COURSE&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A page will only be required to explicitly set a context, course, or cm under one of these conditions:&lt;br /&gt;
# &#039;&#039;&#039;require_login&#039;&#039;&#039; is NOT being called correctly&lt;br /&gt;
# The page is using CONTEXT_SYSTEM, CONTEXT_COURSECAT, or CONTEXT_USER (call &#039;&#039;&#039;$PAGE-&amp;gt;set_context&#039;&#039;&#039; ).&lt;br /&gt;
# The page is using a course or cm but it is also using one of the above contexts (call &#039;&#039;&#039;$PAGE-&amp;gt;set_course&#039;&#039;&#039; or &#039;&#039;&#039;$PAGE-&amp;gt;set_cm&#039;&#039;&#039; ).&lt;br /&gt;
&lt;br /&gt;
The navigation structure cannot be generated before the $PAGE object is configured. It is only generated when it is first used, either when something tries to access the structure or when code tries to add to it.  The navigation is initialised in a specific order:&lt;br /&gt;
# Main navigation structure&lt;br /&gt;
# Settings navigation&lt;br /&gt;
# Navbar (does not need to be generated because of its simple contents and rendering)&lt;br /&gt;
&lt;br /&gt;
==Extending the navigation==&lt;br /&gt;
&lt;br /&gt;
===Code extension===&lt;br /&gt;
This method of extending is when the code arbitrarily extends the navigation during its execution. Extending the navigation through this means allows you to extend the navigation anywhere easily, however it will only be shown on pages where your extending code gets called (you should probably put it in a function within lib.php).&lt;br /&gt;
&lt;br /&gt;
These examples are taken from the [http://moodle.org/mod/forum/discuss.php?d=152391 General Developer Forum: Moodle 2 - how to set up breadcrumbs for a module page]. It has further information that is well worth reading.&lt;br /&gt;
====Navigation====&lt;br /&gt;
This is extending the main navigation structure.&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$previewnode = $PAGE-&amp;gt;navigation-&amp;gt;add(get_string(&#039;preview&#039;), new moodle_url(&#039;/a/link/if/you/want/one.php&#039;), navigation_node::TYPE_CONTAINER);&lt;br /&gt;
$thingnode = $previewnode-&amp;gt;add(get_string(&#039;name of thing&#039;), new moodle_url(&#039;/a/link/if/you/want/one.php&#039;));&lt;br /&gt;
$thingnode-&amp;gt;make_active();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
The above lines of code adds a preview node to the bottom of the navigation and then adds a thingnode to the previewnode (adding a leaf to our tree).&lt;br /&gt;
The final line of code makes the thingnode active so that the navbar finds it however if the URL you give it is the same as the url you set for the page it will automatically be marked active and you won&#039;t need this call.&lt;br /&gt;
&lt;br /&gt;
Next extending the navigation for the course.&lt;br /&gt;
For this you will need to know the course id and have called require_login($courseorid); so that the navigation is loaded for the course.&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$coursenode = $PAGE-&amp;gt;navigation-&amp;gt;find($courseid, navigation_node::TYPE_COURSE);&lt;br /&gt;
$thingnode = $coursenode-&amp;gt;add(get_string(&#039;Name of thing&#039;), new moodle_url(&#039;/a/link/if/you/want/one.php&#039;));&lt;br /&gt;
$thingnode-&amp;gt;make_active();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
The new bit of code here really is the first line which simply finds the course node, to do this we give it the course id and the node type in this case TYPE_COURSE.&lt;br /&gt;
What we are doing here is relying on the navigation to generate the navigation up to the course and then just adding to the course.&lt;br /&gt;
====Settings navigation====&lt;br /&gt;
Adding to the settings navigation is very similar to navigation&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$settingnode = $PAGE-&amp;gt;settingsnav-&amp;gt;add(get_string(&#039;setting&#039;), new moodle_url(&#039;/a/link/if/you/want/one.php&#039;), navigation_node::TYPE_CONTAINER);&lt;br /&gt;
$thingnode = $settingnode-&amp;gt;add(get_string(&#039;Name of thing&#039;), new moodle_url(&#039;/a/link/if/you/want/one.php&#039;));&lt;br /&gt;
$thingnode-&amp;gt;make_active();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
====Navbar====&lt;br /&gt;
This is extending the settings navigation.&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$PAGE-&amp;gt;navbar-&amp;gt;ignore_active();&lt;br /&gt;
$PAGE-&amp;gt;navbar-&amp;gt;add(get_string(&#039;preview&#039;), new moodle_url(&#039;/a/link/if/you/want/one.php&#039;));&lt;br /&gt;
$PAGE-&amp;gt;navbar-&amp;gt;add(get_string(&#039;name of thing&#039;), new moodle_url(&#039;/a/link/if/you/want/one.php&#039;));&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
The above code tells the navbar to ignore what ever the active page was and just use what you add, at which point we add two items as shown.&lt;br /&gt;
===Plugin Callbacks===&lt;br /&gt;
These are specific functions that the navigation looks for and calls if they exist for the plugin, presently only three plugin types can extend the navigation through these call-backs.&lt;br /&gt;
====Module====&lt;br /&gt;
Modules have two call-back methods, first to extend the navigation, and second to extend the settings. These call-backs get called when ever the user is viewing a page within the module and should only extend the navigation for the module.&lt;br /&gt;
====Course Formats====&lt;br /&gt;
Course formats are able to completely redefine the way in which navigation is generated for a course, as well as this they also have several methods to ensure the navigation is generated correctly.&lt;br /&gt;
====Course Reports====&lt;br /&gt;
By default reports don&#039;t add themselves or anything else to the navigation however there is a call-back that can be implemented to allow them to do so.&lt;br /&gt;
&lt;br /&gt;
==FAQ&#039;s and troubleshooting==&lt;br /&gt;
&#039;&#039;&#039;Q.&#039;&#039;&#039; My page is on the navigation but it doesn&#039;t find it?&lt;br /&gt;
&lt;br /&gt;
The first thing to do here is check the URL you are setting for the page. It should match the URL your page has within the navigation. If it doesn&#039;t you have two options, first change your &#039;&#039;&#039;$PAGE-&amp;gt;set_url&#039;&#039;&#039; call, or second override the URL the navigation is using to find the active node as shown below:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
navigation_node::override_active_url(new moodle_url(&#039;/your/url/here.php&#039;, array(&#039;param&#039;=&amp;gt;&#039;value&#039;)));&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
* [[Core APIs]]&lt;br /&gt;
&lt;br /&gt;
[[Category:API]]&lt;/div&gt;</summary>
		<author><name>Sethblueearth</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Navigation_API&amp;diff=33147</id>
		<title>Navigation API</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Navigation_API&amp;diff=33147"/>
		<updated>2012-04-06T19:08:11Z</updated>

		<summary type="html">&lt;p&gt;Sethblueearth: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Overview==&lt;br /&gt;
The Navigation API allows for the manipulation of the navigation system used in Moodle.&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
==What the navigation is==&lt;br /&gt;
It&#039;s very important to understand what the navigation is exactly within Moodle. One of the goals for Moodle 2.0 was to standardise navigation throughout Moodle and try to bring order to the structure of a Moodle site.  Navigation is available through the page object &#039;&#039;&#039;$PAGE&#039;&#039;&#039;, against which you set the heading for the page, the title, any JavaScript requirements, etc.  The navigation structure uses the information $PAGE contains to generate a navigation structure for the site.  The navigation or settings [[blocks]] are interpretations of the navigation structure Moodle creates.&lt;br /&gt;
&lt;br /&gt;
This navigation structure is available through three variables:&lt;br /&gt;
&lt;br /&gt;
; $PAGE-&amp;gt;navigation : This is the main navigation structure, it will contain items that will allow the user to browse to the other available pages.&lt;br /&gt;
; $PAGE-&amp;gt;settingsnav : This is the settings navigation structure contains items that will allow the user to edit settings.&lt;br /&gt;
; $PAGE-&amp;gt;navbar : The navbar is a special structure for page breadcrumbs.&lt;br /&gt;
&lt;br /&gt;
==What the navigation is not==&lt;br /&gt;
The navigation is &#039;&#039;&#039;NOT&#039;&#039;&#039; the navigation block or the settings block!  These two blocks were created to display the navigation structure. The navigation block looks at &#039;&#039;$PAGE-&amp;gt;navigation&#039;&#039;, and the settings block looks at &#039;&#039;$PAGE-&amp;gt;settingsnav&#039;&#039;.  Both blocks interpret their data into an HTML structure and render it.&lt;br /&gt;
&lt;br /&gt;
# The navigation is a back-end structure that is built behind the scenes and has no immediate method of display.&lt;br /&gt;
# The navigation and settings blocks display the back-end navigation structure but add nothing to it at all.&lt;br /&gt;
::In the [[model-view-controller pattern]], $PAGE-&amp;gt;navigation, $PAGE-&amp;gt;settingsnav, and $PAGE-&amp;gt;navbar are the models, and the blocks are views.&lt;br /&gt;
&lt;br /&gt;
The navbar is just the path to the active navigation or settings item. The navbar is not displayed by a block; instead it is added into the theme&#039;s layout files and displayed by the core renderer. &lt;br /&gt;
&lt;br /&gt;
==How the navigation works==&lt;br /&gt;
&lt;br /&gt;
The main navigation structure can be accessed through &#039;&#039;&#039;$PAGE-&amp;gt;navigation&#039;&#039;&#039;.  The navigation and settings are contextual in that they will relate to the page that the user is viewing. This is determined by other $PAGE object properties:&lt;br /&gt;
* &#039;&#039;&#039;$PAGE-&amp;gt;context&#039;&#039;&#039; is a Moodle context that immediately outlines the nature of the page the user is viewing.&lt;br /&gt;
* &#039;&#039;&#039;$PAGE-&amp;gt;course&#039;&#039;&#039; is the course the user is viewing.  This is essential if the context is CONTEXT_COURSE or greater.  However, it is also useful in other contexts such as CONTEXT_USER.&lt;br /&gt;
* &#039;&#039;&#039;$PAGE-&amp;gt;cm&#039;&#039;&#039; is the course module instance.  This is essential if the context is CONTEXT_MODULE or greater.&lt;br /&gt;
* &#039;&#039;&#039;$PAGE-&amp;gt;url&#039;&#039;&#039; is used to match the active navigation item. &lt;br /&gt;
&lt;br /&gt;
Nearly every page sets $PAGE-&amp;gt;url through a call to &#039;&#039;&#039;$PAGE-&amp;gt;set_url&#039;&#039;&#039; however not many explicitly set the context, course, or cm. When you call &#039;&#039;&#039;require_login&#039;&#039;&#039; with a course or cm it automatically calls the following:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
if ($cm) {&lt;br /&gt;
    $PAGE-&amp;gt;set_cm($cm, $course); // set&#039;s up global $COURSE&lt;br /&gt;
} else {&lt;br /&gt;
    $PAGE-&amp;gt;set_course($course);// set&#039;s up global $COURSE&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A page will only be required to explicitly set a context, course, or cm under one of these conditions:&lt;br /&gt;
# &#039;&#039;&#039;require_login&#039;&#039;&#039; is NOT being called correctly&lt;br /&gt;
# The page is using CONTEXT_SYSTEM, CONTEXT_COURSECAT, or CONTEXT_USER (call &#039;&#039;&#039;$PAGE-&amp;gt;set_context&#039;&#039;&#039; ).&lt;br /&gt;
# The page is using a course or cm but it is also using one of the above contexts (call &#039;&#039;&#039;$PAGE-&amp;gt;set_course&#039;&#039;&#039; or &#039;&#039;&#039;$PAGE-&amp;gt;set_cm&#039;&#039;&#039; ).&lt;br /&gt;
&lt;br /&gt;
The navigation structure cannot be generated before the $PAGE object is configured. It is only generated when it is first used, either when something tries to access the structure or when code tries to add to it.  The navigation is initialised in a specific order:&lt;br /&gt;
# Main navigation structure&lt;br /&gt;
# Settings navigation&lt;br /&gt;
# Navbar (does not need to be generated because of its simple contents and rendering)&lt;br /&gt;
&lt;br /&gt;
==Extending the navigation==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
===Code extension===&lt;br /&gt;
This method of extending is when the code arbitrarily extends the navigation during its execution. Extending the navigation through this means allows you to extend the navigation anywhere easily, however it will only be shown on pages where your extending code gets called (you should probably put it in a function within lib.php).&lt;br /&gt;
&lt;br /&gt;
These examples are taken from the [http://moodle.org/mod/forum/discuss.php?d=152391 General Developer Forum: Moodle 2 - how to set up breadcrumbs for a module page]. It has further information that is well worth reading.&lt;br /&gt;
====Navigation====&lt;br /&gt;
This is extending the main navigation structure.&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$previewnode = $PAGE-&amp;gt;navigation-&amp;gt;add(get_string(&#039;preview&#039;), new moodle_url(&#039;/a/link/if/you/want/one.php&#039;), navigation_node::TYPE_CONTAINER);&lt;br /&gt;
$thingnode = $previewnode-&amp;gt;add(get_string(&#039;name of thing&#039;), new moodle_url(&#039;/a/link/if/you/want/one.php&#039;));&lt;br /&gt;
$thingnode-&amp;gt;make_active();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
The above lines of code adds a preview node to the bottom of the navigation and then adds a thingnode to the previewnode (adding a leaf to our tree).&lt;br /&gt;
The final line of code makes the thingnode active so that the navbar finds it however if the URL you give it is the same as the url you set for the page it will automatically be marked active and you won&#039;t need this call.&lt;br /&gt;
&lt;br /&gt;
Next extending the navigation for the course.&lt;br /&gt;
For this you will need to know the course id and have called require_login($courseorid); so that the navigation is loaded for the course.&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$coursenode = $PAGE-&amp;gt;navigation-&amp;gt;find($courseid, navigation_node::TYPE_COURSE);&lt;br /&gt;
$thingnode = $coursenode-&amp;gt;add(get_string(&#039;Name of thing&#039;), new moodle_url(&#039;/a/link/if/you/want/one.php&#039;));&lt;br /&gt;
$thingnode-&amp;gt;make_active();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
The new bit of code here really is the first line which simply finds the course node, to do this we give it the course id and the node type in this case TYPE_COURSE.&lt;br /&gt;
What we are doing here is relying on the navigation to generate the navigation up to the course and then just adding to the course.&lt;br /&gt;
====Settings navigation====&lt;br /&gt;
Adding to the settings navigation is very similar to navigation&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$settingnode = $PAGE-&amp;gt;settingsnav-&amp;gt;add(get_string(&#039;setting&#039;), new moodle_url(&#039;/a/link/if/you/want/one.php&#039;), navigation_node::TYPE_CONTAINER);&lt;br /&gt;
$thingnode = $settingnode-&amp;gt;add(get_string(&#039;Name of thing&#039;), new moodle_url(&#039;/a/link/if/you/want/one.php&#039;));&lt;br /&gt;
$thingnode-&amp;gt;make_active();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
====Navbar====&lt;br /&gt;
This is extending the settings navigation.&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$PAGE-&amp;gt;navbar-&amp;gt;ignore_active();&lt;br /&gt;
$PAGE-&amp;gt;navbar-&amp;gt;add(get_string(&#039;preview&#039;), new moodle_url(&#039;/a/link/if/you/want/one.php&#039;));&lt;br /&gt;
$PAGE-&amp;gt;navbar-&amp;gt;add(get_string(&#039;name of thing&#039;), new moodle_url(&#039;/a/link/if/you/want/one.php&#039;));&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
The above code tells the navbar to ignore what ever the active page was and just use what you add, at which point we add two items as shown.&lt;br /&gt;
===Plugin Callbacks===&lt;br /&gt;
These are specific functions that the navigation looks for and calls if they exist for the plugin, presently only three plugin types can extend the navigation through these call-backs.&lt;br /&gt;
====Module====&lt;br /&gt;
Modules have two call-back methods, first to extend the navigation, and second to extend the settings. These call-backs get called when ever the user is viewing a page within the module and should only extend the navigation for the module.&lt;br /&gt;
====Course Formats====&lt;br /&gt;
Course formats are able to completely redefine the way in which navigation is generated for a course, as well as this they also have several methods to ensure the navigation is generated correctly.&lt;br /&gt;
====Course Reports====&lt;br /&gt;
By default reports don&#039;t add themselves or anything else to the navigation however there is a call-back that can be implemented to allow them to do so.&lt;br /&gt;
&lt;br /&gt;
==FAQ&#039;s and troubleshooting==&lt;br /&gt;
&#039;&#039;&#039;Q.&#039;&#039;&#039; My page is on the navigation but it doesn&#039;t find it?&lt;br /&gt;
&lt;br /&gt;
The first thing to do here is check the URL you are setting for the page. It should match the URL your page has within the navigation. If it doesn&#039;t you have two options, first change your &#039;&#039;&#039;$PAGE-&amp;gt;set_url&#039;&#039;&#039; call, or second override the URL the navigation is using to find the active node as shown below:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
navigation_node::override_active_url(new moodle_url(&#039;/your/url/here.php&#039;, array(&#039;param&#039;=&amp;gt;&#039;value&#039;)));&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
* [[Core APIs]]&lt;br /&gt;
&lt;br /&gt;
[[Category:API]]&lt;/div&gt;</summary>
		<author><name>Sethblueearth</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Navigation_API&amp;diff=33146</id>
		<title>Navigation API</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Navigation_API&amp;diff=33146"/>
		<updated>2012-04-06T19:07:45Z</updated>

		<summary type="html">&lt;p&gt;Sethblueearth: /* Extending the navigation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Overview==&lt;br /&gt;
The Navigation API allows for the manipulation of the navigation system used in Moodle.&lt;br /&gt;
&lt;br /&gt;
==What the navigation is==&lt;br /&gt;
It&#039;s very important to understand what the navigation is exactly within Moodle. One of the goals for Moodle 2.0 was to standardise navigation throughout Moodle and try to bring order to the structure of a Moodle site.  Navigation is available through the page object &#039;&#039;&#039;$PAGE&#039;&#039;&#039;, against which you set the heading for the page, the title, any JavaScript requirements, etc.  The navigation structure uses the information $PAGE contains to generate a navigation structure for the site.  The navigation or settings [[blocks]] are interpretations of the navigation structure Moodle creates.&lt;br /&gt;
&lt;br /&gt;
This navigation structure is available through three variables:&lt;br /&gt;
&lt;br /&gt;
; $PAGE-&amp;gt;navigation : This is the main navigation structure, it will contain items that will allow the user to browse to the other available pages.&lt;br /&gt;
; $PAGE-&amp;gt;settingsnav : This is the settings navigation structure contains items that will allow the user to edit settings.&lt;br /&gt;
; $PAGE-&amp;gt;navbar : The navbar is a special structure for page breadcrumbs.&lt;br /&gt;
&lt;br /&gt;
==What the navigation is not==&lt;br /&gt;
The navigation is &#039;&#039;&#039;NOT&#039;&#039;&#039; the navigation block or the settings block!  These two blocks were created to display the navigation structure. The navigation block looks at &#039;&#039;$PAGE-&amp;gt;navigation&#039;&#039;, and the settings block looks at &#039;&#039;$PAGE-&amp;gt;settingsnav&#039;&#039;.  Both blocks interpret their data into an HTML structure and render it.&lt;br /&gt;
&lt;br /&gt;
# The navigation is a back-end structure that is built behind the scenes and has no immediate method of display.&lt;br /&gt;
# The navigation and settings blocks display the back-end navigation structure but add nothing to it at all.&lt;br /&gt;
::In the [[model-view-controller pattern]], $PAGE-&amp;gt;navigation, $PAGE-&amp;gt;settingsnav, and $PAGE-&amp;gt;navbar are the models, and the blocks are views.&lt;br /&gt;
&lt;br /&gt;
The navbar is just the path to the active navigation or settings item. The navbar is not displayed by a block; instead it is added into the theme&#039;s layout files and displayed by the core renderer. &lt;br /&gt;
&lt;br /&gt;
==How the navigation works==&lt;br /&gt;
&lt;br /&gt;
The main navigation structure can be accessed through &#039;&#039;&#039;$PAGE-&amp;gt;navigation&#039;&#039;&#039;.  The navigation and settings are contextual in that they will relate to the page that the user is viewing. This is determined by other $PAGE object properties:&lt;br /&gt;
* &#039;&#039;&#039;$PAGE-&amp;gt;context&#039;&#039;&#039; is a Moodle context that immediately outlines the nature of the page the user is viewing.&lt;br /&gt;
* &#039;&#039;&#039;$PAGE-&amp;gt;course&#039;&#039;&#039; is the course the user is viewing.  This is essential if the context is CONTEXT_COURSE or greater.  However, it is also useful in other contexts such as CONTEXT_USER.&lt;br /&gt;
* &#039;&#039;&#039;$PAGE-&amp;gt;cm&#039;&#039;&#039; is the course module instance.  This is essential if the context is CONTEXT_MODULE or greater.&lt;br /&gt;
* &#039;&#039;&#039;$PAGE-&amp;gt;url&#039;&#039;&#039; is used to match the active navigation item. &lt;br /&gt;
&lt;br /&gt;
Nearly every page sets $PAGE-&amp;gt;url through a call to &#039;&#039;&#039;$PAGE-&amp;gt;set_url&#039;&#039;&#039; however not many explicitly set the context, course, or cm. When you call &#039;&#039;&#039;require_login&#039;&#039;&#039; with a course or cm it automatically calls the following:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
if ($cm) {&lt;br /&gt;
    $PAGE-&amp;gt;set_cm($cm, $course); // set&#039;s up global $COURSE&lt;br /&gt;
} else {&lt;br /&gt;
    $PAGE-&amp;gt;set_course($course);// set&#039;s up global $COURSE&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A page will only be required to explicitly set a context, course, or cm under one of these conditions:&lt;br /&gt;
# &#039;&#039;&#039;require_login&#039;&#039;&#039; is NOT being called correctly&lt;br /&gt;
# The page is using CONTEXT_SYSTEM, CONTEXT_COURSECAT, or CONTEXT_USER (call &#039;&#039;&#039;$PAGE-&amp;gt;set_context&#039;&#039;&#039; ).&lt;br /&gt;
# The page is using a course or cm but it is also using one of the above contexts (call &#039;&#039;&#039;$PAGE-&amp;gt;set_course&#039;&#039;&#039; or &#039;&#039;&#039;$PAGE-&amp;gt;set_cm&#039;&#039;&#039; ).&lt;br /&gt;
&lt;br /&gt;
The navigation structure cannot be generated before the $PAGE object is configured. It is only generated when it is first used, either when something tries to access the structure or when code tries to add to it.  The navigation is initialised in a specific order:&lt;br /&gt;
# Main navigation structure&lt;br /&gt;
# Settings navigation&lt;br /&gt;
# Navbar (does not need to be generated because of its simple contents and rendering)&lt;br /&gt;
&lt;br /&gt;
==Extending the navigation==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
===Code extension===&lt;br /&gt;
This method of extending is when the code arbitrarily extends the navigation during its execution. Extending the navigation through this means allows you to extend the navigation anywhere easily, however it will only be shown on pages where your extending code gets called (you should probably put it in a function within lib.php).&lt;br /&gt;
&lt;br /&gt;
These examples are taken from the [http://moodle.org/mod/forum/discuss.php?d=152391 General Developer Forum: Moodle 2 - how to set up breadcrumbs for a module page]. It has further information that is well worth reading.&lt;br /&gt;
====Navigation====&lt;br /&gt;
This is extending the main navigation structure.&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$previewnode = $PAGE-&amp;gt;navigation-&amp;gt;add(get_string(&#039;preview&#039;), new moodle_url(&#039;/a/link/if/you/want/one.php&#039;), navigation_node::TYPE_CONTAINER);&lt;br /&gt;
$thingnode = $previewnode-&amp;gt;add(get_string(&#039;name of thing&#039;), new moodle_url(&#039;/a/link/if/you/want/one.php&#039;));&lt;br /&gt;
$thingnode-&amp;gt;make_active();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
The above lines of code adds a preview node to the bottom of the navigation and then adds a thingnode to the previewnode (adding a leaf to our tree).&lt;br /&gt;
The final line of code makes the thingnode active so that the navbar finds it however if the URL you give it is the same as the url you set for the page it will automatically be marked active and you won&#039;t need this call.&lt;br /&gt;
&lt;br /&gt;
Next extending the navigation for the course.&lt;br /&gt;
For this you will need to know the course id and have called require_login($courseorid); so that the navigation is loaded for the course.&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$coursenode = $PAGE-&amp;gt;navigation-&amp;gt;find($courseid, navigation_node::TYPE_COURSE);&lt;br /&gt;
$thingnode = $coursenode-&amp;gt;add(get_string(&#039;Name of thing&#039;), new moodle_url(&#039;/a/link/if/you/want/one.php&#039;));&lt;br /&gt;
$thingnode-&amp;gt;make_active();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
The new bit of code here really is the first line which simply finds the course node, to do this we give it the course id and the node type in this case TYPE_COURSE.&lt;br /&gt;
What we are doing here is relying on the navigation to generate the navigation up to the course and then just adding to the course.&lt;br /&gt;
====Settings navigation====&lt;br /&gt;
Adding to the settings navigation is very similar to navigation&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$settingnode = $PAGE-&amp;gt;settingsnav-&amp;gt;add(get_string(&#039;setting&#039;), new moodle_url(&#039;/a/link/if/you/want/one.php&#039;), navigation_node::TYPE_CONTAINER);&lt;br /&gt;
$thingnode = $settingnode-&amp;gt;add(get_string(&#039;Name of thing&#039;), new moodle_url(&#039;/a/link/if/you/want/one.php&#039;));&lt;br /&gt;
$thingnode-&amp;gt;make_active();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
====Navbar====&lt;br /&gt;
This is extending the settings navigation.&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$PAGE-&amp;gt;navbar-&amp;gt;ignore_active();&lt;br /&gt;
$PAGE-&amp;gt;navbar-&amp;gt;add(get_string(&#039;preview&#039;), new moodle_url(&#039;/a/link/if/you/want/one.php&#039;));&lt;br /&gt;
$PAGE-&amp;gt;navbar-&amp;gt;add(get_string(&#039;name of thing&#039;), new moodle_url(&#039;/a/link/if/you/want/one.php&#039;));&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
The above code tells the navbar to ignore what ever the active page was and just use what you add, at which point we add two items as shown.&lt;br /&gt;
===Plugin Callbacks===&lt;br /&gt;
These are specific functions that the navigation looks for and calls if they exist for the plugin, presently only three plugin types can extend the navigation through these call-backs.&lt;br /&gt;
====Module====&lt;br /&gt;
Modules have two call-back methods, first to extend the navigation, and second to extend the settings. These call-backs get called when ever the user is viewing a page within the module and should only extend the navigation for the module.&lt;br /&gt;
====Course Formats====&lt;br /&gt;
Course formats are able to completely redefine the way in which navigation is generated for a course, as well as this they also have several methods to ensure the navigation is generated correctly.&lt;br /&gt;
====Course Reports====&lt;br /&gt;
By default reports don&#039;t add themselves or anything else to the navigation however there is a call-back that can be implemented to allow them to do so.&lt;br /&gt;
&lt;br /&gt;
==FAQ&#039;s and troubleshooting==&lt;br /&gt;
&#039;&#039;&#039;Q.&#039;&#039;&#039; My page is on the navigation but it doesn&#039;t find it?&lt;br /&gt;
&lt;br /&gt;
The first thing to do here is check the URL you are setting for the page. It should match the URL your page has within the navigation. If it doesn&#039;t you have two options, first change your &#039;&#039;&#039;$PAGE-&amp;gt;set_url&#039;&#039;&#039; call, or second override the URL the navigation is using to find the active node as shown below:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
navigation_node::override_active_url(new moodle_url(&#039;/your/url/here.php&#039;, array(&#039;param&#039;=&amp;gt;&#039;value&#039;)));&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
* [[Core APIs]]&lt;br /&gt;
&lt;br /&gt;
[[Category:API]]&lt;/div&gt;</summary>
		<author><name>Sethblueearth</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Navigation_API&amp;diff=33145</id>
		<title>Navigation API</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Navigation_API&amp;diff=33145"/>
		<updated>2012-04-06T19:02:00Z</updated>

		<summary type="html">&lt;p&gt;Sethblueearth: /* Manipulating the navigation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Overview==&lt;br /&gt;
The Navigation API allows for the manipulation of the navigation system used in Moodle.&lt;br /&gt;
&lt;br /&gt;
==What the navigation is==&lt;br /&gt;
It&#039;s very important to understand what the navigation is exactly within Moodle. One of the goals for Moodle 2.0 was to standardise navigation throughout Moodle and try to bring order to the structure of a Moodle site.  Navigation is available through the page object &#039;&#039;&#039;$PAGE&#039;&#039;&#039;, against which you set the heading for the page, the title, any JavaScript requirements, etc.  The navigation structure uses the information $PAGE contains to generate a navigation structure for the site.  The navigation or settings [[blocks]] are interpretations of the navigation structure Moodle creates.&lt;br /&gt;
&lt;br /&gt;
This navigation structure is available through three variables:&lt;br /&gt;
&lt;br /&gt;
; $PAGE-&amp;gt;navigation : This is the main navigation structure, it will contain items that will allow the user to browse to the other available pages.&lt;br /&gt;
; $PAGE-&amp;gt;settingsnav : This is the settings navigation structure contains items that will allow the user to edit settings.&lt;br /&gt;
; $PAGE-&amp;gt;navbar : The navbar is a special structure for page breadcrumbs.&lt;br /&gt;
&lt;br /&gt;
==What the navigation is not==&lt;br /&gt;
The navigation is &#039;&#039;&#039;NOT&#039;&#039;&#039; the navigation block or the settings block!  These two blocks were created to display the navigation structure. The navigation block looks at &#039;&#039;$PAGE-&amp;gt;navigation&#039;&#039;, and the settings block looks at &#039;&#039;$PAGE-&amp;gt;settingsnav&#039;&#039;.  Both blocks interpret their data into an HTML structure and render it.&lt;br /&gt;
&lt;br /&gt;
# The navigation is a back-end structure that is built behind the scenes and has no immediate method of display.&lt;br /&gt;
# The navigation and settings blocks display the back-end navigation structure but add nothing to it at all.&lt;br /&gt;
::In the [[model-view-controller pattern]], $PAGE-&amp;gt;navigation, $PAGE-&amp;gt;settingsnav, and $PAGE-&amp;gt;navbar are the models, and the blocks are views.&lt;br /&gt;
&lt;br /&gt;
The navbar is just the path to the active navigation or settings item. The navbar is not displayed by a block; instead it is added into the theme&#039;s layout files and displayed by the core renderer. &lt;br /&gt;
&lt;br /&gt;
==How the navigation works==&lt;br /&gt;
&lt;br /&gt;
The main navigation structure can be accessed through &#039;&#039;&#039;$PAGE-&amp;gt;navigation&#039;&#039;&#039;.  The navigation and settings are contextual in that they will relate to the page that the user is viewing. This is determined by other $PAGE object properties:&lt;br /&gt;
* &#039;&#039;&#039;$PAGE-&amp;gt;context&#039;&#039;&#039; is a Moodle context that immediately outlines the nature of the page the user is viewing.&lt;br /&gt;
* &#039;&#039;&#039;$PAGE-&amp;gt;course&#039;&#039;&#039; is the course the user is viewing.  This is essential if the context is CONTEXT_COURSE or greater.  However, it is also useful in other contexts such as CONTEXT_USER.&lt;br /&gt;
* &#039;&#039;&#039;$PAGE-&amp;gt;cm&#039;&#039;&#039; is the course module instance.  This is essential if the context is CONTEXT_MODULE or greater.&lt;br /&gt;
* &#039;&#039;&#039;$PAGE-&amp;gt;url&#039;&#039;&#039; is used to match the active navigation item. &lt;br /&gt;
&lt;br /&gt;
Nearly every page sets $PAGE-&amp;gt;url through a call to &#039;&#039;&#039;$PAGE-&amp;gt;set_url&#039;&#039;&#039; however not many explicitly set the context, course, or cm. When you call &#039;&#039;&#039;require_login&#039;&#039;&#039; with a course or cm it automatically calls the following:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
if ($cm) {&lt;br /&gt;
    $PAGE-&amp;gt;set_cm($cm, $course); // set&#039;s up global $COURSE&lt;br /&gt;
} else {&lt;br /&gt;
    $PAGE-&amp;gt;set_course($course);// set&#039;s up global $COURSE&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A page will only be required to explicitly set a context, course, or cm under one of these conditions:&lt;br /&gt;
# &#039;&#039;&#039;require_login&#039;&#039;&#039; is NOT being called correctly&lt;br /&gt;
# The page is using CONTEXT_SYSTEM, CONTEXT_COURSECAT, or CONTEXT_USER (call &#039;&#039;&#039;$PAGE-&amp;gt;set_context&#039;&#039;&#039; ).&lt;br /&gt;
# The page is using a course or cm but it is also using one of the above contexts (call &#039;&#039;&#039;$PAGE-&amp;gt;set_course&#039;&#039;&#039; or &#039;&#039;&#039;$PAGE-&amp;gt;set_cm&#039;&#039;&#039; ).&lt;br /&gt;
&lt;br /&gt;
The navigation structure cannot be generated before the $PAGE object is configured. It is only generated when it is first used, either when something tries to access the structure or when code tries to add to it.  The navigation is initialised in a specific order:&lt;br /&gt;
# Main navigation structure&lt;br /&gt;
# Settings navigation&lt;br /&gt;
# Navbar (does not need to be generated because of its simple contents and rendering)&lt;br /&gt;
&lt;br /&gt;
==Extending the navigation==&lt;br /&gt;
Before we tear into this we need to look at the different ways in which you can extend or manipulate the navigation.&lt;br /&gt;
# &#039;&#039;&#039;Code extension&#039;&#039;&#039; : This method of extending is when the code arbitrarily extends the navigation during its execution. Extending the navigation through this means allows you to extend the navigation anywhere easily, however it will only be shown on pages where your extending code gets called (you should probably put it in a function within lib.php).&lt;br /&gt;
## &#039;&#039;&#039;Navigation&#039;&#039;&#039; : This is extending the main navigation structure.&lt;br /&gt;
## &#039;&#039;&#039;Settings navigation&#039;&#039;&#039; : This is extending the settings navigation.&lt;br /&gt;
## &#039;&#039;&#039;The navbar&#039;&#039;&#039; : This is adding to the navbar.&lt;br /&gt;
# &#039;&#039;&#039;Plugin call-backs&#039;&#039;&#039; : These are specific functions that the navigation looks for and calls if they exist for the plugin, presently only three plugin types can extend the navigation through these call-backs.&lt;br /&gt;
## &#039;&#039;&#039;Modules&#039;&#039;&#039; : Modules have two call-back methods, first to extend the navigation, and second to extend the settings. These call-backs get called when ever the user is viewing a page within the module and should only extend the navigation for the module.&lt;br /&gt;
## &#039;&#039;&#039;Course formats&#039;&#039;&#039; : Course formats are able to completely redefine the way in which navigation is generated for a course, as well as this they also have several methods to ensure the navigation is generated correctly.&lt;br /&gt;
## &#039;&#039;&#039;Course reports&#039;&#039;&#039; : By default reports don&#039;t add themselves or anything else to the navigation however there is a call-back that can be implemented to allow them to do so.&lt;br /&gt;
&lt;br /&gt;
===Code extension===&lt;br /&gt;
These examples are taken from the [http://moodle.org/mod/forum/discuss.php?d=152391 General Developer Forum: Moodle 2 - how to set up breadcrumbs for a module page]. It has further information that is well worth reading.&lt;br /&gt;
====Navigation====&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$previewnode = $PAGE-&amp;gt;navigation-&amp;gt;add(get_string(&#039;preview&#039;), new moodle_url(&#039;/a/link/if/you/want/one.php&#039;), navigation_node::TYPE_CONTAINER);&lt;br /&gt;
$thingnode = $previewnode-&amp;gt;add(get_string(&#039;name of thing&#039;), new moodle_url(&#039;/a/link/if/you/want/one.php&#039;));&lt;br /&gt;
$thingnode-&amp;gt;make_active();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
The above lines of code adds a preview node to the bottom of the navigation and then adds a thingnode to the previewnode (adding a leaf to our tree).&lt;br /&gt;
The final line of code makes the thingnode active so that the navbar finds it however if the URL you give it is the same as the url you set for the page it will automatically be marked active and you won&#039;t need this call.&lt;br /&gt;
&lt;br /&gt;
Next extending the navigation for the course.&lt;br /&gt;
For this you will need to know the course id and have called require_login($courseorid); so that the navigation is loaded for the course.&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$coursenode = $PAGE-&amp;gt;navigation-&amp;gt;find($courseid, navigation_node::TYPE_COURSE);&lt;br /&gt;
$thingnode = $coursenode-&amp;gt;add(get_string(&#039;Name of thing&#039;), new moodle_url(&#039;/a/link/if/you/want/one.php&#039;));&lt;br /&gt;
$thingnode-&amp;gt;make_active();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
The new bit of code here really is the first line which simply finds the course node, to do this we give it the course id and the node type in this case TYPE_COURSE.&lt;br /&gt;
What we are doing here is relying on the navigation to generate the navigation up to the course and then just adding to the course.&lt;br /&gt;
====Settings navigation====&lt;br /&gt;
Adding to the settings navigation is very similar to navigation&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$settingnode = $PAGE-&amp;gt;settingsnav-&amp;gt;add(get_string(&#039;setting&#039;), new moodle_url(&#039;/a/link/if/you/want/one.php&#039;), navigation_node::TYPE_CONTAINER);&lt;br /&gt;
$thingnode = $settingnode-&amp;gt;add(get_string(&#039;Name of thing&#039;), new moodle_url(&#039;/a/link/if/you/want/one.php&#039;));&lt;br /&gt;
$thingnode-&amp;gt;make_active();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
====Navbar====&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$PAGE-&amp;gt;navbar-&amp;gt;ignore_active();&lt;br /&gt;
$PAGE-&amp;gt;navbar-&amp;gt;add(get_string(&#039;preview&#039;), new moodle_url(&#039;/a/link/if/you/want/one.php&#039;));&lt;br /&gt;
$PAGE-&amp;gt;navbar-&amp;gt;add(get_string(&#039;name of thing&#039;), new moodle_url(&#039;/a/link/if/you/want/one.php&#039;));&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
The above code tells the navbar to ignore what ever the active page was and just use what you add, at which point we add two items as shown.&lt;br /&gt;
&lt;br /&gt;
==FAQ&#039;s and troubleshooting==&lt;br /&gt;
&#039;&#039;&#039;Q.&#039;&#039;&#039; My page is on the navigation but it doesn&#039;t find it?&lt;br /&gt;
&lt;br /&gt;
The first thing to do here is check the URL you are setting for the page. It should match the URL your page has within the navigation. If it doesn&#039;t you have two options, first change your &#039;&#039;&#039;$PAGE-&amp;gt;set_url&#039;&#039;&#039; call, or second override the URL the navigation is using to find the active node as shown below:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
navigation_node::override_active_url(new moodle_url(&#039;/your/url/here.php&#039;, array(&#039;param&#039;=&amp;gt;&#039;value&#039;)));&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
* [[Core APIs]]&lt;br /&gt;
&lt;br /&gt;
[[Category:API]]&lt;/div&gt;</summary>
		<author><name>Sethblueearth</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Navigation_API&amp;diff=33144</id>
		<title>Navigation API</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Navigation_API&amp;diff=33144"/>
		<updated>2012-04-06T18:51:20Z</updated>

		<summary type="html">&lt;p&gt;Sethblueearth: /* How the navigation works */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Overview==&lt;br /&gt;
The Navigation API allows for the manipulation of the navigation system used in Moodle.&lt;br /&gt;
&lt;br /&gt;
==What the navigation is==&lt;br /&gt;
It&#039;s very important to understand what the navigation is exactly within Moodle. One of the goals for Moodle 2.0 was to standardise navigation throughout Moodle and try to bring order to the structure of a Moodle site.  Navigation is available through the page object &#039;&#039;&#039;$PAGE&#039;&#039;&#039;, against which you set the heading for the page, the title, any JavaScript requirements, etc.  The navigation structure uses the information $PAGE contains to generate a navigation structure for the site.  The navigation or settings [[blocks]] are interpretations of the navigation structure Moodle creates.&lt;br /&gt;
&lt;br /&gt;
This navigation structure is available through three variables:&lt;br /&gt;
&lt;br /&gt;
; $PAGE-&amp;gt;navigation : This is the main navigation structure, it will contain items that will allow the user to browse to the other available pages.&lt;br /&gt;
; $PAGE-&amp;gt;settingsnav : This is the settings navigation structure contains items that will allow the user to edit settings.&lt;br /&gt;
; $PAGE-&amp;gt;navbar : The navbar is a special structure for page breadcrumbs.&lt;br /&gt;
&lt;br /&gt;
==What the navigation is not==&lt;br /&gt;
The navigation is &#039;&#039;&#039;NOT&#039;&#039;&#039; the navigation block or the settings block!  These two blocks were created to display the navigation structure. The navigation block looks at &#039;&#039;$PAGE-&amp;gt;navigation&#039;&#039;, and the settings block looks at &#039;&#039;$PAGE-&amp;gt;settingsnav&#039;&#039;.  Both blocks interpret their data into an HTML structure and render it.&lt;br /&gt;
&lt;br /&gt;
# The navigation is a back-end structure that is built behind the scenes and has no immediate method of display.&lt;br /&gt;
# The navigation and settings blocks display the back-end navigation structure but add nothing to it at all.&lt;br /&gt;
::In the [[model-view-controller pattern]], $PAGE-&amp;gt;navigation, $PAGE-&amp;gt;settingsnav, and $PAGE-&amp;gt;navbar are the models, and the blocks are views.&lt;br /&gt;
&lt;br /&gt;
The navbar is just the path to the active navigation or settings item. The navbar is not displayed by a block; instead it is added into the theme&#039;s layout files and displayed by the core renderer. &lt;br /&gt;
&lt;br /&gt;
==How the navigation works==&lt;br /&gt;
&lt;br /&gt;
The main navigation structure can be accessed through &#039;&#039;&#039;$PAGE-&amp;gt;navigation&#039;&#039;&#039;.  The navigation and settings are contextual in that they will relate to the page that the user is viewing. This is determined by other $PAGE object properties:&lt;br /&gt;
* &#039;&#039;&#039;$PAGE-&amp;gt;context&#039;&#039;&#039; is a Moodle context that immediately outlines the nature of the page the user is viewing.&lt;br /&gt;
* &#039;&#039;&#039;$PAGE-&amp;gt;course&#039;&#039;&#039; is the course the user is viewing.  This is essential if the context is CONTEXT_COURSE or greater.  However, it is also useful in other contexts such as CONTEXT_USER.&lt;br /&gt;
* &#039;&#039;&#039;$PAGE-&amp;gt;cm&#039;&#039;&#039; is the course module instance.  This is essential if the context is CONTEXT_MODULE or greater.&lt;br /&gt;
* &#039;&#039;&#039;$PAGE-&amp;gt;url&#039;&#039;&#039; is used to match the active navigation item. &lt;br /&gt;
&lt;br /&gt;
Nearly every page sets $PAGE-&amp;gt;url through a call to &#039;&#039;&#039;$PAGE-&amp;gt;set_url&#039;&#039;&#039; however not many explicitly set the context, course, or cm. When you call &#039;&#039;&#039;require_login&#039;&#039;&#039; with a course or cm it automatically calls the following:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
if ($cm) {&lt;br /&gt;
    $PAGE-&amp;gt;set_cm($cm, $course); // set&#039;s up global $COURSE&lt;br /&gt;
} else {&lt;br /&gt;
    $PAGE-&amp;gt;set_course($course);// set&#039;s up global $COURSE&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A page will only be required to explicitly set a context, course, or cm under one of these conditions:&lt;br /&gt;
# &#039;&#039;&#039;require_login&#039;&#039;&#039; is NOT being called correctly&lt;br /&gt;
# The page is using CONTEXT_SYSTEM, CONTEXT_COURSECAT, or CONTEXT_USER (call &#039;&#039;&#039;$PAGE-&amp;gt;set_context&#039;&#039;&#039; ).&lt;br /&gt;
# The page is using a course or cm but it is also using one of the above contexts (call &#039;&#039;&#039;$PAGE-&amp;gt;set_course&#039;&#039;&#039; or &#039;&#039;&#039;$PAGE-&amp;gt;set_cm&#039;&#039;&#039; ).&lt;br /&gt;
&lt;br /&gt;
The navigation structure cannot be generated before the $PAGE object is configured. It is only generated when it is first used, either when something tries to access the structure or when code tries to add to it.  The navigation is initialised in a specific order:&lt;br /&gt;
# Main navigation structure&lt;br /&gt;
# Settings navigation&lt;br /&gt;
# Navbar (does not need to be generated because of its simple contents and rendering)&lt;br /&gt;
&lt;br /&gt;
==Extending the navigation==&lt;br /&gt;
Before we tear into this we need to look at the different ways in which you can extend or manipulate the navigation.&lt;br /&gt;
# &#039;&#039;&#039;Code extension&#039;&#039;&#039; : This method of extending is when the code arbitrarily extends the navigation during its execution. Extending the navigation through this means allows you to extend the navigation anywhere easily, however it will only be shown on pages where your extending code gets called (you should probably put it in a function within lib.php).&lt;br /&gt;
## &#039;&#039;&#039;Navigation&#039;&#039;&#039; : This is extending the main navigation structure.&lt;br /&gt;
## &#039;&#039;&#039;Settings navigation&#039;&#039;&#039; : This is extending the settings navigation.&lt;br /&gt;
## &#039;&#039;&#039;The navbar&#039;&#039;&#039; : This is adding to the navbar.&lt;br /&gt;
# &#039;&#039;&#039;Plugin call-backs&#039;&#039;&#039; : These are specific functions that the navigation looks for and calls if they exist for the plugin, presently only three plugin types can extend the navigation through these call-backs.&lt;br /&gt;
## &#039;&#039;&#039;Modules&#039;&#039;&#039; : Modules have two call-back methods, first to extend the navigation, and second to extend the settings. These call-backs get called when ever the user is viewing a page within the module and should only extend the navigation for the module.&lt;br /&gt;
## &#039;&#039;&#039;Course formats&#039;&#039;&#039; : Course formats are able to completely redefine the way in which navigation is generated for a course, as well as this they also have several methods to ensure the navigation is generated correctly.&lt;br /&gt;
## &#039;&#039;&#039;Course reports&#039;&#039;&#039; : By default reports don&#039;t add themselves or anything else to the navigation however there is a call-back that can be implemented to allow them to do so.&lt;br /&gt;
&lt;br /&gt;
===Code extension===&lt;br /&gt;
These examples are taken from the [http://moodle.org/mod/forum/discuss.php?d=152391 General Developer Forum: Moodle 2 - how to set up breadcrumbs for a module page]. It has further information that is well worth reading.&lt;br /&gt;
====Navigation====&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$previewnode = $PAGE-&amp;gt;navigation-&amp;gt;add(get_string(&#039;preview&#039;), new moodle_url(&#039;/a/link/if/you/want/one.php&#039;), navigation_node::TYPE_CONTAINER);&lt;br /&gt;
$thingnode = $previewnode-&amp;gt;add(get_string(&#039;name of thing&#039;), new moodle_url(&#039;/a/link/if/you/want/one.php&#039;));&lt;br /&gt;
$thingnode-&amp;gt;make_active();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
The above lines of code adds a preview node to the bottom of the navigation and then adds a thingnode to the previewnode (adding a leaf to our tree).&lt;br /&gt;
The final line of code makes the thingnode active so that the navbar finds it however if the URL you give it is the same as the url you set for the page it will automatically be marked active and you won&#039;t need this call.&lt;br /&gt;
&lt;br /&gt;
Next extending the navigation for the course.&lt;br /&gt;
For this you will need to know the course id and have called require_login($courseorid); so that the navigation is loaded for the course.&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$coursenode = $PAGE-&amp;gt;navigation-&amp;gt;find($courseid, navigation_node::TYPE_COURSE);&lt;br /&gt;
$thingnode = $coursenode-&amp;gt;add(get_string(&#039;Name of thing&#039;), new moodle_url(&#039;/a/link/if/you/want/one.php&#039;));&lt;br /&gt;
$thingnode-&amp;gt;make_active();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
The new bit of code here really is the first line which simply finds the course node, to do this we give it the course id and the node type in this case TYPE_COURSE.&lt;br /&gt;
What we are doing here is relying on the navigation to generate the navigation up to the course and then just adding to the course.&lt;br /&gt;
====Settings navigation====&lt;br /&gt;
Adding to the settings navigation is very similar to navigation&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$settingnode = $PAGE-&amp;gt;settingsnav-&amp;gt;add(get_string(&#039;setting&#039;), new moodle_url(&#039;/a/link/if/you/want/one.php&#039;), navigation_node::TYPE_CONTAINER);&lt;br /&gt;
$thingnode = $settingnode-&amp;gt;add(get_string(&#039;Name of thing&#039;), new moodle_url(&#039;/a/link/if/you/want/one.php&#039;));&lt;br /&gt;
$thingnode-&amp;gt;make_active();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
====Navbar====&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$PAGE-&amp;gt;navbar-&amp;gt;ignore_active();&lt;br /&gt;
$PAGE-&amp;gt;navbar-&amp;gt;add(get_string(&#039;preview&#039;), new moodle_url(&#039;/a/link/if/you/want/one.php&#039;));&lt;br /&gt;
$PAGE-&amp;gt;navbar-&amp;gt;add(get_string(&#039;name of thing&#039;), new moodle_url(&#039;/a/link/if/you/want/one.php&#039;));&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
The above code tells the navbar to ignore what ever the active page was and just use what you add, at which point we add two items as shown.&lt;br /&gt;
&lt;br /&gt;
==Manipulating the navigation==&lt;br /&gt;
Why would you want to, its perfect just as it is.&lt;br /&gt;
&lt;br /&gt;
==FAQ&#039;s and troubleshooting==&lt;br /&gt;
&#039;&#039;&#039;Q.&#039;&#039;&#039; My page is on the navigation but it doesn&#039;t find it?&lt;br /&gt;
&lt;br /&gt;
The first thing to do here is check the URL you are setting for the page. It should match the URL your page has within the navigation. If it doesn&#039;t you have two options, first change your &#039;&#039;&#039;$PAGE-&amp;gt;set_url&#039;&#039;&#039; call, or second override the URL the navigation is using to find the active node as shown below:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
navigation_node::override_active_url(new moodle_url(&#039;/your/url/here.php&#039;, array(&#039;param&#039;=&amp;gt;&#039;value&#039;)));&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
* [[Core APIs]]&lt;br /&gt;
&lt;br /&gt;
[[Category:API]]&lt;/div&gt;</summary>
		<author><name>Sethblueearth</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Navigation_API&amp;diff=33143</id>
		<title>Navigation API</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Navigation_API&amp;diff=33143"/>
		<updated>2012-04-06T18:33:39Z</updated>

		<summary type="html">&lt;p&gt;Sethblueearth: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Overview==&lt;br /&gt;
The Navigation API allows for the manipulation of the navigation system used in Moodle.&lt;br /&gt;
&lt;br /&gt;
==What the navigation is==&lt;br /&gt;
It&#039;s very important to understand what the navigation is exactly within Moodle. One of the goals for Moodle 2.0 was to standardise navigation throughout Moodle and try to bring order to the structure of a Moodle site.  Navigation is available through the page object &#039;&#039;&#039;$PAGE&#039;&#039;&#039;, against which you set the heading for the page, the title, any JavaScript requirements, etc.  The navigation structure uses the information $PAGE contains to generate a navigation structure for the site.  The navigation or settings [[blocks]] are interpretations of the navigation structure Moodle creates.&lt;br /&gt;
&lt;br /&gt;
This navigation structure is available through three variables:&lt;br /&gt;
&lt;br /&gt;
; $PAGE-&amp;gt;navigation : This is the main navigation structure, it will contain items that will allow the user to browse to the other available pages.&lt;br /&gt;
; $PAGE-&amp;gt;settingsnav : This is the settings navigation structure contains items that will allow the user to edit settings.&lt;br /&gt;
; $PAGE-&amp;gt;navbar : The navbar is a special structure for page breadcrumbs.&lt;br /&gt;
&lt;br /&gt;
==What the navigation is not==&lt;br /&gt;
The navigation is &#039;&#039;&#039;NOT&#039;&#039;&#039; the navigation block or the settings block!  These two blocks were created to display the navigation structure. The navigation block looks at &#039;&#039;$PAGE-&amp;gt;navigation&#039;&#039;, and the settings block looks at &#039;&#039;$PAGE-&amp;gt;settingsnav&#039;&#039;.  Both blocks interpret their data into an HTML structure and render it.&lt;br /&gt;
&lt;br /&gt;
# The navigation is a back-end structure that is built behind the scenes and has no immediate method of display.&lt;br /&gt;
# The navigation and settings blocks display the back-end navigation structure but add nothing to it at all.&lt;br /&gt;
::In the [[model-view-controller pattern]], $PAGE-&amp;gt;navigation, $PAGE-&amp;gt;settingsnav, and $PAGE-&amp;gt;navbar are the models, and the blocks are views.&lt;br /&gt;
&lt;br /&gt;
The navbar is just the path to the active navigation or settings item. The navbar is not displayed by a block; instead it is added into the theme&#039;s layout files and displayed by the core renderer. &lt;br /&gt;
&lt;br /&gt;
==How the navigation works==&lt;br /&gt;
&lt;br /&gt;
The main navigation structure can be accessed through &#039;&#039;&#039;$PAGE-&amp;gt;navigation&#039;&#039;&#039;.  The navigation and settings are contextual in that they will relate to the page that the user is viewing. This is determined by other $PAGE object properties:&lt;br /&gt;
* &#039;&#039;&#039;$PAGE-&amp;gt;context&#039;&#039;&#039; is a Moodle context that immediately outlines the nature of the page the user is viewing.&lt;br /&gt;
* &#039;&#039;&#039;$PAGE-&amp;gt;course&#039;&#039;&#039; is the course the user is viewing.  This is essential if the context is CONTEXT_COURSE or greater.  However, it is also useful in other contexts such as CONTEXT_USER.&lt;br /&gt;
* &#039;&#039;&#039;$PAGE-&amp;gt;cm&#039;&#039;&#039; is the course module instance.  This is essential if the context is CONTEXT_MODULE or greater.&lt;br /&gt;
* &#039;&#039;&#039;$PAGE-&amp;gt;url&#039;&#039;&#039; is used to match the active navigation item. &lt;br /&gt;
&lt;br /&gt;
So at this point we know how the navigation finds out about what the user is viewing, now we need to quickly look at how navigation gets that information. As you&#039;ve probably realised by looking at code nearly every page sets $PAGE-&amp;gt;url through a call to &#039;&#039;&#039;$PAGE-&amp;gt;set_url&#039;&#039;&#039; however not many explicitly set the context, course, of cm.&lt;br /&gt;
&lt;br /&gt;
This is because require_login does it for you if it is called with a course, and or cm (other than the front-page course). When you call require_login with the a course and/or cm it automatically calls the following:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
if ($cm) {&lt;br /&gt;
    $PAGE-&amp;gt;set_cm($cm, $course); // set&#039;s up global $COURSE&lt;br /&gt;
} else if ($cm) {&lt;br /&gt;
    $PAGE-&amp;gt;set_course($course);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Then within each of those two functions it sets the context for the item it was just given. This is how $PAGE finds out about courses and course modules.&lt;br /&gt;
&lt;br /&gt;
Providing require_login is being called correctly a page will only be required to explicitly set a context, course, or cm if one of the following conditions are met:&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;$PAGE-&amp;gt;set_context&#039;&#039;&#039; The page is using CONTEXT_SYSTEM, CONTEXT_COURSECAT, or CONTEXT_USER.&lt;br /&gt;
# &#039;&#039;&#039;$PAGE-&amp;gt;set_course&#039;&#039;&#039; or &#039;&#039;&#039;$PAGE-&amp;gt;set_cm&#039;&#039;&#039; The page is using a course or cm but it is also using one of the above contexts.&lt;br /&gt;
&lt;br /&gt;
So by looking at the $PAGE object the navigation is able to generate a structure that reflects the Moodle site as well as the page the user is viewing.&lt;br /&gt;
&lt;br /&gt;
Before we move on to look at how to interact with the navigation however there is one more thing that you need to know and that is when the navigation structure is generated.&lt;br /&gt;
&lt;br /&gt;
Of course we can&#039;t generate the navigation structure immediately as we need to give the code a chance to set the $PAGE object correctly. Because of this the navigation structure is only generated when it is first used. This may be either when something tries to access the structure or when code tries to add to it.&lt;br /&gt;
Also the navigation is initialised in a specific order:&lt;br /&gt;
&lt;br /&gt;
# Main navigation structure&lt;br /&gt;
# Settings navigation&lt;br /&gt;
# Navbar&lt;br /&gt;
&lt;br /&gt;
The navbar however is a special case, as it is just the path up to and including the active item it doesn&#039;t need generation, it will of course be determined when interacted with by which time everything else will have been generated.&lt;br /&gt;
&lt;br /&gt;
==Extending the navigation==&lt;br /&gt;
Before we tear into this we need to look at the different ways in which you can extend or manipulate the navigation.&lt;br /&gt;
# &#039;&#039;&#039;Code extension&#039;&#039;&#039; : This method of extending is when the code arbitrarily extends the navigation during its execution. Extending the navigation through this means allows you to extend the navigation anywhere easily, however it will only be shown on pages where your extending code gets called (you should probably put it in a function within lib.php).&lt;br /&gt;
## &#039;&#039;&#039;Navigation&#039;&#039;&#039; : This is extending the main navigation structure.&lt;br /&gt;
## &#039;&#039;&#039;Settings navigation&#039;&#039;&#039; : This is extending the settings navigation.&lt;br /&gt;
## &#039;&#039;&#039;The navbar&#039;&#039;&#039; : This is adding to the navbar.&lt;br /&gt;
# &#039;&#039;&#039;Plugin call-backs&#039;&#039;&#039; : These are specific functions that the navigation looks for and calls if they exist for the plugin, presently only three plugin types can extend the navigation through these call-backs.&lt;br /&gt;
## &#039;&#039;&#039;Modules&#039;&#039;&#039; : Modules have two call-back methods, first to extend the navigation, and second to extend the settings. These call-backs get called when ever the user is viewing a page within the module and should only extend the navigation for the module.&lt;br /&gt;
## &#039;&#039;&#039;Course formats&#039;&#039;&#039; : Course formats are able to completely redefine the way in which navigation is generated for a course, as well as this they also have several methods to ensure the navigation is generated correctly.&lt;br /&gt;
## &#039;&#039;&#039;Course reports&#039;&#039;&#039; : By default reports don&#039;t add themselves or anything else to the navigation however there is a call-back that can be implemented to allow them to do so.&lt;br /&gt;
&lt;br /&gt;
===Code extension===&lt;br /&gt;
These examples are taken from the [http://moodle.org/mod/forum/discuss.php?d=152391 General Developer Forum: Moodle 2 - how to set up breadcrumbs for a module page]. It has further information that is well worth reading.&lt;br /&gt;
====Navigation====&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$previewnode = $PAGE-&amp;gt;navigation-&amp;gt;add(get_string(&#039;preview&#039;), new moodle_url(&#039;/a/link/if/you/want/one.php&#039;), navigation_node::TYPE_CONTAINER);&lt;br /&gt;
$thingnode = $previewnode-&amp;gt;add(get_string(&#039;name of thing&#039;), new moodle_url(&#039;/a/link/if/you/want/one.php&#039;));&lt;br /&gt;
$thingnode-&amp;gt;make_active();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
The above lines of code adds a preview node to the bottom of the navigation and then adds a thingnode to the previewnode (adding a leaf to our tree).&lt;br /&gt;
The final line of code makes the thingnode active so that the navbar finds it however if the URL you give it is the same as the url you set for the page it will automatically be marked active and you won&#039;t need this call.&lt;br /&gt;
&lt;br /&gt;
Next extending the navigation for the course.&lt;br /&gt;
For this you will need to know the course id and have called require_login($courseorid); so that the navigation is loaded for the course.&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$coursenode = $PAGE-&amp;gt;navigation-&amp;gt;find($courseid, navigation_node::TYPE_COURSE);&lt;br /&gt;
$thingnode = $coursenode-&amp;gt;add(get_string(&#039;Name of thing&#039;), new moodle_url(&#039;/a/link/if/you/want/one.php&#039;));&lt;br /&gt;
$thingnode-&amp;gt;make_active();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
The new bit of code here really is the first line which simply finds the course node, to do this we give it the course id and the node type in this case TYPE_COURSE.&lt;br /&gt;
What we are doing here is relying on the navigation to generate the navigation up to the course and then just adding to the course.&lt;br /&gt;
====Settings navigation====&lt;br /&gt;
Adding to the settings navigation is very similar to navigation&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$settingnode = $PAGE-&amp;gt;settingsnav-&amp;gt;add(get_string(&#039;setting&#039;), new moodle_url(&#039;/a/link/if/you/want/one.php&#039;), navigation_node::TYPE_CONTAINER);&lt;br /&gt;
$thingnode = $settingnode-&amp;gt;add(get_string(&#039;Name of thing&#039;), new moodle_url(&#039;/a/link/if/you/want/one.php&#039;));&lt;br /&gt;
$thingnode-&amp;gt;make_active();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
====Navbar====&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$PAGE-&amp;gt;navbar-&amp;gt;ignore_active();&lt;br /&gt;
$PAGE-&amp;gt;navbar-&amp;gt;add(get_string(&#039;preview&#039;), new moodle_url(&#039;/a/link/if/you/want/one.php&#039;));&lt;br /&gt;
$PAGE-&amp;gt;navbar-&amp;gt;add(get_string(&#039;name of thing&#039;), new moodle_url(&#039;/a/link/if/you/want/one.php&#039;));&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
The above code tells the navbar to ignore what ever the active page was and just use what you add, at which point we add two items as shown.&lt;br /&gt;
&lt;br /&gt;
==Manipulating the navigation==&lt;br /&gt;
Why would you want to, its perfect just as it is.&lt;br /&gt;
&lt;br /&gt;
==FAQ&#039;s and troubleshooting==&lt;br /&gt;
&#039;&#039;&#039;Q.&#039;&#039;&#039; My page is on the navigation but it doesn&#039;t find it?&lt;br /&gt;
&lt;br /&gt;
The first thing to do here is check the URL you are setting for the page. It should match the URL your page has within the navigation. If it doesn&#039;t you have two options, first change your &#039;&#039;&#039;$PAGE-&amp;gt;set_url&#039;&#039;&#039; call, or second override the URL the navigation is using to find the active node as shown below:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
navigation_node::override_active_url(new moodle_url(&#039;/your/url/here.php&#039;, array(&#039;param&#039;=&amp;gt;&#039;value&#039;)));&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
* [[Core APIs]]&lt;br /&gt;
&lt;br /&gt;
[[Category:API]]&lt;/div&gt;</summary>
		<author><name>Sethblueearth</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Activity_modules&amp;diff=32687</id>
		<title>Activity modules</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Activity_modules&amp;diff=32687"/>
		<updated>2012-03-08T16:28:33Z</updated>

		<summary type="html">&lt;p&gt;Sethblueearth: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Activity modules reside in the &#039;&#039;&#039;/mod&#039;&#039;&#039; directory. Each module is in a separate subdirectory and consists of the following mandatory elements (plus extra scripts unique to each module):&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;[[mod_form.php]]&#039;&#039; - a form to set up or update an instance of this module&lt;br /&gt;
* &#039;&#039;[[version.php]]&#039;&#039; - defines some meta-info&lt;br /&gt;
* &#039;&#039;pix/icon.gif&#039;&#039; - a 16x16 icon for the module&lt;br /&gt;
* &#039;&#039;db/install.xml&#039;&#039; - defines the structure of db tables for all database types. Is used during module installation&lt;br /&gt;
* &#039;&#039;[[db/upgrade.php]]&#039;&#039; - defines changes in the structure of db tables. Is used during module upgrade&lt;br /&gt;
* &#039;&#039;[[db/access.php]]&#039;&#039; - defines module capabilities&lt;br /&gt;
* &#039;&#039;[[index.php]]&#039;&#039; - a page to list all instances in a course&lt;br /&gt;
* &#039;&#039;[[view.php]]&#039;&#039; - a page to view a particular instance&lt;br /&gt;
* &#039;&#039;[[lib.php]]&#039;&#039; - any/all functions defined by the module should be in here. If the module name is called &#039;&#039;&#039;widget&#039;&#039;&#039;, then the required functions include:&lt;br /&gt;
:* widget_install() - will be called during the installation of the module&lt;br /&gt;
:* widget_add_instance() - code to add a new instance of widget&lt;br /&gt;
:* widget_update_instance() - code to update an existing instance&lt;br /&gt;
:* widget_delete_instance() - code to delete an instance&lt;br /&gt;
:* widget_user_outline() - given an instance, return a summary of a user&#039;s contribution&lt;br /&gt;
:* widget_user_complete() - given an instance, print details of a user&#039;s contribution&lt;br /&gt;
:* widget_get_view_actions() / widget_get_post_actions() - Used by the participation report (course/report/participation/index.php) to classify actions in the logs table.&lt;br /&gt;
:* Other functions available but not required are:&lt;br /&gt;
:** widget_delete_course() - code to clean up anything that would be leftover after all instances are deleted&lt;br /&gt;
:** widget_process_options() - code to pre-process the form data from module settings&lt;br /&gt;
:** [[Implementing Reset course functionality in a module|widget_reset_course_form() and widget_delete_userdata()]] - used to implement [[Reset course]] feature.&lt;br /&gt;
:* To avoid possible conflict, any module functions should be named starting with widget_ and any constants you define should start with WIDGET_&lt;br /&gt;
* &#039;&#039;backuplib.php&#039;&#039; and &#039;&#039;restorelib.php&#039;&#039; (optional)&lt;br /&gt;
* &#039;&#039;settings.php&#039;&#039; or &#039;&#039;settingstree.php&#039;&#039; - (optional) a definition of an admin settings page for this module. mod/assignment/settings.php is a good simple example. mod/quiz/settingstree.php is a more complex example.&lt;br /&gt;
* &#039;&#039;defaults.php&#039;&#039; - lets you easily define default values for your configuration variables. It is included by upgrade_activity_modules in lib/adminlib.php. It should define an array $defaults. These values are then loaded into the config table. Alternatively, if you set $defaults[&#039;_use_config_plugins&#039;] to true, the values are instead loaded into the config_plugins table, which is better practice. See mod/quiz/defaults.php for an example. (This apparently only works with moodle 2.x branch.)&lt;br /&gt;
* &#039;&#039;lang/en/widget.php&#039;&#039; - (optional) Lastly, each module will have some language files that contain strings for that module.&lt;br /&gt;
&lt;br /&gt;
=== IMPORTANT: ===&lt;br /&gt;
* When creating a new module, the new name of the module must not contain numbers or other special characters!&lt;br /&gt;
&lt;br /&gt;
* You need a &#039;&#039;data base table&#039;&#039; with the same name as your module. This table must have at least three fields: &lt;br /&gt;
*# id &lt;br /&gt;
*# course &lt;br /&gt;
*# name&lt;br /&gt;
&lt;br /&gt;
* You should also make sure that your activity module provides appropriate support for groups and meta-courses. &lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* Moodle 2.x activity module template [https://github.com/moodlehq/moodle-mod_newmodule https://github.com/moodlehq/moodle-mod_newmodule] for developing new modules.&lt;br /&gt;
* [[Blocks]]&lt;br /&gt;
* [[Backup]]&lt;br /&gt;
* Tracker issue [http://tracker.moodle.org/browse/CONTRIB-52 CONTRIB-52 Improvements to make NEWMODULE really useful] - including download link for new module template supporting roles, formslib etc. (unfinished) &lt;br /&gt;
* http://download.moodle.org/plugins16/mod/NEWMODULE.zip - new module template for versions of Moodle prior to 1.7. Please follow the README instructions inside the zip.&lt;br /&gt;
* [[NEWMODULE_Documentation]]&lt;br /&gt;
&lt;br /&gt;
Using Moodle forum discussions:&lt;br /&gt;
*[http://moodle.org/mod/forum/discuss.php?d=66165 A new resource type: where do I put the language strings?]&lt;br /&gt;
*[http://moodle.org/mod/forum/discuss.php?d=65986 New Module Template Code for Moodle 1.7]&lt;br /&gt;
*[http://moodle.org/mod/forum/discuss.php?d=90154 LEGACY roles and capabilities]&lt;br /&gt;
&lt;br /&gt;
[[Category:Modules]]&lt;br /&gt;
[[Category:Modules]]&lt;br /&gt;
[[Category:Tutorial]]&lt;br /&gt;
[[Category:Plugins]]&lt;/div&gt;</summary>
		<author><name>Sethblueearth</name></author>
	</entry>
</feed>