source: trunk/lib/Navigation.inc.php @ 262

Last change on this file since 262 was 186, checked in by scdev, 18 years ago

Q - bugfixing Navigation.inc.php

File size: 8.8 KB
RevLine 
[1]1<?php
2/**
[184]3 * Navigation.inc.php
[136]4 * code by strangecode :: www.strangecode.com :: this document contains copyrighted information
5 *
6 * The Nav class provides a system for working with navigation elements.
[184]7 * It supports storing page titles and URLs for printing breadcrumbs
8 * and titles, as well as setting page params such as hiding the page title on
9 * some pages but not others, and storing vars like the page title itself.
10 *
11 * Note: this class was renamed from "Nav" because of the change in API and to be more descriptive.
[1]12 *
13 * @author  Quinn Comendant <quinn@strangecode.com>
[184]14 * @version 2.0
[1]15 */
[184]16class Navigation {
[1]17
[184]18    // Configuration parameters for this object.
19    var $_params = array(       
[185]20        'head_title' => true,
21        'body_title' => true,
[1]22        'title' => true,
23        'path' => true,
24        'breadcrumbs' => true,
25        'chop_breadcrumbs' => 0,
26        'chop_breadcrumb_links' => 1,
[184]27        'path_delimiter' => ' / ',
28        'last_crumb_format' => '%s',
[1]29    );
[184]30    var $pages = array();
[1]31
32    /**
[184]33     * Navigation constructor.
[1]34     */
[184]35    function Navigation($params=null)
[1]36    {
[184]37        $app =& App::getInstance();
38
39        if (isset($params) && is_array($params)) {
40            // Merge new parameters with old overriding only those passed.
41            $this->_params = array_merge($this->_params, $params);
[1]42        }
43    }
44
45    /**
46     * Add a page to the internal pages array. Pages must be added sequentially
47     * as they are to be printed. The root page must be added first, and the
[184]48     * current page added last. Vars can be specified for any page, but only vars
49     * from the "current" page will be accessed with Nav::get.
50     *
[1]51     * @access  public
52     * @param   string  $title      The title of the page.
[184]53     * @param   string  $url        The URL to the page. Set to null to use PHP_SELF.
54     * @param   array   $vars       Additoinal page variables.
[1]55     */
[184]56    function add($title, $url=null, $vars=array())
[1]57    {
[184]58        $page = array(
59            'title' => $title,
[186]60            'head_title' => $title,
61            'body_title' => $title,
[185]62            'url' => is_null($url) ? $_SERVER['PHP_SELF'] : $url,
[1]63        );
[184]64        $this->pages[] = array_merge($page, $vars);
[1]65    }
[42]66
[1]67    /**
[184]68     * Set (or overwrite existing) parameters by passing an array of new parameters.
[1]69     *
[184]70     * @access public
71     * @param  array    $params     Array of parameters (key => val pairs).
72     */
73    function setParam($params)
74    {
75        $app =& App::getInstance();
76   
77        if (isset($params) && is_array($params)) {
78            // Merge new parameters with old overriding only those passed.
79            $this->_params = array_merge($this->_params, $params);
80        } else {
81            $app->logMsg(sprintf('Parameters are not an array: %s', $params), LOG_ERR, __FILE__, __LINE__);
82        }
83    }
84
85    /**
86     * Return the value of a parameter, if it exists.
[1]87     *
[184]88     * @access public
89     * @param string $param        Which parameter to return.
90     * @return mixed               Configured parameter value.
[1]91     */
[184]92    function getParam($param)
[1]93    {
[184]94        $app =& App::getInstance();
95   
96        if (isset($this->_params[$param])) {
97            return $this->_params[$param];
98        } else {
99            $app->logMsg(sprintf('Parameter is not set: %s', $param), LOG_DEBUG, __FILE__, __LINE__);
100            return null;
[1]101        }
102    }
103
104    /**
[184]105     * Unsets all pages.
[1]106     *
107     * @access  public
108     */
[184]109    function clear()
[1]110    {
111        $this->pages = array();
112    }
113
114    /**
[184]115     * Sets a variable into the current page.
[1]116     *
[184]117     * @access public
118     * @param mixed $key      Which value to set.
119     * @param mixed $val      Value to set variable to.
[1]120     */
[184]121    function set($key, $val)
[1]122    {
[184]123        // Set params of current page.
[186]124        $curr_page =& $this->pages[sizeof($this->pages) - 1];       
[184]125        $curr_page[$key] = $val;
[1]126    }
127
128    /**
[184]129     * Returns a specified value from the current page.
[1]130     *
[184]131     * @access public
132     * @param mixed $key      Which value to return.
133     * @param mixed $default  Value to return if key not found in user_data.
134     * @return mixed          Value stored in session.
[1]135     */
[184]136    function get($key, $default='')
[1]137    {
[184]138        $curr_page =& $this->pages[sizeof($this->pages) - 1];
139       
140        switch ($key) {
141        case 'title' :
142            if ($this->getParam('title') && isset($curr_page['title'])) {
143                return $curr_page['title'];
144            }
145            break;
[42]146
[184]147        case 'head_title' :
148            if ($this->getParam('head_title') && $this->getParam('title') && isset($curr_page['head_title'])) {
149                return $curr_page['head_title'];
150            }
151            break;
152
153        case 'body_title' :
[186]154            if ($this->getParam('body_title') && $this->getParam('title') && isset($curr_page['body_title'])) {
[184]155                return $curr_page['body_title'];
156            }
157            break;
158
159        case 'path' :
160            if ($this->getParam('path')) {
161                return $this->getPath();
162            }
163            break;
164
165        case 'breadcrumbs' :
166            if ($this->getParam('breadcrumbs')) {
167                return $this->getBreadcrumbs();
168            }
169            break;
170
171        default :
172            return isset($curr_page[$key]) ? $curr_page[$key] : $default;
173            break;
[1]174        }
175
[184]176        return $default;
[1]177    }
178
179    /**
180     * Returns the text path from root up to the current page, seperated by the
181     * path_delimeter.
182     *
183     * @access  public
184     *
[184]185     * @return  mixed   Path (string) or false if path param is not set.
[1]186     */
[184]187    function getPath()
[1]188    {
[184]189        if ($this->getParam('path')) {
[1]190            $path = '';
191            $pathmark = '';
[184]192            foreach ($this->pages as $page) {
[1]193                $path .= oTxt($pathmark . strip_tags($page['title']), true);
[184]194                $pathmark = $this->getParam('path_delimiter');
[1]195            }
196            return $path;
197        } else {
198            return false;
199        }
200    }
201
202    /**
203     * Returns the breadcrumbs from the root page to the current page.
204     * Breadcrumbs are the text path with pages titles linked to that page.
205     *
206     * @access  public
207     *
[184]208     * @return  mixed   Breadcrumbs (string) or false if breadcrumbs param not set.
[1]209     */
[184]210    function getBreadcrumbs()
[1]211    {
[136]212        $app =& App::getInstance();
213
[184]214        if ($this->getParam('breadcrumbs')) {
[1]215            $breadcrumbs = '';
216            $pathmark = '';
217            $crumb_count = sizeof($this->pages);
[184]218            foreach ($this->pages as $page) {
219                if ($crumb_count <= $this->getParam('chop_breadcrumbs')) {
[1]220                    // Stop gathering crumbs.
221                    return $breadcrumbs;
222                }
223                if ($crumb_count <= 1) {
224                    // The last crumb.
[184]225                    if ('' == trim($page['url']) || $crumb_count <= $this->getParam('chop_breadcrumb_links')) {
[1]226                        // A crumb with no link.
[184]227                        $breadcrumbs .= oTxt($pathmark, true) . sprintf($this->getParam('last_crumb_format'), oTxt($page['title'], true));
228                    } else if ($crumb_count > $this->getParam('chop_breadcrumb_links')) {
[1]229                        // A normal linked crumb.
[184]230                        $breadcrumbs .= oTxt($pathmark, true) . '<a href="' . $app->oHREF($page['url']) . '">' . sprintf($this->getParam('last_crumb_format'), oTxt($page['title'], true)) . '</a>';
[1]231                    }
232                } else {
[184]233                    if ('' == trim($page['url'])) {
[1]234                        // A crumb with no link.
235                        $breadcrumbs .= oTxt($pathmark . $page['title'], true);
236                    } else {
237                        // A normal linked crumb.
[136]238                        $breadcrumbs .= oTxt($pathmark, true) . '<a href="' . $app->oHREF($page['url']) . '">' . oTxt($page['title'], true) . '</a>';
[1]239                    }
240                }
[184]241                $pathmark = $this->getParam('path_delimiter');
[1]242                $crumb_count--;
243            }
244            return $breadcrumbs;
245        } else {
246            return false;
247        }
248    }
249
250    /**
251     * Returns a string if the queried page is the current page. One use is to print
252     * CSS tags if the current page matches a link, such as:
253     * $nav->currentPage('mypage.php', ' id="current"');
254     *
255     * @access  public
256     *
[44]257     * @param   mixed   $page   The URI of the page to query, with PREG express markup, if needed.
[1]258     * @param   mixed   $return The value to return if the current page matches the page queried.
259     *
[44]260     * @return  mixed   The value set for $return, TRUE by default.
[1]261     */
262    function currentPage($page_uri, $return=true)
263    {
[155]264        // $page_uri = str_replace('/', '\/', $page_uri);
265        if (preg_match('/^' . preg_quote(urldecode($page_uri), '/') . '/i', $_SERVER['PHP_SELF'])) {
[1]266            return $return;
267        }
268    }
[42]269
270}
[1]271// End of class.
272
273?>
Note: See TracBrowser for help on using the repository browser.