Spade
Mini Shell
| Directory:~$ /home/lmsyaran/public_html/htaccess.back/gantry5/classes/Gantry/Framework/ |
| [Home] [System Details] [Kill Me] |
<?php
/**
* @package Gantry5
* @author RocketTheme http://www.rockettheme.com
* @copyright Copyright (C) 2007 - 2017 RocketTheme, LLC
* @license GNU/GPLv2 and later
*
* http://www.gnu.org/licenses/gpl-2.0.html
*/
namespace Gantry\Framework;
use Gantry\Admin\ThemeList;
use Gantry\Component\Filesystem\Folder;
use Gantry\Component\Outline\OutlineCollection;
use Gantry\Joomla\StyleHelper;
use Gantry\Joomla\TemplateInstaller;
use RocketTheme\Toolbox\ResourceLocator\UniformResourceLocator;
class Outlines extends OutlineCollection
{
protected $createId;
public function preset($id)
{
if (is_numeric($id)) {
$style = StyleHelper::getStyle($id);
$params = json_decode($style->params, true);
$id = isset($params['preset']) ?
$params['preset'] : 'default';
}
return $id;
}
public function current($template = null)
{
if (!is_object($template)) {
// Get the template style.
$template = \JFactory::getApplication()->getTemplate(true);
}
$preset = $template->params->get('preset',
'default');
$outline = $template->params->get('configuration',
!empty($template->id) ? $template->id : null);
GANTRY_DEBUGGER &&
\Gantry\Debugger::addMessage('Template Style:') &&
\Gantry\Debugger::addMessage($template);
if (JDEBUG && !$outline) {
static $shown = false;
if (!$shown) {
$shown = true;
\JFactory::getApplication()->enqueueMessage('[DEBUG]
JApplicationSite::getTemplate() was overridden with no specified Gantry 5
outline.', 'notice');
}
}
/** @var UniformResourceLocator $locator */
$locator = $this->container['locator'];
return ($outline &&
is_dir($locator("{$this->path}/{$outline}"))) ? $outline :
$preset;
}
/**
* @param string $path
* @return $this
*/
public function load($path = 'gantry-config://')
{
$this->path = $path;
$gantry = $this->container;
$theme = isset($gantry['theme.name']) ?
$gantry['theme.name'] : null;
$styles = ThemeList::getStyles($theme);
$installer = new
TemplateInstaller($this->container['theme.name']);
$title = $installer->getStyleName('%s - ');
$outlines = [];
foreach ($styles as $style) {
$preset = isset($style->params['preset']) ?
$style->params['preset'] : null;
$outline = isset($style->params['configuration'])
? $style->params['configuration'] : $preset;
if ($outline && $outline != $style->id) {
// New style generated by Joomla.
StyleHelper::copy($style, $outline, $style->id);
}
$outlines[$style->id] = preg_replace('|^' .
preg_quote($title) . '|', '', $style->style);
}
asort($outlines);
$this->items = $this->addDefaults($outlines);
return $this;
}
/**
* @param string|null $id
* @param string $title
* @param string|array $preset
* @return string
* @throws \RuntimeException
*/
public function create($id, $title = null, $preset = null)
{
if ($this->createId) {
// Workaround Joomla wanting to use different logic for style
duplication.
$new = parent::create($this->createId, $title, $preset);
$this->createId = null;
return $new;
}
$title = $title ? "%s - {$title}" : '%s -
Untitled';
$installer = new
TemplateInstaller($this->container['theme.name']);
$title = $installer->getStyleName($title);
$style = $installer->addStyle($title);
$error = $style->getError();
if ($error) {
throw new \RuntimeException($error, 400);
}
$presetId = (string)
(isset($preset['preset']['name']) ?
$preset['preset']['name'] : ($preset ?:
'default'));
StyleHelper::update($style->id, $presetId);
// Create configuration folder.
$id = parent::create($style->id, $title, $preset);
if ($id != $style->id) {
throw new \RuntimeException(sprintf("Creating outline:
folder '%s' already exists!", $style->id));
}
return $style->id;
}
public function duplicate($id, $title = null, $inherit = false)
{
if (!$this->canDuplicate($id)) {
throw new \RuntimeException("Outline '$id'
cannot be duplicated", 400);
}
// Handle special case of duplicating system outlines.
if ((string)(int) $id !== (string) $id) {
return parent::duplicate($id, $title, $inherit);
}
// Use Joomla logic to duplicate the style.
$model = StyleHelper::loadModel();
$pks = [$id];
if (!$model->duplicate($pks)) {
throw new \RuntimeException($model->getError(), 400);
}
// Seek the newly generated style ID since Joomla doesn't
return one on duplication.
$theme = $this->container['theme.name'];
$styles = ThemeList::getStyles($theme, true);
$style = end($styles);
if ($title) {
// Change the title.
$installer = new TemplateInstaller($theme);
$title = $installer->getStyleName("%s -
{$title}");
$this->rename($style->id, $title);
} else {
$title = $style->style;
}
$this->createId = $style->id;
return parent::duplicate($id, $title, $inherit);
}
public function rename($id, $title)
{
$model = StyleHelper::loadModel();
$item = $model->getTable();
$item->load($id);
if (!$item->id) {
throw new \RuntimeException('Outline not found',
404);
}
$theme = $this->container['theme.name'];
$installer = new TemplateInstaller($theme);
$title = $title ? "%s - {$title}" : '%s -
Untitled';
$title = $installer->getStyleName($title);
$item->title = $title;
if (!$item->check()) {
throw new \RuntimeException($item->getError(), 400);
}
if (!$item->store()) {
throw new \RuntimeException($item->getError(), 500);
}
if (isset($this->items[$id])) {
$this->items[$id] = $title;
}
return $id;
}
public function delete($id, $deleteModel = true)
{
if (!$this->canDelete($id)) {
throw new \RuntimeException("Outline '$id'
cannot be deleted", 400);
}
$model = StyleHelper::loadModel();
$item = $model->getTable();
$item->load($id);
try {
foreach ($this->getInheritingOutlines($id) as $outline =>
$title) {
$this->layout($outline)->updateInheritance($id)->save()->saveIndex();
}
foreach ($this->getInheritingOutlinesWithAtom($id) as
$outline => $title) {
Atoms::instance($outline)->updateInheritance($id)->save();
}
if ($deleteModel && !$model->delete($id)) {
$error = $model->getError();
// Well, Joomla can always send enqueue message instead!
if (!$error) {
$messages =
\JFactory::getApplication()->getMessageQueue();
$message = reset($messages);
$error = $message ? $message['message'] :
'Unknown error';
}
throw new \RuntimeException($error);
}
} catch (\Exception $e) {
throw new \RuntimeException('Deleting outline failed:
' . $e->getMessage(), 400, $e);
}
// Remove configuration directory.
$gantry = $this->container;
/** @var UniformResourceLocator $locator */
$locator = $gantry['locator'];
$path =
$locator->findResource("{$this->path}/{$item->id}",
true, true);
if ($path) {
if (file_exists($path)) {
Folder::delete($path);
}
}
unset($this->items[$item->id]);
}
/**
* @param string $id
* @return boolean
*/
public function canDelete($id)
{
$model = StyleHelper::loadModel();
$item = $model->getTable();
$item->load($id);
return !$item->id || $item->home ? false : true;
}
/**
* @param string $id
* @return boolean
*/
public function isDefault($id)
{
$model = StyleHelper::loadModel();
$item = $model->getTable();
$item->load($id);
return (bool) $item->home;
}
}