190 lines
6.5 KiB
PHP
190 lines
6.5 KiB
PHP
<?php
|
|
/**
|
|
* Main starter repository for Multiplane with a custom folder structure to use
|
|
* Cockpit CMS v1 as a library.
|
|
*
|
|
* Multiplane is a small PHP front end for the headless Cockpit CMS v1.
|
|
*
|
|
* @author Raffael Jesche
|
|
* @license MIT
|
|
* @version 1.0.0
|
|
*
|
|
* @see https://codeberg.org/multiplane/multiplane
|
|
* @see https://codeberg.org/multiplane/cockpit-cms-Multiplane
|
|
* @see https://github.com/agentejo/cockpit/
|
|
*/
|
|
|
|
/**
|
|
* check for custom defines
|
|
*/
|
|
if (\file_exists(__DIR__.'/../defines.php')) {
|
|
include(__DIR__.'/../defines.php');
|
|
}
|
|
|
|
if (!defined('COCKPIT_CLI')) {
|
|
define('COCKPIT_CLI', PHP_SAPI == 'cli');
|
|
}
|
|
|
|
/**
|
|
* relative path to (public) include dir
|
|
*/
|
|
if (!defined('MP_INC_DIR')) {
|
|
define('MP_INC_DIR', '/mp-inc');
|
|
}
|
|
|
|
/**
|
|
* relative path to cockpit
|
|
*/
|
|
if (!defined('CPMP_COCKPIT_PATH')) {
|
|
define('CPMP_COCKPIT_PATH', MP_INC_DIR . '/cockpit');
|
|
}
|
|
|
|
/**
|
|
* route to load cockpit admin ui (without leading slash)
|
|
* `/*` binds to frontend, `/cockpit/*` binds to admin ui
|
|
*/
|
|
if (!defined('MP_ADMIN_ROUTE')) {
|
|
define('MP_ADMIN_ROUTE', 'cockpit');
|
|
}
|
|
|
|
/**
|
|
* Autoload vendor libs
|
|
*/
|
|
include(__DIR__.'/../lib/vendor/autoload.php');
|
|
|
|
/**
|
|
* load .env file from parent folder if it exists
|
|
*/
|
|
if (!class_exists('DotEnv')) {
|
|
include(__DIR__ . CPMP_COCKPIT_PATH . '/lib/DotEnv.php');
|
|
}
|
|
DotEnv::load(dirname(__DIR__));
|
|
|
|
/**
|
|
* SYSTEM DEFINES, Collect needed paths
|
|
*/
|
|
$DIR = str_replace(DIRECTORY_SEPARATOR, '/', realpath(__DIR__));
|
|
$BASE_URL = dirname(parse_url($_SERVER['SCRIPT_NAME'], PHP_URL_PATH));
|
|
$MP_DOCS_ROOT = str_replace(DIRECTORY_SEPARATOR, '/', isset($_SERVER['DOCUMENT_ROOT']) ? realpath($_SERVER['DOCUMENT_ROOT']) : dirname(__DIR__));
|
|
|
|
# make sure that $_SERVER['DOCUMENT_ROOT'] is set correctly
|
|
if (strpos($DIR, $MP_DOCS_ROOT)!==0 && isset($_SERVER['SCRIPT_NAME'])) {
|
|
$MP_DOCS_ROOT = str_replace(dirname(str_replace(DIRECTORY_SEPARATOR, '/', $_SERVER['SCRIPT_NAME'])), '', $DIR);
|
|
}
|
|
|
|
// TODO: Debug until MP_ENV_ROOT is not needed anymore
|
|
if (!defined('MP_ENV_ROOT')) define('MP_ENV_ROOT' , $DIR.MP_INC_DIR);
|
|
|
|
if (!defined('MP_DIR')) define('MP_DIR' , $DIR);
|
|
if (!defined('COCKPIT_DIR')) define('COCKPIT_DIR' , $DIR.CPMP_COCKPIT_PATH);
|
|
if (!defined('MP_DOCS_ROOT')) define('MP_DOCS_ROOT' , $MP_DOCS_ROOT);
|
|
if (!defined('MP_DOCS_ROOT')) define('MP_DOCS_ROOT' , MP_DOCS_ROOT);
|
|
if (!defined('MP_BASE_URL')) define('MP_BASE_URL' , $BASE_URL === '/' ? '' : $BASE_URL);
|
|
if (!defined('COCKPIT_BASE_URL')) define('COCKPIT_BASE_URL' , MP_BASE_URL.'/'.MP_ADMIN_ROUTE);
|
|
if (!defined('COCKPIT_BASE_ROUTE')) define('COCKPIT_BASE_ROUTE' , MP_BASE_URL.'/'.MP_ADMIN_ROUTE);
|
|
|
|
// detect custom addons dir
|
|
if (!defined('COCKPIT_ENV_ROOT')) define('COCKPIT_ENV_ROOT' , $DIR.MP_INC_DIR);
|
|
|
|
// for thumbnails and for browsing from project root in Finder
|
|
if (!defined('COCKPIT_SITE_DIR')) define('COCKPIT_SITE_DIR' , dirname($DIR));
|
|
|
|
// use custom config, storage and public storage folders
|
|
if (!defined('COCKPIT_STORAGE_FOLDER')) define('COCKPIT_STORAGE_FOLDER' , dirname($DIR).'/storage');
|
|
if (!defined('COCKPIT_CONFIG_DIR')) define('COCKPIT_CONFIG_DIR' , dirname($DIR).'/config');
|
|
if (!defined('COCKPIT_PUBLIC_STORAGE_FOLDER')) define('COCKPIT_PUBLIC_STORAGE_FOLDER' , $DIR.MP_INC_DIR.'/pstorage');
|
|
|
|
// admin route
|
|
if (!COCKPIT_CLI && !defined('MP_COCKPIT_ADMIN_ROUTE')) {
|
|
$route = preg_replace('#'.preg_quote(MP_BASE_URL, '#').'#', '', parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH), 1);
|
|
define('MP_COCKPIT_ADMIN_ROUTE', $route == '' ? '/' : $route);
|
|
}
|
|
|
|
define('COCKPIT_ADMIN', COCKPIT_CLI ? 0 : strpos(MP_COCKPIT_ADMIN_ROUTE, '/'.MP_ADMIN_ROUTE) === 0);
|
|
|
|
if (!defined('COCKPIT_API_REQUEST')) {
|
|
define('COCKPIT_API_REQUEST', COCKPIT_ADMIN && strpos($_SERVER['REQUEST_URI'], COCKPIT_BASE_URL.'/api/') !== false ? 1 : 0);
|
|
}
|
|
|
|
/**
|
|
* bootstrap cockpit
|
|
*/
|
|
require(COCKPIT_DIR.'/bootstrap.php');
|
|
|
|
/**
|
|
* fix compatibility with uncommon COCKPIT_ENV_ROOT and COCKPIT_SITE_DIR
|
|
*/
|
|
$cockpit->path('site', $DIR.'/html');
|
|
|
|
/**
|
|
* fix broken assets paths for App.base() and App.route(),
|
|
* fix `site://<route>` replacements in content preview urls
|
|
*/
|
|
if (COCKPIT_ADMIN) {
|
|
|
|
$cockpit->set('base_url', MP_BASE_URL.CPMP_COCKPIT_PATH);
|
|
|
|
}
|
|
if (COCKPIT_ADMIN && !COCKPIT_API_REQUEST) {
|
|
|
|
/**
|
|
* Modified \Cockpit\Controller\Media to fix settings/edit page and
|
|
* Finder root when COCKPIT_DIR doesn't match COCKPIT_ENV_ROOT
|
|
*/
|
|
if ((COCKPIT_DIR !== COCKPIT_ENV_ROOT)
|
|
&& (COCKPIT_SITE_DIR !== COCKPIT_ENV_ROOT)) {
|
|
$cockpit->bindClass('CockpitModifiedMediaController', 'media');
|
|
}
|
|
|
|
/**
|
|
* Alternative to custom styles in `#config:cockpit/style.css`
|
|
*/
|
|
$cockpit->on('admin.init', function() {
|
|
if ($this->path('#pstorage:cockpit/style.css')) {
|
|
$this->helper('admin')->addAssets(['#pstorage:cockpit/style.css']);
|
|
}
|
|
});
|
|
|
|
/**
|
|
* Alternative to custom tags in `#config:tags/<custom-component.tag>`
|
|
*/
|
|
$cockpit->on('app.layout.footer', function() {
|
|
$version = $this['debug'] ? time() : $this['cockpit/version'];
|
|
foreach ($this->helper('fs')->ls('*.tag', '#pstorage:tags') as $component) {
|
|
$src = $this->pathToUrl('#pstorage:tags/'.$component->getBasename());
|
|
echo '<script type="riot/tag" src="'.$src.'?nc='.$version.'"></script>';
|
|
}
|
|
});
|
|
|
|
$cockpit->on('app.layout.header', function() {
|
|
|
|
$env_url = $this->pathToUrl(MP_ENV_ROOT);
|
|
$SITE_URL = $this->getSiteUrl(true) . '/' . MP_BASE_URL.MP_ADMIN_ROUTE;
|
|
|
|
$customBases = [
|
|
'/addons', // `/mp-inc/addons`
|
|
// '/config', // `/mp-inc/config` --> not available in this setup
|
|
];
|
|
$baseRegexPartial = implode('|', array_map(function($v) {return preg_quote($v, '/');}, $customBases));
|
|
|
|
echo '<!-- fixes for uncommen path usage when using cockpit as a library -->
|
|
<script>
|
|
SITE_URL = "' . $SITE_URL . '";
|
|
App.env_url = "'. $env_url .'";
|
|
App.base = function(url) {
|
|
return url.match(/^('.$baseRegexPartial.')/) ? this.env_url+url : this.base_url+url;
|
|
};
|
|
App.route = function(url) {
|
|
if (url.match(/^\/assets(?!manager)/)) {
|
|
return this.base_route+"'. CPMP_COCKPIT_PATH .'"+url;
|
|
}
|
|
if (url.match(/^('.$baseRegexPartial.')/)) {
|
|
return this.env_url+url;
|
|
}
|
|
return this.base_route+url;
|
|
};
|
|
</script>';
|
|
});
|
|
|
|
}
|