| <?php |
| /** |
| * ***************************************************************************** |
| * Copyright (c) 2014 Eclipse Foundation and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * Denis Roy (Eclipse Foundation) - initial API and implementation |
| * Christopher Guindon (Eclipse Foundation) - Updated first level and added |
| * removeCrumb() |
| * Darrell Armstrong - Add 2nd and 3rd level crumbs |
| * ***************************************************************************** |
| */ |
| if (!class_exists('MenuItem')) { |
| require_once ("menuitem.class.php"); |
| } |
| |
| if (!class_exists('Menu')) { |
| require_once ("menu.class.php"); |
| } |
| |
| class Breadcrumb extends Menu { |
| |
| private $CrumbList = array(); |
| |
| private $protocol = "http://"; |
| |
| private $www_prefix = ""; |
| |
| // static list of first-level URIs with corresponding display-friendly names |
| // everything outside of this is considered to be in project space |
| private $FirstLevel = array( |
| "10years" => "10 years of Eclipse", |
| "articles" => "Articles", |
| "artwork" => "Artwork", |
| "community" => "Community", |
| "committers" => "Committers", |
| "contribute" => "Contribute", |
| "corporate_sponsors" => "Corporate Sponsors", |
| "donate" => "Donate", |
| "downloads" => "Downloads", |
| "eclipse4" => "Eclipse SDK 4.x", |
| "errors" => "Errors", |
| "europa" => "Europa", |
| "friends" => "Friends of Eclipse", |
| "galileo" => "Galileo", |
| "ganymede" => "Ganymede", |
| "go" => "Go", |
| "home" => "Home", |
| "ide" => "IDE", |
| "images" => "Images", |
| "indigo" => "Indigo", |
| "juno" => "Juno", |
| "kepler" => "Kepler", |
| "legal" => "Legal", |
| "licenses" => "Licenses", |
| "luna" => "Luna", |
| "mail" => "Mailing Lists", |
| "membership" => "Members", |
| "mobile" => "Mobile", |
| "newsgroups" => "Forums", |
| "org" => "About Us", |
| "phoenix-test" => "Test", |
| "projects" => "Projects", |
| "resources" => "Resources", |
| "screenshots" => "Screenshots", |
| "site_login" => "My Account", |
| "users" => "Getting started", |
| 'webmaster' => "Webmaster", |
| "" => "" |
| ) // Homepage |
| ; |
| |
| // Second level items and friendly names (taken from page title which shows in current crumb) |
| // newsletters set their own additional level of crumbs (in community) |
| private $SecondLevel = array( |
| "foundation" => "Eclipse Foundation", |
| "workinggroups" => "Eclipse Working Groups", |
| "elections" => "Elections", |
| "documents" => "Governance Documents", |
| "press-release" => "Press Releases" |
| ); |
| |
| // Third level items and friendly names |
| // omit the date as the main landing page includes the current report + archived |
| private $ThirdLevel = array( |
| "reports" => "Annual Report" |
| ); |
| |
| function getCrumbList() { |
| return $this->CrumbList; |
| } |
| |
| function getProtocol() { |
| return $this->protocol = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') ? 'https://' : 'http://'; |
| } |
| |
| function getWWW_prefix() { |
| global $App; |
| |
| if (!isset($App)) { |
| $App = new App(); |
| } |
| |
| $this->www_prefix = $App->getWWWPrefix(); |
| $this->getProtocol(); |
| $http_host = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : getenv('HTTP_HOST'); |
| |
| // List of domains where we can't use the value of $App->getWWWPrefix(). |
| $allowed_domain_override = array( |
| 'dev.eclipse.org', |
| 'dev.eclipse.local' |
| ); |
| |
| if (in_array($http_host, $allowed_domain_override)) { |
| $this->www_prefix = $this->protocol . $http_host; |
| } |
| |
| return $this->www_prefix; |
| } |
| |
| function setCrumbList($_List) { |
| $this->CrumbList = $_List; |
| } |
| |
| // Main constructor |
| function Breadcrumb($page_title = "") { |
| |
| $this->getWWW_prefix(); |
| |
| // Default: Home |
| $this->addCrumb("Home", $this->protocol . "www.eclipse.org/", "_self"); |
| |
| if (isset($_SERVER['REQUEST_URI'])) { |
| // http://www.eclipse.org/newsgroups/test.php |
| // Array ( [0] => [1] => newsgroups [2] => test.php ) |
| $items = explode("/", $_SERVER['REQUEST_URI']); |
| |
| // Examine Item 1 (first level URL) |
| if (isset($this->FirstLevel[$items[1]])) { |
| $this->addCrumb($this->FirstLevel[$items[1]], $this->www_prefix . "/" . $items[1], "_self"); |
| } |
| else { |
| // Not pre-defined Foundation page, must be a project page |
| // /xtext/file.php => Home > Projects > xtext > $pageTitle |
| $this->addCrumb("Projects", $this->www_prefix . "/projects/", "_self"); |
| $this->addCrumb($items[1], $this->www_prefix . "/" . $items[1], "_self"); |
| } |
| |
| // Add 2nd (and 3rd) level crumb, if needed and it is not the landing page (index) |
| if (count($items) >= 4){ |
| if(isset($this->SecondLevel[$items[2]]) && !empty($items[count($items) - 1]) && $items[count($items) - 1] !== "index.php") { |
| $this->addCrumb($this->SecondLevel[$items[2]], $this->www_prefix . "/" . $items[1] . "/" . $items[2], "_self"); |
| } |
| |
| // 3rd level - Annual Reports (annual_report is the landing page for current report and where to return if browsing archived report) |
| if(isset($this->ThirdLevel[$items[3]]) && $items[count($items) - 1] !== "annual_report.php" && $items[count($items) -1] !== "index.php"){ |
| $this->addCrumb($this->ThirdLevel[$items[3]], |
| $this->www_prefix . "/" . $items[1] . "/" . $items[2] . "/" .$items[3], "_self"); |
| } |
| } |
| |
| // Add current page |
| // AT this point, $pageTitle should be set as we are running in header() |
| global $pageTitle; |
| if (!empty($page_title)) { |
| $pageTitle = $page_title; |
| } |
| $pageTitle = strip_tags($pageTitle); |
| if (isset($pageTitle)) { |
| $title = $pageTitle; |
| |
| // consider truncating $pageTitle if it's too long |
| if (strlen($title) > 35) { |
| $title = substr($title, 0, 35) . "..."; |
| } |
| |
| // Bug 442449 - Distinguish between page title and breadcrumbs menu |
| // Remove project name from $title |
| if ($this->getCrumbCount() > 1) { |
| $pattern = '/^' . $this->getCrumbAt($this->getCrumbCount() - 1)->getText() . " /i"; |
| $title = preg_replace($pattern, '', $title); |
| } |
| $this->addCrumb($title, NULL, NULL); |
| } |
| else { |
| // Add final generic crumb |
| $this->addCrumb("Document", NULL, NULL); |
| } |
| |
| } |
| } |
| |
| function addCrumb($_Text, $_URL, $_Target) { |
| $_Text = strip_tags($_Text); |
| |
| // We don't need to add a crumb if there is no text for it. |
| if (!empty($_Text)) { |
| // Menu Items must be added at position 1 |
| $Crumb = new Link($_Text, $_URL, $_Target, 0); |
| |
| // Add incoming menuitem |
| $this->CrumbList[count($this->CrumbList)] = $Crumb; |
| } |
| } |
| |
| function getCrumbCount() { |
| return count($this->CrumbList); |
| } |
| |
| function getCrumbAt($_Pos) { |
| if ($_Pos < $this->getCrumbCount()) { |
| return $this->CrumbList[$_Pos]; |
| } |
| // If link does not exist, return an empty link object |
| else { |
| $Crumb = new Link('', '', '', 0); |
| return $Crumb; |
| } |
| } |
| |
| /** |
| * Insert breadcrumb at a specific position |
| * |
| * @param unknown $_Pos |
| * Position to insert at |
| * @param unknown $_Text |
| * Link text |
| * @param unknown $_URL |
| * Link URL |
| * @param unknown $_Target |
| * Link target |
| * |
| */ |
| function insertCrumbAt($_Pos, $_Text, $_URL, $_Target) { |
| if ($_Pos < $this->getCrumbCount() && $_Pos > 0) { // Don't allow inserting |
| // before Home |
| $Crumb = new Link($_Text, $_URL, $_Target, 0); |
| $tempList = array( |
| $Crumb |
| ); |
| $result = array_merge(array_slice($this->CrumbList, 0, $_Pos, true), $tempList, array_slice($this->CrumbList, $_Pos, $this->getCrumbCount(), true)); |
| $this->CrumbList = $result; |
| } |
| else { |
| $this->addCrumb($_Text, $_URL, $_Target); |
| } |
| } |
| |
| /** |
| * Unset a link from CrumbList |
| * |
| * @param int|array $_Key |
| */ |
| private function _removeCrumb($_Key) { |
| if (isset($this->CrumbList[$_Key])) { |
| unset($this->CrumbList[$_Key]); |
| } |
| } |
| |
| /** |
| * Remove links from CrumbList |
| * |
| * Usage example: |
| * |
| * Remove more than one link with an array. |
| * $Breadcrumb->removeCrumb(array(0,3)); |
| * |
| * Remove only one link. |
| * $Breadcrumb->removeCrumb(1); |
| * |
| * @param int|array $_Key |
| */ |
| function removeCrumb($_Key = NULL) { |
| |
| if ($_Key === NULL) { |
| return; |
| } |
| |
| if (is_array($_Key)) { |
| foreach ($_Key as $k) { |
| $this->_removeCrumb($k); |
| } |
| } |
| else { |
| $this->_removeCrumb($_Key); |
| } |
| |
| // 'reindex' CrumbList. |
| $this->CrumbList = array_values($this->CrumbList); |
| } |
| |
| function showBreadcrumbs() { |
| // for debugging purposes only |
| echo "Breadcrumbs: "; |
| foreach ($this->CrumbList as $Crumb) { |
| // $Crumb is a Link object |
| echo "<a href='" . $Crumb->getURL() . "'>" . $Crumb->getText() . "</a>"; |
| echo " | "; |
| } |
| } |
| |
| } |