multiplane/html/bootstrap.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>';
});
}