/app/code/core/Mage/Page/Block/Html/Head.php
PHP | 515 lines | 264 code | 36 blank | 215 comment | 31 complexity | 5bdecd9517b68f4279e335ea33e11922 MD5 | raw file
Possible License(s): CC-BY-SA-3.0, LGPL-2.1, GPL-2.0, WTFPL
- <?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_Page
- * @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)
- */
- /**
- * Html page block
- *
- * @category Mage
- * @package Mage_Page
- * @author Magento Core Team <core@magentocommerce.com>
- */
- class Mage_Page_Block_Html_Head extends Mage_Core_Block_Template
- {
- /**
- * Initialize template
- *
- */
- protected function _construct()
- {
- $this->setTemplate('page/html/head.phtml');
- }
- /**
- * Add CSS file to HEAD entity
- *
- * @param string $name
- * @param string $params
- * @return Mage_Page_Block_Html_Head
- */
- public function addCss($name, $params = "")
- {
- $this->addItem('skin_css', $name, $params);
- return $this;
- }
- /**
- * Add JavaScript file to HEAD entity
- *
- * @param string $name
- * @param string $params
- * @return Mage_Page_Block_Html_Head
- */
- public function addJs($name, $params = "")
- {
- $this->addItem('js', $name, $params);
- return $this;
- }
- /**
- * Add CSS file for Internet Explorer only to HEAD entity
- *
- * @param string $name
- * @param string $params
- * @return Mage_Page_Block_Html_Head
- */
- public function addCssIe($name, $params = "")
- {
- $this->addItem('skin_css', $name, $params, 'IE');
- return $this;
- }
- /**
- * Add JavaScript file for Internet Explorer only to HEAD entity
- *
- * @param string $name
- * @param string $params
- * @return Mage_Page_Block_Html_Head
- */
- public function addJsIe($name, $params = "")
- {
- $this->addItem('js', $name, $params, 'IE');
- return $this;
- }
- /**
- * Add Link element to HEAD entity
- *
- * @param string $rel forward link types
- * @param string $href URI for linked resource
- * @return Mage_Page_Block_Html_Head
- */
- public function addLinkRel($rel, $href)
- {
- $this->addItem('link_rel', $href, 'rel="' . $rel . '"');
- return $this;
- }
- /**
- * Add HEAD Item
- *
- * Allowed types:
- * - js
- * - js_css
- * - skin_js
- * - skin_css
- * - rss
- *
- * @param string $type
- * @param string $name
- * @param string $params
- * @param string $if
- * @param string $cond
- * @return Mage_Page_Block_Html_Head
- */
- public function addItem($type, $name, $params=null, $if=null, $cond=null)
- {
- if ($type==='skin_css' && empty($params)) {
- $params = 'media="all"';
- }
- $this->_data['items'][$type.'/'.$name] = array(
- 'type' => $type,
- 'name' => $name,
- 'params' => $params,
- 'if' => $if,
- 'cond' => $cond,
- );
- return $this;
- }
- /**
- * Remove Item from HEAD entity
- *
- * @param string $type
- * @param string $name
- * @return Mage_Page_Block_Html_Head
- */
- public function removeItem($type, $name)
- {
- unset($this->_data['items'][$type.'/'.$name]);
- return $this;
- }
- /**
- * Get HEAD HTML with CSS/JS/RSS definitions
- * (actually it also renders other elements, TODO: fix it up or rename this method)
- *
- * @return string
- */
- public function getCssJsHtml()
- {
- // separate items by types
- $lines = array();
- foreach ($this->_data['items'] as $item) {
- if (!is_null($item['cond']) && !$this->getData($item['cond']) || !isset($item['name'])) {
- continue;
- }
- $if = !empty($item['if']) ? $item['if'] : '';
- $params = !empty($item['params']) ? $item['params'] : '';
- switch ($item['type']) {
- case 'js': // js/*.js
- case 'skin_js': // skin/*/*.js
- case 'js_css': // js/*.css
- case 'skin_css': // skin/*/*.css
- $lines[$if][$item['type']][$params][$item['name']] = $item['name'];
- break;
- default:
- $this->_separateOtherHtmlHeadElements($lines, $if, $item['type'], $params, $item['name'], $item);
- break;
- }
- }
- // prepare HTML
- $shouldMergeJs = Mage::getStoreConfigFlag('dev/js/merge_files');
- $shouldMergeCss = Mage::getStoreConfigFlag('dev/css/merge_css_files');
- $html = '';
- foreach ($lines as $if => $items) {
- if (empty($items)) {
- continue;
- }
- if (!empty($if)) {
- $html .= '<!--[if '.$if.']>'."\n";
- }
- // static and skin css
- $html .= $this->_prepareStaticAndSkinElements('<link rel="stylesheet" type="text/css" href="%s"%s />' . "\n",
- empty($items['js_css']) ? array() : $items['js_css'],
- empty($items['skin_css']) ? array() : $items['skin_css'],
- $shouldMergeCss ? array(Mage::getDesign(), 'getMergedCssUrl') : null
- );
- // static and skin javascripts
- $html .= $this->_prepareStaticAndSkinElements('<script type="text/javascript" src="%s"%s></script>' . "\n",
- empty($items['js']) ? array() : $items['js'],
- empty($items['skin_js']) ? array() : $items['skin_js'],
- $shouldMergeJs ? array(Mage::getDesign(), 'getMergedJsUrl') : null
- );
- // other stuff
- if (!empty($items['other'])) {
- $html .= $this->_prepareOtherHtmlHeadElements($items['other']) . "\n";
- }
- if (!empty($if)) {
- $html .= '<![endif]-->'."\n";
- }
- }
- return $html;
- }
- /**
- * Merge static and skin files of the same format into 1 set of HEAD directives or even into 1 directive
- *
- * Will attempt to merge into 1 directive, if merging callback is provided. In this case it will generate
- * filenames, rather than render urls.
- * The merger callback is responsible for checking whether files exist, merging them and giving result URL
- *
- * @param string $format - HTML element format for sprintf('<element src="%s"%s />', $src, $params)
- * @param array $staticItems - array of relative names of static items to be grabbed from js/ folder
- * @param array $skinItems - array of relative names of skin items to be found in skins according to design config
- * @param callback $mergeCallback
- * @return string
- */
- protected function &_prepareStaticAndSkinElements($format, array $staticItems, array $skinItems, $mergeCallback = null)
- {
- $designPackage = Mage::getDesign();
- $baseJsUrl = Mage::getBaseUrl('js');
- $items = array();
- if ($mergeCallback && !is_callable($mergeCallback)) {
- $mergeCallback = null;
- }
- // get static files from the js folder, no need in lookups
- foreach ($staticItems as $params => $rows) {
- foreach ($rows as $name) {
- $items[$params][] = $mergeCallback ? Mage::getBaseDir() . DS . 'js' . DS . $name : $baseJsUrl . $name;
- }
- }
- // lookup each file basing on current theme configuration
- foreach ($skinItems as $params => $rows) {
- foreach ($rows as $name) {
- $items[$params][] = $mergeCallback ? $designPackage->getFilename($name, array('_type' => 'skin'))
- : $designPackage->getSkinUrl($name, array());
- }
- }
- $html = '';
- foreach ($items as $params => $rows) {
- // attempt to merge
- $mergedUrl = false;
- if ($mergeCallback) {
- $mergedUrl = call_user_func($mergeCallback, $rows);
- }
- // render elements
- $params = trim($params);
- $params = $params ? ' ' . $params : '';
- if ($mergedUrl) {
- $html .= sprintf($format, $mergedUrl, $params);
- } else {
- foreach ($rows as $src) {
- $html .= sprintf($format, $src, $params);
- }
- }
- }
- return $html;
- }
- /**
- * Classify HTML head item and queue it into "lines" array
- *
- * @see self::getCssJsHtml()
- * @param array &$lines
- * @param string $itemIf
- * @param string $itemType
- * @param string $itemParams
- * @param string $itemName
- * @param array $itemThe
- */
- protected function _separateOtherHtmlHeadElements(&$lines, $itemIf, $itemType, $itemParams, $itemName, $itemThe)
- {
- $params = $itemParams ? ' ' . $itemParams : '';
- $href = $itemName;
- switch ($itemType) {
- case 'rss':
- $lines[$itemIf]['other'][] = sprintf('<link href="%s"%s rel="alternate" type="application/rss+xml" />',
- $href, $params
- );
- break;
- case 'link_rel':
- $lines[$itemIf]['other'][] = sprintf('<link%s href="%s" />', $params, $href);
- break;
- }
- }
- /**
- * Render arbitrary HTML head items
- *
- * @see self::getCssJsHtml()
- * @param array $items
- * @return string
- */
- protected function _prepareOtherHtmlHeadElements($items)
- {
- return implode("\n", $items);
- }
- /**
- * Retrieve Chunked Items
- *
- * @param array $items
- * @param string $prefix
- * @param int $maxLen
- * @return array
- */
- public function getChunkedItems($items, $prefix = '', $maxLen = 450)
- {
- $chunks = array();
- $chunk = $prefix;
- foreach ($items as $item) {
- if (strlen($chunk.','.$item)>$maxLen) {
- $chunks[] = $chunk;
- $chunk = $prefix;
- }
- $chunk .= ','.$item;
- }
- $chunks[] = $chunk;
- return $chunks;
- }
- /**
- * Retrieve Content Type
- *
- * @return string
- */
- public function getContentType()
- {
- if (empty($this->_data['content_type'])) {
- $this->_data['content_type'] = $this->getMediaType().'; charset='.$this->getCharset();
- }
- return $this->_data['content_type'];
- }
- /**
- * Retrieve Media Type
- *
- * @return string
- */
- public function getMediaType()
- {
- if (empty($this->_data['media_type'])) {
- $this->_data['media_type'] = Mage::getStoreConfig('design/head/default_media_type');
- }
- return $this->_data['media_type'];
- }
- /**
- * Retrieve Charset
- *
- * @return string
- */
- public function getCharset()
- {
- if (empty($this->_data['charset'])) {
- $this->_data['charset'] = Mage::getStoreConfig('design/head/default_charset');
- }
- return $this->_data['charset'];
- }
- /**
- * Set title element text
- *
- * @param string $title
- * @return Mage_Page_Block_Html_Head
- */
- public function setTitle($title)
- {
- $this->_data['title'] = Mage::getStoreConfig('design/head/title_prefix') . ' ' . $title
- . ' ' . Mage::getStoreConfig('design/head/title_suffix');
- return $this;
- }
- /**
- * Retrieve title element text (encoded)
- *
- * @return string
- */
- public function getTitle()
- {
- if (empty($this->_data['title'])) {
- $this->_data['title'] = $this->getDefaultTitle();
- }
- return htmlspecialchars(html_entity_decode(trim($this->_data['title']), ENT_QUOTES, 'UTF-8'));
- }
- /**
- * Retrieve default title text
- *
- * @return string
- */
- public function getDefaultTitle()
- {
- return Mage::getStoreConfig('design/head/default_title');
- }
- /**
- * Retrieve content for description tag
- *
- * @return string
- */
- public function getDescription()
- {
- if (empty($this->_data['description'])) {
- $this->_data['description'] = Mage::getStoreConfig('design/head/default_description');
- }
- return $this->_data['description'];
- }
- /**
- * Retrieve content for keyvords tag
- *
- * @return string
- */
- public function getKeywords()
- {
- if (empty($this->_data['keywords'])) {
- $this->_data['keywords'] = Mage::getStoreConfig('design/head/default_keywords');
- }
- return $this->_data['keywords'];
- }
- /**
- * Retrieve URL to robots file
- *
- * @return string
- */
- public function getRobots()
- {
- if (empty($this->_data['robots'])) {
- $this->_data['robots'] = Mage::getStoreConfig('design/head/default_robots');
- }
- return $this->_data['robots'];
- }
- /**
- * Get miscellanious scripts/styles to be included in head before head closing tag
- *
- * @return string
- */
- public function getIncludes()
- {
- if (empty($this->_data['includes'])) {
- $this->_data['includes'] = Mage::getStoreConfig('design/head/includes');
- }
- return $this->_data['includes'];
- }
- /**
- * Getter for path to Favicon
- *
- * @return string
- */
- public function getFaviconFile()
- {
- if (empty($this->_data['favicon_file'])) {
- $this->_data['favicon_file'] = $this->_getFaviconFile();
- }
- return $this->_data['favicon_file'];
- }
- /**
- * Retrieve path to Favicon
- *
- * @return string
- */
- protected function _getFaviconFile()
- {
- $folderName = Mage_Adminhtml_Model_System_Config_Backend_Image_Favicon::UPLOAD_DIR;
- $storeConfig = Mage::getStoreConfig('design/head/shortcut_icon');
- $faviconFile = Mage::getBaseUrl('media') . $folderName . '/' . $storeConfig;
- $absolutePath = Mage::getBaseDir('media') . '/' . $folderName . '/' . $storeConfig;
- if(!is_null($storeConfig) && $this->_isFile($absolutePath)) {
- $url = $faviconFile;
- } else {
- $url = $this->getSkinUrl('favicon.ico');
- }
- return $url;
- }
- /**
- * If DB file storage is on - find there, otherwise - just file_exists
- *
- * @param string $filename
- * @return bool
- */
- protected function _isFile($filename) {
- if (Mage::helper('core/file_storage_database')->checkDbUsage() && !is_file($filename)) {
- Mage::helper('core/file_storage_database')->saveFileToFilesystem($filename);
- }
- return is_file($filename);
- }
- }