Current Directory: /home/astoriaah/www/templates/yootheme-BK/vendor/yootheme/theme/platforms/joomla
Viewing File: /home/astoriaah/www/templates/yootheme-BK/vendor/yootheme/theme/platforms/joomla/index.php
<?php
use YOOtheme\Http\Uri;
$config = [
'name' => 'yootheme/joomla-theme',
'main' => 'YOOtheme\\Theme\\Joomla',
'inject' => [
'db' => 'app.db',
'url' => 'app.url',
'view' => 'app.view',
'admin' => 'app.admin',
'styles' => 'app.styles',
'scripts' => 'app.scripts',
'sections' => 'app.view.sections',
'builder' => 'app.builder',
'customizer' => 'theme.customizer',
'conf' => 'JFactory::getConfig',
'http' => 'JHttpFactory::getHttp',
'document' => 'JFactory::getDocument',
'language' => 'JFactory::getLanguage',
'application' => 'JFactory::getApplication',
],
'routes' => function ($routes) {
$routes->get('/customizer', function ($return = false, $response) {
$this->app->trigger('theme.admin', [$this->theme]);
$this->customizer->mergeData([
'config' => $this->theme->config,
'title' => $this->theme->title,
'default' => $this->theme->default,
'return' => $return ?: $this->app->url('administrator/index.php'),
]);
JHtml::_('behavior.keepalive');
JHtml::_('bootstrap.tooltip');
return $this->document
->setTitle("Website Builder - {$this->conf->get('sitename')}")
->addFavicon(JUri::root(true).'/administrator/templates/isis/favicon.ico')
->render(false, [
'file' => 'component.php',
'template' => 'system',
]);
});
$routes->post('/customizer', function ($config, $response) {
$user = JFactory::getUser();
if (!$user->authorise('core.edit', 'com_templates')) {
$this->app->abort(403, 'Insufficient User Rights.');
}
// alter custom_data type to MEDIUMTEXT
$query = "SHOW FIELDS FROM @extensions WHERE Field = 'custom_data'";
$alter = "ALTER TABLE @extensions CHANGE `custom_data` `custom_data` MEDIUMTEXT NOT NULL";
if ($this->db->fetchObject($query)->Type == 'text') {
$this->db->executeQuery($alter);
}
// update template style params
$params = array_replace($this->theme->params->toArray(), ['config' => json_encode($config)]);
$this->db->update('@template_styles', ['params' => json_encode($params)], ['id' => $this->theme->id]);
return 'success';
});
$routes->get('/finder', function ($response) {
$base = JPATH_ADMINISTRATOR.'/components/com_media';
JLoader::register('MediaHelper', "{$base}/helpers/media.php");
define('COM_MEDIA_BASE', JPATH_ROOT.'/'.JComponentHelper::getParams('com_media')->get('file_path'));
$files = [];
foreach (JControllerLegacy::getInstance('Media', ['base_path' => $base])->getModel('list')->getList() as $type => $items) {
foreach ($items as $item) {
$files[] = [
'name' => $item->get('name'),
'path' => $item->get('path_relative'),
'url' => strtr(ltrim(substr($item->get('path'), strlen(JPATH_ROOT)), '/'), '\\', '/'),
'type' => $type == 'folders' ? 'folder' : 'file',
'size' => $item->get('size') ? JHtml::_('number.bytes', $item->get('size')) : 0
];
}
}
return $response->withJson($files);
});
$routes->post('/builder/image', function ($src, $md5 = null, $response) {
$params = JComponentHelper::getParams('com_media');
try {
$uri = Uri::fromString($src);
$file = basename($uri->getPath());
if ($uri->getHost() === 'images.unsplash.com') {
$file .= '.'.$uri->getQueryParam('fm', 'jpg');
}
$file = JFile::makeSafe($file);
$path = JPath::check(rtrim(implode('/', [JPATH_ROOT, $params->get('image_path'), $this->theme->get('media_folder')]), '/\\'));
// file already exists?
while ($iterate = @md5_file("{$path}/{$file}")) {
if ($iterate === $md5 || is_null($md5)) {
return $response->withJson(strtr(substr("{$path}/{$file}", strlen(JPATH_ROOT) + 1), '\\', '/'));
}
$file = preg_replace_callback('/-?(\d*)(\.[^.]+)?$/', function ($match) {
return sprintf("-%02d%s", intval($match[1]) + 1, isset($match[2]) ? $match[2] : '');
}, $file, 1);
}
// download file
$tmp = "{$path}/".uniqid();
$res = $this->http->get($src);
if ($res->code != 200) {
throw new Exception('Download failed.');
} else if (!JFile::write($tmp, $res->body)) {
throw new Exception('Error writing file.');
}
// allow .svg files
$params->set('upload_extensions', $params->get('upload_extensions').',svg');
// ignore MIME-type check for .svg files
$params->set('ignore_extensions', $params->get('ignore_extensions') ? $params->get('ignore_extensions').',svg' : 'svg');
if (!(new JHelperMedia)->canUpload(['name' => $file, 'tmp_name' => $tmp, 'size' => filesize($tmp)])) {
JFile::delete($tmp);
$queue = $this->application->getMessageQueue();
$message = count($queue) ? $queue[0]['message'] : '';
throw new Exception($message);
}
// move file
if (!JFile::move($tmp, "{$path}/{$file}")) {
throw new Exception('Error writing file.');
}
return $response->withJson(strtr(substr("{$path}/{$file}", strlen(JPATH_ROOT) + 1), '\\', '/'));
} catch (\Exception $e) {
$this->app->abort(500, $e->getMessage());
}
});
},
'events' => [
'init' => function ($app) {
$app['kernel']->addMiddleware(function ($request, $response, $next) {
$user = JFactory::getUser();
// no cache
$response = $response->withHeader('Expires', 'Mon, 1 Jan 2001 00:00:00 GMT');
$response = $response->withHeader('Cache-Control', 'no-cache, must-revalidate, max-age=0');
// check user permissions
if (!$request->getAttribute('allowed') && !$user->authorise('core.edit', 'com_templates') && !$user->authorise('core.edit', 'com_content')) {
$this->app->abort(403, 'Insufficient User Rights.');
}
return $next($request, $response);
});
$app->trigger('theme.init', [$this->theme]);
},
'theme.init' => [function ($theme) {
// set defaults and config
$theme->merge($this->options['config']['defaults'], true);
$theme->merge($theme->params->get('config', []));
}, -5],
'theme.site' => function () {
$custom = $this->theme->get('custom_js') ?: '';
if ($this->theme->get('jquery') || strpos($custom, 'jQuery') !== false) {
JHtml::_('jquery.framework');
}
if ($custom) {
if (stripos(trim($custom), '<script') === 0) {
$this->document->addCustomTag($custom);
} else {
$this->document->addCustomTag("<script>try { {$custom} } catch (e) { console.error('Custom Theme JS Code: ', e); }</script>");
}
}
// fix markup after email cloaking
if (JPluginHelper::isEnabled('content', 'emailcloak')) {
$cloak = <<<'EOD'
document.addEventListener('DOMContentLoaded', function() {
Array.prototype.slice.call(document.querySelectorAll('a span[id^="cloak"]')).forEach(function(span) {
span.innerText = span.textContent;
});
});
EOD;
$this->scripts->add('emailcloak', $cloak, 'theme-style', 'string');
}
},
'theme.admin' => function () {
// load editor
$editor = $this->conf->get('editor');
if (in_array($editor, ['tinymce', 'jce'])) {
// all good, use enabled visual editor
} elseif (JPluginHelper::getPlugin('editors', 'tinymce') && !in_array($editor, ['none', 'codemirror'])) {
// tinymce installed? use as visual
$editor = 'tinymce';
} else {
$editor = null;
}
if ($editor) {
JHtml::_('behavior.modal');
JHtml::_('jquery.framework');
JEditor::getInstance($editor)->display('yo_dummy_editor', '', '', '', '', '', false);
}
},
'view' => function () {
if ($this->app['admin'] || $this->theme->isCustomizer) {
return;
}
if ($css = $this->theme->get('css')) {
$this->styles->add('theme-inline', preg_replace('/[\r\n\t]+/', ' ', $css), [], 'string');
}
},
],
'config' => [
'panels' => [
'system' => [
'title' => 'System',
'width' => 400,
'fields' => [
'media_folder' => [
'label' => 'Media Folder',
'description' => 'This folder stores images that you download when using layouts from the YOOtheme Pro library. It\'s located inside the Joomla images folder.',
'type' => 'text',
],
],
],
'system-post' => [
'title' => 'Post',
'width' => 400,
'fields' => [
'post.meta_style' => [
'label' => 'Meta Style',
'description' => 'Display the meta text in a sentence or a horizontal list.',
'type' => 'select',
'options' => [
'List' => 'list',
'Sentence' => 'sentence',
],
],
'post.header_align' => [
'label' => 'Alignment',
'description' => 'The alignment option applies to both, the blog and single posts.',
'type' => 'checkbox',
'text' => 'Center the header and footer',
],
'post.content_width' => [
'label' => 'Max Width',
'description' => 'Set a smaller width than the image\'s for the content.',
'type' => 'checkbox',
'text' => 'Small',
],
'post.content_dropcap' => [
'label' => 'Drop Cap',
'description' => 'Set a large initial letter that drops below the first line of the first paragraph.',
'type' => 'checkbox',
'text' => 'Show drop cap',
],
],
],
'system-blog' => [
'title' => 'Blog',
'width' => 400,
'fields' => [
'blog.column_gutter' => [
'type' => 'checkbox',
'text' => 'Large gutter',
'show' => 'blog.column != "1"',
],
'blog.column_divider' => [
'description' => 'Set a larger gutter and display dividers between columns.',
'type' => 'checkbox',
'text' => 'Display dividers between columns',
'show' => 'blog.column != "1"',
],
'blog.content_align' => [
'label' => 'Alignment',
'description' => 'This option applies to the blog overview and not to single posts. To center the post\'s header and footer, go to the post settings.',
'type' => 'checkbox',
'text' => 'Center the content',
],
'blog.button_style' => [
'label' => 'Button',
'description' => 'Select a style for the continue reading button.',
'type' => 'select',
'options' => [
'Default' => 'default',
'Primary' => 'primary',
'Secondary' => 'secondary',
'Danger' => 'danger',
'Text' => 'text',
],
],
'blog.navigation' => [
'label' => 'Navigation',
'description' => 'Use a numeric pagination or previous/next links to move between blog pages.',
'type' => 'select',
'options' => [
'Pagination' => 'pagination',
'Previous/Next' => 'previous/next',
],
],
'blog.pagination_startend' => [
'type' => 'checkbox',
'text' => 'Show Start/End links',
'show' => 'blog.navigation == "pagination"',
],
],
]
],
'defaults' => [
'post' => [
'meta_style' => 'sentence',
'header_align' => 0,
'content_width' => 0,
'content_dropcap' => 0,
'navigation' => 1,
],
'blog' => [
'column_gutter' => 0,
'column_divider' => 0,
'content_align' => 0,
'button_style' => 'default',
'navigation' => 'pagination',
],
'media_folder' => 'yootheme',
],
],
];
return defined('_JEXEC') ? $config : false;