0byt3m1n1
Path:
/
data
/
applications
/
aps
/
magento
/
1.5.1.0-0
/
standard
/
htdocs
/
app
/
code
/
core
/
Mage
/
Core
/
Model
/
[
Home
]
File: Url.php
<?php /** * Magento * * NOTICE OF LICENSE * * This source file is subject to the Open Software License (OSL 3.0) * that is bundled with this package in the file LICENSE.txt. * It is also available through the world-wide-web at this URL: * http://opensource.org/licenses/osl-3.0.php * If you did not receive a copy of the license and are unable to * obtain it through the world-wide-web, please send an email * to license@magentocommerce.com so we can send you a copy immediately. * * DISCLAIMER * * Do not edit or add to this file if you wish to upgrade Magento to newer * versions in the future. If you wish to customize Magento for your * needs please refer to http://www.magentocommerce.com for more information. * * @category Mage * @package Mage_Core * @copyright Copyright (c) 2010 Magento Inc. (http://www.magentocommerce.com) * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) */ /** * URL * * Properties: * * - request * * - relative_url: true, false * - type: 'link', 'skin', 'js', 'media' * - store: instanceof Mage_Core_Model_Store * - secure: true, false * * - scheme: 'http', 'https' * - user: 'user' * - password: 'password' * - host: 'localhost' * - port: 80, 443 * - base_path: '/dev/magento/' * - base_script: 'index.php' * * - storeview_path: 'storeview/' * - route_path: 'module/controller/action/param1/value1/param2/value2' * - route_name: 'module' * - controller_name: 'controller' * - action_name: 'action' * - route_params: array('param1'=>'value1', 'param2'=>'value2') * * - query: (?)'param1=value1¶m2=value2' * - query_array: array('param1'=>'value1', 'param2'=>'value2') * - fragment: (#)'fragment-anchor' * * URL structure: * * https://user:password@host:443/base_path/[base_script][storeview_path]route_name/controller_name/action_name/param1/value1?query_param=query_value#fragment * \__________A___________/\____________________________________B_____________________________________/ * \__________________C___________________/ \__________________D_________________/ \_____E_____/ * \_____________F______________/ \___________________________G______________________/ * \___________________________________________________H____________________________________________________/ * * - A: authority * - B: path * - C: absolute_base_url * - D: action_path * - E: route_params * - F: host_url * - G: route_path * - H: route_url * * @category Mage * @package Mage_Core * @author Magento Core Team <core@magentocommerce.com> */ class Mage_Core_Model_Url extends Varien_Object { const DEFAULT_CONTROLLER_NAME = 'index'; const DEFAULT_ACTION_NAME = 'index'; const XML_PATH_UNSECURE_URL = 'web/unsecure/base_url'; const XML_PATH_SECURE_URL = 'web/secure/base_url'; const XML_PATH_SECURE_IN_ADMIN = 'web/secure/use_in_adminhtml'; const XML_PATH_SECURE_IN_FRONT = 'web/secure/use_in_frontend'; static protected $_configDataCache; static protected $_encryptedSessionId; /** * Reserved Route parametr keys * * @var array */ protected $_reservedRouteParams = array( '_store', '_type', '_secure', '_forced_secure', '_use_rewrite', '_nosid', '_absolute', '_current', '_direct', '_fragment', '_escape', '_query', '_store_to_url' ); /** * Controller request object * * @var Zend_Controller_Request_Http */ protected $_request; /** * Use Session ID for generate URL * * @var bool */ protected $_useSession; protected function _construct() { $this->setStore(null); } /** * Initialize object data from retrieved url * * @param string $url * @return Mage_Core_Model_Url */ public function parseUrl($url) { $data = parse_url($url); $parts = array( 'scheme'=>'setScheme', 'host' =>'setHost', 'port' =>'setPort', 'user' =>'setUser', 'pass' =>'setPassword', 'path' =>'setPath', 'query' =>'setQuery', 'fragment'=>'setFragment'); foreach ($parts as $component=>$method) { if (isset($data[$component])) { $this->$method($data[$component]); } } return $this; } /** * Retrieve default controller name * * @return string */ public function getDefaultControllerName() { return self::DEFAULT_CONTROLLER_NAME; } public function setUseUrlCache($flag) { $this->setData('use_url_cache', $flag); return $this; } /** * Set use session rule * * @param bool $useSession * @return Mage_Core_Model_Url */ public function setUseSession($useSession) { $this->_useSession = (bool)$useSession; return $this; } public function setRouteFrontName($name) { $this->setData('route_front_name', $name); return $this; } /** * Retrieve use session rule * * @return bool */ public function getUseSession() { if (is_null($this->_useSession)) { $this->_useSession = Mage::app()->getUseSessionInUrl(); } return $this->_useSession; } /** * Retrieve default action name * * @return string */ public function getDefaultActionName() { return self::DEFAULT_ACTION_NAME; } public function getConfigData($key, $prefix=null) { if (is_null($prefix)) { $prefix = 'web/'.($this->getSecure() ? 'secure' : 'unsecure').'/'; } $path = $prefix.$key; $cacheId = $this->getStore()->getCode().'/'.$path; if (!isset(self::$_configDataCache[$cacheId])) { $data = $this->getStore()->getConfig($path); self::$_configDataCache[$cacheId] = $data; } return self::$_configDataCache[$cacheId]; } public function setRequest(Zend_Controller_Request_Http $request) { $this->_request = $request; return $this; } /** * Zend request object * * @return Zend_Controller_Request_Http */ public function getRequest() { if (!$this->_request) { $this->_request = Mage::app()->getRequest(); } return $this->_request; } public function getType() { if (!$this->hasData('type')) { $this->setData('type', Mage_Core_Model_Store::URL_TYPE_LINK); } return $this->_getData('type'); } /** * Retrieve is secure mode URL * * @return bool */ public function getSecure() { if ($this->hasData('secure_is_forced')) { return $this->getData('secure'); } $store = $this->getStore(); if ($store->isAdmin() && !$store->isAdminUrlSecure()) { //!Mage::getStoreConfigFlag(self::XML_PATH_SECURE_IN_ADMIN, $this->getStore()->getId()) return false; } if (!$store->isAdmin() && !$store->isFrontUrlSecure()) {//!Mage::getStoreConfigFlag(self::XML_PATH_SECURE_IN_FRONT return false; } if (!$this->hasData('secure')) { if ($this->getType() == Mage_Core_Model_Store::URL_TYPE_LINK) { $pathSecure = Mage::getConfig()->shouldUrlBeSecure('/'.$this->getActionPath()); $this->setData('secure', $pathSecure); } else { $this->setData('secure', $store->isCurrentlySecure()); } } return $this->getData('secure'); } public function setStore($data) { $this->setData('store', Mage::app()->getStore($data)); return $this; } /** * Get current store for the url instance * * @return Mage_Core_Model_Store */ public function getStore() { if (!$this->hasData('store')) { $this->setStore(null); } return $this->_getData('store'); } /** * Retrieve Base URL * * @param array $params * @return string */ public function getBaseUrl($params = array()) { if (isset($params['_store'])) { $this->setStore($params['_store']); } if (isset($params['_type'])) { $this->setType($params['_type']); } if (isset($params['_secure'])) { $this->setSecure($params['_secure']); } /** * Add availability support urls without store code */ if ($this->getType() == Mage_Core_Model_Store::URL_TYPE_LINK && Mage::app()->getRequest()->isDirectAccessFrontendName($this->getRouteFrontName())) { $this->setType(Mage_Core_Model_Store::URL_TYPE_DIRECT_LINK); } return $this->getStore()->getBaseUrl($this->getType(), $this->getSecure()); } /** * Set Route Parameters * * @param array $data * @return Mage_Core_Model_Url */ public function setRoutePath($data) { if ($this->_getData('route_path')==$data) { return $this; } $a = explode('/', $data); $route = array_shift($a); if ('*'===$route) { $route = $this->getRequest()->getRequestedRouteName(); } $this->setRouteName($route); $routePath = $route.'/'; if (!empty($a)) { $controller = array_shift($a); if ('*'===$controller) { $controller = $this->getRequest()->getRequestedControllerName(); } $this->setControllerName($controller); $routePath .= $controller.'/'; } if (!empty($a)) { $action = array_shift($a); if ('*'===$action) { $action = $this->getRequest()->getRequestedActionName(); } $this->setActionName($action); $routePath .= $action.'/'; } if (!empty($a)) { $this->unsetData('route_params'); while (!empty($a)) { $key = array_shift($a); if (!empty($a)) { $value = array_shift($a); $this->setRouteParam($key, $value); #$routePath .= $key.'/'.urlencode($value).'/'; $routePath .= $key.'/'.$value.'/'; } } } #$this->setData('route_path', $routePath); return $this; } public function getActionPath() { if (!$this->getRouteName()) { return ''; } $hasParams = (bool)$this->getRouteParams(); $path = $this->getRouteFrontName() . '/'; if ($this->getControllerName()) { $path .= $this->getControllerName() . '/'; } elseif ($hasParams) { $path .= $this->getDefaultControllerName() . '/'; } if ($this->getActionName()) { $path .= $this->getActionName() . '/'; } elseif ($hasParams) { $path .= $this->getDefaultActionName() . '/'; } return $path; } public function getRoutePath($routeParams=array()) { if (!$this->hasData('route_path')) { $routePath = $this->getRequest()->getAlias(Mage_Core_Model_Url_Rewrite::REWRITE_REQUEST_PATH_ALIAS); if (!empty($routeParams['_use_rewrite']) && ($routePath !== null)) { $this->setData('route_path', $routePath); return $routePath; } $routePath = $this->getActionPath(); if ($this->getRouteParams()) { foreach ($this->getRouteParams() as $key=>$value) { if (is_null($value) || false===$value || ''===$value || !is_scalar($value)) { continue; } $routePath .= $key.'/'.$value.'/'; } } if ($routePath != '' && substr($routePath, -1, 1) !== '/') { $routePath.= '/'; } $this->setData('route_path', $routePath); } return $this->_getData('route_path'); } public function setRouteName($data) { if ($this->_getData('route_name')==$data) { return $this; } $this->unsetData('route_front_name') ->unsetData('route_path') ->unsetData('controller_name') ->unsetData('action_name') ->unsetData('secure'); return $this->setData('route_name', $data); } public function getRouteFrontName() { if (!$this->hasData('route_front_name')) { $routeName = $this->getRouteName(); $route = Mage::app()->getFrontController()->getRouterByRoute($routeName); $frontName = $route->getFrontNameByRoute($routeName); $this->setRouteFrontName($frontName); } return $this->_getData('route_front_name'); } public function getRouteName() { return $this->_getData('route_name'); } /** * Set Controller Name * Reset action name and route path if has change * * @param string $data * @return Mage_Core_Model_Url */ public function setControllerName($data) { if ($this->_getData('controller_name')==$data) { return $this; } $this->unsetData('route_path')->unsetData('action_name')->unsetData('secure'); return $this->setData('controller_name', $data); } public function getControllerName() { return $this->_getData('controller_name'); } /** * Set Action name * Reseted route path if action name has change * * @param string $data * @return Mage_Core_Model_Url */ public function setActionName($data) { if ($this->_getData('action_name') == $data) { return $this; } $this->unsetData('route_path'); return $this->setData('action_name', $data)->unsetData('secure'); } public function getActionName() { return $this->_getData('action_name'); } public function setRouteParams(array $data, $unsetOldParams=true) { if (isset($data['_type'])) { $this->setType($data['_type']); unset($data['_type']); } if (isset($data['_store'])) { $this->setStore($data['_store']); unset($data['_store']); } if (isset($data['_forced_secure'])) { $this->setSecure((bool)$data['_forced_secure']); $this->setSecureIsForced(true); unset($data['_forced_secure']); } else { if (isset($data['_secure'])) { $this->setSecure((bool)$data['_secure']); unset($data['_secure']); } } if (isset($data['_absolute'])) { unset($data['_absolute']); } if ($unsetOldParams) { $this->unsetData('route_params'); } $this->setUseUrlCache(true); if (isset($data['_current'])) { if (is_array($data['_current'])) { foreach ($data['_current'] as $key) { if (array_key_exists($key, $data) || !$this->getRequest()->getUserParam($key)) { continue; } $data[$key] = $this->getRequest()->getUserParam($key); } } elseif ($data['_current']) { foreach ($this->getRequest()->getUserParams() as $key=>$value) { if (array_key_exists($key, $data) || $this->getRouteParam($key)) { continue; } $data[$key] = $value; } foreach ($this->getRequest()->getQuery() as $key=>$value) { $this->setQueryParam($key, $value); } $this->setUseUrlCache(false); } unset($data['_current']); } if (isset($data['_use_rewrite'])) { unset($data['_use_rewrite']); } if (isset($data['_store_to_url']) && (bool)$data['_store_to_url'] === true) { if (!Mage::getStoreConfig(Mage_Core_Model_Store::XML_PATH_STORE_IN_URL, $this->getStore()) && !Mage::app()->isSingleStoreMode() ) { $this->setQueryParam('___store', $this->getStore()->getCode()); } } unset($data['_store_to_url']); foreach ($data as $k=>$v) { $this->setRouteParam($k, $v); } return $this; } public function getRouteParams() { return $this->_getData('route_params'); } public function setRouteParam($key, $data) { $params = $this->_getData('route_params'); if (isset($params[$key]) && $params[$key]==$data) { return $this; } $params[$key] = $data; $this->unsetData('route_path'); return $this->setData('route_params', $params); } public function getRouteParam($key) { return $this->_getData('route_params', $key); } public function getRouteUrl($routePath=null, $routeParams=null) { $this->unsetData('route_params'); if (isset($routeParams['_direct'])) { if (is_array($routeParams)) { $this->setRouteParams($routeParams, false); } return $this->getBaseUrl().$routeParams['_direct']; } if (!is_null($routePath)) { $this->setRoutePath($routePath); } if (is_array($routeParams)) { $this->setRouteParams($routeParams, false); } $url = $this->getBaseUrl().$this->getRoutePath($routeParams); return $url; } /** * If the host was switched but session cookie won't recognize it - add session id to query * * @return unknown */ public function checkCookieDomains() { $hostArr = explode(':', $this->getRequest()->getServer('HTTP_HOST')); if ($hostArr[0]!==$this->getHost()) { $session = Mage::getSingleton('core/session'); if (!$session->isValidForHost($this->getHost())) { if (!self::$_encryptedSessionId) { $helper = Mage::helper('core'); if (!$helper) { return $this; } self::$_encryptedSessionId = $session->getEncryptedSessionId(); } $this->setQueryParam( $session->getSessionIdQueryParam(), self::$_encryptedSessionId ); } } return $this; } public function addSessionParam() { $session = Mage::getSingleton('core/session'); if (!self::$_encryptedSessionId) { $helper = Mage::helper('core'); if (!$helper) { return $this; } self::$_encryptedSessionId = $session->getEncryptedSessionId(); } $this->setQueryParam( $session->getSessionIdQueryParam(), self::$_encryptedSessionId ); return $this; } /** * Set URL query param(s) * * @param mixed $data * @return Mage_Core_Model_Url */ public function setQuery($data) { if ($this->_getData('query') == $data) { return $this; } $this->unsetData('query_params'); return $this->setData('query', $data); } /** * Get query params part of url * * @param bool $escape "&" escape flag * @return string */ public function getQuery($escape = false) { if (!$this->hasData('query')) { $query = ''; $params = $this->getQueryParams(); if (is_array($params)) { ksort($params); $query = http_build_query($params, '', $escape ? '&' : '&'); } $this->setData('query', $query); } return $this->_getData('query'); } /** * Set query Params as array * * @param array $data * @return Mage_Core_Model_Url */ public function setQueryParams(array $data) { $this->unsetData('query'); if ($this->_getData('query_params') == $data) { return $this; } $params = $this->_getData('query_params'); if (!is_array($params)) { $params = array(); } foreach ($data as $param => $value) { $params[$param] = $value; } $this->setData('query_params', $params); return $this; } /** * Purge Query params array * * @return Mage_Core_Model_Url */ public function purgeQueryParams() { $this->setData('query_params', array()); return $this; } /** * Retrurn Query Params * * @return array */ public function getQueryParams() { if (!$this->hasData('query_params')) { $params = array(); if ($this->_getData('query')) { foreach (explode('&', $this->_getData('query')) as $param) { $paramArr = explode('=', $param); $params[$paramArr[0]] = urldecode($paramArr[1]); } } $this->setData('query_params', $params); } return $this->_getData('query_params'); } public function setQueryParam($key, $data) { $params = $this->getQueryParams(); if (isset($params[$key]) && $params[$key]==$data) { return $this; } $params[$key] = $data; $this->unsetData('query'); return $this->setData('query_params', $params); } public function getQueryParam($key) { if (!$this->hasData('query_params')) { $this->getQueryParams(); } return $this->_getData('query_params', $key); } /** * Set fragment to URL * * @param string $data * @return Mage_Core_Model_Url */ public function setFragment($data) { return $this->setData('fragment', $data); } public function getFragment() { return $this->_getData('fragment'); } /** * Build url by requested path and parameters * * @param string $routePath * @param array $routeParams * @return string */ public function getUrl($routePath=null, $routeParams=null) { $escapeQuery = false; /** * All system params should be unseted before we call getRouteUrl * this method has condition for ading default controller anr actions names * in case when we have params */ if (isset($routeParams['_fragment'])) { $this->setFragment($routeParams['_fragment']); unset($routeParams['_fragment']); } if (isset($routeParams['_escape'])) { $escapeQuery = $routeParams['_escape']; unset($routeParams['_escape']); } $query = null; if (isset($routeParams['_query'])) { $this->purgeQueryParams(); $query = $routeParams['_query']; unset($routeParams['_query']); } $noSid = null; if (isset($routeParams['_nosid'])) { $noSid = (bool)$routeParams['_nosid']; unset($routeParams['_nosid']); } $url = $this->getRouteUrl($routePath, $routeParams); /** * Apply query params, need call after getRouteUrl for rewrite _current values */ if ($query !== null) { if (is_string($query)) { $this->setQuery($query); } elseif (is_array($query)) { $this->setQueryParams($query, !empty($routeParams['_current'])); } if ($query === false) { $this->setQueryParams(array()); } } if ($noSid !== true) { $this->_prepareSessionUrl($url); } if ($query = $this->getQuery($escapeQuery)) { $url .= '?'.$query; } if ($this->getFragment()) { $url .= '#'.$this->getFragment(); } return $this->escape($url); } /** * Check and add session id to URL * * @param string $url * @return Mage_Core_Model_Url */ protected function _prepareSessionUrl($url) { if (!$this->getUseSession()) { return $this; } $session = Mage::getSingleton('core/session'); /* @var $session Mage_Core_Model_Session */ if (Mage::app()->getUseSessionVar() && !$session->getSessionIdForHost($url)) { // secure URL if ($this->getSecure()) { $this->setQueryParam('___SID', 'S'); } else { $this->setQueryParam('___SID', 'U'); } } else { if ($sessionId = $session->getSessionIdForHost($url)) { $this->setQueryParam($session->getSessionIdQueryParam(), $sessionId); } } return $this; } /** * Escape (enclosure) URL string * * @param string $value * @return string */ public function escape($value) { $value = str_replace('"', '%22', $value); $value = str_replace("'", '%27', $value); $value = str_replace('>', '%3E', $value); $value = str_replace('<', '%3C', $value); return $value; } /** * Build url by direct url and parameters * * @param string $url * @param array $params * @return string */ public function getDirectUrl($url, $params = array()) { $params['_direct'] = $url; return $this->getUrl('', $params); } /** * Replace Session ID value in URL * * @param string $html * @return string */ public function sessionUrlVar($html) { return preg_replace_callback('#(\?|&|&)___SID=([SU])(&|&)?#', array($this, "sessionVarCallback"), $html); } /** * Check and return use SID for URL * * @param bool $secure * @return bool */ public function useSessionIdForUrl($secure = false) { $key = 'use_session_id_for_url_' . (int)$secure; if (is_null($this->getData($key))) { $httpHost = Mage::app()->getFrontController()->getRequest()->getHttpHost(); $urlHost = parse_url(Mage::app()->getStore()->getBaseUrl(Mage_Core_Model_Store::URL_TYPE_LINK, $secure), PHP_URL_HOST); if ($httpHost != $urlHost) { $this->setData($key, true); } else { $this->setData($key, false); } } return $this->getData($key); } /** * Callback function for session replace * * @param array $match * @return string */ public function sessionVarCallback($match) { if ($this->useSessionIdForUrl($match[2] == 'S' ? true : false)) { $session = Mage::getSingleton('core/session'); /* @var $session Mage_Core_Model_Session */ return $match[1] . $session->getSessionIdQueryParam() . '=' . $session->getEncryptedSessionId() . (isset($match[3]) ? $match[3] : ''); } else { if ($match[1] == '?' && isset($match[3])) { return '?'; } elseif ($match[1] == '?' && !isset($match[3])) { return ''; } elseif (($match[1] == '&' || $match[1] == '&') && !isset($match[3])) { return ''; } elseif (($match[1] == '&' || $match[1] == '&') && isset($match[3])) { return $match[3]; } } return ''; } /** * Check if users originated URL is one of the domain URLs assigned to stores * * @return boolean */ public function isOwnOriginUrl() { $storeDomains = array(); $referer = parse_url(Mage::app()->getFrontController()->getRequest()->getServer('HTTP_REFERER'), PHP_URL_HOST); foreach (Mage::app()->getStores() as $store) { $storeDomains[] = parse_url($store->getBaseUrl(), PHP_URL_HOST); } $storeDomains = array_unique($storeDomains); if (empty($referer) || in_array($referer, $storeDomains)) { return true; } return false; } }