------------------------------------------------------------------------------- $Id$ -----------------------------------------------------------------------------*/ require_once 'HTML/Common.php'; /** * HTML Link representation. When adding GET variables, if the value is an object, it looks for a toString() method, if it doesn't exists or if is an array, it serializes the object/array to get a string value. This is done in toHtml() method. Object are stored as references. * * @package HTML * @access public */ class MLIB_HTML_Link extends HTML_Common { /** * Variables to send via GET HTTP method. * * @var array $getVars * @access protected */ var $_getVars = array(); /** * Link contents. * * @var array $contents * @access protected */ var $_contents = array(); /** * Gets GetVars. * * @return array * @access public */ function getGetVars() { return $this->_getVars; } /** * Sets GetVars. * * @param array $getVars GetVars. * * @return void * @access public */ function setGetVars($getVars) { $this->_getVars = $getVars; } /** * Constructor. * * @param string $href Hypertext reference. * @param mixed $contents Link contents. * @param array $getVars Array (as key => value pairs) of GET variables to pass to the link. * @param array $attrs Other links (A tag) attributes. * * @return void * @access public */ function MLIB_HTML_Link($href = '', $contents = '', $getVars = array(), $attrs = array()) { if (is_array($attrs)) { $attrs['href'] = $href; if (!isset($attrs['class'])){ $attrs['class'] = 'MLIB_html_link'; } } else { $attrs .= " href=$href"; } parent::HTML_Common($attrs); $this->_getVars = $getVars; $this->addContents($contents); } /** * Converts to HTML output. * * @return string * @access public */ function toHtml() { $attrs = ''; foreach ($this->getAttributes() as $key => $val) { if ($key == 'href') { $val = $this->getURI(); } else { $val = htmlentities($val); } $attrs .= ' ' . $key . '="' . $val . '"'; } return "" . $this->getContents() . ''; } /** * Gets hypertext reference. * * @return string * @access public */ function getHref() { return $this->getAttribute('href'); } /** * Sets hypertext reference. * * @param string $href Hypertext reference. * * @return void * @access public */ function setHref($href) { $this->updateAttributes(array('href' => $href)); } /** * Set a GET variable. * * @param string $key Key for the GET variable. * @param mixed $value Value for the variable. * * @return void * @access public */ function setGetVar($key, $value) { $this->_getVars[$key] = $value; } /** * Updates GET variables. * * @param array $vars Array (as key => value pairs) of GET variables to update. If they doesn't exists, they are added, if they exists, they are updated. * * @return void * @access public */ function updateGetVars($vars) { foreach ($vars as $key => $value) { $this->_getVars[$key] = $value; } } /** * Unsets (removes) GET variables. This method supports variable arguments. * * @param string $key Key of the GET variable to remove. * * @return void * @access public */ function unsetGetVars($key) { $keys = func_get_args(); foreach ($keys as $key) { unset($this->_getVars[$key]); } } /** * Adds contents to the link. * * @param mixed &$contents Contents to add. Can be an object with a toHtml() method. * @param bool $front Tells where to put the new content. * * @return void * @access public */ function addContents($contents, $front = false) { if ($front) { array_unshift($this->_contents, $contents); } else { $this->_contents[] = $contents; } } /** * @return string * @access public */ function getContents() { $html = ''; foreach ($this->_contents as $c) { if (is_object($c) and method_exists($c, 'tohtml')) { $html .= $c->toHtml(); } else { $html .= htmlentities($c); } } return $html; } /** * @param mixed $contents New link contents. * * @return void * @access public */ function setContents($contents) { $this->_contents = array($contents); } /** * @param mixed $contents New link contents. * * @return void * @access public */ function getCSS() { return '/MLIB/css/html/link'; } /** * Gets the query string generated with the GET vars. * * @return GET query string. */ function getQueryString() { $vars = array(); if ($this->_getVars) { foreach ($this->_getVars as $var => $v) { if (is_object($v) and method_exists($v, 'tostring')) { $v = $v->tostring(); } elseif (is_object($v)) { $v = serialize($v); } if (is_array($v)) { foreach ($v as $i) { $vars[] = urlencode($var) . '[]=' . urlencode($i); } } else { $vars[] = urlencode($var) . '=' . urlencode($v); } } return join('&', $vars); } } /** * Gets the URI (base page with the query string). * * @return URI string. */ function getURI() { $query = $this->getQueryString(); return $this->getAttribute('href') . ($query ? "?$query" : ''); } } ?>