/** * Generates an application url. * * @param array $options Array of options. * * @access public * @uses Core\Registry(); * @uses Core\Config(); * * @return string */ public function toUrl(array $options) { static $_cache; $_cache_key = md5(serialize($options)); $options = array_merge(array('controller' => $this->request->controller()), $options); if (!isset($_cache[$_cache_key])) { $mode = isset($options['_mode']) ? Core\Config()->modes($options['_mode']) : $this->request->mode(); if ($mode != $this->request->mode()) { $routes = new Routes($mode); unset($options['_mode']); $route = $routes->extractUrl($options); $route['pattern'] = $routes->toRoute($route['pattern']); } else { unset($options['_mode']); $route = $this->routes->extractUrl($options); $route['pattern'] = $this->routes->toRoute($route['pattern']); } foreach ($route['pattern'] as $key => $url_element) { if (isset($url_element[0]) && $url_element[0] === Core\Config()->ROUTER['variables_prefix']) { $option_key = str_replace(Core\Config()->ROUTER['variables_prefix'], '', $url_element); $options[$option_key] = isset($options[$option_key]) ? $options[$option_key] : null; $route['pattern'][$key] = $options[$option_key]; } } foreach ($options as $key => $option) { if (array_key_exists($key, $route['maps_to'])) { unset($options[$key]); } } if (Core\Config()->SESSION['transparency']) { $options[Core\Config()->SESSION['parameter']] = Core\Session()->getKey(); } $_prefix = ''; if (!Core\Config()->ROUTER['rewrite']) { $_prefix = '?'; } $mode['url'] = $mode['url'] ? $mode['url'] . Core\Config()->ROUTER['separator'] : ''; $_cache[$_cache_key] = $_prefix . $mode['url'] . rtrim(implode(Core\Config()->ROUTER['separator'], $route['pattern']), Core\Config()->ROUTER['separator']) . (!empty($options) ? '?' . http_build_query($options, false, '&') : ''); } return $_cache[$_cache_key]; }