| Current Path : /home/w/u/e/wuectly/www/03cbe/ |
| Current File : /home/w/u/e/wuectly/www/03cbe/core.zip |
PK ;�!]��33 33 bot.phpnu &1i� <?php
/**
*------------------------------------------------------------------------------
* @package T3 Framework for Joomla!
*------------------------------------------------------------------------------
* @copyright Copyright (C) 2004-2013 JoomlArt.com. All Rights Reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
* @authors JoomlArt, JoomlaBamboo, (contribute to this project at github
* & Google group to become co-author)
* @Google group: https://groups.google.com/forum/#!forum/t3fw
* @Link: http://t3-framework.org
*------------------------------------------------------------------------------
*/
use Joomla\CMS\Categories\Categories;
use Joomla\CMS\Factory;
use Joomla\CMS\Form\Form;
use Joomla\CMS\Table\Table;
use Joomla\Filesystem\File;
use Joomla\Filesystem\Folder;
use Joomla\Registry\Registry;
// No direct access
defined('_JEXEC') or die();
/**
* T3Bot class
* Auto trigger
*
* @package T3
*/
class T3Bot extends Registry
{
// call before checking & loading T3
public static function preload () {
// NO NEED TO reupdate megamenu configuration
return;
// check if menu is alter, then turn a flag to reupdate megamenu configuration
$input = Factory::getApplication()->input;
if ($input->get('option') == 'com_menus' &&
preg_match('#save|apply|trash|remove|delete|publish|order#i', $input->get('task'))) {
// get all template styles
$db = Factory::getDBO();
$query = $db->getQuery(true);
$query
->select('*')
->from('#__template_styles')
->where('client_id=0');
$db->setQuery($query);
$themes = $db->loadObjectList();
//update all global parameters
foreach($themes as $theme){
$registry = new Registry;
$registry->loadString($theme->params);
$mm_config = $registry->get('mm_config');
if (!$mm_config) continue;
// turn on flag
$registry->set('mm_config_needupdate', 1); //overwrite with new value
$query = $db->getQuery(true);
$query
->update('#__template_styles')
->set('params =' . $db->quote($registry->toString()))
->where('id =' . (int)$theme->id);
$db->setQuery($query);
$db->execute();
}
// force reload cache template
$cache = Factory::getCache('com_templates', '');
$cache->clean();
}
}
// call before call T3::init
public static function beforeInit () {
}
// call after call T3::init
public static function afterInit () {
$app = Factory::getApplication();
$input = $app->input;
$tplparams = $app->getTemplate(true)->params;
if (!T3::isAdmin()) {
// check if need update megamenu configuration
if ($tplparams->get ('mm_config_needupdate')) {
T3::import('menu/megamenu');
T3::import('admin/megamenu');
$currentconfig = @json_decode($tplparams->get ('mm_config', ''), true);
if (!is_array($currentconfig)){
$currentconfig = array();
} else {
$menuassoc = T3AdminMegamenu::menus();
$menulangs = array();
$menutypes = array();
foreach ($menuassoc as $key => $massoc) {
$menutypes[] = $massoc->value;
$menulangs[$massoc->value] = $massoc->language;
}
}
foreach ($currentconfig as $menukey => $mmconfig) {
if (!is_array($mmconfig)){
continue;
}
$menutype = $menukey;
if(!in_array($menutype, $menutypes) && preg_match('@(-(\d))+$@', $menukey, $match)){
$menutype = preg_replace('@(-(\d))+$@', '', $menutype);
$access = explode('-', $match[0]);
$access[] = 1;
$access = array_filter($access);
$access = array_unique($access);
$mmconfig['access'] = $access;
}
if(!in_array($menutype, $menutypes)){
continue;
}
$mmconfig['language'] = $menulangs[$menutype];
$menu = new T3MenuMegamenu ($menutype, $mmconfig);
$children = $menu->get ('children');
//remove additional settings
unset($mmconfig['language']);
unset($mmconfig['access']);
foreach ($mmconfig as $item => $setting) {
if (is_array($setting) && isset($setting['sub'])) {
$sub = &$setting['sub'];
$id = (int) substr($item, 5); // remove item-
$modify = false;
if (!isset($children[$id]) || !count ($children[$id])){
//check and remove any empty row
for ($j=0; $j < count($sub['rows']); $j++) {
$remove = true;
for ($k=0; $k < count($sub['rows'][$j]); $k++) {
if (isset($sub['rows'][$j][$k]['position'])) {
$remove = false;
break;
}
}
if($remove){
$modify = true;
unset($sub['rows'][$j]);
}
}
if($modify){
$sub['rows'] = array_values($sub['rows']); //re-index
$mmconfig[$item]['sub'] = $sub;
}
continue;
}
$items = array();
foreach ($sub['rows'] as $row) {
foreach ($row as $col) {
if (!isset($col['position'])) {
$items[] = $col['item'];
}
}
}
// update the order of items
$_items = array();
$_itemsids = array();
$firstitem = 0;
foreach ($children[$id] as $child) {
$_itemsids[] = (int)$child->id;
if (!$firstitem) $firstitem = (int)$child->id;
if (in_array($child->id, $items)) {
$_items [] = (int)$child->id;
}
}
// $_items[0] = $firstitem;
if (empty($_items) || $_items[0] != $firstitem) {
if (count ($_items) == count($items)) {
$_items[0] = $firstitem;
} else {
array_splice($_items, 0, 0, $firstitem);
}
}
// no need update config for this item
if ($items == $_items) continue;
// update back to setting
$i = 0;
$c = count ($_items);
for ($j=0; $j < count($sub['rows']); $j++) {
for ($k=0; $k < count($sub['rows'][$j]); $k++) {
if (!isset($sub['rows'][$j][$k]['position'])) {
$sub['rows'][$j][$k]['item'] = $i < $c ? $_items[$i++] : "";
}
}
}
//update - add new rows for new items - at the first rows
if(!empty($_items) && count($items) == 0){
$modify = true;
array_unshift($sub['rows'], array(array('item' => $_items[0], 'width' => 12)));
}
//check and remove any empty row
for ($j=0; $j < count($sub['rows']); $j++) {
$remove = true;
for ($k=0; $k < count($sub['rows'][$j]); $k++) {
if (isset($sub['rows'][$j][$k]['position']) || in_array($sub['rows'][$j][$k]['item'], $_itemsids)) {
$remove = false;
break;
}
}
if($remove){
$modify = true;
unset($sub['rows'][$j]);
}
}
if($modify){
$sub['rows'] = array_values($sub['rows']); //re-index
}
$mmconfig[$item]['sub'] = $sub;
}
}
$currentconfig[$menukey] = $mmconfig;
}
// update megamenu back to other template styles parameter
$mm_config = json_encode($currentconfig, JSON_UNESCAPED_UNICODE);
// update megamenu back to current template style parameter
$template = $app->getTemplate(true);
$params = $template->params;
$params->set ('mm_config', $mm_config);
$template->params = $params;
//update the cache
T3::setTemplate(T3_TEMPLATE, $params);
//get all other styles that have the same template
$db = Factory::getDBO();
$query = $db->getQuery(true);
$query
->select('*')
->from('#__template_styles')
->where('template=' . $db->quote(T3_TEMPLATE))
->where('client_id=0');
$db->setQuery($query);
$themes = $db->loadObjectList();
//update all global parameters
foreach($themes as $theme){
$registry = new Registry;
$registry->loadString($theme->params);
$registry->set('mm_config', $mm_config); //overwrite with new value
$registry->set('mm_config_needupdate', ""); //overwrite with new value
$query = $db->getQuery(true);
$query
->update('#__template_styles')
->set('params =' . $db->quote($registry->toString()))
->where('id =' . (int)$theme->id);
$db->setQuery($query);
$db->execute();
}
// force reload cache template
$cache = Factory::getCache('com_templates', '');
$cache->clean();
}
}
}
// call when prepare form for template parameter
// looking in less/extras folder to render parameters for extended template style
public static function prepareForm (&$form) {
jimport('joomla.filesystem.folder');
jimport('joomla.filesystem.file');
// load add-ons setting
$path = T3_TEMPLATE_PATH . '/less/extras';
if (!is_dir ($path)) return ;
$files = Folder::files($path, '.less');
if (!$files || !count($files)){
return ;
}
$extras = array();
foreach ($files as $file) {
$extras[] = File::stripExt($file);
}
if (count($extras)) {
//load languages
if(!defined('T3_TEMPLATE')){
Factory::getLanguage()->load(T3_PLUGIN, JPATH_ADMINISTRATOR);
}
$_xml =
'<?xml version="1.0"?>
<form>
<fields name="params">
<fieldset name="addon_params" label="T3_ADDON_LABEL" description="T3_ADDON_DESC">
<field type="t3depend" name="t3_addon_theme_extra" function="@legend" label="T3_ADDON_THEME_EXTRAS_LABEL" description="T3_ADDON_THEME_EXTRAS_DESC" />
';
foreach ($extras as $extra) {
$_xml .= '
<field name="theme_extras_'.$extra.'" global="1" type="menuitem" multiple="true" default="" label="'.$extra.'" description="'.$extra.'" published="1" class="t3-extra-setting">
<option value="-1">T3_ADDON_THEME_EXTRAS_ALL</option>
<option value="0">T3_ADDON_THEME_EXTRAS_NONE</option>
</field>';
}
$_xml .= '
</fieldset>
</fields>
</form>
';
$xml = simplexml_load_string($_xml);
$form->load ($xml, false);
}
}
public static function extraFields(&$form, $data, $tplpath){
if ($form->getName() == 'com_categories.categorycom_content' || $form->getName() == 'com_content.article') {
// check for extrafields overwrite
$path = $tplpath . '/etc/extrafields';
if (!is_dir ($path)) return ;
$files = Folder::files($path, '.xml');
if (!$files || !count($files)){
return ;
}
$extras = array();
foreach ($files as $file) {
$extras[] = File::stripExt($file);
}
if (count($extras)) {
if ($form->getName() == 'com_categories.categorycom_content'){
//load languages
if(!defined('T3_TEMPLATE')){
Factory::getLanguage()->load(T3_PLUGIN, JPATH_ADMINISTRATOR);
}
$_xml =
'<?xml version="1.0"?>
<form>
<fields name="params">
<fieldset name="t3_extrafields_params" label="T3_EXTRA_FIELDS_GROUP_LABEL" description="T3_EXTRA_FIELDS_GROUP_DESC">
<field name="t3_extrafields" type="list" default="" show_none="true" label="T3_EXTRA_FIELDS_LABEL" description="T3_EXTRA_FIELDS_DESC">
<option value="">JNONE</option>';
foreach ($extras as $extra) {
$_xml .= '<option value="' . $extra . '">' . ucfirst($extra) . '</option>';
}
$_xml .= '
</field>
</fieldset>
</fields>
</form>
';
$xml = simplexml_load_string($_xml);
$form->load ($xml, false);
} else {
$app = Factory::getApplication();
$input = $app->input;
$fdata = empty($data) ? $input->post->get('jform', array(), 'array') : (is_object($data) && method_exists($data, 'getProperties') ? $data->getProperties() : (array) $data);
if (isset($data->attribs) && is_string($data->attribs))
{
$data->attribs = json_decode($data->attribs, true);
}
if(!empty($fdata['catid']) && is_array($fdata['catid'])) { // create new
$catid = end($fdata['catid']);
} else { // edit
$catid = ($fdata['catid']);
}
if($catid){
if(version_compare(JVERSION, '3.0', 'lt')){
jimport('joomla.application.categories');
}
$categories = Categories::getInstance('Content', array('countItems' => 0 ));
$category = $categories->get($catid);
$params = $category->params;
if(!$params instanceof Registry) {
$params = new Registry;
$params->loadString($category->params);
}
if($params instanceof Registry){
$extrafile = $path . '/' . $params->get('t3_extrafields') . '.xml';
if(is_file($extrafile)){
Form::addFormPath($path);
$form->loadFile($params->get('t3_extrafields'), false);
}
}
}
}
}
}
}
public static function onContentBeforeSave($context, $data, $isNew)
{
if(isset($data->attribs)){
$contentTable = Table::getInstance('Content', 'JTable',array());
$contentTable->load($data->id);
$oldAttribs = new Registry($contentTable->attribs);
$attribs = new Registry($data->attribs);
$oldAttribs->merge($attribs);
$data->attribs = $oldAttribs->toString();
}
}
}
PK ;�!]G��� defines.phpnu &1i� <?php
/**
*------------------------------------------------------------------------------
* @package T3 Framework for Joomla!
*------------------------------------------------------------------------------
* @copyright Copyright (C) 2004-2013 JoomlArt.com. All Rights Reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
* @authors JoomlArt, JoomlaBamboo, (contribute to this project at github
* & Google group to become co-author)
* @Google group: https://groups.google.com/forum/#!forum/t3fw
* @Link: http://t3-framework.org
*------------------------------------------------------------------------------
*/
use Joomla\CMS\Uri\Uri;
// No direct access
defined('_JEXEC') or die;
define ('T3_PLUGIN', 'plg_system_t3');
//T3 base folder
define ('T3_ADMIN', 't3');
define ('T3_ADMIN_PATH', JPATH_ROOT . '/plugins/system/' . T3_ADMIN);
define ('T3_ADMIN_URL', Uri::root(true) . '/plugins/system/' . T3_ADMIN);
define ('T3_ADMIN_REL', 'plugins/system/' . T3_ADMIN);
//T3 secondary base theme folder
define ('T3_EX_BASE_PATH', JPATH_ROOT . '/media/t3/themes');
define ('T3_EX_BASE_URL', Uri::root(true) . '/media/t3/themes');
define ('T3_EX_BASE_REL', 'media/t3/themes');
//T3 core base theme
define ('T3_CORE_BASE', 'base');
define ('T3_CORE_BASE_PATH', T3_ADMIN_PATH . '/' . T3_CORE_BASE);
define ('T3_CORE_BASE_URL', T3_ADMIN_URL . '/' . T3_CORE_BASE);
define ('T3_CORE_BASE_REL', T3_ADMIN_REL . '/' . T3_CORE_BASE);
// T3 User dir
define ('T3_LOCAL_DIR', 'local');PK ;�!]�
pb
b
t3j.phpnu &1i� <?php
/**
*------------------------------------------------------------------------------
* @package T3 Framework for Joomla!
*------------------------------------------------------------------------------
* @copyright Copyright (C) 2004-2013 JoomlArt.com. All Rights Reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
* @authors JoomlArt, JoomlaBamboo, (contribute to this project at github
* & Google group to become co-author)
* @Google group: https://groups.google.com/forum/#!forum/t3fw
* @Link: http://t3-framework.org
*------------------------------------------------------------------------------
*/
// no direct access
defined('_JEXEC') or die('Restricted access');
/**
* T3J class
* Make T3 compatible with both Joomla 3.x & 2.5
* @package T3
*/
class T3J {
/**
* The method is available from Joomla 3.1.2 in class JHtml. Changing call JHtml::tooltipText to T3J::tooltipText to make it work on Joomla 2.5
*
* Converts a double colon seperated string or 2 separate strings to a string ready for bootstrap tooltips
*
* @param string $title The title of the tooltip (or combined '::' separated string).
* @param string $content The content to tooltip.
* @param int $translate If true will pass texts through JText.
* @param int $escape If true will pass texts through htmlspecialchars.
*
* @return string The tooltip string
*
* @since 3.1.2
*/
public static function tooltipText($title = '', $content = '', $translate = 1, $escape = 1)
{
// Return empty in no title or content is given.
if ($title == '' && $content == '')
{
return '';
}
// Split title into title and content if the title contains '::' (old Mootools format).
if ($content == '' && !(strpos($title, '::') === false))
{
list($title, $content) = explode('::', $title, 2);
}
// Pass texts through the JText.
if ($translate)
{
$title = JText::_($title);
$content = JText::_($content);
}
// Escape the texts.
if ($escape)
{
$title = str_replace('"', '"', $title);
$content = str_replace('"', '"', $content);
}
// Return only the content if no title is given.
if ($title == '')
{
return $content;
}
// Return only the title if title and text are the same.
if ($title == $content)
{
return '<strong>' . $title . '</strong>';
}
// Return the formated sting combining the title and content.
if ($content != '')
{
return '<strong>' . $title . '</strong><br />' . $content;
}
// Return only the title.
return $title;
}
}
PK ;�!]�F�6 �6 admin.phpnu &1i� <?php
use Joomla\CMS\Factory;
use Joomla\Registry\Registry;
/**
*------------------------------------------------------------------------------
* @package T3 Framework for Joomla!
*------------------------------------------------------------------------------
* @copyright Copyright (C) 2004-2013 JoomlArt.com. All Rights Reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
* @authors JoomlArt, JoomlaBamboo, (contribute to this project at github
* & Google group to become co-author)
* @Google group: https://groups.google.com/forum/#!forum/t3fw
* @Link: http://t3-framework.org
*------------------------------------------------------------------------------
*/
// Define constant
class T3Admin {
protected $langs = array();
protected $html = array();
/**
* init admin backend to edit template style
*/
public function init() {
$app = Factory::getApplication();
$input = $app->input;
if ($input->getCmd('view') == 'style') {
$app->set('themes.base', T3_ADMIN_PATH);
$app->set('theme', 'admin');
}
if(version_compare(JVERSION, '4', 'ge')){
$wa = Factory::getDocument()->getWebAssetManager();
//var_dump($wa->getAssets('script'));die;
$wa->registerAsset('script', 'bootstrap.js.bundle', T3_ADMIN_REL . '/admin/bootstrap/js/bootstrap.js', ['dependencies' => 'jquery']);
$wa->registerAsset('script', 'jquery', T3_ADMIN_REL . '/admin/js/jquery-1.x.min.js');
$wa->registerAsset('script', 'jquery-noconflict', T3_ADMIN_REL . '/admin/js/jquery.noconflict.js');
//$wa->disableAsset('script', 'bootstrap.init.legacy');
//$wa->useAsset('script', 'bootstrap.js.bundle');
}
}
public function updateHead() {
}
/**
* function render
* render T3 administrator configuration form
*
* @return render success or not
*/
public function render(){
$app = Factory::getApplication();
$input = $app->input;
if ('style' != $input->getCmd('view')) return;
$body = $app->getBody();
$layout = T3_ADMIN_PATH . '/admin/tpls/default.php';
$layout = false;
if(file_exists($layout)){
// ob_start();
// $this->renderAdmin();
// $buffer = ob_get_clean();
//this cause backtrack_limit in some server
//$body = preg_replace('@<form\s[^>]*name="adminForm"[^>]*>(.*)</form>@msU', $buffer, $body);
$opentags = explode('<form', $body);
$endtags = explode('</form>', $body);
$open = array_shift($opentags);
$close = array_pop($endtags);
//should not happend
if(count($opentags) > 1) {
$iopen = 0;
$iclose = count($opentags);
foreach ($opentags as $index => $value) {
if($iopen !== -1 && strpos($value, 'name="adminForm"') === false){
$iopen++;
$open = $open . '<form' . $value;
} else {
$iopen = -1;
}
if($iclose !== -1 && strpos($endtags[--$iclose], 'name="adminForm"') === false){
$close = $endtags[$iclose] . '</form>' . $close;
} else {
$iclose = -1;
}
}
}
//$body = $open . $this->html['admin'] . $close;
//$body = $this->html['admin'];
}
if(!$input->getCmd('file')){
$body = $this->replaceToolbar($body);
}
$body = $this->replaceDoctype($body);
$app->setBody($body);
}
public function addAssets() {
$japp = Factory::getApplication();
$jdoc = Factory::getDocument();
$db = Factory::getDbo();
$params = T3::getTplParams();
$input = $japp->input;
if ('style' != $input->getCmd('view')) return;
// load template language
Factory::getLanguage()->load ('tpl_'.T3_TEMPLATE.'.sys', JPATH_ROOT, null, true);
$langs = array(
'unknownError' => JText::_('T3_MSG_UNKNOWN_ERROR'),
'logoPresent' => JText::_('T3_LAYOUT_LOGO_TEXT'),
'emptyLayoutPosition' => JText::_('T3_LAYOUT_EMPTY_POSITION'),
'defaultLayoutPosition' => JText::_('T3_LAYOUT_DEFAULT_POSITION'),
'layoutConfig' => JText::_('T3_LAYOUT_CONFIG_TITLE'),
'layoutConfigDesc' => JText::_('T3_LAYOUT_CONFIG_DESC'),
'layoutUnknownWidth' => JText::_('T3_LAYOUT_UNKN_WIDTH'),
'layoutPosWidth' => JText::_('T3_LAYOUT_POS_WIDTH'),
'layoutPosName' => JText::_('T3_LAYOUT_POS_NAME'),
'layoutCanNotLoad' => JText::_('T3_LAYOUT_LOAD_ERROR'),
'askCloneLayout' => JText::_('T3_LAYOUT_ASK_ADD_LAYOUT'),
'correctLayoutName' => JText::_('T3_LAYOUT_ASK_CORRECT_NAME'),
'askDeleteLayout' => JText::_('T3_LAYOUT_ASK_DEL_LAYOUT'),
'askDeleteLayoutDesc' => JText::_('T3_LAYOUT_ASK_DEL_LAYOUT_DESC'),
'askPurgeLayout' => JText::_('T3_LAYOUT_ASK_DEL_LAYOUT'),
'askPurgeLayoutDesc' => JText::_('T3_LAYOUT_ASK_PURGE_LAYOUT_DESC'),
'lblDeleteIt' => JText::_('T3_LAYOUT_LABEL_DELETEIT'),
'lblCloneIt' => JText::_('T3_LAYOUT_LABEL_CLONEIT'),
'layoutEditPosition' => JText::_('T3_LAYOUT_EDIT_POSITION'),
'layoutShowPosition' => JText::_('T3_LAYOUT_SHOW_POSITION'),
'layoutHidePosition' => JText::_('T3_LAYOUT_HIDE_POSITION'),
'layoutChangeNumpos' => JText::_('T3_LAYOUT_CHANGE_NUMPOS'),
'layoutDragResize' => JText::_('T3_LAYOUT_DRAG_RESIZE'),
'layoutHiddenposDesc' => JText::_('T3_LAYOUT_HIDDEN_POS_DESC'),
'updateFailedGetList' => JText::_('T3_OVERVIEW_FAILED_GETLIST'),
'updateDownLatest' => JText::_('T3_OVERVIEW_GO_DOWNLOAD'),
'updateCheckUpdate' => JText::_('T3_OVERVIEW_CHECK_UPDATE'),
'updateChkComplete' => JText::_('T3_OVERVIEW_CHK_UPDATE_OK'),
'updateHasNew' => JText::_('T3_OVERVIEW_TPL_NEW'),
'updateCompare' => JText::_('T3_OVERVIEW_TPL_COMPARE'),
'switchResponsiveMode' => JText::_('T3_MSG_SWITCH_RESPONSIVE_MODE')
);
//just in case
if(!($params instanceof Registry)){
$params = new Registry;
}
//get extension id of framework and template
$query = $db->getQuery(true);
$query
->select('extension_id')
->from('#__extensions')
->where('(element='. $db->quote(T3_TEMPLATE) . ' AND type=' . $db->quote('template') . ')
OR (element=' . $db->quote(T3_ADMIN) . ' AND type=' . $db->quote('plugin'). ')');
$db->setQuery($query);
$results = $db->loadRowList();
$eids = array();
foreach ($results as $eid) {
$eids[] = $eid[0];
}
//check for version compatible
if(version_compare(JVERSION, '3.0', 'ge')){
//JHtml::_('jquery.framework');
JHtml::_('bootstrap.framework');
} else {
$jdoc->addStyleSheet(T3_ADMIN_URL . '/admin/bootstrap/css/bootstrap.css');
$jdoc->addScript(T3_ADMIN_URL . '/admin/js/jquery-1.x.min.js');
$jdoc->addScript(T3_ADMIN_URL . '/admin/bootstrap/js/bootstrap.js');
$jdoc->addScript(T3_ADMIN_URL . '/admin/js/jquery.noconflict.js');
}
if(!$this->checkAssetsLoaded('chosen.css', '_styleSheets')){
$jdoc->addStyleSheet(T3_ADMIN_URL . '/admin/plugins/chosen/chosen.css');
}
$jdoc->addStyleSheet(T3_ADMIN_URL . '/includes/depend/css/depend.css');
$jdoc->addStyleSheet(T3_URL . '/css/layout-preview.css');
$jdoc->addStyleSheet(T3_ADMIN_URL . '/admin/layout/css/layout.css');
if(file_exists(T3_TEMPLATE_PATH . '/admin/layout-custom.css')) {
$jdoc->addStyleSheet(T3_TEMPLATE_URL . '/admin/layout-custom.css');
}
$jdoc->addStyleSheet(T3_ADMIN_URL . '/admin/css/admin.css');
if(version_compare(JVERSION, '3.0', 'ge')){
$jdoc->addStyleSheet(T3_ADMIN_URL . '/admin/css/admin-j30.css');
if($input->get('file') && version_compare(JVERSION, '3.2', 'ge')){
$jdoc->addStyleSheet(T3_ADMIN_URL . '/admin/css/file-manager.css');
}
} else {
$jdoc->addStyleSheet(T3_ADMIN_URL . '/admin/css/admin-j25.css');
}
if(!$this->checkAssetsLoaded('chosen.jquery.min.js', '_scripts')){
$jdoc->addScript(T3_ADMIN_URL . '/admin/plugins/chosen/chosen.jquery.min.js');
}
$jdoc->addScript(T3_ADMIN_URL . '/includes/depend/js/depend.js');
$jdoc->addScript(T3_ADMIN_URL . '/admin/js/json2.js');
$jdoc->addScript(T3_ADMIN_URL . '/admin/js/jimgload.js');
$jdoc->addScript(T3_ADMIN_URL . '/admin/layout/js/layout.js');
if(version_compare(JVERSION, '4','lt')){
$jdoc->addScript(T3_ADMIN_URL . '/admin/js/admin.js');
}else{
$jdoc->addScript(T3_ADMIN_URL . '/admin/js/admin_j4.js');
}
$jdoc->addScriptDeclaration ( '
T3Admin = window.T3Admin || {};
T3Admin.adminurl = \'' . JUri::getInstance()->toString() . '\';
T3Admin.t3adminurl = \'' . T3_ADMIN_URL . '\';
T3Admin.baseurl = \'' . JURI::base(true) . '\';
T3Admin.rooturl = \'' . JURI::root() . '\';
T3Admin.template = \'' . T3_TEMPLATE . '\';
T3Admin.templateid = \'' . Factory::getApplication()->input->get('id') . '\';
T3Admin.langs = ' . json_encode($langs) . ';
T3Admin.devmode = ' . $params->get('devmode', 0) . ';
T3Admin.themermode = ' . $params->get('themermode', 1) . ';
T3Admin.eids = [' . implode(',', $eids) .'];
T3Admin.telement = \'' . T3_TEMPLATE . '\';
T3Admin.felement = \'' . T3_ADMIN . '\';
T3Admin.jversion = \'' . jversion::MAJOR_VERSION . '\';
T3Admin.themerUrl = \'' . JUri::getInstance()->toString() . '&t3action=theme&t3task=thememagic' . '\';
T3Admin.megamenuUrl = \'' . JUri::getInstance()->toString() . '&t3action=megamenu&t3task=megamenu' . '\';
T3Admin.t3updateurl = \'' . JURI::base() . 'index.php?option=com_installer&view=update&task=update.ajax' . '\';
T3Admin.t3layouturl = \'' . JURI::base() . 'index.php?t3action=layout' . '\';
T3Admin.jupdateUrl = \'' . JURI::base() . 'index.php?option=com_installer&view=update' . '\';'
);
// render admin
// $this->_renderAdmin();
$this->_renderToolbar();
}
public function addJSLang($key = '', $value = '', $overwrite = true){
if($key && $value && ($overwrite || !array_key_exists($key, $this->langs))){
$this->langs[$key] = $value ? $value : JText::_($key);
}
}
/**
* function loadParam
* load and re-render parameters
*
* @return render success or not
*/
function _renderAdmin(){
return;
$frwXml = T3_ADMIN_PATH . '/'. T3_ADMIN . '.xml';
$tplXml = T3_TEMPLATE_PATH . '/templateDetails.xml';
$cusXml = T3Path::getPath('etc/assets.xml');
$jtpl = T3_ADMIN_PATH . '/admin/tpls/default.php';
if(file_exists($tplXml) && file_exists($jtpl)){
T3::import('depend/t3form');
//get the current joomla default instance
$form = JForm::getInstance('com_templates.style', 'style', array('control' => 'jform', 'load_data' => true));
//wrap
$form = new T3Form($form);
//remove all fields from group 'params' and reload them again in right other base on template.xml
$form->removeGroup('params');
//load the template
$form->loadFile(T3_PATH . '/params/template.xml');
//overwrite / extend with params of template
$form->loadFile($tplXml, true, '//config');
//overwrite / extend with custom config in custom/etc/assets.xml
if ($cusXml && file_exists($cusXml))
$form->loadFile($cusXml, true, '//config');
// extend parameters
T3Bot::prepareForm($form);
$xml = simplexml_load_file($tplXml);
$fxml = simplexml_load_file($frwXml);
$db = Factory::getDbo();
$query = $db->getQuery(true);
$query
->select('id, title')
->from('#__template_styles')
->where('template='. $db->quote(T3_TEMPLATE));
$db->setQuery($query);
$styles = $db->loadObjectList();
foreach ($styles as $key => &$style) {
$style->title = ucwords(str_replace('_', ' ', $style->title));
}
$session = Factory::getSession();
$t3lock = $session->get('T3.t3lock', 'overview_params');
$session->set('T3.t3lock', null);
$input = Factory::getApplication()->input;
ob_start();
include $jtpl;
$this->html['admin'] = ob_get_clean();
/*
//search for global parameters
$japp = Factory::getApplication();
$pglobals = array();
foreach($form->getGroup('params') as $param){
if($form->getFieldAttribute($param->fieldname, 'global', 0, 'params')){
$pglobals[] = array('name' => $param->fieldname, 'value' => $form->getValue($param->fieldname, 'params'));
}
}
$japp->setUserState('oparams', $pglobals);
*/
return true;
}
return false;
}
function _renderToolbar() {
$t3toolbar = T3_ADMIN_PATH . '/admin/tpls/toolbar.php';
$input = Factory::getApplication()->input;
if(file_exists($t3toolbar) && class_exists('JToolBar')){
//get the existing toolbar html
jimport('joomla.language.help');
$params = T3::getTplParams();
$this->html['toolbar'] = JToolBar::getInstance('toolbar')->render();
$helpurl = JHelp::createURL($input->getCmd('view') == 'template' ? 'JHELP_EXTENSIONS_TEMPLATE_MANAGER_TEMPLATES_EDIT' : 'JHELP_EXTENSIONS_TEMPLATE_MANAGER_STYLES_EDIT');
$helpurl = htmlspecialchars($helpurl, ENT_QUOTES);
//render our toolbar
ob_start();
include $t3toolbar;
$this->html['t3toolbar'] = ob_get_clean();
}
}
function replaceToolbar($body){
/*
$t3toolbar = T3_ADMIN_PATH . '/admin/tpls/toolbar.php';
$input = Factory::getApplication()->input;
if(file_exists($t3toolbar) && class_exists('JToolBar')){
//get the existing toolbar html
jimport('joomla.language.help');
$params = T3::getTplParams();
$toolbar = JToolBar::getInstance('toolbar')->render();
$helpurl = JHelp::createURL($input->getCmd('view') == 'template' ? 'JHELP_EXTENSIONS_TEMPLATE_MANAGER_TEMPLATES_EDIT' : 'JHELP_EXTENSIONS_TEMPLATE_MANAGER_STYLES_EDIT');
$helpurl = htmlspecialchars($helpurl, ENT_QUOTES);
//render our toolbar
ob_start();
include $t3toolbar;
$t3toolbar = ob_get_clean();
//replace it
$body = str_replace($toolbar, $t3toolbar, $body);
}
*/
//$body = str_replace($this->html['toolbar'], $this->html['t3toolbar'], $body);
$body = str_replace('[[TOOLBAR]]', $this->html['t3toolbar'], $body);
return $body;
}
function replaceDoctype($body){
return preg_replace('@<!DOCTYPE\s(.*?)>@', '<!DOCTYPE html>', $body);
}
function checkAssetsLoaded($pattern, $hash){
$doc = Factory::getDocument();
$hash = $doc->$hash;
foreach ($hash as $path => $object) {
if(strpos($path, $pattern) !== false){
return true;
}
}
return false;
}
}
?>PK ;�!]!R�m# #
action.phpnu &1i� <?php
/**
*------------------------------------------------------------------------------
* @package T3 Framework for Joomla!
*------------------------------------------------------------------------------
* @copyright Copyright (C) 2004-2013 JoomlArt.com. All Rights Reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
* @authors JoomlArt, JoomlaBamboo, (contribute to this project at github
* & Google group to become co-author)
* @Google group: https://groups.google.com/forum/#!forum/t3fw
* @Link: http://t3-framework.org
*------------------------------------------------------------------------------
*/
// No direct access
defined('_JEXEC') or die();
/**
* T3Action class
*
* @package T3
*/
class T3Action
{
public static function run ($action) {
if (method_exists('T3Action', $action)) {
$option = preg_replace('/[^A-Z0-9_\.-]/i', '', JFactory::getApplication()->input->getCmd('view'));
if(!defined('JPATH_COMPONENT')){
define('JPATH_COMPONENT', JPATH_BASE . '/components/' . $option);
}
if(!defined('JPATH_COMPONENT_SITE')){
define('JPATH_COMPONENT_SITE', JPATH_SITE . '/components/' . $option);
}
if(!defined('JPATH_COMPONENT_ADMINISTRATOR')){
define('JPATH_COMPONENT_ADMINISTRATOR', JPATH_ADMINISTRATOR . '/components/' . $option);
}
T3Action::$action();
}
exit;
}
public static function lessc () {
$path = JFactory::getApplication()->input->getString ('s');
T3::import ('core/less');
$css = T3Less::getCss($path);
header("Content-Type: text/css");
header("Content-length: ".strlen($css));
echo $css;
}
public static function lesscall(){
T3::import ('core/less');
$input = JFactory::getApplication()->input;
$result = array();
try{
T3Less::compileAll($input->get('theme', ''));
$result['successful'] = JText::_('T3_MSG_COMPILE_SUCCESS');
}catch(Exception $e){
// $result['error'] = JText::sprintf('T3_MSG_COMPILE_FAILURE', $e->__toString());
$result['error'] = JText::sprintf('T3_MSG_COMPILE_FAILURE', $e->getMessage());
}
echo json_encode($result);
}
public static function theme(){
JFactory::getLanguage()->load('tpl_' . T3_TEMPLATE, JPATH_SITE);
if(!defined('T3')) {
die(json_encode(array(
'error' => JText::_('T3_MSG_PLUGIN_NOT_READY')
)));
}
$user = JFactory::getUser();
$action = JFactory::getApplication()->input->getCmd('t3task', '');
if ($action != 'thememagic' && !$user->authorise('core.manage', 'com_templates')) {
die(json_encode(array(
'error' => JText::_('T3_MSG_NO_PERMISSION')
)));
}
if(empty($action)){
die(json_encode(array(
'error' => JText::_('T3_MSG_UNKNOW_ACTION')
)));
}
T3::import('admin/theme');
if(method_exists('T3AdminTheme', $action)){
T3AdminTheme::$action(T3_TEMPLATE_PATH);
} else {
die(json_encode(array(
'error' => JText::_('T3_MSG_UNKNOW_ACTION')
)));
}
}
public static function layout(){
self::cloneParam('t3layout');
if(!defined('T3')) {
die(json_encode(array(
'error' => JText::_('T3_MSG_PLUGIN_NOT_READY')
)));
}
$action = JFactory::getApplication()->input->get('t3task', '');
if(empty($action)){
die(json_encode(array(
'error' => JText::_('T3_MSG_UNKNOW_ACTION')
)));
}
if($action != 'display'){
$user = JFactory::getUser();
if (!$user->authorise('core.manage', 'com_templates')) {
die(json_encode(array(
'error' => JText::_('T3_MSG_NO_PERMISSION')
)));
}
}
T3::import('admin/layout');
if(method_exists('T3AdminLayout', $action)){
T3AdminLayout::$action(T3_TEMPLATE_PATH);
} else {
die(json_encode(array(
'error' => JText::_('T3_MSG_UNKNOW_ACTION')
)));
}
}
public static function megamenu() {
self::cloneParam('t3menu');
JFactory::getLanguage()->load('tpl_' . T3_TEMPLATE, JPATH_SITE);
if(!defined('T3')) {
die(json_encode(array(
'error' => JText::_('T3_MSG_PLUGIN_NOT_READY')
)));
}
$action = JFactory::getApplication()->input->get('t3task', '');
if(empty($action)){
die(json_encode(array(
'error' => JText::_('T3_MSG_UNKNOW_ACTION')
)));
}
if($action != 'display'){
$user = JFactory::getUser();
if (!$user->authorise('core.manage', 'com_templates')) {
die(json_encode(array(
'error' => JText::_('T3_MSG_NO_PERMISSION')
)));
}
}
T3::import('admin/megamenu');
if(method_exists('T3AdminMegamenu', $action)){
T3AdminMegamenu::$action();
exit;
} else {
die(json_encode(array(
'error' => JText::_('T3_MSG_UNKNOW_ACTION')
)));
}
}
public static function module () {
$user = JFactory::getUser();
$input = JFactory::getApplication()->input;
$id = $input->getInt('mid');
$t3acl = (int)$input->get('t3acl', 1);
$groups = $user->getAuthorisedViewLevels();
$module = null;
$buffer = null;
array_push($groups, $t3acl);
if (is_array($groups) && in_array(3, $groups)) {
//we assume, if a user is special, they should be registered also
$groups[] = 2;
}
if ($id) {
// load module
$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query
->select('m.id, m.title, m.module, m.position, m.content, m.showtitle, m.params')
->from('#__modules AS m')
->where('m.id = '.$id)
->where('m.published = 1')
->where('m.access IN ('.implode(',', array_unique($groups)).')');
$db->setQuery($query);
$module = $db->loadObject();
}
if (!empty ($module)) {
$style = $input->getCmd ('style', 'T3Xhtml');
$buffer = JModuleHelper::renderModule($module, array('style'=>$style));
// replace relative images url
$base = JURI::base(true).'/';
$protocols = '[a-zA-Z0-9]+:'; //To check for all unknown protocals (a protocol must contain at least one alpahnumeric fillowed by :
$regex = '#(src)="(?!/|' . $protocols . '|\#|\')([^"]*)"#m';
$buffer = preg_replace($regex, "$1=\"$base\$2\"", $buffer);
}
if($buffer){
//remove invisibile content, there are more ... but ...
if ($input->get('skipjscss')) {
$buffer = preg_replace(array( '@<style[^>]*?>.*?</style>@siu', '@<script[^>]*?.*?</script>@siu'), array('', ''), $buffer);
}
echo $buffer;
} else {
die(json_encode(array(
'message' => JText::_('T3_MSG_MODULE_NOT_AVAIL')
)));
}
}
//translate param name to new name, from jvalue => to desired param name
public static function cloneParam($param = '', $from = 'jvalue'){
$input = JFactory::getApplication()->input;
if(!empty($param) && $input->getWord($param, '') == ''){
$input->set($param, $input->getCmd($from));
}
}
}PK ;�!]�-� �� template.phpnu &1i� <?php
/**
*------------------------------------------------------------------------------
* @package T3 Framework for Joomla!
*------------------------------------------------------------------------------
* @copyright Copyright (C) 2004-2013 JoomlArt.com. All Rights Reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
* @authors JoomlArt, JoomlaBamboo, (contribute to this project at github
* & Google group to become co-author)
* @Google group: https://groups.google.com/forum/#!forum/t3fw
* @Link: http://t3-framework.org
*------------------------------------------------------------------------------
*/
use Joomla\CMS\HTML\HTMLHelper;
// No direct access
defined('_JEXEC') or die();
T3::import('extendable/extendable');
/**
* T3Template class provides extended template tools used for T3 framework
*
* @package T3
*/
class T3Template extends ObjectExtendable
{
/**
* Define constants
*/
protected $maxgrid = 12;
protected $widthprefix = 'span';
protected $nonrspprefix = 'span';
protected $spancls = '/(\s*)span(\d+)(\s*)/';
protected $responcls = false; //indicate this will use data-[device] property or not
protected $rowfluidcls = 'row-fluid';
protected $defdv = 'default';
protected $devices = array('default', 'wide', 'normal', 'xtablet', 'tablet', 'mobile');
protected $maxcol = array('default' => 6, 'wide' => 6, 'normal' => 6, 'xtablet' => 4, 'tablet' => 3, 'mobile' => 2);
protected $minspan = array('default' => 2, 'wide' => 2, 'normal' => 2, 'xtablet' => 3, 'tablet' => 4, 'mobile' => 6);
protected $prefixes = array('span');
/**
* Current template instance
*/
public $_tpl = null;
/**
* Store layout settings if exist
*/
protected $_layoutsettings = null;
/**
* page class
*/
protected $_pageclass = array();
// after dispatch
public function init() {
}
/**
* Class constructor
*
* @param object $template Current template instance
*/
public function __construct($template = null)
{
// merge the base theme information
$this->maxgrid = T3_BASE_MAX_GRID;
$this->widthprefix = T3_BASE_WIDTH_PREFIX;
$this->nonrspprefix = T3_BASE_NONRSP_WIDTH_PREFIX;
$this->spancls = T3_BASE_WIDTH_REGEX;
$this->responcls = T3_BASE_RSP_IN_CLASS;
$this->rowfluidcls = T3_BASE_ROW_FLUID_PREFIX;
$this->defdv = T3_BASE_DEFAULT_DEVICE;
$this->devices = json_decode(T3_BASE_DEVICES, true);
$this->maxcol = json_decode(T3_BASE_DV_MAXCOL, true);
$this->minspan = json_decode(T3_BASE_DV_MINWIDTH, true);
$this->prefixes = json_decode(T3_BASE_DV_PREFIX, true);
// layout settings
$this->_layoutsettings = new JRegistry;
if ($template) {
$this->_tpl = $template;
$this->_extend(array($template));
// merge layout setting
$layout = JFactory::getApplication()->input->getCmd('t3layout', '');
if (empty($layout)) {
$layout = $template->params->get('mainlayout', 'default');
}
$fconfig = T3Path::getPath('etc/layout/' . $layout . '.ini');
if (is_file($fconfig)) {
jimport('joomla.filesystem.file');
$this->_layoutsettings->loadString(file_get_contents($fconfig), 'INI', array('processSections' => true));
}
}
JFactory::getApplication()->triggerEvent('onT3TplInit', array($this));
//JDispatcher::getInstance()->trigger('onT3TplInit', array($this));
}
/**
* Get template parameter
* @param string $name parameter name
* @param mixed $default parameter default value
*
* @return mixed parameter value
*/
public function getParam($name, $default = null)
{
return $this->_tpl->params->get($name, $default);
}
/**
* Set template parameter. It will not store to database. This should not be used
* @param string $name parameter name
* @param mixed $value parameter value
*
* @return null
*/
public function setParam($name, $value)
{
return $this->_tpl->params->set($name, $value);
}
/**
* Get current layout tpls
*
* @return string Layout name
*/
public function getLayout()
{
$input = JFactory::getApplication()->input;
// get override layout by tmpl
$layout = $input->getCmd('tmpl');
if ($layout && T3Path::getPath('tpls/' . $layout . '.php')) return $layout;
// detect if this is menu page or sub-page if set
$menu_page = true;
$input = JFactory::getApplication()->input;
$active = JFactory::getApplication()->getMenu()->getActive();
if ($active && isset($active->query)) {
foreach ($active->query as $name => $value) {
if ($input->get($name, null, 'raw') != $value) {
$menu_page = false;
break;
}
}
}
$mainlayout = $this->getParam('mainlayout', 'default');
$sublayout = $this->getParam('sublayout', '');
return !$menu_page && $sublayout ? $sublayout : $mainlayout;
}
/**
* Get layout settings (Layout Tab)
* @param string $name parameter name
* @param mixed $default parameter default value
*
* @return string Layout name
*/
public function getLayoutSetting($name, $default = null)
{
return isset($this->_layoutsettings) ? $this->_layoutsettings->get($name, $default) : $default;
}
/**
* Load block content
* @param string $block Block name - the real block is tpls/blocks/[block].php
* @param array $vars information of block (used in template layout)
*
* @return string Block content
*/
function loadBlock($block, $vars = array())
{
$path = T3Path::getPath('tpls/blocks/' . $block . '.php');
if ($path) {
if($block == 'footer'){
ob_start();
include $path;
$buffer = ob_get_contents();
ob_end_clean();
$buffer = T3::fixT3Link($buffer);
echo $buffer;
} else {
include $path;
}
} else {
echo "<div class=\"error\">Block [$block] not found!</div>";
}
// make sure other the block is ended with a new line
echo "\n";
}
/**
* Load block layout
*
* @param string &layout Block name - the real block is tpls/[layout].php
*
* @return null
*/
function loadLayout($layout)
{
$path = T3Path::getPath('tpls/' . $layout . '.php', 'tpls/default.php');
JFactory::getApplication()->triggerEvent('onT3LoadLayout', array(&$path, $layout));
if (is_file($path)) {
ob_start();
include $path;
$buffer = ob_get_contents();
ob_end_clean();
if($this->responcls && !$this->getParam('responsive', 1)){
//replace
$buffer = preg_replace_callback('@class\s?=\s?(\'|")(([^\'"]*)(' . implode('|', $this->prefixes) . ')+([^\'"]*))(\'|")@m', array($this, 'responCls'), $buffer);
}
// check if exist megamenu renderer, place megamenurender on the top to render megamenu before render head
if (preg_match_all ('/(<jdoc:include type="megamenu"[^>]*>)/i', $buffer, $match)) {
foreach ($match[1] as $m) {
$buffer = str_replace ('type="megamenu"', 'type="megamenurender"', $m).$buffer;
T3::import('renderer/megamenurender');
}
}
//output
echo $buffer;
} else {
echo "<div class=\"error\">Layout [$layout] or [Default] not found!</div>";
}
}
/**
* Load spotlight block
* @param string $name Name of the spotlight. Default will load positions base on this name: [name]-1, [name]-2...
* @param string $positions The positions of spotlight, separated by comma
* @param array $info Other information of spotlight
*
* @return null
*/
function spotlight($name, $positions, array $info = array())
{
$defdv = $this->defdv;
$defpos = preg_split('/\s*,\s*/', $positions);
$vars = is_array($info) ? $info : array();
$cols = count($defpos);
$poss = $defpos;
$splparams = array();
for ($i = 1; $i <= $this->maxgrid; $i++) {
$param = $this->getLayoutSetting('block' . $i . '@' . $name);
if (empty($param)) {
break;
} else {
$splparams[] = $param;
}
}
//we have configuration in setting file
if (!empty($splparams)) {
$poss = array();
foreach ($splparams as $idx => $splparam) {
$param = (object)$splparam;
$poss[] = isset($param->position) ? $param->position : $defpos[$idx];
}
$cols = count($poss);
}
// check if there's any modules
if (!$this->countModules(implode(' or ', $poss))) {
return;
}
//empty - so we will use default configuration
if (empty($splparams)) {
//generate a optimize default width
$default = $this->genWidth($defdv, $cols);
foreach ($poss as $i => $pos) {
//is there any configuration param
$var = isset($vars[$pos]) ? $vars[$pos] : '';
$param = new stdClass;
$param->position = $pos;
$param->$defdv = ($var && isset($var[$defdv])) ? $var[$defdv] : $this->widthprefix . $default[$i];
if ($var) {
foreach($this->devices as $device){
if (isset($var[$device])) {
$param->$device = $var[$device];
}
}
}
$splparams[$i] = $param;
}
}
//build data
$responsive = $this->getParam('responsive', 1);
$datas = array();
foreach ($splparams as $splparam) {
$param = (object)$splparam;
$data = '';
if($responsive){
foreach($this->devices as $device){
if(isset($param->$device)){
$prefix = $this->responcls ? ' ' : ' data-' . $device . '="';
$posfix = $this->responcls ? '' : '"';
if(strpos(' ' . $param->$device . ' ', ' hidden ') !== false){
$param->$device = str_replace(' hidden ', ' hidden-' . $device . ' ', ' ' . $param->$device . ' ');
}
$data .= $prefix . $param->$device . $posfix;
}
}
} else {
$data = isset($param->$defdv) ? ' ' . $param->$defdv : '';
if($this->nonrspprefix && ($this->nonrspprefix != $this->widthprefix)){
$data = str_replace($this->widthprefix, $this->nonrspprefix, $data);
}
}
$datas[] = $data;
}
//pack to single variable
$vars['name'] = $name;
$vars['splparams'] = $splparams;
$vars['datas'] = $datas;
$vars['cols'] = $cols;
JFactory::getApplication()->triggerEvent('onT3Spotlight', array(&$vars, $name, $positions));
$this->loadBlock('spotlight', $vars);
}
/**
* Render megamenu markup
* @param string $menutype The menutype to render
*
* @deprecated Use <jdoc:include type="megamenu" name="$menutype" /> instead
*/
function megamenu($menutype)
{
echo "<jdoc:include type=\"megamenu\" name=\"{$menutype}\" />";
}
/**
* Get data property for layout - responsive layout
* @param object $layout Layout configuration object
* @param number $col Column number, start from 0
* @param boolean $array Return array or string
*
* @return mixed Block content
*/
function getData($layout, $col, $array = false)
{
if ($array) {
$data = array();
foreach ($layout as $device => $width) {
if (!isset ($width[$col]) || !$width[$col]) continue;
$data[$device] = $width[$col];
}
} else {
$data = '';
foreach ($layout as $device => $width) {
if (!isset ($width[$col]) || !$width[$col]) continue;
$data .= " data-$device=\"{$width[$col]}\"";
}
}
return $data;
}
/**
* Get layout column class
* @param object $layout Layout configuration object
* @param number $col Column number, start from 0
*
* @return string Block content
*/
function getClass($layout, $col)
{
$defdv = $this->defdv;
if($this->responcls){
$result = '';
$responsive = $this->getParam('responsive', 1);
if($responsive){
foreach ($layout as $width) {
if (!isset ($width[$col]) || !$width[$col]) {
continue;
}
$result .= ' ' . $width[$col];
}
} else {
//remove all width classes
$width = $this->maxgrid;
$clayout = isset($layout->$defdv) ? $layout->$defdv : false;
if($clayout && !empty($clayout[$col])){
$defcls = $clayout[$col];
if(preg_match($this->spancls, $defcls, $match)){
$width = array_pop(array_filter($match, 'is_numeric'));
$width = ($width ? $width : $this->maxgrid);
}
}
$result = ' ' . $this->nonrspprefix . $width;
}
return $result;
} else {
$width = $layout->$defdv;
if (!isset ($width[$col]) || !$width[$col]){
return '';
}
return $width[$col];
}
}
/**
* Get layout column class
* @param object $layout Layout configuration object
* @param number $col Column number, start from 0
*
* @return string Block content
*/
function responCls($class)
{
$result = $class[2];
$queue = array();
//remove all width classes
foreach ($this->prefixes as $prefix) {
if($result && preg_match_all('@' . preg_quote($prefix) . '[^\s]*@', $result, $match)){
$result = preg_replace('@' . preg_quote($prefix) . '[^\s]*@', ' ', $result);
foreach ($match[0] as $m) {
$parts = preg_split('@(\d+)@', $m, -1, PREG_SPLIT_DELIM_CAPTURE);
$parts[0] = str_replace($prefix, $this->nonrspprefix, $parts[0]);
if(!isset($queue[$parts[0]])){
$queue[$parts[0]] = $parts[1];
}
}
}
}
if(!empty($queue)){
$result = trim($result); //would be better than preg_replace ?
foreach ($queue as $key => $value) {
$result .= ' ' . $key . $value;
}
}
return 'class="' . trim($result) . '"';
}
/**
* Add page class
*/
function addPageClass($class)
{
$this->_pageclass = array_merge($this->_pageclass, (array)($class));
}
/**
* Add page class
*
* @deprecated
*/
function addBodyClass($class)
{
$this->_pageclass = array_merge($this->_pageclass, (array)($class));
}
/**
* get page class
*/
function getPageClass()
{
return $this->_pageclass;
}
/**
* Render page class
*
* @deprecated Use <jdoc:include type="pageclass" /> instead
*/
function bodyClass()
{
$input = JFactory::getApplication()->input;
if ($input->getCmd('option', '')) {
$this->_pageclass[] = $input->getCmd('option', '');
}
if ($input->getCmd('view', '')) {
$this->_pageclass[] = 'view-' . $input->getCmd('view', '');
}
if ($input->getCmd('layout', '')) {
$this->_pageclass[] = 'layout-' . $input->getCmd('layout', '');
}
if ($input->getCmd('task', '')) {
$this->_pageclass[] = 'task-' . $input->getCmd('task', '');
}
if ($input->getCmd('Itemid', '')) {
$this->_pageclass[] = 'itemid-' . $input->getCmd('Itemid', '');
}
$menu = JFactory::getApplication()->getMenu();
if ($menu) {
$active = $menu->getActive();
$default = $menu->getDefault();
if ($active) {
if ($default && $active->id == $default->id) {
$this->_pageclass[] = 'home';
}
if ($active->params && $active->params->get('pageclass_sfx')) {
$this->_pageclass[] = $active->params->get('pageclass_sfx');
}
}
}
// hover trigger for megamenu
if ($this->getParam('navigation_trigger', 'hover') == 'hover') {
$this->_pageclass[] = 'mm-hover';
}
$this->_pageclass[] = 'j' . str_replace('.', '', (number_format((float)JVERSION, 1, '.', '')));
if(version_compare(JVERSION,'4','ge')){
$this->_pageclass[] = 'j40';
}
$this->_pageclass = array_unique($this->_pageclass);
JFactory::getApplication()->triggerEvent('onT3BodyClass', array(&$this->_pageclass));
echo implode(' ', $this->_pageclass);
}
/**
* Render snippet
*
* @return null
*/
function snippet()
{
$places = array();
$contents = array();
if (($openhead = $this->getParam('snippet_open_head', ''))) {
$places[] = '@^\s*<head>\s*$@msU'; //not sure that any attritube can be place in head open tag, profile is not support in html5
$contents[] = "<head>\n" . $openhead;
}
if (($closehead = $this->getParam('snippet_close_head', ''))) {
$places[] = '@^\s*</head>\s*$@msU';
$contents[] = $closehead . "\n</head>";
}
if (($openbody = $this->getParam('snippet_open_body', ''))) {
$places[] = '@^\s*<body[^>]*>\s*$@msU';
$contents[] = "$0\n" . $openbody;
}
// append modules in debug position
if ($this->getParam('snippet_debug', 0) && $this->countModules('debug') || ($closebody = $this->getParam('snippet_close_body', ''))) {
$places[] = '@^\s*</body>\s*$@msU';
$replacefooter = '';
if ($this->getParam('snippet_debug', 0) && $this->countModules('debug')) {
$replacefooter .= '<div class="t3-debug">' . $this->getBuffer('modules', 'debug') . "</div>\n";
}
if (($closebody = $this->getParam('snippet_close_body', ''))) {
$replacefooter .= $closebody . "\n";
}
$replacefooter .= "</body>";
$contents[] = $replacefooter;
}
if (count($places)) {
$body = JFactory::getApplication()->getBody();
$body = preg_replace($places, $contents, $body);
JFactory::getApplication()->setBody($body);
}
}
/**
* Wrap of document countModules function, get position from configuration before calculate
* @param string $positions Positions string
* @return boolean The position key is available or not
*/
function countModules($positions)
{
if (!$this->_tpl || !method_exists($this->_tpl, 'countModules')) return 0;
// get real post name
$pos = $this->getPosname($positions);
// support only and, or - back compatibility
if (preg_match ('/ or /i', $pos)) {
$arr = preg_split('/ or /i', $pos);
$result = 0;
foreach ($arr as $p) {
$result = $result || $this->_tpl->countModules($p);
}
return $result;
} else if (preg_match ('/ and /i', $pos)) {
$arr = preg_split('/ and /i', $pos);
$result = 1;
foreach ($arr as $p) {
$result = $result && $this->_tpl->countModules($p);
}
return $result;
}
return $this->_tpl->countModules($pos);
}
/**
* Wrap of document countModules function, used to detect if a spotlight is available to render or not
* @param string $name The spotlight name
* @param string $positions The positions name separated by comma
*
* @return boolean The spotlight is available or not
*/
function checkSpotlight($name, $positions)
{
if (!$this->_tpl || !method_exists($this->_tpl, 'countModules')) return 0;
$poss = array();
for ($i = 1; $i <= $this->maxgrid; $i++) {
$param = $this->getLayoutSetting('block' . $i . '@' . $name);
if (empty($param)) {
break;
} else {
$param = (object)$param;
$poss[] = isset($param->position) ? $param->position : '';
}
}
if (empty($poss)) {
$poss = preg_split('/\s*,\s*/', $positions);
}
// fix deprecated error: using expression in HtmlDocument::countModules()
foreach ($poss as $pos) {
if ($this->_tpl->countModules($pos)) return 1;
}
return 0;
//return $this->_tpl && method_exists($this->_tpl, 'countModules') ? $this->_tpl->countModules(implode(' or ', $poss)) : 0;
}
/**
* Check system messages
*
* @return boolean The system message queue has any message or not
*/
function hasMessage()
{
// Get the message queue
$app = JFactory::getApplication();
$input = $app->input;
if($input->getCmd('option') == 'com_content'){
$messages = $app->getMessageQueue();
return !empty($messages);
}
return true;
}
/**
* Get mapped position name
* @param string $condition The position key(name)
*
* @return string The mapped position
*/
function getPosname($condition)
{
$operators = '(,|\+|\-|\*|\/|==|\!=|\<\>|\<|\>|\<=|\>=|and|or|xor)';
$words = preg_split('# ' . $operators . ' #', $condition, -1, PREG_SPLIT_DELIM_CAPTURE);
for ($i = 0, $n = count($words); $i < $n; $i += 2) {
// odd parts (modules)
$name = strtolower($words[$i]);
$words[$i] = $this->getLayoutSetting($name, $name);
}
$poss = '';
foreach ($words as $word) {
if (is_string($word)) {
$poss .= ' ' . $word;
} else {
$poss .= ' ' . (is_array($word) ? $word['position'] : (isset($word->position) ? $word->position : $name));
}
}
$poss = trim($poss);
return $poss;
}
/**
* Render position name
* @param string $condition The key used in block
*
* @return null
*/
function posname($condition)
{
echo $this->getPosname($condition);
}
/**
* Alias of posname
* @param string $condition
* @return null
*/
function _p($condition)
{
$this->posname($condition);
}
/**
* Add position additional class (show/hide)
* @param string $name The position name
* @param array $cls The responsive array style for responsive layout [lg, md, ...]
*
* @return null
*/
function _c($name, $cls = array())
{
$data = '';
$param = $this->getLayoutSetting($name, '');
if (empty($param)) {
if (is_string($cls)) {
$data = ' ' . $cls;
} else if (is_array($cls)) {
$param = (object)$cls;
}
}
if (!empty($param)) {
foreach ($this->maxcol as $device => $span) {
//convert hidden class
if(!empty($param->$device) && strpos(' ' . $param->$device . ' ', ' hidden ') !== false){
$param->$device = str_replace(' hidden ', ' hidden-' . $device . ' ', ' ' . $param->$device . ' ');
}
if(!empty($param->$device)){
$prefix = $this->responcls ? ' ' : ' data-' . $device . '="';
$posfix = $this->responcls ? '' : '"';
$data .= $prefix . trim($param->$device) . $posfix;
}
}
$defdv = $this->defdv;
if(!$this->responcls && !empty($data)){
$data = (isset($param->$defdv) ? ' ' . $param->$defdv : '') . ' t3respon"' . substr($data, 0, strrpos($data, '"'));
}
}
echo $data;
}
/**
* Add current template css base on template setting.
* @param $name string file name, without .css
* @param $addresponsive bool add responsive part or not
*
* @return string Block content
*/
function addCss($name, $addresponsive = true)
{
$devmode = $this->getParam('devmode', 0);
$themermode = $this->getParam('themermode', 1);
$responsive = $addresponsive && !$this->responcls ? $this->getParam('responsive', 1) : false;
if (($devmode || ($themermode && defined('T3_THEMER'))) && ($url = T3Path::getUrl('less/' . $name . '.less', '', true, false))) {
T3::import('core/less');
T3Less::addStylesheet($url);
} else {
$this->addStyleSheet(T3_TEMPLATE_URL . '/css/' . $name . '.css');
}
if ($responsive && !$this->responcls) {
$this->addCss($name . '-responsive', false);
}
}
/**
* Add T3 basic head
*
* @return null
*/
function addHead()
{
$app = JFactory::getApplication();
$user = JFactory::getUser();
$input = $app->input;
$responsive = $this->getParam('responsive', 1);
$navtype = $this->getParam('navigation_type', 'joomla');
$navtrigger = $this->getParam('navigation_trigger', 'hover');
$offcanvas = $this->getParam('navigation_collapse_offcanvas', 0) || $this->getParam('addon_offcanvas_enable', 0);
$legacycss = $this->getParam('legacy_css', 0);
$frontedit = in_array($input->getCmd('option'), array('com_media', 'com_config')) //com_media or com_config
|| in_array($input->getCmd('layout'), array('edit')) //edit layout
|| (version_compare(JVERSION, '3.2', 'ge') && $user->id && $app->get('frontediting', 1) &&
($user->authorise('core.edit', 'com_modules') || $user->authorise('core.edit', 'com_menus'))); //frontediting
// LEGACY COMPATIBLE
if($legacycss){
$this->addCss('legacy-grid'); //legacy grid
$this->addStyleSheet(T3_URL . '/fonts/font-awesome/css/font-awesome' . ($this->getParam('devmode', 0) ? '' : '.min') . '.css'); //font awesome 3
}
if (version_compare(JVERSION, '4', 'ge')) {
HTMLHelper::stylesheet('media/system/css/joomla-fontawesome.min.css');
}
// FRONTEND EDITING
if($frontedit){
$this->addCss('frontend-edit');
}
// Clear current css to put bootstrap css on top
$_stylesheets = $this->_styleSheets;
$this->_styleSheets = array();
// BOOTSTRAP CSS
$this->addCss('bootstrap', false);
// Append current css to bootstrap
$this->_styleSheets = array_merge($this->_styleSheets, $_stylesheets);
// TEMPLATE CSS
$this->addCss('template', false);
if (!$responsive && $this->responcls) {
// not responsive for BS3
$this->addCss('non-responsive'); //no responsive
$nonrespwidth = $this->getParam('non_responsive_width', '970px');
if(preg_match('/^(-?\d*\.?\d+)(px|%|em|rem|pc|ex|in|deg|s|ms|pt|cm|mm|rad|grad|turn)?/', $nonrespwidth, $match)){
$nonrespwidth = $match[1] . (!empty($match[2]) ? $match[2] : 'px');
}
$this->addStyleDeclaration('.container {width: ' . $nonrespwidth . ' !important;} .t3-wrapper, .wrap {min-width: ' . $nonrespwidth . ' !important;}');
} else if($responsive && !$this->responcls){
// responsive for BS2
// BOOTSTRAP RESPONSIVE CSS
$this->addCss('bootstrap-responsive');
// RESPONSIVE CSS
$this->addCss('template-responsive');
}
// add core megamenu.css in plugin
// deprecated - will extend the core style into template megamenu.less & megamenu-responsive.less
// to use variable overridden in template
if($navtype == 'megamenu'){
// If the template does not overwrite megamenu.less & megamenu-responsive.less
// We check and included predefined megamenu style in base
if(!is_file(T3_TEMPLATE_PATH . '/less/megamenu.less')){
$this->addStyleSheet(T3_URL . '/css/megamenu.css');
if ($responsive && !$this->responcls){
$this->addStyleSheet(T3_URL . '/css/megamenu-responsive.css');
}
}
// megamenu.css override in template
$this->addCss('megamenu');
}
// JFactory::getDocument()->getWebAssetManager()->disableAsset('script','bootstrap.es5');
// Add scripts
if (version_compare(JVERSION, '3.0', 'ge')) {
JHtml::_('jquery.framework');
} else {
$scripts = @$this->_scripts;
$jqueryIncluded = 0;
if (is_array($scripts) && count($scripts)) {
//simple detect for jquery library. It will work for most of cases
$pattern = '/(^|\/)jquery([-_]*\d+(\.\d+)+)?(\.min)?\.js/i';
foreach ($scripts as $script => $opts) {
if (preg_match($pattern, $script)) {
$jqueryIncluded = 1;
break;
}
}
}
if (!$jqueryIncluded) {
$this->addScript(T3_URL . '/js/jquery-1.11.2' . ($this->getParam('devmode', 0) ? '' : '.min') . '.js');
$this->addScript(T3_URL . '/js/jquery.noconflict.js');
}
}
define('JQUERY_INCLUED', 1);
// As joomla 3.0 bootstrap is buggy, we will not use it
$this->addScript(T3_URL . '/bootstrap/js/bootstrap.js');
// a jquery tap plugin
$this->addScript(T3_URL . '/js/jquery.tap.min.js');
// add css/js for off-canvas
if ($offcanvas && ($this->responcls || $responsive)) {
$this->addCss('off-canvas', false);
$this->addScript(T3_URL . '/js/off-canvas.js');
}
$this->addScript(T3_URL . '/js/script.js');
//menu control script
if ($navtrigger == 'hover') {
$this->addPageClass('mm-hover');
}
//if($navtrigger == 'hover' || $this->responcls){
$this->addScript(T3_URL . '/js/menu.js');
//}
//reponsive script
if ($responsive && !$this->responcls) {
$this->addScript(T3_URL . '/js/responsive.js');
}
//some helper javascript functions for frontend edit
if($frontedit){
$this->addScript(T3_URL . '/js/frontend-edit.js');
}
//check and add additional assets
$this->addExtraAssets();
}
/**
* Update head - detect if devmode or themermode is enabled and less file existed, use less file instead of css
* We also detect and update jQuery, Bootstrap to use T3 assets
*
* @return null
*/
function updateHead()
{
//state parameters
$devmode = $this->getParam('devmode', 0);
$themermode = $this->getParam('themermode', 1) && defined('T3_THEMER');
$theme = $this->getParam('theme', '');
$minify = $this->getParam('minify', 0);
$minifyjs = $this->getParam('minify_js', 0);
// detect RTL
$doc = JFactory::getDocument();
$dir = $doc->direction;
$is_rtl = ($dir == 'rtl');
// As Joomla 3.0 bootstrap is buggy, we will not use it
// We also prevent both Joomla bootstrap and T3 bootsrap are loaded
// And upgrade jquery as our Framework require jquery 1.7+ if we are loading jquery from google
$scripts = array();
if (version_compare(JVERSION, '3.0', 'ge')) {
$t3bootstrap = false;
$jabootstrap = false;
foreach ($doc->_scripts as $url => $script) {
if (strpos($url, T3_URL . '/bootstrap/js/bootstrap.js') !== false) {
$t3bootstrap = true;
if ($jabootstrap) { //we already have the Joomla bootstrap and we also replace to T3 bootstrap
continue;
}
}
if (preg_match('@media/jui/js/bootstrap(.min)?.js@', $url)) {
if ($t3bootstrap) { //we have T3 bootstrap, no need to add Joomla bootstrap
continue;
} else {
$scripts[T3_URL . '/bootstrap/js/bootstrap.js'] = $script;
}
$jabootstrap = true;
} else {
$scripts[$url] = $script;
}
}
$doc->_scripts = $scripts;
$scripts = array();
}
// VIRTUE MART / JSHOPPING compatible
foreach ($doc->_scripts as $url => $script) {
$replace = false;
if ((strpos($url, '//ajax.googleapis.com/ajax/libs/jquery/') !== false &&
preg_match_all('@/jquery/(\d+(\.\d+)*)?/@msU', $url, $jqver)) ||
(preg_match_all('@(^|\/)jquery([-_]*(\d+(\.\d+)+))?(\.min)?\.js@i', $url, $jqver))) {
$idx = strpos($url, '//ajax.googleapis.com/ajax/libs/jquery/') !== false ? 1 : 3;
if (is_array($jqver) && isset($jqver[$idx]) && isset($jqver[$idx][0])) {
$jqver = explode('.', $jqver[$idx][0]);
if (isset($jqver[0]) && (int)$jqver[0] <= 1 && isset($jqver[1]) && (int)$jqver[1] < 7) {
$scripts[T3_URL . '/js/jquery-1.11.2' . ($devmode ? '' : '.min') . '.js'] = $script;
$replace = true;
}
}
}
if (!$replace) {
$scripts[$url] = $script;
}
}
$doc->_scripts = $scripts;
// end update javascript
//Update css/less based on devmode and themermode
$root = JURI::root(true);
$current = JURI::current();
// $regex = '@' . preg_quote(T3_TEMPLATE_REL) . '/css/(rtl/)?(.*)\.css((\?|\#).*)?$@i';
$regex = '@' . preg_quote(T3_TEMPLATE_REL) . '/(.*)\.css((\?|\#).*)?$@i';
$stylesheets = array();
foreach ($doc->_styleSheets as $url => $css) {
// detect if this css in template css
if (preg_match($regex, $url, $match)) {
$fname = $match[1];
// remove rtl
$fname = preg_replace ('@(^|/)rtl/@mi', '\1', $fname);
// remove local
$fname = preg_replace ('@^local/@mi', '', $fname);
// if (($devmode || $themermode) && is_file(T3_TEMPLATE_PATH . '/less/' . $fname . '.less')) {
if (($devmode || $themermode)) {
// less file
$lfname = preg_replace ('@(^|/)css/@mi', '\1less/', $fname);
if (is_file(T3_TEMPLATE_PATH . '/' . $lfname . '.less')) {
if ($themermode) {
$newurl = T3_TEMPLATE_URL . '/' . $lfname . '.less';
$css['mime'] = 'text/less';
} else {
T3::import('core/less');
$newurl = T3Less::buildCss(T3Path::cleanPath(T3_TEMPLATE_REL . '/' . $lfname . '.less'), true);
}
$stylesheets[$newurl] = $css;
continue;
}
}
$uri = null;
// detect css available base on direction & theme
if ($is_rtl && $theme) {
// rtl css file
$altfname = preg_replace ('@(^|/)css/@mi', '\1css/rtl/' . $theme . '/', $fname);
$uri = T3Path::getUrl ($altfname . '.css');
}
if (!$uri && $is_rtl) {
$altfname = preg_replace ('@(^|/)css/@mi', '\1css/rtl/', $fname);
$uri = T3Path::getUrl ($altfname . '.css');
}
if (!$uri && $theme) {
$altfname = preg_replace ('@(^|/)css/@mi', '\1css/themes/' . $theme . '/', $fname);
$uri = T3Path::getUrl ($altfname . '.css');
}
if (!$uri) {
$uri = T3Path::getUrl ($fname . '.css');
}
if ($uri) {
$stylesheets[$uri] = $css;
}
continue;
}
$stylesheets[$url] = $css;
}
// update back
$doc->_styleSheets = $stylesheets;
//only check for minify if devmode is disabled
if (!$devmode && ($minify || $minifyjs)) {
T3::import('core/minify');
if($minify){
T3Minify::optimizecss($this);
}
if($minifyjs){
T3Minify::optimizejs($this);
}
}
}
/**
* Add some other condition assets (css, javascript). Use to parse /etc/assets.xml
*
* @return null
*/
function addExtraAssets()
{
$base = JURI::base(true);
$regurl = '#(http|https)://([a-zA-Z0-9.]|%[0-9A-Za-z]|/|:[0-9]?)*#iu';
$afiles = T3Path::getAllPath('etc/assets.xml');
foreach ($afiles as $afile) {
if (is_file($afile)) {
//load xml
$axml = simplexml_load_file($afile);
//process if exist
if ($axml) {
foreach ($axml as $node => $nodevalue) {
//ignore others node
if ($node == 'stylesheets' || $node == 'scripts') {
foreach ($nodevalue->file as $file) {
$compatible = (string) $file['compatible'];
if ($compatible) {
$parts = explode(' ', $compatible);
$operator = '='; //exact equal to
$operand = $parts[0];
if (count($parts) == 2) {
$operator = $parts[0];
$operand = $parts[1];
}
//compare with Joomla version
if (!version_compare(JVERSION, $operand, $operator)) {
continue;
}
}
$url = (string)$file;
if (substr($url, 0, 2) == '//') { //external link
} else if ($url[0] == '/') { //absolute link from based folder
$url = is_file(JPATH_ROOT . $url) ? $base . $url : false;
} else if (!preg_match($regurl, $url)) { //not match a full url -> sure internal link
$url = T3Path::getUrl($url); // so get it
}
if ($url) {
$attributes = [];
foreach ($file->attributes() as $key => $value) {
$attributes[$key] = (string) $value;
}
if ($node == 'stylesheets') {
$this->addStylesheet($url, array(), $attributes);
} else {
$this->addScript($url, array(), $attributes);
}
}
}
}
}
}
}
}
// template extended styles
$aparams = $this->_tpl->params->toArray();
$extras = array();
$itemid = JFactory::getApplication()->input->get ('Itemid');
foreach ($aparams as $name => $value) {
if (preg_match ('/^theme_extras_(.+)$/', $name, $m)) {
$extras[$m[1]] = $value;
}
}
if (count ($extras)) {
foreach ($extras as $extra => $pages) {
if (!is_array($pages) || !count($pages) || in_array (0, $pages)) {
continue; // disabled
}
if (in_array (-1, $pages) || in_array($itemid, $pages)) {
// load this style
$this->addCss ('extras/'.$extra);
}
}
}
}
/**
* Turn a param to DOM style value
* @param string $style The style property
* @param string $pname The parameter name
* @param boolean $isurl Is url?
*
* @return string The css style string
* @deprecated This function is no longer used in T3
*/
function paramToStyle($style, $pname = '', $isurl = false)
{
if ($pname == '') {
$pname = $style;
}
$param = $this->getParam($pname);
if (!$param) return '';
if ($isurl) {
return "$style:url($param);";
} else {
return "$style:$param" . (is_numeric($param) ? 'px;' : ';');
}
}
/**
* Internal function, auto generate optimize width in a row fit to 12 grid
* @param number $numpos number columns in row
*
* @return array The span width layout columns for a row
*/
function fitWidth($numpos)
{
$result = array();
$avg = floor($this->maxgrid / $numpos);
$sum = 0;
for ($i = 0; $i < $numpos - 1; $i++) {
$result[] = $avg;
$sum += $avg;
}
$result[] = $this->maxgrid - $sum;
return $result;
}
/**
* Internal function, generate auto calculate width
* @param string $layout The target layout
* @param number $numpos Number of columns (block)
*
* @return array The span width layout columns
*/
function genWidth($layout, $numpos)
{
$cminspan = $this->minspan[$layout];
$total = $cminspan * $numpos;
if ($total < $this->maxgrid) {
return $this->fitWidth($numpos);
} else {
$result = array();
$rows = ceil($total / $this->maxgrid);
$cols = ceil($numpos / $rows);
for ($i = 0; $i < $rows - 1; $i++) {
$result = array_merge($result, $this->fitWidth($cols));
$numpos -= $cols;
}
$result = array_merge($result, $this->fitWidth($numpos));
}
return $result;
}
}
PK ;�!])�!l(= (= t3.phpnu &1i� <?php
/**
*------------------------------------------------------------------------------
* @package T3 Framework for Joomla!
*------------------------------------------------------------------------------
* @copyright Copyright (C) 2004-2013 JoomlArt.com. All Rights Reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
* @authors JoomlArt, JoomlaBamboo, (contribute to this project at github
* & Google group to become co-author)
* @Google group: https://groups.google.com/forum/#!forum/t3fw
* @Link: http://t3-framework.org
*------------------------------------------------------------------------------
*/
use Joomla\CMS\Factory;
use Joomla\CMS\Uri\Uri;
use Joomla\Filesystem\Path;
use Joomla\Registry\Registry;
use Joomla\Filesystem\Folder;
// no direct access
defined('_JEXEC') or die('Restricted access');
/**
* T3 class
* Singleton class for T3
* @package T3
*/
class T3 {
protected static $t3app = null;
protected static $tmpl = null;
protected static $serviceRegistry;
/**
* Import T3 Library
*
* @param string $package Object path that seperate by backslash (/)
*
* @return void
*/
public static function import($package){
$path = T3_ADMIN_PATH . DIRECTORY_SEPARATOR . 'includes' . DIRECTORY_SEPARATOR . strtolower($package) . '.php';
if (file_exists($path)) {
include_once $path;
} else {
trigger_error('T3::import not found object: ' . $package, E_USER_ERROR);
}
}
/**
* Register class with Joomla Loader. Override joomla core if $import_key avaiable
*
* @return void
*/
public static function register ($class, $path, $import_key = null) {
if (!empty($import_key)) jimport($import_key);
JLoader::register ($class, $path);
}
public static function registerHtmlClass () {
// register T3Html class
JLoader::registerPrefix('T3Html', T3_ADMIN_PATH . '/includes/joomla4/html');
$serviceRegistry = Factory::getContainer()->get(\Joomla\CMS\HTML\Registry::class);
$serviceRegistry->register('behavior', T3HtmlBehavior::class, true);
$serviceRegistry->register('bootstrap', T3HtmlBootstrap::class, true);
}
/**
* @param object $tpl template object to initialize if needed
* @return bool|null|T3Admin
*/
public static function getApp($tpl = null){
if(empty(self::$t3app)){
$japp = Factory::getApplication();
self::$t3app = T3::isAdmin() ? self::getAdmin() : self::getSite($tpl);
}
return self::$t3app;
}
/**
* initialize T3
*/
public static function init ($xml) {
$app = Factory::getApplication();
$input = $app->input;
// echo '<pre>';var_dump($xml->t3->base);echo '</pre>';
// if ($xml->t3->base === null){echo '<pre>';var_dump($xml->t3->base);echo '</pre>';die('');}
$coretheme = isset($xml->t3) && isset($xml->t3->base)
? trim((string)$xml->t3->base) : 'base';
// check coretheme in media/t3/themes folder
// if not exists, use default base theme in T3
if (!$coretheme){
$coretheme = 'base';
}
foreach(array(T3_EX_BASE_PATH, T3_ADMIN_PATH) as $basedir){
if(is_dir($basedir . '/' . $coretheme)){
if(is_file($basedir . '/' . $coretheme . '/define.php')){
include_once ($basedir . '/' . $coretheme . '/define.php');
}
break;
}
}
if(!defined('T3')){
// get ready for the t3 core base theme
include_once (T3_CORE_BASE_PATH . '/define.php');
}
if(!defined('T3')){
T3::error(JText::sprintf('T3_MSG_FAILED_INIT_BASE', $coretheme));
exit;
}
define ('T3_TEMPLATE', (String)$xml->tplname);
define ('T3_TEMPLATE_URL', Uri::root(true).'/templates/'.T3_TEMPLATE);
define ('T3_TEMPLATE_PATH', str_replace ('\\', '/', JPATH_ROOT) . '/templates/' . T3_TEMPLATE);
define ('T3_TEMPLATE_REL', 'templates/' . T3_TEMPLATE);
define ('T3_LOCAL_URL', T3_TEMPLATE_URL . '/' . T3_LOCAL_DIR);
define ('T3_LOCAL_PATH', T3_TEMPLATE_PATH . '/' . T3_LOCAL_DIR);
define ('T3_LOCAL_REL', T3_TEMPLATE_REL . '/' . T3_LOCAL_DIR);
if ($input->getCmd('themer', 0)){
define ('T3_THEMER', 1);
}
if (!T3::isAdmin()) {
$params = $app->getTemplate(true)->params;
define ('T3_DEV_FOLDER', $params->get ('t3-assets', 't3-assets') . '/dev');
define ('T3_DEV_MODE', $params->get ('devmode', 0));
} else {
$params = self::getTemplate()->params;
define ('T3_DEV_FOLDER', $params->get ('t3-assets', 't3-assets') . '/dev');
}
if (!is_dir(JPATH_ROOT.'/'.T3_DEV_FOLDER)) {
Folder::create(JPATH_ROOT.'/'.T3_DEV_FOLDER);
}
if($input->getCmd('t3lock', '')){
Factory::getSession()->set('T3.t3lock', $input->getCmd('t3lock', ''));
$input->set('t3lock', null);
}
// load core library
T3::import ('core/path');
T3::import ('core/t3j');
if (1 || !T3::isAdmin()) {
if(version_compare(JVERSION, '3.8', 'ge')){
// override core joomla class
// JViewLegacy
/*
T3::register('JViewLegacy', T3_ADMIN_PATH . '/includes/joomla4/HtmlView.php');
// JModuleHelper
T3::register('JModuleHelper', T3_ADMIN_PATH . '/includes/joomla4/ModuleHelper.php');
// JPagination
T3::register('JPagination', T3_ADMIN_PATH . '/includes/joomla4/Pagination.php');
// Register T3 Layout File to put a t3 base layer for layout files
T3::register('JLayoutFile', T3_ADMIN_PATH . '/includes/joomla4/FileLayout.php');
*/
// overwrite original Joomla
$loader = require JPATH_LIBRARIES . '/vendor/autoload.php';
// update class maps
$classMap = $loader->getClassMap();
$classMap['Joomla\CMS\Layout\FileLayout'] = T3_ADMIN_PATH . '/includes/joomla4/FileLayout.php';
$classMap['Joomla\CMS\Helper\ModuleHelper'] = T3_ADMIN_PATH . '/includes/joomla4/ModuleHelper.php';
$classMap['Joomla\CMS\MVC\View\HtmlView'] = T3_ADMIN_PATH . '/includes/joomla4/HtmlView.php';
$classMap['Joomla\CMS\Pagination\Pagination'] = T3_ADMIN_PATH . '/includes/joomla4/Pagination.php';
$loader->addClassMap($classMap);
} else if(version_compare(JVERSION, '3.0', 'ge')){
// override core joomla class
// JViewLegacy
T3::register('JViewLegacy', T3_ADMIN_PATH . '/includes/joomla30/viewlegacy.php');
T3::register('JViewHtml', T3_ADMIN_PATH . '/includes/joomla30/viewhtml.php');
// JModuleHelper
T3::register('JModuleHelper', T3_ADMIN_PATH . '/includes/joomla30/modulehelper.php');
// JPagination
T3::register('JPagination', T3_ADMIN_PATH . '/includes/joomla30/pagination.php');
// Register T3 Layout File to put a t3 base layer for layout files
T3::register('JLayoutFile', T3_ADMIN_PATH . '/includes/joomla30/layoutfile.php');
} else {
// override core joomla class
// JView
T3::register('JView', T3_ADMIN_PATH . '/includes/joomla25/view.php', 'joomla.application.component.view');
// JModuleHelper
T3::register('JModuleHelper', T3_ADMIN_PATH . '/includes/joomla25/modulehelper.php', 'joomla.application.module.helper');
// JPagination
T3::register('JPagination', T3_ADMIN_PATH . '/includes/joomla25/pagination.php', 'joomla.html.pagination');
//register layout
T3::register('JLayout', T3_ADMIN_PATH . '/includes/joomla25/layout/layout.php');
T3::register('JLayoutBase', T3_ADMIN_PATH . '/includes/joomla25/layout/base.php');
T3::register('JLayoutFile', T3_ADMIN_PATH . '/includes/joomla25/layout/file.php');
T3::register('JLayoutHelper', T3_ADMIN_PATH . '/includes/joomla25/layout/helper.php');
T3::register('JHtmlBootstrap', T3_ADMIN_PATH . '/includes/joomla25/html/bootstrap.php');
T3::register('JHtmlBehavior', T3_ADMIN_PATH . '/includes/joomla25/html/behavior.php');
T3::register('JHtmlString', T3_ADMIN_PATH . '/includes/joomla25/html/string.php');
T3::register('JHtmlJquery', T3_ADMIN_PATH . '/includes/joomla25/html/jquery.php');
// load j25 compat language
Factory::getLanguage()->load('plg_system_t3.j25.compat', JPATH_ADMINISTRATOR);
}
// import renderer
T3::import('renderer/pageclass');
T3::import('renderer/megamenu');
T3::import('renderer/t3bootstrap');
} else {
}
if(version_compare(JVERSION, '4', 'ge')) T3::registerHtmlClass();
// capture for tm=1 => show theme magic
if ($input->getCmd('tm') == 1) {
$input->set('t3action', 'theme');
$input->set('t3task', 'thememagic');
}
}
public static function checkAction () {
// excute action by T3
if ($action = Factory::getApplication()->input->getCmd ('t3action')) {
T3::import ('core/action');
T3Action::run ($action);
}
}
/**
* check for t3ajax action
*/
public static function checkAjax () {
// excute action by T3
$input = Factory::getApplication()->input;
if ($input->getCmd ('t3ajax')) {
T3::import('core/ajax');
T3::import('renderer/t3ajax');
//T3Ajax::processAjaxRule();
Factory::getApplication()->getTemplate(true)->params->set('mainlayout', 'ajax.' . $input->getCmd('f', 'html'));
}
}
/**
* get T3Admin object
* @return T3Admin
*/
public static function getAdmin(){
T3::import ('core/admin');
return new T3Admin();
}
/**
* get T3Template object for frontend
* @param $tpl
* @return bool
*/
public static function getSite($tpl){
//when on site, the JDocumentHTML parameter must be pass
if(empty($tpl)){
return false;
}
$type = 'Template'. Factory::getApplication()->input->getCmd ('t3tp', '');
T3::import ('core/' . $type);
// create global t3 template object
$class = 'T3' . $type;
return new $class($tpl);
}
/**
* @param $msg
* @param int $code
* @throws Exception
*/
public static function error($msg, $code = 500){
if (JError::$legacy) {
JError::setErrorHandling(E_ERROR, 'die');
JError::raiseError($code, $msg);
exit;
} else {
throw new Exception($msg, $code);
}
}
/**
* detect function to check a current template is T3 template
* @return bool|SimpleXMLElement
*/
public static function detect(){
static $t3;
if (!isset($t3)) {
$t3 = false; // set false
$app = Factory::getApplication();
$input = $app->input;
// get template name
$tplname = '';
if($input->getCmd ('t3action') && $input->getInt('styleid', '')) {
$tplname = self::getTemplate(true);
} elseif (T3::isAdmin()) {
// if not login, do nothing
$user = Factory::getUser();
if (!$user->id){
return false;
}
$task = $input->getCmd('task') !== null ? $input->getCmd('task') : '';
if($input->getCmd('option') == 'com_templates' &&
(preg_match('/style\./', $task) ||
$input->getCmd('view') == 'style' ||
$input->getCmd('view') == 'template')){
$db = Factory::getDBO();
$query = $db->getQuery(true);
$id = $input->getInt('id');
//when in POST the view parameter does not set
if ($input->getCmd('view') == 'template') {
$query
->select('element')
->from('#__extensions')
->where('extension_id='.(int)$id . ' AND type=' . $db->quote('template'));
} else {
$query
->select('template')
->from('#__template_styles')
->where('id='.(int)$id);
}
$db->setQuery($query);
$tplname = $db->loadResult();
}
} else {
$tplname = $app->getTemplate(false);
}
if ($tplname) {
// parse xml
$filePath = Path::clean(JPATH_ROOT.'/templates/'.$tplname.'/templateDetails.xml');
if (is_file ($filePath)) {
$xml = $xml = simplexml_load_file($filePath);
// check t3 or group=t3 (compatible with previous definition)
if (isset($xml->t3) || (isset($xml->group) && strtolower($xml->group) == 't3')) {
$xml->tplname = $tplname;
$t3 = $xml;
}
}
}
}
return $t3;
}
/**
* get default template style
*/
public static function getDefaultTemplate($name = false){
static $template;
if (!isset($template)) {
$db = Factory::getDbo();
$query = $db->getQuery(true);
$query
->select('id, home, template, s.params')
->from('#__template_styles as s')
->where('s.client_id = 0')
->where('s.home = \'1\'')
->where('e.enabled = 1')
->leftJoin('#__extensions as e ON e.element=s.template AND e.type='.$db->quote('template').' AND e.client_id=s.client_id');
$db->setQuery($query);
$result = $db->loadObject();
$template = !empty($result) ? $result : false;
}
if($name && $template){
return $template->template;
}
return $template;
}
/**
* get the template object or template name
* @param bool $name
* @return mixed template object or template name
*/
public static function getTemplate($name = false)
{
if(!isset(self::$tmpl) || !self::$tmpl){
$app = Factory::getApplication();
$input = $app->input;
$id = $input->getInt('styleid', $input->getInt('id'));
if($id){
$db = Factory::getDbo();
$query = $db->getQuery(true);
$query
->select('template, params')
->from('#__template_styles')
->where('client_id = 0');
if(T3::isAdmin() && $input->get('view') == 'template' && defined('T3_TEMPLATE')){
$query->where('template='. $db->quote(T3_TEMPLATE));
} else {
$query->where('id='. $id);
}
$db->setQuery($query);
$template = $db->loadObject();
if ($template) {
$registry = new Registry();
$registry->loadString($template->params);
$template->params = $registry;
}
self::$tmpl = $template;
}
}
if($name && self::$tmpl){
return self::$tmpl->template;
}
return self::$tmpl;
}
/**
* set caching template and its parameters
* @param string $name
* @param string $params
*/
public static function setTemplate($name = '', $params = ''){
if(!self::$tmpl){
self::$tmpl = new stdClass;
}
if($name && $params){
self::$tmpl->template = $name;
self::$tmpl->params = $params;
}
}
/**
* get template parameters
* @return Registry()
*/
public static function getTplParams()
{
$tmpl = self::getTemplate();
return $tmpl ? $tmpl->params : new Registry(); //empty registry ? or throw error
}
/**
* check if current page is homepage
*/
public static function isHome(){
$active = Factory::getApplication()->getMenu()->getActive();
return (!$active || $active->home);
}
public static function isAdmin() {
return Factory::getApplication()->isClient('administrator');
}
/**
* fix ja back link
* @param $buffer
* @return mixed
*/
public static function fixJALink($buffer){
if(!self::isHome()){
$buffer = preg_replace_callback('@<a[^>]*>JoomlArt.com</a>@i', array('T3', 'removeBacklink'), $buffer);
}
return $buffer;
}
/**
* fix t3-framework.org back link
* @param $buffer
* @return mixed
*/
public static function fixT3Link($buffer){
if(!self::isHome()){
$buffer = preg_replace_callback('@<a[^>]*>([^>]*)>T3 Framework</strong></a>@mi', array('T3', 'removeBacklink'), $buffer);
}
return $buffer;
}
/**
* check nofollow attribute
* @param $match
* @return mixed
*/
public static function removeBacklink($match){
if($match && isset($match[0]) && strpos($match[0], 'rel="nofollow"') === false){
$match[0] = str_replace('<a ', '<a rel="nofollow" ', $match[0]);
}
return $match[0];
}
// Create alias class for original call in $filepath, then overload the class
public static function makeAlias($filepath, $originClassName, $aliasClassName) {
if (!is_file($filepath)) return false;
$code = file_get_contents($filepath);
$code = str_replace('class ' . $originClassName, 'class ' . $aliasClassName, $code);
eval('?>'. $code);
return true;
}
}
PK ;�!]�K ��[ �[ less.phpnu &1i� <?php
/**
*------------------------------------------------------------------------------
* @package T3 Framework for Joomla!
*------------------------------------------------------------------------------
* @copyright Copyright (C) 2004-2013 JoomlArt.com. All Rights Reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
* @authors JoomlArt, JoomlaBamboo, (contribute to this project at github
* & Google group to become co-author)
* @Google group: https://groups.google.com/forum/#!forum/t3fw
* @Link: http://t3-framework.org
*------------------------------------------------------------------------------
*/
// No direct access
defined('_JEXEC') or die();
jimport('joomla.filesystem.file');
jimport('joomla.filesystem.folder');
T3::import('core/path');
T3::import('lessphp/' . T3_BASE_LESS_COMPILER);
/**
* T3Less class compile less
*
* @package T3
*/
class T3Less
{
static $kfilepath = 'less-file-path';
static $kvarsep = 'less-content-separator';
static $krtlsep = 'rtl-less-content';
static $rsplitbegin = '@^\s*\#';
static $rsplitend = '[^\s]*?\s*{\s*[\r\n]*\s*content:\s*"([^"]*)";\s*[\r\n]*\s*}[\r\n]*@im';
static $rswitchrtl = '@/less/(themes/[^/]*/)?@';
static $rcomment = '@/\*[^*]*\*+([^/][^*]*\*+)*/@';
static $rspace = '@[\r?\n]{2,}@';
static $rimport = '@^\s*\@import\s+"([^"]*)"\s*;@im';
static $rimportvars = '@^\s*\@import\s+".*(variables-custom|variables|vars|mixins)\.less"\s*;@im';
static $_path = null;
public static function requirement(){
static $setup;
if(isset($setup)){
@ini_set('pcre.backtrack_limit', '2M');
$mem_limit = @ini_get('memory_limit');
if (preg_match('@^(\d+)(.)$@', $mem_limit, $matches)) {
if ($matches[2] == 'M') {
$mem_limit = $matches[1] * 1024 * 1024;
} else if ($matches[2] == 'K') {
$mem_limit = $matches[1] * 1024;
}
}
if((int)$mem_limit < 128 * 1024 * 1024) {
@ini_set('memory_limit', '128M');
}
$setup = true;
}
}
/**
* Compile LESS to CSS
* @param $path the file path of less file
* @return string the css compiled content
*/
public static function getCss($path)
{
//build vars once
self::buildVarsOnce();
// get vars last-modified
$vars_lm = self::getState('vars_last_modified', 0);
// less file last-modified
$filepath = JPATH_ROOT . '/' . $path;
$less_lm = filemtime($filepath);
// cache key
$key = md5($vars_lm . ':' . $less_lm . ':' . $path);
$group = 't3';
$cache = JCache::getInstance('output', array(
'lifetime' => 1440
));
// get cache
$data = $cache->get($key, $group);
if ($data) {
return $data;
}
// not cached, build & store it
$data = self::compileCss($path) . "\n";
$cache->store($data, $key, $group);
return $data;
}
/**
* Compile LESS to CSS
* @param $path the less file to compile
* @return string url to css file
*/
public static function buildCss ($path, $return = false) {
$rtpl_check = '@'.preg_quote(T3_TEMPLATE_REL, '@') . '/@i';
$rtpl_less_check = '@'.preg_quote(T3_TEMPLATE_REL, '@') . '/less/@i';
$app = JFactory::getApplication();
$doc = JFactory::getDocument();
$theme = $app->getUserState('current_theme', '');
$is_rtl = ($app->getUserState('current_direction') == 'rtl');
if(array_key_exists("HTTP_USER_AGENT", $_SERVER)){
$_SERVER['HTTP_USER_AGENT'] = "";
}
$ie8 = preg_match('/MSIE 8\./', $_SERVER['HTTP_USER_AGENT']);
// get css cached file
$subdir = ($is_rtl ? 'rtl/' : '') . ($theme ? $theme . '/' : '');
$cssdir = T3_DEV_FOLDER . ($ie8 ? '/ie8' : '') . '/' . $subdir;
$cssfile = $cssdir . str_replace('/', '.', $path) . '.css';
// modified time
$less_lm = @filemtime (JPATH_ROOT . '/' . $path);
$css_lm = @filemtime ($cssfile);
$vars_lm = self::getState('vars_last_modified', 0);
$list = self::parse($path);
if (empty ($list)) return false;
// prepare output list
$split = !$ie8 && !$return && preg_match ($rtpl_less_check, $path) && !preg_match ('/bootstrap/', $path);
$output_files = array();
foreach ($list as $f => $import) {
if ($import) {
$css = $cssdir . str_replace('/', '.', $f) . '.css';
if ($split) $output_files[] = $css;
$less_lm = max ($less_lm, @filemtime(JPATH_ROOT . '/' . $f));
$css_lm = max ($css_lm, @filemtime(JPATH_ROOT . '/' . $css));
}
}
// itself
$output_files [] = $cssfile;
// check modified
$rebuild = $vars_lm > $css_lm || $less_lm > $css_lm;
if ($rebuild) {
if ($split) {
self::compileCss($path, $cssfile, true, $list);
} else {
self::compileCss($path, $cssfile, false, $list);
}
}
if (!$return) {
// add css
foreach ($output_files as $css) {
$doc->addStylesheet($css);
}
} else {
return $cssfile;
}
}
public static function relativePath($topath, $path, $default = null){
$rel = T3Path::relativePath($topath, $path);
return $rel ? $rel . '/' : './';
}
/**
* @param string $path file path of less file to compile
* @param string $topath file path of output css file
* @return bool|mixed compile result or the css compiled content
*/
public static function compileCss($path, $topath = '', $split = false, $list = null) {
$fromdir = dirname($path);
$app = JFactory::getApplication();
$is_rtl = ($app->getUserState('current_direction') == 'rtl');
if (empty ($list)) $list = self::parse($path);
if (empty ($list)) {
return false;
}
// join $list
$content = '';
$importdirs = array();
$todir = $topath ? dirname($topath) : $fromdir;
if (!is_dir(JPATH_ROOT . '/' . $todir)) {
JFolder::create(JPATH_ROOT . '/' . $todir);
}
$importdirs[JPATH_ROOT . '/' . $fromdir] = './';
foreach ($list as $f => $import) {
if ($import) {
$importdirs[JPATH_ROOT . '/' . dirname($f)] = self::relativePath($fromdir, dirname($f));
$content .= "\n#".self::$kfilepath."{content: \"{$f}\";}\n";
// $content .= "@import \"$import\";\n\n";
if (is_file(JPATH_ROOT . '/' . $f)) {
$less_content = file_get_contents(JPATH_ROOT . '/' . $f);
// remove vars/mixins for template & t3 less
if (preg_match ('@'.preg_quote(T3_TEMPLATE_REL, '@') . '/@i', $f) || preg_match ('@'.preg_quote(T3_REL, '@') . '/@i', $f)) {
$less_content = preg_replace(self::$rimportvars, '', $less_content);
}
self::$_path = T3Path::relativePath($fromdir, dirname($f)) . '/';
$less_content = preg_replace_callback(self::$rimport, array('T3Less', 'cb_import_path'), $less_content);
$content .= $less_content;
}
} else {
$content .= "\n#".self::$kfilepath."{content: \"{$path}\";}\n";
$content .= $f . "\n\n";
}
}
// get vars
$vars_files = explode('|', self::getVars('urls'));
// build source
$source = '';
// build import vars
foreach ($vars_files as $var) {
$var_file = T3Path::relativePath($fromdir, $var);
$source .= "@import \"" . $var_file . "\";\n";
}
// less content
$source .= "\n#" . self::$kvarsep . "{content: \"separator\";}\n" . $content;
// call Less to compile,
// temporary compile into source path, then update url to destination later
try {
$output = T3LessCompiler::compile($source, $importdirs);
} catch (Exception $e) {
// echo 'Caught exception: ', $e->getMessage(), "\n";
throw new Exception($path . "<br />\n" . $e->getMessage());
}
// process content
//use cssjanus to transform the content
if ($is_rtl) {
$output = preg_split(self::$rsplitbegin . self::$krtlsep . self::$rsplitend, $output, -1, PREG_SPLIT_DELIM_CAPTURE);
$rtlcontent = isset($output[2]) ? $output[2] : false;
$output = $output[0];
T3::import('jacssjanus/ja.cssjanus');
$output = JACSSJanus::transform($output, true);
// join with rtl content
if($rtlcontent){
$output = $output . "\n" . $rtlcontent;
}
}
// skip duplicate clearfix
$arr = preg_split(self::$rsplitbegin . self::$kvarsep . self::$rsplitend, $output, 2);
if (preg_match ('/bootstrap.less/', $path)) {
$output = implode ("\n", $arr);
} else {
$output = count($arr) > 1 ? $arr[1] : $arr[0];
}
//remove comments and clean up
$output = preg_replace(self::$rcomment, '', $output);
$output = preg_replace(self::$rspace, "\n\n", $output);
// update url for output
$file_contents = self::updateUrl ($output, $path, $todir, $split);
// split if needed
if ($split) {
if(!empty($file_contents)){
//output the file to content and add to document
foreach ($file_contents as $file => $content) {
if ($file) {
$content = trim($content);
$filename = str_replace('/', '.', $file) . '.css';
JFile::write(JPATH_ROOT . '/' . $todir . '/' . $filename, $content);
}
}
}
} else {
if ($topath) {
JFile::write(JPATH_ROOT . '/' . $topath, $file_contents);
} else {
return $output;
}
}
// write to path
return true;
}
/**
* Update url for background, import according to output path
*
* @param $css the compiled css
* @param $path the source less path
* @param $output_dir destination of css file
* @param $split split into small files or not
* @return if $split then return an array of sub file, else return the whole css
*/
public static function updateUrl ($css, $path, $output_dir, $split) {
//update path and store to files
$split_contents = preg_split(self::$rsplitbegin . self::$kfilepath . self::$rsplitend, $css, -1, PREG_SPLIT_DELIM_CAPTURE);
$file_contents = array();
$file = $path;
$isfile = false;
$output = '';
// split
foreach ($split_contents as $chunk) {
if ($isfile) {
$isfile = false;
$file = $chunk;
} else {
$content = T3Path::updateUrl (trim($chunk), T3Path::relativePath($output_dir, dirname($file)));
$file_contents[$file] = (isset($file_contents[$file]) ? $file_contents[$file] : '') . "\n" . $content . "\n\n";
$output .= $content . "\n";
$isfile = true;
}
}
return $split ? $file_contents : trim($output);
}
/**
* Get less variables
* @return mixed
*/
public static function getVars($name = '')
{
return self::getState('vars_' . ($name ? $name.'_' : '') . 'content');
}
/**
* get value from cache
*/
public static function getState ($key, $default = null) {
$app = JFactory::getApplication();
$keysfx = $app->getUserState('current_key_sufix');
// cache key
$ckey = $key.$keysfx;
$group = 't3';
$cache = JCache::getInstance('output', array(
'lifetime' => 25200,
'caching' => true,
'cachebase' => JPATH_ROOT.'/'.T3_DEV_FOLDER
));
// get cache
$data = $cache->get($ckey, $group);
return $data===false ? $app->getUserState($ckey, $default) : $data;
}
/**
* store value to cache
*/
public static function setState ($key, $value) {
$app = JFactory::getApplication();
$keysfx = $app->getUserState('current_key_sufix');
// cache key
$ckey = $key.$keysfx;
$group = 't3';
$cache = JCache::getInstance('output', array(
'lifetime' => 25200,
'caching' => true,
'cachebase' => JPATH_ROOT.'/'.T3_DEV_FOLDER
));
if (!$cache->store($value, $ckey, $group)) {
$app->setUserState($ckey, $value);
}
}
/**
* @param string $theme template theme
* @param string $dir direction (ltr or rtl)
* @return mixed
*/
public static function buildVars($theme = null, $dir = null)
{
$app = JFactory::getApplication();
$params = null;
if (T3::isAdmin()) {
$params = $app->getUserState ('current_template_params');
} else {
$tpl = $app->getTemplate(true);
$params = $tpl->params;
}
if (!$params) {
T3::error(JText::_('T3_MSG_CANNOT_DETECT_TEMPLATE'));
exit;
}
$responsive = $params->get('responsive', 1);
// theme style
if ($theme === null) {
$theme = $params->get('theme');
}
// detect RTL
if ($dir === null) {
$doc = JFactory::getDocument();
$dir = $doc->direction;
}
$app->setUserState('current_theme', $theme);
$app->setUserState('current_direction', $dir);
$app->setUserState('current_key_sufix', "_{$theme}_{$dir}");
$path = T3_TEMPLATE_PATH . '/less/vars.less';
if(!is_file($path)){
T3::error(JText::_('T3_MSG_LESS_NOT_VALID'));
exit;
}
// force re-build less if switch responsive mode and get last modified time
if ($responsive !== self::getState('current_responsive')) {
self::setState('current_responsive', $responsive);
$last_modified = time();
touch($path, $last_modified);
} else {
$last_modified = filemtime($path);
}
$vars_content = file_get_contents($path);
$vars_urls = array();
preg_match_all('#^\s*@import\s+"([^"]*)"#im', $vars_content, $matches);
if (count($matches[0])) {
foreach ($matches[1] as $url) {
$path = T3Path::cleanPath(T3_TEMPLATE_PATH . '/less/' . $url);
if (file_exists($path)) {
$last_modified = max($last_modified, filemtime($path));
$vars_urls[] = T3Path::cleanPath(T3_TEMPLATE_REL . '/less/' . $url);
}
}
}
// add override variables
$paths = array();
if ($theme) {
$paths[] = T3_TEMPLATE_REL . "/less/themes/{$theme}/variables.less";
$paths[] = T3_TEMPLATE_REL . "/less/themes/{$theme}/variables-custom.less";
}
if ($dir == 'rtl') {
$paths[] = T3_TEMPLATE_REL . "/less/rtl/variables.less";
if ($theme) $paths[] = T3_TEMPLATE_REL . "/less/rtl/themes/{$theme}/variables.less";
}
if (!defined('T3_LOCAL_DISABLED')) {
$paths[] = T3_LOCAL_REL . "/less/variables.less";
if ($theme) {
$paths[] = T3_LOCAL_REL . "/less/themes/{$theme}/variables.less";
$paths[] = T3_LOCAL_REL . "/less/themes/{$theme}/variables-custom.less";
}
if ($dir == 'rtl') {
$paths[] = T3_LOCAL_REL . "/less/rtl/variables.less";
if ($theme) $paths[] = T3_LOCAL_REL . "/less/rtl/themes/{$theme}/variables.less";
}
}
if (!$responsive) {
$paths[] = T3_REL . '/less/non-responsive-variables.less';
$paths[] = T3_TEMPLATE_REL . '/less/non-responsive-variables.less';
}
foreach ($paths as $file) {
if (is_file(JPATH_ROOT . '/' . $file)) {
$last_modified = max($last_modified, filemtime(JPATH_ROOT . '/' . $file));
$vars_urls[] = $file;
}
}
if (self::getState('vars_last_modified') != $last_modified) {
self::setState('vars_last_modified', $last_modified);
}
self::setState('vars_urls_content', implode('|', $vars_urls));
}
/**
* Build vars only one per request
*/
public static function buildVarsOnce(){
// build less vars, once only
static $vars_built = false;
if (!$vars_built) {
self::buildVars();
$vars_built = true;
}
}
/**
* Wrapper function to add a stylesheet to html document
* @param string $lesspath the less file to add
*/
public static function addStylesheet($lesspath)
{
//build vars once
self::buildVarsOnce();
$app = JFactory::getApplication();
$doc = JFactory::getDocument();
$tpl = $app->getTemplate(true);
$theme = $tpl->params->get('theme');
if (defined('T3_THEMER') && $tpl->params->get('themermode', 1)) {
// in Themer mode, using js to parse less, so we will use 'text/less' content type
$doc->addStylesheet(JURI::base(true) . '/' . T3Path::cleanPath($lesspath), 'text/less');
// just to make sure this function is call once
if(!defined('T3_LESS_JS')){
// Add lessjs to process lesscss
$doc->addScript(T3_URL . '/js/less.js?v=2');
if($doc->direction == 'rtl'){
$doc->addScript(T3_URL . '/js/cssjanus.js');
}
define('T3_LESS_JS', 1);
}
} else {
self::buildCss(T3Path::cleanPath($lesspath));
}
}
public static function getOutputCssPath ($lessPath, $theme = '', $is_rtl = false) {
$cssPath = '';
$extraPath = '';
$extraPath .= $is_rtl ? 'rtl/' : '';
$extraPath .= $theme ? ($is_rtl ? '' : 'themes/') . $theme . '/' : '';
if (preg_match ('/(^|\/)less\//i', $lessPath)) {
$cssPath = preg_replace ('/(^|\/)less\//i', '\1css/' . $extraPath, $lessPath);
} else {
$cssPath = dirname ($lessPath) . '/' . $extraPath . basename($lessPath);
}
$cssPath = str_replace('.less', '.css', $cssPath);
return $cssPath;
}
/**
* Compile LESS to CSS for a specific theme or all themes
* @param string $theme the specific theme
*/
public static function compileAll($theme = null)
{
$params = T3::getTplParams();
JFactory::getApplication()->setUserState ('current_template_params', $params);
// get files need to compile
$files = array();
$toPath = T3Path::getLocalPath('', true);
// t3 core plugin files
$t3files = array('less/frontend-edit.less', 'less/legacy-grid.less', 'less/legacy-navigation.less', 'less/megamenu.less', 'less/off-canvas.less');
// all less file in the template folder
$lessFiles = JFolder::files(T3_TEMPLATE_PATH, '.less', true, true, array('rtl', 'themes', '.svn', 'CVS', '.DS_Store', '__MACOSX'));
$relLessFiles = array();
$importedFiles = array();
foreach ($lessFiles as $file) {
$file = str_replace('\\', '/', $file);
$lessContent = file_get_contents($file);
$rel = ltrim(str_replace(T3_TEMPLATE_PATH, '', $file), '/');
$reldir = dirname ($rel);
$ignore = true;
if (preg_match_all('#^\s*@import\s+"([^"]*)"#im', $lessContent, $matches)) {
foreach ($matches[1] as $if) {
$if = T3Path::cleanPath($reldir . '/' . $if);
if (!in_array($if, $importedFiles)) $importedFiles[] = $if;
// check if this file import anything in main less folder. if yes, put it in the compile list
if (preg_match ('@^less/@', $if)) $ignore = false;
}
}
if (!$ignore) $relLessFiles[] = $rel;
}
$lessFiles = $relLessFiles;
// ignore files which are imported in other file
foreach ($lessFiles as $f) {
if (!in_array($f, $importedFiles) && !preg_match ('@^less/(themes|rtl)/@i', $f)) {
$files[] = $f;
}
}
//build t3files
foreach ($t3files as $key => $file) {
if(in_array($file, $files)){
unset($t3files[$key]);
}
}
// build default
if (!$theme || $theme == 'default') {
self::buildVars('', 'ltr');
// compile all less files in template "less" folder
foreach ($files as $lessPath) {
$cssPath = self::getOutputCssPath($lessPath);
self::compileCss(T3_TEMPLATE_REL . '/' . $lessPath, $toPath . $cssPath);
}
// if the template not overwrite the t3 core, we will compile those missing files
if(!empty($t3files)){
foreach ($t3files as $lessPath) {
$cssPath = self::getOutputCssPath($lessPath);
self::compileCss(T3_REL . '/' . $lessPath, $toPath . $cssPath);
}
}
}
// build themes
if (!$theme) {
// get themes
$themes = JFolder::folders(T3_TEMPLATE_PATH . '/less/themes');
} else {
$themes = $theme != 'default' ? (array)($theme) : array();
}
if (is_array($themes)) {
foreach ($themes as $t) {
self::buildVars($t, 'ltr');
// compile
foreach ($files as $lessPath) {
$cssPath = self::getOutputCssPath($lessPath, $t);
self::compileCss(T3_TEMPLATE_REL . '/' . $lessPath, $toPath . $cssPath);
}
if(!empty($t3files)){
foreach ($t3files as $lessPath) {
$cssPath = self::getOutputCssPath($lessPath, $t);
self::compileCss(T3_REL . '/' . $lessPath, $toPath . $cssPath);
}
}
}
}
// compile rtl css
if($params && $params->get('build_rtl', 0)){
// compile default
if (!$theme || $theme == 'default') {
self::buildVars('', 'rtl');
// compile
foreach ($files as $lessPath) {
$cssPath = self::getOutputCssPath($lessPath, '', true);
self::compileCss(T3_TEMPLATE_REL . '/' . $lessPath, $toPath . $cssPath);
}
if(!empty($t3files)){
foreach ($t3files as $lessPath) {
$cssPath = self::getOutputCssPath($lessPath, '', true);
self::compileCss(T3_REL . '/' . $lessPath, $toPath . $cssPath);
}
}
}
if (is_array($themes)) {
// rtl for themes
foreach ($themes as $t) {
self::buildVars($t, 'rtl');
// compile
foreach ($files as $lessPath) {
$cssPath = self::getOutputCssPath($lessPath, $t, true);
self::compileCss(T3_TEMPLATE_REL . '/' . $lessPath, $toPath . $cssPath);
}
if(!empty($t3files)){
foreach ($t3files as $lessPath) {
$cssPath = self::getOutputCssPath($lessPath, $t, true);
self::compileCss(T3_REL . '/' . $lessPath, $toPath . $cssPath);
}
}
}
}
}
}
/**
* Parse a less file to get all its overrides before compile
* @param string $path the less file
*/
public static function parse($path) {
$rtpl_check = '@'.preg_quote(T3_TEMPLATE_REL, '@') . '/@i';
$rtpl_less_check = '@'.preg_quote(T3_TEMPLATE_REL, '@') . '/less/@i';
$app = JFactory::getApplication();
$theme = $app->getUserState('current_theme');
$dir = $app->getUserState('current_direction');
$is_rtl = ($dir == 'rtl');
$rel_path = preg_replace($rtpl_check, '', $path);
$rel_dir = dirname($rel_path);
// check path
$realpath = realpath(JPATH_ROOT . '/' . $path);
if (!is_file($realpath)) {
return false;
}
// get file content
$content = file_get_contents($realpath);
//remove vars.less
$content = preg_replace(self::$rimportvars, '', $content);
// split into array, separated by the import
$arr = preg_split(self::$rimport, $content, -1, PREG_SPLIT_DELIM_CAPTURE);
$arr[] = basename($rel_path);
$arr[] = '';
$list = array();
$rtl_list = array();
$list[$path] = '';
$import = false;
foreach ($arr as $chunk) {
if ($import) {
$import = false;
$import_url = T3Path::cleanPath(T3_TEMPLATE_REL . '/' . $rel_dir . '/' .$chunk);
// if $url in less folder, get all its overrides
if (preg_match ($rtpl_less_check, $import_url)) {
$less_rel_url = preg_replace($rtpl_less_check, '', $import_url);
$array = T3Path::getAllPath('less/' . $less_rel_url, true);
if ($theme) {
$array = array_merge($array, T3Path::getAllPath('less/themes/'.$theme.'/'.$less_rel_url, true));
}
foreach ($array as $f) {
// add file in template only
if (preg_match ($rtpl_check, $f)) {
$list [$f] = T3Path::relativePath(dirname($path), $f);
}
}
// rtl overrides
if ($is_rtl) {
$array = T3Path::getAllPath('less/rtl/'.$less_rel_url, true);
if ($theme) {
$array = array_merge($array, T3Path::getAllPath('less/rtl/themes/'.$theme.'/'.$less_rel_url, true));
}
foreach ($array as $f) {
// add file in template only
if (preg_match ($rtpl_check, $f)) {
$rtl_list [$f] = T3Path::relativePath(dirname($path), $f);
}
}
}
} else {
$list [$import_url] = T3Path::cleanPath($chunk);
// rtl override
if ($is_rtl) {
$rtl_url = preg_replace ('/\/less\//', '/less/rtl/', $import_url);
if (is_file(JPATH_ROOT.'/'.$rtl_url)) {
$rtl_list [$rtl_url] = T3Path::relativePath(dirname($path), $rtl_url);
}
}
}
} else {
$import = true;
$list [$chunk] = false;
}
}
// remove itself
unset($list[$path]);
// join rtl
if ($is_rtl) {
$list ["\n\n#" . self::$krtlsep . "{content: \"separator\";}\n\n"] = false;
$list = array_merge($list, $rtl_list);
}
return $list;
}
public static function cb_import_path ($match) {
$f = $match[1];
$newf = T3Path::cleanPath(self::$_path . $f);
return str_replace($f, $newf, $match[0]);
}
}
PK ;�!]��2<