MDL-51698 navigationlib: Add crumb trail meta data

This commit is contained in:
Brendan Heywood
2015-12-09 00:50:16 +01:00
committed by Eloy Lafuente (stronk7)
parent c3c5e30930
commit d7238be174
2 changed files with 93 additions and 21 deletions
+60 -21
View File
@@ -3084,13 +3084,15 @@ class navbar extends navigation_node {
public $children = array();
/** @var bool A switch for whether we want to include the root node in the navbar */
public $includesettingsbase = false;
/** @var navigation_node[] $prependchildren */
/** @var breadcrumb_navigation_node[] $prependchildren */
protected $prependchildren = array();
/**
* The almighty constructor
*
* @param moodle_page $page
*/
public function __construct(moodle_page $page) {
global $CFG;
if (during_initial_install()) {
@@ -3141,8 +3143,8 @@ class navbar extends navigation_node {
* Gets a navigation node
*
* @param string|int $key for referencing the navbar nodes
* @param int $type navigation_node::TYPE_*
* @return navigation_node|bool
* @param int $type breadcrumb_navigation_node::TYPE_*
* @return breadcrumb_navigation_node|bool
*/
public function get($key, $type = null) {
foreach ($this->children as &$child) {
@@ -3158,7 +3160,7 @@ class navbar extends navigation_node {
return false;
}
/**
* Returns an array of navigation_node's that make up the navbar.
* Returns an array of breadcrumb_navigation_nodes that make up the navbar.
*
* @return array
*/
@@ -3190,7 +3192,7 @@ class navbar extends navigation_node {
// Parse a combined navigation tree
while ($settingsactivenode && $settingsactivenode->parent !== null) {
if (!$settingsactivenode->mainnavonly) {
$items[] = $settingsactivenode;
$items[] = new breadcrumb_navigation_node($settingsactivenode);
}
$settingsactivenode = $settingsactivenode->parent;
}
@@ -3200,12 +3202,14 @@ class navbar extends navigation_node {
}
while ($navigationactivenode && $navigationactivenode->parent !== null) {
if (!$navigationactivenode->mainnavonly) {
$items[] = $navigationactivenode;
$items[] = new breadcrumb_navigation_node($navigationactivenode);
}
if (!empty($CFG->navshowcategories) &&
$navigationactivenode->type === self::TYPE_COURSE &&
$navigationactivenode->parent->key === 'currentcourse') {
$items = array_merge($items, $this->get_course_categories());
foreach ($this->get_course_categories() as $item) {
$items[] = new breadcrumb_navigation_node($item);
}
}
$navigationactivenode = $navigationactivenode->parent;
}
@@ -3213,12 +3217,14 @@ class navbar extends navigation_node {
// Parse the navigation tree to get the active node
while ($navigationactivenode && $navigationactivenode->parent !== null) {
if (!$navigationactivenode->mainnavonly) {
$items[] = $navigationactivenode;
$items[] = new breadcrumb_navigation_node($navigationactivenode);
}
if (!empty($CFG->navshowcategories) &&
$navigationactivenode->type === self::TYPE_COURSE &&
$navigationactivenode->parent->key === 'currentcourse') {
$items = array_merge($items, $this->get_course_categories());
foreach ($this->get_course_categories() as $item) {
$items[] = new breadcrumb_navigation_node($item);
}
}
$navigationactivenode = $navigationactivenode->parent;
}
@@ -3226,18 +3232,18 @@ class navbar extends navigation_node {
// Parse the settings navigation to get the active node
while ($settingsactivenode && $settingsactivenode->parent !== null) {
if (!$settingsactivenode->mainnavonly) {
$items[] = $settingsactivenode;
$items[] = new breadcrumb_navigation_node($settingsactivenode);
}
$settingsactivenode = $settingsactivenode->parent;
}
}
}
$items[] = new navigation_node(array(
'text'=>$this->page->navigation->text,
'shorttext'=>$this->page->navigation->shorttext,
'key'=>$this->page->navigation->key,
'action'=>$this->page->navigation->action
$items[] = new breadcrumb_navigation_node(array(
'text' => $this->page->navigation->text,
'shorttext' => $this->page->navigation->shorttext,
'key' => $this->page->navigation->key,
'action' => $this->page->navigation->action
));
if (count($this->prependchildren) > 0) {
@@ -3274,7 +3280,7 @@ class navbar extends navigation_node {
}
$url = new moodle_url('/course/index.php', array('categoryid' => $category->id));
$name = format_string($category->name, true, array('context' => context_coursecat::instance($category->id)));
$categorynode = navigation_node::create($name, $url, self::TYPE_CATEGORY, null, $category->id);
$categorynode = breadcrumb_navigation_node::create($name, $url, self::TYPE_CATEGORY, null, $category->id);
if (!$category->visible) {
$categorynode->hidden = true;
}
@@ -3287,7 +3293,7 @@ class navbar extends navigation_node {
$courses = $this->page->navigation->get('courses');
if (!$courses) {
// Courses node may not be present.
$courses = navigation_node::create(
$courses = breadcrumb_navigation_node::create(
get_string('courses'),
new moodle_url('/course/index.php'),
self::TYPE_CONTAINER
@@ -3300,9 +3306,9 @@ class navbar extends navigation_node {
}
/**
* Add a new navigation_node to the navbar, overrides parent::add
* Add a new breadcrumb_navigation_node to the navbar, overrides parent::add
*
* This function overrides {@link navigation_node::add()} so that we can change
* This function overrides {@link breadcrumb_navigation_node::add()} so that we can change
* the way nodes get added to allow us to simply call add and have the node added to the
* end of the navbar
*
@@ -3345,7 +3351,7 @@ class navbar extends navigation_node {
// Set the parent to this node
$itemarray['parent'] = $this;
// Add the child using the navigation_node_collections add method
$this->children[] = new navigation_node($itemarray);
$this->children[] = new breadcrumb_navigation_node($itemarray);
return $this;
}
@@ -3390,11 +3396,44 @@ class navbar extends navigation_node {
// Set the parent to this node.
$itemarray['parent'] = $this;
// Add the child node to the prepend list.
$this->prependchildren[] = new navigation_node($itemarray);
$this->prependchildren[] = new breadcrumb_navigation_node($itemarray);
return $this;
}
}
/**
* Subclass of navigation_node allowing different rendering for the breadcrumbs
* in particular adding extra metadata for search engine robots to leverage.
*
* @package core
* @category navigation
* @copyright 2015 Brendan Heywood
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class breadcrumb_navigation_node extends navigation_node {
/**
* A proxy constructor
*
* @param mixed $navnode A navigation_node or an array
*/
public function __construct($navnode) {
if (is_array($navnode)) {
parent::__construct($navnode);
} else if ($navnode instanceof navigation_node) {
// Just clone everything.
$objvalues = get_object_vars($navnode);
foreach ($objvalues as $key => $value) {
$this->$key = $value;
}
} else {
throw coding_exception('Not a valid breadcrumb_navigation_node');
}
}
}
/**
* Class used to manage the settings option for the current page
*