shekil/packages/Webkul/Theme/src/Theme.php

143 lines
2.8 KiB
PHP

<?php
namespace Webkul\Theme;
use Illuminate\Support\Facades\Config;
use Webkul\Theme\Facades\Themes as Themes;
class Theme
{
/**
* Contains theme code
*
* @var string
*/
public $code;
/**
* Contains theme name
*
* @var string
*/
public $name;
/**
* Contains theme views path
*
* @var string
*/
public $viewsPath;
/**
* Contains theme assets path
*
* @var string
*/
public $assetsPath;
/**
* Contains theme parent
*
* @var Theme
*/
public $parent;
/**
* Create a new Theme instance.
*
* @param string $code
* @param string $name
* @param string $assetsPath
* @param string $viewsPath
* @return void
*/
public function __construct($code, $name = null, $assetsPath = null, $viewsPath = null)
{
$this->code = $code;
$this->name = $name;
$this->assetsPath = $assetsPath === null ? $code : $assetsPath;
$this->viewsPath = $viewsPath === null ? $code : $viewsPath;
}
/**
* Sets the parent
*
* @param \Webkul\Theme\Theme
* @return void
*/
public function setParent(Theme $parent)
{
$this->parent = $parent;
}
/**
* Return the parent
*
* @return \Webkul\Theme\Theme
*/
public function getParent()
{
return $this->parent;
}
/**
* Return all the possible view paths
*
* @return array
*/
public function getViewPaths()
{
$paths = [];
$theme = $this;
do {
if (substr($theme->viewsPath, 0, 1) === DIRECTORY_SEPARATOR) {
$path = base_path(substr($theme->viewsPath, 1));
} else {
$path = $theme->viewsPath;
}
if (! in_array($path, $paths)) {
$paths[] = $path;
}
} while ($theme = $theme->parent);
return $paths;
}
/**
* Convert to asset url based on current theme
*
* @param string $url
* @param bool|null $secure
* @return string
*/
public function url($url, $secure = null)
{
$url = ltrim($url, '/');
if (preg_match('/^((http(s?):)?\/\/)/i', $url)) {
return $url;
}
if (preg_match('/^((http(s?):)?\/\/)/i', $this->assetsPath)) {
return $this->assetsPath . '/' . $url;
}
$fullUrl = str_replace("public/", "", $this->assetsPath) . '/' . $url;
if (file_exists(public_path($fullUrl))) {
return asset($fullUrl, $secure);
}
if ($parentTheme = $this->getParent()) {
return $parentTheme->url($url);
}
return asset($url, $secure);
}
}