*/
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 .= '") !== false) {
$html .= '' . "\n";
} else {
$html .= '' . "\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('', $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('',
$href, $params
);
break;
case 'link_rel':
$lines[$itemIf]['other'][] = sprintf('', $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);
}
}