"Back"

Block Source: Mage_Page_Block_Html_Head

<?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@magento.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.magento.com for more information.
 *
 * @category    Mage
 * @package     Mage_Page
 * @copyright  Copyright (c) 2006-2015 X.commerce, Inc. (http://www.magento.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)) {
                
// open !IE conditional using raw value
                
if (strpos($if"><!-->") !== false) {
                    
$html .= $if "\n";
                } else {
                    
$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)) {
                
// close !IE conditional comments correctly
                
if (strpos($if"><!-->") !== false) {
                    
$html .= '<!--<![endif]-->' "\n";
                } else {
                    
$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);
    }
}