winter/modules/system/ServiceProvider.php
Samuel Georges c8d8d4e931 Introduce new Cms helper
This is modeled after the Backend helper. Primarily used to generate URLs for the frontend, these are piped through the CmsController action. It would also be a good place to add a hook, if necessary later.
2016-08-20 14:43:49 +10:00

477 lines
16 KiB
PHP

<?php namespace System;
use App;
use Lang;
use Event;
use Config;
use Backend;
use Request;
use Validator;
use BackendMenu;
use BackendAuth;
use Twig_Environment;
use Twig_Loader_String;
use System\Classes\ErrorHandler;
use System\Classes\MarkupManager;
use System\Classes\PluginManager;
use System\Classes\SettingsManager;
use System\Twig\Engine as TwigEngine;
use System\Twig\Loader as TwigLoader;
use System\Twig\Extension as TwigExtension;
use System\Models\EventLog;
use System\Models\MailSetting;
use System\Models\MailTemplate;
use System\Classes\CombineAssets;
use Backend\Classes\WidgetManager;
use October\Rain\Support\ModuleServiceProvider;
use October\Rain\Router\Helper as RouterHelper;
class ServiceProvider extends ModuleServiceProvider
{
/**
* Register the service provider.
*
* @return void
*/
public function register()
{
parent::register('system');
$this->registerSingletons();
$this->registerPrivilegedActions();
/*
* Register all plugins
*/
PluginManager::instance()->registerAll();
$this->registerConsole();
$this->registerErrorHandler();
$this->registerLogging();
$this->registerTwigParser();
$this->registerMailer();
$this->registerMarkupTags();
$this->registerAssetBundles();
$this->registerValidator();
/*
* Register other module providers
*/
foreach (Config::get('cms.loadModules', []) as $module) {
if (strtolower(trim($module)) != 'system') {
App::register('\\' . $module . '\ServiceProvider');
}
}
/*
* Backend specific
*/
if (App::runningInBackend()) {
$this->registerBackendNavigation();
$this->registerBackendReportWidgets();
$this->registerBackendPermissions();
$this->registerBackendSettings();
}
}
/**
* Bootstrap the module events.
*
* @return void
*/
public function boot()
{
/*
* Boot plugins
*/
$pluginManager = PluginManager::instance()->bootAll();
parent::boot('system');
}
/**
* Register singletons
*/
protected function registerSingletons()
{
App::singleton('cms.helper', function () {
return new \Cms\Helpers\Cms;
});
App::singleton('backend.helper', function () {
return new \Backend\Helpers\Backend;
});
App::singleton('backend.menu', function () {
return \Backend\Classes\NavigationManager::instance();
});
App::singleton('backend.auth', function () {
return \Backend\Classes\AuthManager::instance();
});
}
/**
* Check for CLI or system/updates route and disable any plugin initialization
*/
protected function registerPrivilegedActions()
{
$requests = ['/combine', '@/system/updates', '@/system/install', '@/backend/auth'];
$commands = ['october:up', 'october:update'];
/*
* Requests
*/
$path = RouterHelper::normalizeUrl(Request::path());
$backendUri = RouterHelper::normalizeUrl(Config::get('cms.backendUri', 'backend'));
foreach ($requests as $request) {
if (substr($request, 0, 1) == '@') {
$request = $backendUri . substr($request, 1);
}
if (stripos($path, $request) === 0) {
PluginManager::$noInit = true;
}
}
/*
* CLI
*/
if (App::runningInConsole() && count(array_intersect($commands, Request::server('argv'))) > 0) {
PluginManager::$noInit = true;
}
}
/*
* Register markup tags
*/
protected function registerMarkupTags()
{
MarkupManager::instance()->registerCallback(function ($manager) {
$manager->registerFunctions([
// Functions
'input' => 'input',
'post' => 'post',
'get' => 'get',
'link_to' => 'link_to',
'link_to_asset' => 'link_to_asset',
'link_to_route' => 'link_to_route',
'link_to_action' => 'link_to_action',
'asset' => 'asset',
'action' => 'action',
'url' => 'url',
'route' => 'route',
'secure_url' => 'secure_url',
'secure_asset' => 'secure_asset',
// Classes
'str_*' => ['Str', '*'],
'url_*' => ['Url', '*'],
'html_*' => ['Html', '*'],
'form_*' => ['Form', '*'],
'form_macro' => ['Form', '__call']
]);
$manager->registerFilters([
// Classes
'slug' => ['Str', 'slug'],
'plural' => ['Str', 'plural'],
'singular' => ['Str', 'singular'],
'finish' => ['Str', 'finish'],
'snake' => ['Str', 'snake'],
'camel' => ['Str', 'camel'],
'studly' => ['Str', 'studly'],
'trans' => ['Lang', 'get'],
'transchoice' => ['Lang', 'choice'],
'md' => ['Markdown', 'parse'],
'time_since' => ['System\Helpers\DateTime', 'timeSince'],
'time_tense' => ['System\Helpers\DateTime', 'timeTense'],
]);
});
}
/**
* Register command line specifics
*/
protected function registerConsole()
{
/*
* Allow plugins to use the scheduler
*/
Event::listen('console.schedule', function($schedule) {
$plugins = PluginManager::instance()->getPlugins();
foreach ($plugins as $plugin) {
if (method_exists($plugin, 'registerSchedule')) {
$plugin->registerSchedule($schedule);
}
}
});
/*
* Add CMS based cache clearing to native command
*/
Event::listen('cache:cleared', function() {
\System\Helpers\Cache::clearInternal();
});
/*
* Register console commands
*/
$this->registerConsoleCommand('october.up', 'System\Console\OctoberUp');
$this->registerConsoleCommand('october.down', 'System\Console\OctoberDown');
$this->registerConsoleCommand('october.update', 'System\Console\OctoberUpdate');
$this->registerConsoleCommand('october.util', 'System\Console\OctoberUtil');
$this->registerConsoleCommand('october.mirror', 'System\Console\OctoberMirror');
$this->registerConsoleCommand('october.fresh', 'System\Console\OctoberFresh');
$this->registerConsoleCommand('october.env', 'System\Console\OctoberEnv');
$this->registerConsoleCommand('october.install', 'System\Console\OctoberInstall');
$this->registerConsoleCommand('plugin.install', 'System\Console\PluginInstall');
$this->registerConsoleCommand('plugin.remove', 'System\Console\PluginRemove');
$this->registerConsoleCommand('plugin.refresh', 'System\Console\PluginRefresh');
$this->registerConsoleCommand('theme.install', 'System\Console\ThemeInstall');
$this->registerConsoleCommand('theme.remove', 'System\Console\ThemeRemove');
$this->registerConsoleCommand('theme.list', 'System\Console\ThemeList');
$this->registerConsoleCommand('theme.use', 'System\Console\ThemeUse');
}
/*
* Error handling for uncaught Exceptions
*/
protected function registerErrorHandler()
{
Event::listen('exception.beforeRender', function ($exception, $httpCode, $request){
$handler = new ErrorHandler;
return $handler->handleException($exception);
});
}
/*
* Write all log events to the database
*/
protected function registerLogging()
{
Event::listen('illuminate.log', function ($level, $message, $context) {
if (EventLog::useLogging()) {
EventLog::add($message, $level);
}
});
}
/*
* Register text twig parser
*/
protected function registerTwigParser()
{
/*
* Register system Twig environment
*/
App::singleton('twig.environment', function ($app) {
$twig = new Twig_Environment(new TwigLoader, ['auto_reload' => true]);
$twig->addExtension(new TwigExtension);
return $twig;
});
/*
* Register .htm extension for Twig views
*/
App::make('view')->addExtension('htm', 'twig', function () {
return new TwigEngine(App::make('twig.environment'));
});
}
/**
* Register mail templating and settings override.
*/
protected function registerMailer()
{
/*
* Override system mailer with mail settings
*/
Event::listen('mailer.beforeRegister', function () {
if (MailSetting::isConfigured()) {
MailSetting::applyConfigValues();
}
});
/*
* Override standard Mailer content with template
*/
Event::listen('mailer.beforeAddContent', function ($mailer, $message, $view, $data) {
MailTemplate::addContentToMailer($message, $view, $data);
return false;
});
}
/*
* Register navigation
*/
protected function registerBackendNavigation()
{
BackendMenu::registerCallback(function ($manager) {
$manager->registerMenuItems('October.System', [
'system' => [
'label' => 'system::lang.settings.menu_label',
'icon' => 'icon-cog',
'iconSvg' => 'modules/system/assets/images/cog-icon.svg',
'url' => Backend::url('system/settings'),
'permissions' => [],
'order' => 1000
]
]);
});
/*
* Register the sidebar for the System main menu
*/
BackendMenu::registerContextSidenavPartial(
'October.System',
'system',
'~/modules/system/partials/_system_sidebar.htm'
);
}
/*
* Register report widgets
*/
protected function registerBackendReportWidgets()
{
WidgetManager::instance()->registerReportWidgets(function ($manager) {
$manager->registerReportWidget('System\ReportWidgets\Status', [
'label' => 'backend::lang.dashboard.status.widget_title_default',
'context' => 'dashboard'
]);
});
}
/*
* Register permissions
*/
protected function registerBackendPermissions()
{
BackendAuth::registerCallback(function ($manager) {
$manager->registerPermissions('October.System', [
'system.manage_updates' => [
'label' => 'system::lang.permissions.manage_software_updates',
'tab' => 'system::lang.permissions.name'
],
'system.access_logs' => [
'label' => 'system::lang.permissions.access_logs',
'tab' => 'system::lang.permissions.name'
],
'system.manage_mail_settings' => [
'label' => 'system::lang.permissions.manage_mail_settings',
'tab' => 'system::lang.permissions.name'
],
'system.manage_mail_templates' => [
'label' => 'system::lang.permissions.manage_mail_templates',
'tab' => 'system::lang.permissions.name'
]
]);
});
}
/*
* Register settings
*/
protected function registerBackendSettings()
{
SettingsManager::instance()->registerCallback(function ($manager) {
$manager->registerSettingItems('October.System', [
'updates' => [
'label' => 'system::lang.updates.menu_label',
'description' => 'system::lang.updates.menu_description',
'category' => SettingsManager::CATEGORY_SYSTEM,
'icon' => 'icon-cloud-download',
'url' => Backend::url('system/updates'),
'permissions' => ['system.manage_updates'],
'order' => 300
],
'administrators' => [
'label' => 'backend::lang.user.menu_label',
'description' => 'backend::lang.user.menu_description',
'category' => SettingsManager::CATEGORY_SYSTEM,
'icon' => 'icon-users',
'url' => Backend::url('backend/users'),
'permissions' => ['backend.manage_users'],
'order' => 400
],
'mail_settings' => [
'label' => 'system::lang.mail.menu_label',
'description' => 'system::lang.mail.menu_description',
'category' => SettingsManager::CATEGORY_MAIL,
'icon' => 'icon-envelope',
'class' => 'System\Models\MailSetting',
'permissions' => ['system.manage_mail_settings'],
'order' => 600
],
'mail_templates' => [
'label' => 'system::lang.mail_templates.menu_label',
'description' => 'system::lang.mail_templates.menu_description',
'category' => SettingsManager::CATEGORY_MAIL,
'icon' => 'icon-envelope-square',
'url' => Backend::url('system/mailtemplates'),
'permissions' => ['system.manage_mail_templates'],
'order' => 610
],
'event_logs' => [
'label' => 'system::lang.event_log.menu_label',
'description' => 'system::lang.event_log.menu_description',
'category' => SettingsManager::CATEGORY_LOGS,
'icon' => 'icon-exclamation-triangle',
'url' => Backend::url('system/eventlogs'),
'permissions' => ['system.access_logs'],
'order' => 900,
'keywords' => 'error exception'
],
'request_logs' => [
'label' => 'system::lang.request_log.menu_label',
'description' => 'system::lang.request_log.menu_description',
'category' => SettingsManager::CATEGORY_LOGS,
'icon' => 'icon-file-o',
'url' => Backend::url('system/requestlogs'),
'permissions' => ['system.access_logs'],
'order' => 910,
'keywords' => '404 error'
]
]);
});
}
/**
* Register asset bundles
*/
protected function registerAssetBundles()
{
/*
* Register asset bundles
*/
CombineAssets::registerCallback(function($combiner) {
$combiner->registerBundle('~/modules/system/assets/less/styles.less');
$combiner->registerBundle('~/modules/system/assets/ui/storm.less');
$combiner->registerBundle('~/modules/system/assets/ui/storm.js');
});
}
/**
* Extends the validator with custom rules
*/
protected function registerValidator()
{
/*
* Allowed file extensions, as opposed to mime types.
* - extensions: png,jpg,txt
*/
Validator::extend('extensions', function($attribute, $value, $parameters) {
$extension = strtolower($value->getClientOriginalExtension());
return in_array($extension, $parameters);
});
Validator::replacer('extensions', function($message, $attribute, $rule, $parameters) {
return strtr($message, [':values' => implode(', ', $parameters)]);
});
}
}