[code][code][code][code]
functions.php
[code=php]<?php
// No direct access.
defined('_JEXEC') or die;
jimport('joomla.html.parameter');
if (!defined('_ARTX_FUNCTIONS')) {
define('_ARTX_FUNCTIONS', 1);
$app['artx_settings'] = array(
'block' => array('has_header' => true),
'menu' => array('show_submenus' => true),
'vmenu' => array('show_submenus' => true, 'simple' => false)
);
/**
* Base class with index.php view routines. Contains method for placing positions,
* calculating classes, decorating components. Version-specific routines are defined
* in subclasses: ArtxPage15 and ArtxPage16.
*/
abstract class ArtxPageView
{
public $page;
protected function __construct($page) {
$this->page = $page;
}
/**
* Returns version-specific body class: art-j15 for joomla15 or art-j16 for joomla16.
*
* Example:
* <body class="art-j15">
*/
abstract function bodyClass();
/**
* Checks whether Joomla! has system messages to display.
*/
abstract function hasMessages();
/**
* Returns true when one of the given positions contains at least one module.
* Example:
* if ($obj->containsModules('top1', 'top2', 'top3')) {
* // the following code will be executed when one of the positions contains modules:
* ...
* }
*/
function containsModules()
{
foreach (func_get_args() as $position)
if (0 != $this->page->countModules($position))
return true;
return false;
}
/**
* Builds list of positions, collapsing the empty ones.
*
* Samples:
* Four positions:
* No empty positions: 25%:25%:25%:25%
* With one empty position: -:50%:25%:25%, 50%:-:25%:25%, 25%:50%:-:25%, 25%:25%:50%:-
* With two empty positions: -:-:75%:25%, -:50%:-:50%, -:50%:50%:-, -:50%:50%:-, 75%:-:-:25%, 50%:-:50%:-, 25%:75%:-:-
* One non-empty position: 100%
* Three positions:
* No empty positions: 33%:33%:34%
* With one empty position: -:66%:34%, 50%:-:50%, 33%:67%:-
* One non-empty position: 100%
*/
function positions($positions, $style) {
// Build $cells by collapsing empty positions:
$cells = array();
$buffer = 0;
$cell = null;
foreach ($positions as $name => $width) {
if ($this->containsModules($name)) {
$cells[$name] = $buffer + $width;
$buffer = 0;
$cell = $name;
} else if (null == $cell)
$buffer += $width;
else
$cells[$cell] += $width;
}
// Backward compatibility:
// For three equal width columns with empty center position width should be 50/50:
if (3 == count($positions) && 2 == count($cells)) {
$columns1 = array_keys($positions);
$columns2 = array_keys($cells);
if (33 == $positions[$columns1[0]] && 33 == $positions[$columns1[1]] && 34 == $positions[$columns1[2]]
&& $columns2[0] == $columns1[0] && $columns2[1] == $columns1[2])
$cells[$columns2[0]] = 50;
$cells[$columns2[1]] = 50;
}
// Render $cells:
if (count($cells) == 0)
return '';
if (count($cells) == 1)
foreach ($cells as $name => $width)
return $this->position($name, $style);
$result = '<table class="position" cellpadding="0" cellspacing="0" border="0">';
$result .= '<tr valign="top">';
foreach ($cells as $name => $width)
$result .='<td width="' . $width. '%">' . $this->position($name, $style). '</td>';
$result .= '</tr>';
$result .= '</table>';
return $result;
}
function position($position, $style = null)
{
return '<jdoc:include type="modules" name="' . $position . '"' . (null != $style ? ' style="artstyle" artstyle="' . $style . '"' : ''). ' />';
}
/**
* Preprocess component content before printing it.
*/
function componentWrapper()
{
}
function getWysiwygBackgroundImprovement($id)
{
ob_start();
?>
(function () {
var waitFor = function (interval, criteria, callback) {
var interval = setInterval(function () {
if (!criteria())
return;
clearInterval(interval);
callback();
}, interval);
};
waitFor(20, function () { return 'undefined' != typeof jQuery; },
function () {
var editor = ('undefined' != typeof tinyMCE)
? tinyMCE
: (('undefined' != typeof JContentEditor)
? JContentEditor : null);
if (null == editor)
return;
waitFor(20,
function () {
if (editor.editors)
for (var key in editor.editors)
if (editor.editors.hasOwnProperty(key))
return editor.editors[key].initialized;
return false;
},
function () {
var ifr = jQuery('#<?php echo $id; ?>');
var ifrdoc = ifr.attr('contentDocument');
setTimeout(function () {
// check whether editor.css is included or not:
if (0 == jQuery('link[href*="/css/editor.css"]', ifrdoc).length)
return;
var background = ifr.css('background-color');
ifr.css('background', 'transparent');
ifr.attr('allowtransparency', 'true');
var layout = jQuery('table.mceLayout');
var background = layout.css('background-color');
layout.css('background', 'transparent');
layout.find('.mceToolbar').css('background', background);
layout.find('.mceStatusbar').css('background', background);
jQuery('body', ifrdoc).css('background', 'transparent');
}, 1);
});
});
})();
<?php
return ob_get_clean();
}
}
class ArtxPage15 extends ArtxPageView
{
public function __construct($page) {
parent::__construct($page);
}
function bodyClass() {
return 'art-j15';
}
function hasMessages()
{
$app = JFactory::getApplication()->getMessageQueue();
if (is_array($app) && count($app))
foreach ($app as $msg)
if (isset($msg['type']) && isset($msg['message']))
return true;
return false;
}
/**
* Wraps component content into article style unless it is not wrapped already.
*
* The componentWrapper method gets the content of the 'component' buffer and searches for the '<div class="art-post">' string in it.
* Then it replaces the componentheading DIV tag with span (to fix the w3.org validation) and replaces content of the buffer with
* wrapped content.
*/
function componentWrapper()
{
if ($this->page->getType()!= 'html')
return;
$option = JRequest::getCmd('option');
$view = JRequest::getCmd('view');
$layout = JRequest::getCmd('layout');
$task = JRequest::getCmd('task');
$content = $this->page->getBuffer('component');
// Workarounds for Joomla bugs and inconsistencies:
switch ($option) {
case "com_user":
switch ($view) {
case "remind":
if ("" == $layout)
$content = str_replace('<button type="submit" class="validate">', '<button type="submit" class="button validate">', $content);
break;
case "reset":
if ("" == $layout)
$content = str_replace('<button type="submit" class="validate">', '<button type="submit" class="button validate">', $content);
break;
}
break;
}
// Code injections:
switch ($option) {
case "com_content":
switch ($view) {
case "article":
if ("edit" == $task)
$this->page->addScriptDeclaration($this->getWysiwygBackgroundImprovement('text_ifr'));
break;
}
break;
}
if ('com_content' == $option && ('frontpage' == $view || 'article' == $view || ('category' == $view && 'blog' == $layout)))
return;
if (false === strpos($content, '<div class="art-post')) {
$title = null;
if (preg_match('~<div\s+class="(componentheading[^"]*)"([^>]*)>([^<]+)</div>~', $content, $matches, PREG_OFFSET_CAPTURE)) {
$content = substr($content, 0, $matches[0][1]). substr($content, $matches[0][1] + strlen($matches[0][0]));
$title = '<span class="' . $matches[1][0] . '"' . $matches[2][0] . '>' . $matches[3][0] . '</span>';
}
$this->page->setBuffer(artxPost(array('header-text' => $title, 'content' => $content)), 'component');
}
}
}
class ArtxPage16 extends ArtxPageView
{
public function __construct($page) {
parent::__construct($page);
}
function bodyClass() {
return 'art-j16';
}
function hasMessages()
{
$app = JFactory::getApplication()->getMessageQueue();
if (is_array($app) && count($app))
foreach ($app as $msg)
if (isset($msg['type']) && isset($msg['message']))
return true;
return false;
}
/**
* Wraps component content into article style unless it is not wrapped already.
*
* The componentWrapper method gets the content of the 'component' buffer and searches for the '<div class="art-post">' string in it.
* Then it wraps content of the buffer with art-post.
*/
function componentWrapper()
{
if ($this->page->getType()!= 'html')
return;
$option = JRequest::getCmd('option');
$view = JRequest::getCmd('view');
$layout = JRequest::getCmd('layout');
$content = $this->page->getBuffer('component');
// Workarounds for Joomla bugs and inconsistencies:
switch ($option) {
case "com_content":
switch ($view) {
case "form":
if ("edit" == $layout)
$content = str_replace('<button type="button" onclick="', '<button type="button" class="button" onclick="', $content);
break;
}
break;
case "com_users":
switch ($view) {
case "remind":
if ("" == $layout)
$content = str_replace('<button type="submit">', '<button type="submit" class="button">', $content);
break;
case "reset":
if ("" == $layout)
$content = str_replace('<button type="submit">', '<button type="submit" class="button">', $content);
break;
case "registration":
if ("" == $layout)
$content = str_replace('<button type="submit" class="validate">', '<button type="submit" class="button validate">', $content);
break;
}
break;
}
// Code injections:
switch ($option) {
case "com_content":
switch ($view) {
case "form":
if ("edit" == $layout)
$this->page->addScriptDeclaration($this->getWysiwygBackgroundImprovement('jform_articletext_ifr'));
break;
}
break;
}
if ('com_content' == $option && ('featured' == $view || 'article' == $view || ('category' == $view && 'blog' == $layout)))
return;
if (false === strpos($content, '<div class="art-post'))
$this->page->setBuffer(artxPost(array('header-text' => null, 'content' => $content)), 'component');
}
}
/**
* Base class with content page routines for rendering page header and article factory.
*/
abstract class ArtxContentView
{
protected $_component;
protected $_componentParams;
/**
* Component page class suffix.
* @var string
*/
public $pageClassSfx;
/**
* @var boolean
*/
public $showPageHeading;
/**
* Page heading (or page title).
* @var string
*/
public $pageHeading;
protected function __construct($component, $params)
{
$this->_component = $component;
$this->_componentParams = $params;
}
abstract function pageHeading($heading = null);
abstract function article($article, $print);
abstract function articleListItem($item);
public function beginPageContainer($class)
{
return '<div class="' . $class . $this->pageClassSfx .'">';
}
public function endPageContainer()
{
return '</div>';
}
}
class ArtxContent15 extends ArtxContentView
{
public function __construct($component, $params)
{
parent::__construct($component, $params);
$this->pageClassSfx = $this->_componentParams->get('pageclass_sfx');
$this->showPageHeading = $this->_componentParams->def('show_page_title', 1);
$this->pageHeading = $this->showPageHeading ? $this->_componentParams->get('page_title') : '';
}
function pageHeading($heading = null)
{
return artxPost(array('header-text' => null == $heading ? $this->pageHeading : $heading));
}
function article($article, $print)
{
return new ArtxContentArticleView15($this->_component, $this->_componentParams, $article, $print);
}
function articleListItem($item)
{
return new ArtxContentFrontpageItemView15($this->_component, $this->_componentParams, $item);
}
}
class ArtxContent16 extends ArtxContentView
{
public function __construct($component, $params)
{
parent::__construct($component, $params);
$this->pageClassSfx = $this->_component->pageclass_sfx;
$this->showPageHeading = $this->_componentParams->def('show_page_heading', 1);
$this->pageHeading = $this->showPageHeading ? $this->_componentParams->get('page_heading') : '';
}
function pageHeading($heading = null)
{
return artxPost(array('header-text' => null == $heading ? $this->pageHeading : $heading));
}
function article($article, $print)
{
return new ArtxContentArticleView16($this->_component, $this->_componentParams, $article, $print);
}
function articleListItem($item)
{
return new ArtxContentFeaturedItemView16($this->_component, $this->_componentParams, $item);
}
}
abstract class ArtxContentGeneralArticleView
{
protected $_component;
protected $_componentParams;
protected $_article;
public $params;
public $isPublished;
public $canEdit;
public $title;
public $titleVisible;
public $titleLink;
public $hits;
public $print;
public $showCreateDate;
public $showModifyDate;
public $showPublishDate;
public $showAuthor;
public $showPdfIcon;
public $showPrintIcon;
public $showEmailIcon;
public $showHits;
public $showUrl;
public $showIntro;
public $showTeaser;
public $showText;
public $showReadmore;
public $showParentCategory;
public $parentCategoryLink;
public $parentCategory;
public $showCategory;
public $categoryLink;
public $category;
protected function __construct($component, $componentParams, $article)
{
// Initialization:
$this->_component = $component;
$this->_componentParams = $componentParams;
$this->_article = $article;
// Calculate properties:
$this->isPublished = 0 != $this->_article->state;
}
public function introText() { return ''; }
public function createDateInfo() { return ''; }
public function modifyDateInfo() { return ''; }
public function publishDateInfo() { return ''; }
public function authorInfo() { return ''; }
public function hitsInfo() { return ''; }
public function pdfIcon() { return ''; }
public function emailIcon() { return ''; }
public function editIcon() { return ''; }
public function printPopupIcon() { return ''; }
public function printScreenIcon() { return ''; }
public function readmore() { return ''; }
public function beginUnpublishedArticle() { return '<div class="system-unpublished">'; }
public function endUnpublishedArticle() { return '</div>'; }
public function articleSeparator() { return '<div class="item-separator"></div>'; }
public function categories()
{
$showParentCategory = $this->showParentCategory && !empty($this->parentCategory);
$showCategory = $this->showCategory && !empty($this->category);
$result = JText::_('Category'). ': ';
if ($showParentCategory) {
$result .= '<span class="art-post-metadata-category-parent">';
$title = $this->_component->escape($this->parentCategory);
if (!empty($this->parentCategoryLink))
$result .= '<a href="' . $this->parentCategoryLink . '">' . $title . '</a>';
else
$result .= $title;
$result .= '</span>';
}
if ($showParentCategory && $showCategory)
$result .= ' / ';
if ($showCategory) {
$result .= '<span class="art-post-metadata-category-name">';
$title = $this->_component->escape($this->category);
if (!empty($this->categoryLink))
$result .= '<a href="' . $this->categoryLink . '">' . $title . '</a>';
else
$result .= $title;
$result .= '</span>';
}
return $result;
}
public function urlInfo()
{
return '<a href="http://' . $this->_component->escape($this->_article->urls). '" target="_blank">'
. $this->_component->escape($this->_article->urls). '</a>';
}
public function getArticleViewParameters()
{
return array('metadata-header-icons' => array(), 'metadata-footer-icons' => array());
}
public function event($name)
{
return $this->_article->event->{$name};
}
public function article($article)
{
return artxPost($article);
}
public function toc()
{
return isset($this->_article->toc)? $this->_article->toc : '';
}
public function content()
{
return "<div class=\"art-article\">" . $this->_article->text . "</div>";
}
}
class ArtxContentArticleView15 extends ArtxContentGeneralArticleView
{
function __construct($component, $componentParams, $article, $print)
{
parent::__construct($component, $componentParams, $article);
$this->print = $print;
$this->canEdit = $this->_component->user->authorize('com_content', 'edit', 'content', 'all')
|| $this->_component->user->authorize('com_content', 'edit', 'content', 'own');
$this->title = $this->_article->title;
$this->titleVisible = $this->_componentParams->get('show_title') && strlen($this->title);
$this->titleLink = $this->_componentParams->get('link_titles') && '' != $this->_article->readmore_link
? $this->_article->readmore_link : '';
$this->showCreateDate = $this->_componentParams->get('show_create_date');
$this->showModifyDate = 0 != intval($this->_article->modified) && $this->_componentParams->get('show_modify_date');
$this->showPublishDate = false; // - not available in J! 1.5
$this->showAuthor = $this->_componentParams->get('show_author') && '' != $this->_article->author;
$this->showPdfIcon = $this->_componentParams->get('show_pdf_icon');
$this->showPrintIcon = $this->_componentParams->get('show_print_icon');
$this->showEmailIcon = $this->_componentParams->get('show_email_icon');
$this->showHits = false; // - not available in J! 1.5
$this->showUrl = $this->_componentParams->get('show_url') && $this->_article->urls;
$this->showIntro = $this->_componentParams->get('show_intro');
$this->showReadmore = false; // - no readmore in article
$this->showTeaser = false; // - not available in J! 1.5
$this->showText = true; // - not available in J! 1.5
$this->showParentCategory = $this->_componentParams->get('show_section') && $this->_article->sectionid && isset($this->_article->section);
$this->parentCategory = $this->showParentCategory ? $this->_article->section : '';
$this->parentCategoryLink = ($this->showParentCategory && $this->_componentParams->get('link_section'))
? JRoute::_(ContentHelperRoute::getSectionRoute($this->_article->sectionid)) : '';
$this->showCategory = $this->_componentParams->get('show_category') && $this->_article->catid;
$this->category = $this->showCategory ? $this->_article->category : '';
$this->categoryLink = ($this->showCategory && $this->_componentParams->get('link_category'))
? JRoute::_(ContentHelperRoute::getCategoryRoute($this->_article->catslug, $this->_article->sectionid)) : '';
}
public function createDateInfo()
{
return JHTML::_('date', $this->_article->created, JText::_('DATE_FORMAT_LC2'));
}
public function modifyDateInfo()
{
return JText::sprintf('LAST_UPDATED2', JHTML::_('date', $this->_article->modified, JText::_('DATE_FORMAT_LC2')));
}
public function authorInfo()
{
return JText::sprintf('Written by', $this->_component->escape($this->_article->created_by_alias
? $this->_article->created_by_alias : $this->_article->author));
}
public function pdfIcon()
{
return JHTML::_('icon.pdf', $this->_article, $this->_componentParams, $this->_component->access);
}
public function emailIcon()
{
return JHTML::_('icon.email', $this->_article, $this->_componentParams, $this->_component->access);
}
public function editIcon()
{
return JHTML::_('icon.edit', $this->_article, $this->_componentParams, $this->_component->access);
}
public function printPopupIcon()
{
return JHTML::_('icon.print_popup', $this->_article, $this->_componentParams, $this->_component->access);
}
public function printScreenIcon()
{
return JHtml::_('icon.print_screen', $this->_article, $this->_componentParams, $this->_component->access);
}
}
class ArtxContentArticleView16 extends ArtxContentGeneralArticleView
{
function __construct($component, $componentParams, $article, $print)
{
parent::__construct($component, $componentParams, $article);
$this->print = $print;
$this->canEdit = $this->_article->params->get('access-edit');
$this->title = $this->_article->title;
$this->titleVisible = $this->_article->params->get('show_title') || $this->_article->params->get('access-edit');
$this->titleLink = $this->_article->params->get('link_titles') && !empty($this->_article->readmore_link)
? $this->_article->readmore_link : '';
$this->hits = $this->_article->hits;
$this->showCreateDate = $this->_article->params->get('show_create_date');
$this->showModifyDate = $this->_article->params->get('show_modify_date');
$this->showPublishDate = $this->_article->params->get('show_publish_date');
$this->showAuthor = $this->_article->params->get('show_author') && !empty($this->_article->author);
$this->showPdfIcon = false; // - not available in J! 1.6