Author SHA1 Message Date
Michal Kváček e8065c99c7 FEATURE: refactorize settings 2017-08-02 10:27:58 +02:00
Michal Kváček e5d9ce682d FEATURE #1865: add logging for uploaded file 2017-08-01 23:33:01 +02:00
Michal Kváček 7a38f357dc FEATURE #2045: generate thumbnails in queue 2017-08-01 23:00:44 +02:00
Michal Kváček 8c15a63c2a FEATURE #1753: add commands for enablind/disabling modules 2017-08-01 22:58:59 +02:00
Michal Kváček c2502a2355 FIX: fix invalid pingpong parent classes in few controllers 2017-08-01 19:56:01 +02:00
Michal Kváček 2d60010f9e FEATURE: use even more route model binding 2017-08-01 19:51:12 +02:00
Michal Kváček 3275e5aeed FEATURE: use more route model binding 2017-08-01 19:10:55 +02:00
Michal Kváček a7e91ef499 FEATURE #2472: fix few minor bugs in template management 2017-07-31 18:26:26 +02:00
Michal Kváček 638f6ef134 FEATURE #2472: update to laravel 5.4 - not stable at allg a -A 2017-07-31 16:10:23 +02:00
Michal Kváček e9e9f0976c FEATURE #1753: remove pingpong menus and install nwidart laravel-menus 2017-07-31 15:46:24 +02:00
Michal Kváček 5707750f5b FEATURE #1753: change parent class of module service providers 2017-07-31 15:35:40 +02:00
Michal Kváček 72c64dc6d1 FEATURE #1753: remove pingpong/modules and use custom solution 2017-07-31 15:32:33 +02:00
Michal Kváček f876a08429 REFACTORING: move creating directories into repository 2017-07-30 16:06:28 +02:00
Michal Kváček f48c0cfac3 FIX: fix setting same height 2017-04-24 00:26:28 +02:00
121 changed files with 2155 additions and 2628 deletions
@@ -1,7 +1,7 @@
<?php <?php
namespace App\CMS\Handlers\Registrators; namespace App\CMS\Handlers\Registrators;
use App\CMS\Enumerations\Exceptions\EnumerationExistsException; use App\CMS\Exceptions\Enumerations\EnumerationExistsException;
use App\CMS\Handlers\Contracts\SearchHandler; use App\CMS\Handlers\Contracts\SearchHandler;
use App\CMS\Handlers\Contracts\SearchPresenterHandler; use App\CMS\Handlers\Contracts\SearchPresenterHandler;
use App\CMS\Handlers\Registrators\Items\SearchEngine; use App\CMS\Handlers\Registrators\Items\SearchEngine;
+1 -8
View File
@@ -22,16 +22,9 @@ class CurrentTemplate implements TemplateHandler
{ {
if (!self::$initialized) { if (!self::$initialized) {
self::$template = Cache::rememberForever('current-template', function () { self::$template = Cache::rememberForever('current-template', function () {
$template = Module::where('is_template', true) return Module::where('is_template', true)
->where('enabled', true) ->where('enabled', true)
->first(); ->first();
// todo remove after adding $casts into Module model
if ($template) {
$template->module_settings = json_decode($template->module_settings);
}
return $template;
}); });
+2 -2
View File
@@ -2,6 +2,7 @@
namespace App\CMS\Helpers; namespace App\CMS\Helpers;
use App\CMS\Repositories\Settings\Settings as SettingsRepository;
use App\Models\Settings as SettingsModel; use App\Models\Settings as SettingsModel;
use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Cache;
@@ -78,8 +79,7 @@ class Settings
{ {
if (!self::$initialized) { if (!self::$initialized) {
self::$settings = Cache::remember('settings', config('cache.settingCacheLifetime'), function () { self::$settings = Cache::remember('settings', config('cache.settingCacheLifetime'), function () {
$model = new SettingsModel(); app(SettingsRepository::class)->getAll();
return $model->getAll();
}); });
} }
} }
+4 -2
View File
@@ -27,12 +27,12 @@ class WidgetAreas
protected static function loadWidgetArea($uniqueCode) protected static function loadWidgetArea($uniqueCode)
{ {
dd($uniqueCode);
WidgetArea::where('code', $uniqueCode) WidgetArea::where('code', $uniqueCode)
->increment('viewed'); ->increment('viewed');
$widgets = Cache::remember('widget-area-' . $uniqueCode, setting('widgetCacheLifetime', 5), function () use ($uniqueCode) { $widgets = Cache::remember('widget-area-' . $uniqueCode, setting('widgetCacheLifetime', 5), function () use ($uniqueCode) {
$widgetArea = new WidgetArea(); $widgetArea = app(\App\CMS\Repositories\Widgets\WidgetArea::class);
return $widgetArea->getWidgets($uniqueCode) return $widgetArea->getWidgets($uniqueCode)
->get(); ->get();
}); });
@@ -69,6 +69,8 @@ class WidgetAreas
self::initWidgetAreas(); self::initWidgetAreas();
} }
// dd($uniqueCode);
if (!isset(self::$widgetAreas[$uniqueCode])) { if (!isset(self::$widgetAreas[$uniqueCode])) {
self::loadWidgetArea($uniqueCode); self::loadWidgetArea($uniqueCode);
} }
@@ -31,22 +31,13 @@ class CreateDirectory implements Interaction
{ {
$data['parentDirectory'] = isset($data['parentDirectory']) ? $data['parentDirectory'] : null; $data['parentDirectory'] = isset($data['parentDirectory']) ? $data['parentDirectory'] : null;
// todo this should probably go into validation, but we are not able to get $data in getValidationRules
// check if created folder does not exist in current directory // check if created folder does not exist in current directory
if ($this->repository->checkIfNameExists($data['name'], $data['parentDirectory'])) { if ($this->repository->checkIfNameExists($data['name'], $data['parentDirectory'])) {
throw new SubdirectoryExistsInDirectory(); throw new SubdirectoryExistsInDirectory();
} }
// todo use Directory::create() and rename columns/fields in request
// create new database entry // create new database entry
$directory = new Directory(); return $this->repository->create($data);
$directory->name = $data['name'];
$directory->parent_id = $data['parentDirectory'];
$directory->user_id = \Auth::user()->id;
$directory->description = $data['description'];
$directory->save();
return $directory;
} }
/** /**
@@ -1,8 +1,9 @@
<?php <?php
namespace App\CMS\MenuPresenters; namespace App\CMS\MenuPresenters;
use Pingpong\Menus\MenuItem; use Nwidart\Menus\MenuItem;
use Pingpong\Menus\Presenters\Presenter; use Nwidart\Menus\Presenters\Presenter;
class FoundationDrilldownMenuPresenter extends Presenter class FoundationDrilldownMenuPresenter extends Presenter
{ {
@@ -1,7 +1,8 @@
<?php <?php
namespace App\CMS\MenuPresenters; namespace App\CMS\MenuPresenters;
use Pingpong\Menus\Presenters\Presenter; use Nwidart\Menus\Presenters\Presenter;
class FoundationDropdownMenuPresenter extends Presenter class FoundationDropdownMenuPresenter extends Presenter
{ {
@@ -27,7 +28,7 @@ class FoundationDropdownMenuPresenter extends Presenter
public function getMenuWithoutDropdownWrapper($item) public function getMenuWithoutDropdownWrapper($item)
{ {
$link = '<a href="' . $item->getUrl() . '">' . $item->getIcon() . ' ' . $item->title . '</a>'; $link = '<a href="' . $item->getUrl() . '">' . $item->getIcon() . ' ' . $item->title . '</a>';
return '<li' . $this->getActiveState($item) . '>' . $link . '</li>'.PHP_EOL; return '<li' . $this->getActiveState($item) . '>' . $link . '</li>' . PHP_EOL;
} }
/** /**
@@ -43,7 +44,7 @@ class FoundationDropdownMenuPresenter extends Presenter
*/ */
public function getDividerWrapper() public function getDividerWrapper()
{ {
return '<li class="divider"></li>'.PHP_EOL; return '<li class="divider"></li>' . PHP_EOL;
} }
/** /**
@@ -1,8 +1,8 @@
<?php <?php
namespace App\CMS\MenuPresenters; namespace App\CMS\MenuPresenters;
use Pingpong\Menus\MenuItem; use Nwidart\Menus\MenuItem;
use Pingpong\Menus\Presenters\Presenter; use Nwidart\Menus\Presenters\Presenter;
class MetismenuPresenter extends Presenter class MetismenuPresenter extends Presenter
{ {
@@ -1,8 +1,9 @@
<?php <?php
namespace App\CMS\MenuPresenters; namespace App\CMS\MenuPresenters;
use Pingpong\Menus\MenuItem; use Nwidart\Menus\MenuItem;
use Pingpong\Menus\Presenters\Presenter; use Nwidart\Menus\Presenters\Presenter;
class ProfileMenuPresenter extends Presenter class ProfileMenuPresenter extends Presenter
{ {
@@ -1,13 +1,13 @@
<?php <?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider; namespace App\CMS\Modules\ServiceProviders;
abstract class ModuleServiceProvider extends ServiceProvider use Illuminate\Support\ServiceProvider as LaravelServiceProvider;
abstract class ServiceProvider extends LaravelServiceProvider
{ {
/** /**
* Indicates if loading of the provider is deferred. * Indicates if loading of the provider is deferred.
*
* @var bool * @var bool
*/ */
protected $defer = false; protected $defer = false;
@@ -20,7 +20,6 @@ abstract class ModuleServiceProvider extends ServiceProvider
/** /**
* Boot the application events. * Boot the application events.
*
* @return void * @return void
*/ */
public function boot() public function boot()
@@ -35,7 +34,6 @@ abstract class ModuleServiceProvider extends ServiceProvider
/** /**
* Register config. * Register config.
*
* @return void * @return void
*/ */
protected function registerConfig() protected function registerConfig()
@@ -50,7 +48,6 @@ abstract class ModuleServiceProvider extends ServiceProvider
/** /**
* Register views. * Register views.
*
* @return void * @return void
*/ */
protected function registerViews() protected function registerViews()
@@ -69,7 +66,6 @@ abstract class ModuleServiceProvider extends ServiceProvider
/** /**
* Register translations. * Register translations.
*
* @return void * @return void
*/ */
protected function registerTranslations() protected function registerTranslations()
+12
View File
@@ -0,0 +1,12 @@
<?php
return [
'name' => '$Module$',
'translatedName' => '$module$::$module$.name',
'translatedDescription' => '$module$::$module$.description',
'alias' => 'categories',
'handler' => \Modules\$Module$\Handlers\$Module$Handler::class,
'providers' => [\Modules\$Module$\Providers\$Module$ServiceProvider::class],
'files' => ['Http/routes.php'],
'order' => 0,
];
@@ -0,0 +1,8 @@
<?php
namespace Modules\$ModuleNamespace$\Entities;
use Illuminate\Database\Eloquent\Model;
class $Entity$ extends Model {
// ...
}
@@ -0,0 +1,40 @@
<?php
namespace Modules\$ModuleNamespace$\Handlers;
use App\CMS\Contracts\Content\ContentTitles;
use App\Models\Content\Content;
class $Module$ContentHandler extends $Module$Handler implements ContentTitles
{
/**
* Get translated title for pages overview of given type.
* This value is used for rendering list of all content pages of given type in administration.
* @return string
*/
public static function getOverviewTitle()
{
// TODO: Implement getOverviewTitle() method.
}
/**
* Title displayed above for for creating new content page
* @return string
*/
public static function getCreateNewTitle()
{
// TODO: Implement getCreateNewTitle() method.
}
/**
* Title for form displayed for editin content page
*
* @param Content $content
*
* @return mixed
*/
public static function getEditTitle(Content $content)
{
// TODO: Implement getEditTitle() method.
}
}
@@ -0,0 +1,38 @@
<?php
namespace Modules\$ModuleNamespace$\Handlers;
use App\CMS\Handlers\Handler;
use App\Models\User;
class $Module$Handler extends Handler
{
/**
* Register admin menu
*
* @param User $user
*/
public static function registerAdminMenu(User $user)
{
// register links in admin menu
$menu = \Menu::instance('mainMenu');
$menu->dropdown(trans('$module$::$module$.name'), function ($submenu) use ($user) {
$submenu->route('$module$.overview', trans('$module$::$module$.overview'), [], 20, ['icon' => 'fa fa-fw fa-list']);
$submenu->route('$module$.new', trans('$module$::$module$.new'), [], 21, ['icon' => 'fa fa-fw fa-plus']);
}, 15, ['icon' => 'fa fa-fw']);
// TODO: add admin menu entries
}
/**
* Does this module support categories?
* @return boolean
*/
public static function supportCategories()
{
return true;
}
}
@@ -0,0 +1,103 @@
<?php
namespace Modules\$ModuleNamespace$\Http\Controllers\Admin;
use App\Http\Controllers\Admin\Controller;
use Modules\$ModuleNamespace$\Http\Requests\Update$Entity$;
use Modules\$ModuleNamespace$\Http\Requests\Create$Entity$;
use Modules\$ModuleNamespace$\Repositories\$Module$Repository;
use $EntityNamespace$\$Entity$ as $Entity$Entity;
class $Module$ extends Controller
{
/**
* @var $Module$Repository
*/
private $$module$Repository;
public function __construct($Module$Repository $$module$Repository)
{
$this->$module$Repository = $$module$Repository;
}
/**
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/
public function index()
{
$items = $Entity$Entity::all();
return view('$module$::admin/index', compact('items'));
}
/**
* Display form for updating entity
*
* @param $Entity$Entity $entity
*
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/
public function edit($Entity$Entity $entity)
{
return view('$module$::admin/update', compact('entity'));
}
/**
* Update existing entity
*
* @param Update$Entity$ $request
* @param $Entity$Entity $item
*
* @return \Illuminate\Http\RedirectResponse
*/
public function update(Update$Entity$ $request, $Entity$Entity $entity)
{
// ...
$this->$module$Repository->update($entity, $request->all());
return redirect()
->back()
->with('success', trans('$module$.$module.successfullyUpdated'));
}
/**
* Display form for creating new entity
*
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/
public function create() {
$entity = new $Entity$Entity();
return view('$module$::admin/create', compact('entity'));
}
/**
* Create new instance of entity
*/
public function store(Create$Entity$ $request) {
// ...
$this->$module$Repository->create($request->all());
return redirect()
->back()
->with('success', trans('$module$.$module.successfullyUpdated'));
}
/**
* Delete entity
*
* @param $Entity$ $entity
*
* @return \Illuminate\Http\RedirectResponse
*/
public function destroy($Entity$ $entity) {
$entity->delete();
return redirect()
->back()
->with('success', trans('$module$.$module.successfullyDeleted'));
}
}
@@ -0,0 +1,11 @@
<?php
namespace Modules\$ModuleNamespace$\Http\Requests;
use App\Http\Requests\Request;
class Create$Entity$ extends Request {
public function rules()
{
return parent::rules();
}
}
@@ -0,0 +1,11 @@
<?php
namespace Modules\$ModuleNamespace$\Http\Requests;
use App\Http\Requests\Request;
class Update$Entity$ extends Request {
public function rules()
{
return parent::rules();
}
}
+25
View File
@@ -0,0 +1,25 @@
<?php
\Route::group([
'prefix' => \LaravelLocalization::setLocale() . '/admin/$module$',
'middleware' => ['admin'],
'namespace' => 'Modules\$Module$\Http\Controllers\Admin'
], function () {
Route::get('/', '$Module$@index')
->name('$module$.overview');
Route::get('/new', '$Module$@create')
->name('$module$.new');
Route::post('/new', '$Module$@store')
->name('$module$.postNew');
Route::get('/edit/{id}', '$Module$@edit')
->name('$module$.edit');
Route::post('/edit/{id}', '$Module$@update')
->name('$module$.postEdit');
Route::get('/delete/{id}', '$Module$@delete')
->name('$module$.delete');
});
@@ -0,0 +1,31 @@
<?php
namespace Modules\$Module$\Providers;
use App\CMS\Contracts\Modules\ServiceProvider;
/**
* Class $Module$ServiceProvider
*
* Service provider for module $Module$
*
* @package Modules\$Module$\Providers
*/
class $Module$ServiceProvider extends ServiceProvider
{
/**
* Set module Alias
*/
protected function setModuleAlias()
{
$this->alias = strtolower('$module$');
}
/**
* Set path to module
*/
protected function setModulePath()
{
$this->path = __DIR__;
}
}
@@ -0,0 +1,24 @@
<?php
namespace Modules\$ModuleNamespace$\Repositories;
use $EntityNamespace$\$Entity$ as $Entity$Entity;
class $Module$Repository {
/**
* Create new instance of entity
*
* @param $data
*/
public function create($data) {
$Entity$Entity::create($data);
}
/**
* Update entity
*
* @param $Entity$Entity $entity
*/
public function update($Entity$Entity $entity, $data) {
$entity->update($data);
}
}
@@ -0,0 +1,13 @@
<?php
return [
'name' => '$Module$',
'new' => 'Vytvořit nový',
'description' => '',
'successfullyUpdated' => 'Úspěšně upraveno.',
'successfullyCreated' => 'Úspěšně vytvořeno.',
'successfullyDeleted' => 'Úspěšně smazáno.',
'overview' => 'Přehled',
'noItems' => 'Žádná data.',
'save' => 'Uložit'
];
@@ -0,0 +1,7 @@
@extends('admin.layoutWithNavigation')
@section('pageHeading', @trans('$module$::$module$.name'))
@section('content')
@include('$module$::admin/form', ['action' => route('$module$.new')])
@endsection
@@ -0,0 +1,7 @@
@extends('admin.layoutWithNavigation')
@section('pageHeading', @trans('$module$::$module$.name'))
@section('content')
@include('$module$::admin/form', ['action' => route('$module$.update')])
@endsection
@@ -0,0 +1,6 @@
<form action="{{$action}}" method="post">
{{--...--}}
<input type="submit" class="btn btn-primary" value="@lang('$module$::$module$.save')">
</form>
@@ -0,0 +1,17 @@
@extends('admin.layoutWithNavigation')
@section('pageHeading', @trans('$module$::$module$.overview'))
@section('content')
@if (!empty($items))
<table>
@foreach($items as $item)
@endforeach
</table>
@else
<div class="alert alert-info">
<em>@trans('$module$::$module$.noItems')</em>
</div>
@endif
@endsection
@@ -1,4 +1,5 @@
<?php <?php
namespace App\CMS\Pipeline\SavePipeline\Process; namespace App\CMS\Pipeline\SavePipeline\Process;
use App\CMS\Contracts\Content\SavePipeline\Process; use App\CMS\Contracts\Content\SavePipeline\Process;
@@ -19,6 +20,10 @@ class UploadRelatedFiles implements Process
*/ */
function handle(Content & $page, array & $input) function handle(Content & $page, array & $input)
{ {
if (!isset($input['files'])) {
return;
}
$files = $input['files']; $files = $input['files'];
$assignedFiles = isset($input['keepAssigned']) ? $input['keepAssigned'] : []; $assignedFiles = isset($input['keepAssigned']) ? $input['keepAssigned'] : [];
+28 -1
View File
@@ -1,4 +1,5 @@
<?php <?php
namespace App\CMS\Repositories\FileManager; namespace App\CMS\Repositories\FileManager;
use App\CMS\Helpers\RootDirectory; use App\CMS\Helpers\RootDirectory;
@@ -25,7 +26,33 @@ class Directory
return $exists->exists(); return $exists->exists();
} }
public function update(DirectoryModel $directory, $data) { /**
* Create new directory
*
* @param $data
*
* @return DirectoryModel
*/
public function create($data)
{
$directory = new DirectoryModel();
$directory->name = $data['name'];
$directory->parent_id = $data['parentDirectory'];
$directory->user_id = \Auth::user()->id;
$directory->description = $data['description'];
$directory->save();
return $directory;
}
/**
* Update given directory
*
* @param DirectoryModel $directory
* @param $data
*/
public function update(DirectoryModel $directory, $data)
{
$directory->name = $data['name']; $directory->name = $data['name'];
$directory->description = $data['description']; $directory->description = $data['description'];
$directory->save(); $directory->save();
+16
View File
@@ -0,0 +1,16 @@
<?php
namespace App\CMS\Repositories\FileManager;
use App\Models\FileManager\File as FileModel;
class File {
/**
* Update given instance of File
*
* @param FileModel $file
* @param $data
*/
public function update(FileModel $file, $data) {
$file->update($data);
}
}
@@ -1,27 +1,26 @@
<?php <?php
namespace App\Models\ModelTraits;
namespace App\CMS\Repositories\Settings;
use App\Models\Settings as SettingsModel; use App\Models\Settings as SettingsModel;
use Mcamara\LaravelLocalization\Facades\LaravelLocalization; use Mcamara\LaravelLocalization\Facades\LaravelLocalization;
trait Settings class Settings
{ {
/** /**
* Prepares common query for selecting settings * Prepares common query for selecting settings
*
* @return mixed * @return mixed
*/ */
protected function getSettingsQuery() protected function getSettingsQuery()
{ {
return SettingsModel::select(['key', 'value', 'language']) return SettingsModel::select(['key', 'value', 'language'])
->where('language', LaravelLocalization::getCurrentLocale()) ->where('language', LaravelLocalization::getCurrentLocale())
->orWhere('language', null) ->orWhere('language', null)
->orderBy('language', 'ASC'); ->orderBy('language', 'ASC');
} }
/** /**
* Load all settings * Load all settings
*
* @return \stdClass * @return \stdClass
*/ */
public function getAll() public function getAll()
@@ -34,7 +33,6 @@ trait Settings
/** /**
* Get all settings with language info * Get all settings with language info
*
* @return \stdClass * @return \stdClass
*/ */
public function getAllWithLanguage() public function getAllWithLanguage()
@@ -55,7 +53,6 @@ trait Settings
/** /**
* Load only config for views * Load only config for views
*
* @return \stdClass * @return \stdClass
*/ */
public function getForView() public function getForView()
@@ -83,4 +80,29 @@ trait Settings
return $data; return $data;
} }
/**
* Save settings
*
* @param array $data
*/
public function save(array $data)
{
$commonSettings = isset($data['commonSettings']) ? $data['commonSettings'] : [];
unset($data['commonSettings']);
foreach ($data as $key => $value) {
// select language for this setting key
$language = isset($commonSettings[$key]) ? null : LaravelLocalization::getCurrentLocale();
$setting = SettingsModel::firstOrNew(['language' => $language, 'key' => $key]);
if ($setting->value == $value) {
continue;
}
// set value and save or delete
$setting->value = $value;
empty($value) ? $setting->delete() : $setting->save();
}
}
} }
+65
View File
@@ -0,0 +1,65 @@
<?php
namespace App\CMS\Repositories\Users;
use App\CMS\Repositories\Repository;
use App\Models\User as UserModel;
use Illuminate\Support\Facades\Hash;
class User extends Repository {
/**
* Update given user
*
* @param UserModel $user
* @param $data
*/
public function update(UserModel $user, $data) {
// update username if set
if (isset($data['username'])) {
$user->username = $data['username'];
}
// change name (if set)
if (isset($data['name'])) {
$user->name = $data['name'];
}
if (isset($data['role'])) {
$user->role = $data['role'];
}
if (isset($data['status'])) {
$user->status = $data['status'];
}
if (isset($data['password'])) {
$user->password = Hash::make($data['password']);
}
$user->email = $data['email'];
$user->save();
}
/**
* Create new user
*
* @param $data
*
* @return UserModel
*/
public function create($data)
{
// create new user
$user = new UserModel();
$user->name = $data['name'];
$user->email = $data['email'];
$user->username = $data['username'];
$user->role = $data['role'];
$user->password = Hash::make($data['password']);
// store user into database
$user->save();
return $user;
}
}
+116
View File
@@ -0,0 +1,116 @@
<?php
namespace App\Console\Commands\Modules;
use Illuminate\Console\Command;
use Illuminate\Support\Str;
class CreateNew extends Command
{
/**
* The name and signature of the console command.
* @var string
*/
protected $signature = 'module:new
{name : module name}
{parentModule? : name of parent module}
{--entity= : entity}';
/**
* The console command description.
* @var string
*/
protected $description = 'Create new CMS module.';
protected $moduleName;
protected $moduleNamespace;
protected $entity;
protected $entityNamespace;
/**
* Execute the console command.
*/
public function handle()
{
$defaultEntityNamespace = $this->loadArguments();
$path = preg_replace('|/{2,}|i', '/', config('modules.paths.modules') . '/' . $this->moduleNamespace);
if (is_dir($path)) {
$this->error('Module already exists in ' . $path);
return;
}
// copy stub files
\File::copyDirectory(config('modules.paths.stubs'), $path);
$files = \File::allFiles($path);
foreach ($files as $file) {
$newName = str_replace('stub', 'php', $this->replacePlaceholders($file->getPathname()));
// ignore new entity when using existing entity
if ($this->entityNamespace != $defaultEntityNamespace && Str::contains('Entities', $file)) {
\File::delete($file);
continue;
}
// rename file
\File::move($file, $newName);
// change its content
$content = file_get_contents($newName);
$content = $this->replacePlaceholders($content);
file_put_contents($newName, $content);
}
$this->info('Module successfully created.');
}
/**
* Find and replace all placeholders in given content
*
* @param $content
*
* @return mixed
*/
private function replacePlaceholders($content)
{
$replace = [
'$Module$' => $this->moduleName,
'$ModuleNamespace$' => str_replace('/', '\\', $this->moduleNamespace),
'$module$' => strtolower($this->moduleName),
'$EntityNamespace$' => $this->entityNamespace,
'$Entity$' => $this->entity
];
foreach ($replace as $what => $for) {
$content = str_replace($what, $for, $content);
}
return $content;
}
/**
* Load command arguments
* @return string
*/
private function loadArguments()
{
$parent = $this->argument('parentModule');
$this->moduleName = $moduleName = $this->argument('name');
$this->moduleNamespace = trim($parent . '/' . $moduleName, '/');
$entity = $this->option('entity');
$defaultEntityNamespace = '\\Modules\\' . str_replace('/', '\\', $this->moduleNamespace) . '\Entities\\';
if (!empty($entity)) {
$parts = explode('\\', $entity);
$this->entity = $parts[count($parts) - 1];
unset($parts[count($parts) - 1]);
$this->entityNamespace = implode('\\', $parts);
} else {
$this->entityNamespace = $defaultEntityNamespace;
$this->entity = $this->moduleName;
}
return $defaultEntityNamespace;
}
}
@@ -0,0 +1,44 @@
<?php
namespace App\Console\Commands\Modules;
use App\Models\Module;
use Illuminate\Console\Command;
class DisableModule extends Command
{
/**
* The name and signature of the console command.
* @var string
*/
protected $signature = 'module:disable {module}';
/**
* The console command description.
* @var string
*/
protected $description = 'Disable module';
/**
* Execute the console command.
* @return mixed
*/
public function handle()
{
$moduleName = $this->argument('module');
$module = Module::where('static_name', $moduleName)
->firstOrFail();
if ($module->has_submodules) {
$submodules = $module->submodules;
foreach ($submodules as $submodule) {
$this->call('module:disable', ['module' => $submodule->static_name]);
}
}
$module->enabled = false;
$module->save();
$this->line('Module ' . $module->static_name . ' disabled.');
}
}
@@ -0,0 +1,48 @@
<?php
namespace App\Console\Commands\Modules;
use App\Models\Module;
use Illuminate\Console\Command;
class EnableModule extends Command
{
/**
* The name and signature of the console command.
* @var string
*/
protected $signature = 'module:enable {module}';
/**
* The console command description.
* @var string
*/
protected $description = 'Enable module';
/**
* Execute the console command.
* @return mixed
*/
public function handle()
{
$moduleName = $this->argument('module');
$module = Module::where('static_name', $moduleName)
->firstOrFail();
if ($module->has_submodules) {
$submodules = $module->submodules;
foreach ($submodules as $submodule) {
$this->call('module:enable', ['module' => $submodule->static_name]);
}
}
if ($module->parent_id) {
$module->parent->update(['enabled' => true]);
}
$module->enabled = true;
$module->save();
$this->line('Module ' . $module->static_name . ' enabled.');
}
}
@@ -1,6 +1,6 @@
<?php <?php
namespace App\Console\Commands; namespace App\Console\Commands\Modules;
use Illuminate\Console\Command; use Illuminate\Console\Command;
use Illuminate\Support\Facades\File; use Illuminate\Support\Facades\File;
@@ -12,7 +12,7 @@ class InstallAllModules extends Command
* *
* @var string * @var string
*/ */
protected $signature = 'install-all-modules'; protected $signature = 'module:install-all';
/** /**
* The console command description. * The console command description.
* *
@@ -20,16 +20,6 @@ class InstallAllModules extends Command
*/ */
protected $description = 'Crawl /modules directory and install all modules'; protected $description = 'Crawl /modules directory and install all modules';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/** /**
* Execute the console command. * Execute the console command.
* *
@@ -45,7 +35,7 @@ class InstallAllModules extends Command
// try to install each module // try to install each module
try { try {
$this->call('install-module', ['name' => $moduleName]); $this->call('module:install', ['name' => $moduleName]);
} catch (\Exception $e) { } catch (\Exception $e) {
$this->line('Module ' . $moduleName . ' already installed.'); $this->line('Module ' . $moduleName . ' already installed.');
} }
@@ -1,8 +1,9 @@
<?php <?php
namespace App\Console\Commands; namespace App\Console\Commands\Modules;
use App\Models\Module; use App\Models\Module;
use App\ModuleManager\Installer;
use Illuminate\Console\Command; use Illuminate\Console\Command;
use Illuminate\Contracts\Filesystem\FileNotFoundException; use Illuminate\Contracts\Filesystem\FileNotFoundException;
use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Cache;
@@ -17,7 +18,7 @@ class InstallModule extends Command
* *
* @var string * @var string
*/ */
protected $signature = 'install-module {name} {parentModuleId?}'; protected $signature = 'module:install {name} {parentModuleId?}';
/** /**
* The console command description. * The console command description.
* *
@@ -154,14 +155,12 @@ class InstallModule extends Command
if (is_null($module)) { if (is_null($module)) {
// insert module into database // insert module into database
$settings = [ $settings = [
'staticName' => $this->moduleName,
'providers' => $providers, 'providers' => $providers,
'aliases' => isset($config['aliases']) ? $config['aliases'] : [],
'order' => isset($config['order']) ? $config['order'] : 0, 'order' => isset($config['order']) ? $config['order'] : 0,
'files' => isset($config['files']) ? $config['files'] : [] 'files' => isset($config['files']) ? $config['files'] : []
]; ];
$module = Module::install($name, $alias, $description, $handler, $this->parentModuleId, $settings); $module = Installer::install($name, $alias, $this->moduleName, $description, $handler, $this->parentModuleId, $settings);
} }
// try to install submodules // try to install submodules
@@ -184,7 +183,7 @@ class InstallModule extends Command
$submodule = str_replace($this->modulesPath . DIRECTORY_SEPARATOR, '', $submodulePath); $submodule = str_replace($this->modulesPath . DIRECTORY_SEPARATOR, '', $submodulePath);
try { try {
$this->call('install-module', ['name' => $submodule, 'parentModuleId' => $parentModule->id]); $this->call('module:install', ['name' => $submodule, 'parentModuleId' => $parentModule->id]);
} catch (\Exception $e) { } catch (\Exception $e) {
$this->error($e->getMessage()); $this->error($e->getMessage());
} }
@@ -0,0 +1,42 @@
<?php
namespace App\Console\Commands\Modules;
use App\Models\Module;
use Illuminate\Console\Command;
class ModuleMigrate extends Command
{
/**
* The name and signature of the console command.
* @var string
*/
protected $signature = 'module:migrate {module}';
/**
* The console command description.
* @var string
*/
protected $description = 'Run migrations in specified module';
/**
* Execute the console command.
* @return mixed
*/
public function handle()
{
$moduleName = $this->argument('module');
$module = Module::where('static_name', $moduleName)
->firstOrFail();
if ($module->has_submodules) {
$submodules = $module->submodules;
foreach ($submodules as $submodule) {
$this->call('module:migrate', ['module' => $submodule->static_name]);
}
}
$this->line('Migrating ' . $module->static_name);
$this->call('migrate', ['--path' => config('modules.paths.modules').'/'.$moduleName.'/Database']);
}
}
+9 -6
View File
@@ -3,6 +3,8 @@
namespace App\Console\Commands; namespace App\Console\Commands;
use App\Models\Module; use App\Models\Module;
use App\ModuleManager\Installer;
use App\ModuleManager\Uninstaller;
use Illuminate\Console\Command; use Illuminate\Console\Command;
use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Cache;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
@@ -43,14 +45,13 @@ class SetTemplate extends Command
$config['staticName'] = $template; $config['staticName'] = $template;
if ($current) { if ($current) {
$info = json_decode($current->module_settings); $this->line('Template is already installed. Currently using template ' . trans($current->name) . ' located in /templates/' . $current->static_name . '.');
$this->line('Template is already installed. Currently using template ' . trans($current->name) . ' located in /templates/' . $info->staticName . '.');
$confirm = $this->confirm('Uninstall it and install *' . trans($config['name']) . '*? All data associated with installed template will be lost!'); $confirm = $this->confirm('Uninstall it and install *' . trans($config['name']) . '*? All data associated with installed template will be lost!');
if ($confirm) { if ($confirm) {
$this->line('Uninstalling ' . $current->name . '.'); $this->line('Uninstalling ' . $current->name . '.');
$current->uninstall();
Uninstaller::uninstall($current);
} else { } else {
$this->line('Aborting installation.'); $this->line('Aborting installation.');
return; return;
@@ -58,7 +59,7 @@ class SetTemplate extends Command
} }
try { try {
Module::install($config['name'], $config['alias'], $config['description'], $config['handler'], false, $config); Installer::install($config['name'], $config['alias'], $current->static_name, $config['description'], $config['handler'], false, $config);
} catch (\Exception $e) { } catch (\Exception $e) {
$this->error('Cannot install template ' . $template . '. Message: ' . $e->getMessage()); $this->error('Cannot install template ' . $template . '. Message: ' . $e->getMessage());
return; return;
@@ -72,6 +73,8 @@ class SetTemplate extends Command
// run again artisan for publishing resources // run again artisan for publishing resources
// it cannot be done using $this->call, because we need to load different template into service providers // it cannot be done using $this->call, because we need to load different template into service providers
exec('php artisan vendor:publish'); if ($publish) {
exec('php artisan vendor:publish');
}
} }
} }
+42
View File
@@ -0,0 +1,42 @@
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
class UninstallModule extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'command:name';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Command description';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
//
}
}
+10 -5
View File
@@ -2,6 +2,10 @@
namespace App\Console; namespace App\Console;
use App\Console\Commands\Modules\CreateNew;
use App\Console\Commands\Modules\DisableModule;
use App\Console\Commands\Modules\EnableModule;
use App\Console\Commands\Modules\ModuleMigrate;
use App\Console\Commands\PublishTemplateResources; use App\Console\Commands\PublishTemplateResources;
use App\Console\Commands\TemplateInfo; use App\Console\Commands\TemplateInfo;
use Illuminate\Console\Scheduling\Schedule; use Illuminate\Console\Scheduling\Schedule;
@@ -11,14 +15,17 @@ class Kernel extends ConsoleKernel
{ {
/** /**
* The Artisan commands provided by your application. * The Artisan commands provided by your application.
*
* @var array * @var array
*/ */
protected $commands = [ protected $commands = [
Commands\NewUser::class, Commands\NewUser::class,
Commands\ChangePassword::class, Commands\ChangePassword::class,
Commands\InstallModule::class, CreateNew::class,
Commands\InstallAllModules::class, ModuleMigrate::class,
EnableModule::class,
DisableModule::class,
Commands\Modules\InstallModule::class,
Commands\Modules\InstallAllModules::class,
Commands\TranslateDirectory::class, Commands\TranslateDirectory::class,
Commands\TranslateAll::class, Commands\TranslateAll::class,
Commands\InitDatabaseSchema::class, Commands\InitDatabaseSchema::class,
@@ -37,7 +44,5 @@ class Kernel extends ConsoleKernel
*/ */
protected function schedule(Schedule $schedule) protected function schedule(Schedule $schedule)
{ {
// $schedule->command('inspire')
// ->hourly();
} }
} }
+9 -13
View File
@@ -2,37 +2,33 @@
namespace App\Events; namespace App\Events;
use App\Models\FileManager\File as FileModel;
use Illuminate\Queue\SerializesModels; use Illuminate\Queue\SerializesModels;
use Symfony\Component\HttpFoundation\File\File;
use Symfony\Component\HttpFoundation\File\UploadedFile;
class UploadFile extends Event class UploadFile extends Event
{ {
use SerializesModels; use SerializesModels;
/**
* @var UploadedFile
*/
public $uploadedFile; public $uploadedFile;
/** /**
* @var * @var FileModel
*/ */
public $id; public $file;
/** /**
* Create a new event instance. * Create a new event instance.
* *
* @param File $uploadedFile * @param FileModel $file
* @param $id * @param $id
*
* @internal param File $uploadedFile
*/ */
public function __construct(File $uploadedFile, $id) public function __construct(FileModel $file)
{ {
$this->uploadedFile = $uploadedFile; $this->file = $file;
$this->id = $id;
} }
/** /**
* Get the channels the event should be broadcast on. * Get the channels the event should be broadcast on.
*
* @return array * @return array
*/ */
public function broadcastOn() public function broadcastOn()
@@ -7,6 +7,8 @@ use App\CMS\Interactions\Admin\Content\ChangeStatus;
use App\CMS\Interactions\Admin\Content\DeletePage; use App\CMS\Interactions\Admin\Content\DeletePage;
use App\CMS\Interactions\Admin\Content\SetHomepage; use App\CMS\Interactions\Admin\Content\SetHomepage;
use App\Http\Controllers\Admin\Controller; use App\Http\Controllers\Admin\Controller;
use App\Models\Content\Content;
use App\Models\Content\ContentHistory;
class ContentActions extends Controller class ContentActions extends Controller
{ {
@@ -25,15 +27,13 @@ class ContentActions extends Controller
* This method is called in static page overview from quick actions. It checks if status is valid, if page exists * This method is called in static page overview from quick actions. It checks if status is valid, if page exists
* and updates status. * and updates status.
* *
* @param $id * @param Content $page
* @param $status * @param $status
* *
* @return \Illuminate\Http\RedirectResponse * @return \Illuminate\Http\RedirectResponse
*/ */
public function changeStatus($id, $status) public function changeStatus(Content $page, $status)
{ {
$page = $this->content->getOne($id);
Interaction::handle(ChangeStatus::class, ['status' => $status], $page); Interaction::handle(ChangeStatus::class, ['status' => $status], $page);
// redirect back to overview with info for user // redirect back to overview with info for user
@@ -45,14 +45,12 @@ class ContentActions extends Controller
/** /**
* Delete page * Delete page
* *
* @param $id * @param Content $page
* *
* @return \Illuminate\Http\RedirectResponse * @return \Illuminate\Http\RedirectResponse
*/ */
public function delete($id) public function delete(Content $page)
{ {
$page = $this->content->getOne($id);
Interaction::handle(DeletePage::class, [], $page); Interaction::handle(DeletePage::class, [], $page);
// redirect back to overview with info for user // redirect back to overview with info for user
@@ -66,14 +64,12 @@ class ContentActions extends Controller
/** /**
* Sets page as homepage * Sets page as homepage
* *
* @param $id * @param Content $page
* *
* @return \Illuminate\Http\RedirectResponse * @return \Illuminate\Http\RedirectResponse
*/ */
public function setHomepage($id) public function setHomepage(Content $page)
{ {
$page = $this->content->getOne($id);
Interaction::handle(SetHomepage::class, [], $page); Interaction::handle(SetHomepage::class, [], $page);
// redirect back to overview with info for user // redirect back to overview with info for user
@@ -5,6 +5,7 @@ use App\CMS\Contracts\Repositories\Content as IContent;
use App\CMS\Contracts\Repositories\Module as IModule; use App\CMS\Contracts\Repositories\Module as IModule;
use App\CMS\Enumerations\ContentStatuses; use App\CMS\Enumerations\ContentStatuses;
use App\Http\Controllers\Admin\Controller; use App\Http\Controllers\Admin\Controller;
use App\Models\Module;
class ContentOverview extends Controller class ContentOverview extends Controller
{ {
@@ -26,19 +27,19 @@ class ContentOverview extends Controller
/** /**
* Overview for all content pages. * Overview for all content pages.
* *
* @param null|int $moduleId * @param Module|null $module
* @param null $status * @param null $status
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
* @internal param int|null $moduleId
*/ */
public function index($moduleId = null, $status = null) public function index(Module $module = null, $status = null)
{ {
// get module settings // get module settings
$module = $this->module->getOne($moduleId);
$pageHeading = $this->module->getOverviewTitle($module); $pageHeading = $this->module->getOverviewTitle($module);
// get pages for overview // get pages for overview
$handler = $module !== null ? $module->handler : null; $handler = $module->exists ? $module->handler : null;
$pages = $this->content->getOverview($handler, [$status]) $pages = $this->content->getOverview($handler, [$status])
->paginate(setting('paginatedResults', 20)); ->paginate(setting('paginatedResults', 20));
@@ -10,6 +10,7 @@ use App\Cms\Interactions\Admin\Content\NewContent;
use App\Http\Controllers\Admin\Controller; use App\Http\Controllers\Admin\Controller;
use App\Http\Requests\CreateNewContentRequest; use App\Http\Requests\CreateNewContentRequest;
use App\Http\Requests\Request; use App\Http\Requests\Request;
use App\Models\Module;
use Modules\Categories\Contracts\Repositories\Category as ICategory; use Modules\Categories\Contracts\Repositories\Category as ICategory;
/** /**
@@ -67,9 +68,8 @@ class CreateNewContent extends Controller
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/ */
public function create($module) public function create(Module $module)
{ {
$module = $this->module->getOne($module);
$statuses = ContentStatuses::getWithTranslations(); $statuses = ContentStatuses::getWithTranslations();
$pageHeading = $this->module->getCreateContentTitle($module); $pageHeading = $this->module->getCreateContentTitle($module);
$templates = $this->template->getForModule($module); $templates = $this->template->getForModule($module);
@@ -95,15 +95,14 @@ class CreateNewContent extends Controller
/** /**
* Save new content page * Save new content page
* *
* @param CreateNewContentRequest $request * @param CreateNewContentRequest|Request $request
* @param $moduleId * @param Module $module
* *
* @return \Illuminate\Http\RedirectResponse * @return \Illuminate\Http\RedirectResponse
* @internal param $moduleId
*/ */
public function store(Request $request, $moduleId) public function store(Request $request, Module $module)
{ {
$module = $this->module->getOne($moduleId);
// create new page // create new page
Interaction::handle(NewContent::class, $request->all(), $module->handler); Interaction::handle(NewContent::class, $request->all(), $module->handler);
@@ -17,6 +17,7 @@ use App\Models\Content\ContentHistory;
use App\Models\FileManager\File; use App\Models\FileManager\File;
use Illuminate\Support\Facades\Event; use Illuminate\Support\Facades\Event;
use Modules\Categories\Contracts\Repositories\Category as ICategory; use Modules\Categories\Contracts\Repositories\Category as ICategory;
use Modules\Categories\Repositories\Category;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
class EditContent extends Controller class EditContent extends Controller
@@ -58,7 +59,7 @@ class EditContent extends Controller
* @param ICategory $category * @param ICategory $category
* @param ITemplate $template * @param ITemplate $template
*/ */
public function __construct(ContentHistory $history, File $file, IContent $content, IModuleRepository $module, ICategory $category, ITemplate $template) public function __construct(ContentHistory $history, File $file, IContent $content, IModuleRepository $module, Category $category, ITemplate $template)
{ {
$this->history = $history; $this->history = $history;
$this->file = $file; $this->file = $file;
@@ -71,14 +72,13 @@ class EditContent extends Controller
/** /**
* Display form for editing static page * Display form for editing static page
* *
* @param $id * @param Content $page
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/ */
public function edit($id) public function edit(Content $page)
{ {
$statuses = ContentStatuses::getWithTranslations(); $statuses = ContentStatuses::getWithTranslations();
$page = $this->content->getOne($id);
// get module ID // get module ID
$module = $this->module->getByHandler($page->moduleHandler); $module = $this->module->getByHandler($page->moduleHandler);
@@ -105,29 +105,14 @@ class EditContent extends Controller
/** /**
* Edit static page and save changes into history. * Edit static page and save changes into history.
* *
* @param EditContentRequest $request * @param EditContentRequest|Request $request
* @param $id * @param Content $page
* *
* @return \Illuminate\Http\RedirectResponse * @return \Illuminate\Http\RedirectResponse
* @internal param $id
*/ */
public function update(Request $request, $id) public function update(Request $request, Content $page)
{ {
try {
/**
* @var $page Content
*/
$page = $this->content->getOne($id);
} catch (NotFoundHttpException $e) {
// log attempt of invalid edit
Event::fire(new AttemptToEditInvalidContent($id));
// page for editing not found
return redirect()
->route('content.overview')
->with('error', trans('admin/contents.invalidPage'));
}
// edit page // edit page
Interaction::handle(EditContentInteraction::class, $request->all(), $page); Interaction::handle(EditContentInteraction::class, $request->all(), $page);
+12 -11
View File
@@ -19,30 +19,31 @@ class History extends Controller
} }
/** /**
* @param $id * @param Content $page
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/ */
public function getOverview($id) public function getOverview(Content $page)
{ {
// test if given content id is static page and if exists $history = $this->history->getStructuredHistoryOf($page);
$content = Content::findOrFail($id);
$history = $this->history->getStructuredHistoryOf($content);
return view('admin/history.overview', [ return view('admin/history.overview', [
'history' => $history, 'history' => $history,
'page' => $content 'page' => $page
]); ]);
} }
public function getDiff($revision, $id) /**
* @param ContentHistory $revision
*
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/
public function getDiff(ContentHistory $revision)
{ {
$change = $this->history->findOrFail($id); $diff = $this->history->getDiff($revision);
$diff = $this->history->getDiff($change);
return view('admin/history.diff', [ return view('admin/history.diff', [
'change' => $change, 'change' => $revision,
'diff' => $diff 'diff' => $diff
]); ]);
} }
@@ -8,6 +8,7 @@ use App\CMS\Interactions\Admin\FileManager\CreateDirectory;
use App\CMS\Repositories\FileManager\Directory as DirectoryRepository; use App\CMS\Repositories\FileManager\Directory as DirectoryRepository;
use App\Http\Controllers\Admin\Controller; use App\Http\Controllers\Admin\Controller;
use App\Http\Requests; use App\Http\Requests;
use App\Models\FileManager\Directory;
use Illuminate\Http\Request; use Illuminate\Http\Request;
class CreateNewDirectory extends Controller class CreateNewDirectory extends Controller
@@ -30,9 +31,10 @@ class CreateNewDirectory extends Controller
/** /**
* Create new directory * Create new directory
* *
* @param Requests\CreateNewDirectoryRequest $request * @param Requests\CreateNewDirectoryRequest|Request $request
* *
* @return $this|\Illuminate\Http\JsonResponse|\Illuminate\Http\RedirectResponse * @return $this|\Illuminate\Http\JsonResponse|\Illuminate\Http\RedirectResponse
* @internal param Directory $parentDirectory
*/ */
public function store(Request $request) public function store(Request $request)
{ {
@@ -5,19 +5,20 @@ namespace App\Http\Controllers\Admin\FileManager;
use App\CMS\Repositories\FileManager\Directory as DirectoryRepository; use App\CMS\Repositories\FileManager\Directory as DirectoryRepository;
use App\Http\Controllers\Admin\Controller; use App\Http\Controllers\Admin\Controller;
use App\Http\Requests; use App\Http\Requests;
use App\Http\Requests\EditDirectoryRequest;
use App\Models\FileManager\Directory; use App\Models\FileManager\Directory;
class EditDirectory extends Controller class EditDirectory extends Controller
{ {
/** /**
* @param Requests\EditDirectoryRequest $request * @param EditDirectoryRequest $request
* @param Directory $directory * @param Directory $directory
* *
* @return $this|\Illuminate\Http\JsonResponse|\Illuminate\Http\RedirectResponse * @return $this|\Illuminate\Http\JsonResponse|\Illuminate\Http\RedirectResponse
* @internal param $directoryId * @internal param $directoryId
* *
*/ */
public function update(Requests\EditDirectoryRequest $request, Directory $directory) public function update(EditDirectoryRequest $request, Directory $directory)
{ {
$repository = app(DirectoryRepository::class); $repository = app(DirectoryRepository::class);
if ($repository->checkIfNameExists($request->name, $directory->parent_id, $directory->id)) { if ($repository->checkIfNameExists($request->name, $directory->parent_id, $directory->id)) {
@@ -4,6 +4,7 @@ namespace App\Http\Controllers\Admin\FileManager;
use App\CMS\Helpers\FileManager; use App\CMS\Helpers\FileManager;
use App\CMS\Helpers\RootDirectory; use App\CMS\Helpers\RootDirectory;
use App\CMS\Repositories\FileManager\File as FileRepository;
use App\Events\EditFile; use App\Events\EditFile;
use App\Http\Controllers\Admin\Controller; use App\Http\Controllers\Admin\Controller;
use App\Http\Requests\EditUploadedFileRequest; use App\Http\Requests\EditUploadedFileRequest;
@@ -14,14 +15,12 @@ class EditUploadedFile extends Controller
{ {
/** /**
* Edit form * Edit form
*
* Render edit form for displaying details and updating given file * Render edit form for displaying details and updating given file
* *
* @param File $file * @param File $file
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\Http\RedirectResponse|\Illuminate\View\View * @return \Illuminate\Contracts\View\Factory|\Illuminate\Http\RedirectResponse|\Illuminate\View\View
* @internal param int $id file id * @internal param int $id file id
*
*/ */
public function show(File $file) public function show(File $file)
{ {
@@ -35,7 +34,6 @@ class EditUploadedFile extends Controller
/** /**
* Updates file * Updates file
*
* User can change only keywords, original filename and description. Mime type, hash and other fields remain * User can change only keywords, original filename and description. Mime type, hash and other fields remain
* unchanged * unchanged
* *
@@ -44,16 +42,11 @@ class EditUploadedFile extends Controller
* *
* @return \Illuminate\Http\RedirectResponse * @return \Illuminate\Http\RedirectResponse
* @internal param $id * @internal param $id
*
*/ */
public function update(EditUploadedFileRequest $request, File $file) public function update(EditUploadedFileRequest $request, File $file)
{ {
// set values from form $repository = app(FileRepository::class);
$file->name = $request->name; $repository->update($file, $request->all());
$file->keywords = $request->keywords;
$file->description = $request->description;
$file->directory_id = $request->directory_id;
$file->save();
// fire action // fire action
Event::fire(new EditFile($file)); Event::fire(new EditFile($file));
@@ -47,7 +47,7 @@ class UploadFile extends Controller
*/ */
private function internalUpload(Request $request) private function internalUpload(Request $request)
{ {
try { // try {
$uploadedFiles = []; $uploadedFiles = [];
$files = $request->all()['files']; $files = $request->all()['files'];
@@ -62,9 +62,9 @@ class UploadFile extends Controller
return redirect() return redirect()
->back() ->back()
->with('success', trans_choice('admin/fileManager.uploadSuccessfull', $successfullUploads)); ->with('success', trans_choice('admin/fileManager.uploadSuccessfull', $successfullUploads));
} catch (FileException $e) { // } catch (FileException $e) {
return $this->invalidUpload('invalidFile'); // return $this->invalidUpload('invalidFile');
} // }
} }
/** /**
@@ -32,12 +32,12 @@ class UploadedFilesOverview extends Controller
*/ */
public function index(Directory $directory = null) public function index(Directory $directory = null)
{ {
// include hidden directories? // dd($directory);
$includeHidden = Input::get('hidden');
// include hidden directories?
$subdirectories = $this->directoryRepository->getAllSubdirectories($directory); $subdirectories = $this->directoryRepository->getAllSubdirectories($directory);
if (!$includeHidden) { if (!Input::get('hidden', true)) {
$subdirectories = $subdirectories->where('hidden', false); $subdirectories = $subdirectories->where('hidden', false);
} }
+4 -24
View File
@@ -2,15 +2,15 @@
namespace App\Http\Controllers\Admin; namespace App\Http\Controllers\Admin;
use App\CMS\Repositories\Settings\Settings as SettingsRepository;
use App\Http\Requests; use App\Http\Requests;
use App\Models\Settings as SettingsModel; use App\Models\Settings as SettingsModel;
use Illuminate\Support\Facades\App; use Illuminate\Support\Facades\App;
use Mcamara\LaravelLocalization\Facades\LaravelLocalization;
class Settings extends Controller class Settings extends Controller
{ {
/** /**
* @var SettingsModel * @var SettingsRepository
*/ */
protected $settings; protected $settings;
@@ -19,14 +19,13 @@ class Settings extends Controller
* *
* @param SettingsModel $settings * @param SettingsModel $settings
*/ */
public function __construct(SettingsModel $settings) public function __construct(SettingsRepository $settings)
{ {
$this->settings = $settings; $this->settings = $settings;
} }
/** /**
* Get overview (with form) for editing settings * Get overview (with form) for editing settings
*
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/ */
public function getOverview() public function getOverview()
@@ -45,7 +44,6 @@ class Settings extends Controller
/** /**
* Save all settings (ignore empty ones) * Save all settings (ignore empty ones)
*
* When settings used to be non-empty string and user deletes it, key is also deleted from database * When settings used to be non-empty string and user deletes it, key is also deleted from database
* *
* @param Requests\SaveSettingsRequest $request * @param Requests\SaveSettingsRequest $request
@@ -54,25 +52,7 @@ class Settings extends Controller
*/ */
public function saveSettings(Requests\SaveSettingsRequest $request) public function saveSettings(Requests\SaveSettingsRequest $request)
{ {
$data = $request->all(); $this->settings->save($request->except(['_token']));
$commonSettings = isset($data['commonSettings']) ? $data['commonSettings'] : [];
// remove CSRF token field
unset($data['_token'], $data['commonSettings']);
foreach ($data as $key => $value) {
// select language for this setting key
$language = isset($commonSettings[$key]) ? null : LaravelLocalization::getCurrentLocale();
$setting = SettingsModel::firstOrNew(['language' => $language, 'key' => $key]);
if ($setting->value == $value) {
continue;
}
// set value and save or delete
$setting->value = $value;
empty($value) ? $setting->delete() : $setting->save();
}
return redirect() return redirect()
->route('settings.overview') ->route('settings.overview')
@@ -2,6 +2,7 @@
namespace App\Http\Controllers\Admin\Templates; namespace App\Http\Controllers\Admin\Templates;
use App\Cms\Repositories\Templates\Template as TemplateRepository;
use App\Http\Controllers\Admin\Controller; use App\Http\Controllers\Admin\Controller;
use App\Http\Requests\CopyTemplateRequest; use App\Http\Requests\CopyTemplateRequest;
use App\Models\Templates\Template; use App\Models\Templates\Template;
@@ -10,7 +11,6 @@ class CopyTemplate extends Controller
{ {
/** /**
* Method for copying given template. * Method for copying given template.
*
* This method is supposed to be called by POST method. * This method is supposed to be called by POST method.
* *
* @param CopyTemplateRequest $request * @param CopyTemplateRequest $request
@@ -32,15 +32,22 @@ class CopyTemplate extends Controller
$namespace .= '::'; $namespace .= '::';
} }
$repository = app(TemplateRepository::class);
$repository->setModel($template);
// get template absolute paths // get template absolute paths
$realTemplatePath = $template->getPathToTemplate(); $realTemplatePath = $repository->getPathToTemplate();
$customTemplatePath = $template->getPathToTemplate(Template::CUSTOM_EDIT_DIRECTORY); $customTemplatePath = $repository->getPathToTemplate(TemplateRepository::CUSTOM_EDIT_DIRECTORY);
$path = dirname($customTemplatePath); $path = dirname($customTemplatePath);
// create file copy // create file copy
$data = file_get_contents($realTemplatePath); $data = file_get_contents($realTemplatePath);
$written = file_put_contents($path . DIRECTORY_SEPARATOR . $newName . Template::TEMPLATE_SUFFIX, $data);
if (!is_dir($path)) {
mkdir($path, 0777, true);
}
$written = file_put_contents($path . DIRECTORY_SEPARATOR . $newName . TemplateRepository::TEMPLATE_SUFFIX, $data);
// were data written? // were data written?
if ($written === false) { if ($written === false) {
return $this->copyFailed($request, $template); return $this->copyFailed($request, $template);
@@ -67,7 +74,6 @@ class CopyTemplate extends Controller
* @param Template $template * @param Template $template
* *
* @return \Illuminate\Http\JsonResponse|\Illuminate\Http\RedirectResponse * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\RedirectResponse
*
*/ */
private function copyFailed(CopyTemplateRequest $request, Template $template) private function copyFailed(CopyTemplateRequest $request, Template $template)
{ {
@@ -34,13 +34,8 @@ class EditTemplate extends Controller
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/ */
public function getEdit($template) public function getEdit(Template $template)
{ {
/**
* @var $template Template
*/
$template = Template::findOrFail($template);
$this->templateRepository->setModel($template); $this->templateRepository->setModel($template);
// load template content // load template content
@@ -59,15 +54,13 @@ class EditTemplate extends Controller
* Save meta information about template and edited content * Save meta information about template and edited content
* *
* @param EditTemplateRequest $request * @param EditTemplateRequest $request
* @param $templateId * @param Template $template
* *
* @return \Illuminate\Http\RedirectResponse * @return \Illuminate\Http\RedirectResponse
* @internal param $templateId
*/ */
public function postEdit(EditTemplateRequest $request, $templateId) public function postEdit(EditTemplateRequest $request, Template $template)
{ {
// find template
$template = Template::findOrFail($templateId);
// setup meta information // setup meta information
$template->name = $request->name; $template->name = $request->name;
@@ -7,16 +7,21 @@ use App\Models\Templates\TemplatePath;
class TemplateOverview extends Controller class TemplateOverview extends Controller
{ {
public function getPath($path) /**
* Display overview of all templates in given path
*
* @param TemplatePath $templatePath
*
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/
public function getPath(TemplatePath $templatePath)
{ {
$path = TemplatePath::findOrFail($path);
return view('admin.templates.list', [ return view('admin.templates.list', [
'directory' => $path, 'directory' => $templatePath,
'isWritable' => is_writable(base_path($path->path)), 'isWritable' => is_writable(base_path($templatePath->path)),
'templates' => $path->templates() 'templates' => $templatePath->templates()
->get(), ->get(),
'subdirectories' => $path->subdirectories() 'subdirectories' => $templatePath->subdirectories()
->get() ->get()
]); ]);
} }
@@ -3,6 +3,7 @@
namespace App\Http\Controllers\Admin\Users; namespace App\Http\Controllers\Admin\Users;
use App\CMS\Enumerations\UserRoles; use App\CMS\Enumerations\UserRoles;
use App\CMS\Repositories\Users\User as UserRepository;
use App\Events\CreateNewUser as CreateNewUserEvent; use App\Events\CreateNewUser as CreateNewUserEvent;
use App\Http\Controllers\Admin\Controller; use App\Http\Controllers\Admin\Controller;
use App\Http\Requests\CreateNewUserRequest; use App\Http\Requests\CreateNewUserRequest;
@@ -28,28 +29,21 @@ class CreateNewUser extends Controller
/** /**
* Create new user * Create new user
*
* This method saves new user into database * This method saves new user into database
* *
* @param CreateNewUserRequest $request * @param CreateNewUserRequest $request
* @param UserRepository $userRepository
* *
* @return \Illuminate\Http\RedirectResponse * @return \Illuminate\Http\RedirectResponse
*/ */
protected function postRegistration(CreateNewUserRequest $request) protected function postRegistration(CreateNewUserRequest $request, UserRepository $userRepository)
{ {
// when user did not provide any username, use his email // when user did not provide any username, use his email
$username = isset($request->username) && !empty($request->username) ? $request->username : $request->email; $username = isset($request->username) && !empty($request->username) ? $request->username : $request->email;
// create new user $data = $request->all();
$user = new User(); $data['username'] = $username;
$user->name = $request->name; $user = $userRepository->create($data);
$user->email = $request->email;
$user->username = $username;
$user->role = $request->role;
$user->password = Hash::make($request->password);
// store user into database
$user->save();
// fire event // fire event
Event::fire(new CreateNewUserEvent($user)); Event::fire(new CreateNewUserEvent($user));
+33 -37
View File
@@ -4,26 +4,45 @@ namespace App\Http\Controllers\Admin\Users;
use App\CMS\Enumerations\UserRoles; use App\CMS\Enumerations\UserRoles;
use App\CMS\Enumerations\UserStates; use App\CMS\Enumerations\UserStates;
use App\CMS\Repositories\Users\User as UserRepository;
use App\Events\EditUser as EditUserEvent; use App\Events\EditUser as EditUserEvent;
use App\Http\Controllers\Admin\Controller; use App\Http\Controllers\Admin\Controller;
use App\Http\Requests\EditUserRequest; use App\Http\Requests\EditUserRequest;
use App\Models\User; use App\Models\User;
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Event; use Illuminate\Support\Facades\Event;
use Illuminate\Support\Facades\Hash;
class EditUser extends Controller class EditUser extends Controller
{ {
public function getEditUser($id = null) /**
* @var UserRepository
*/
private $userRepository;
/**
* EditUser constructor.
*
* @param UserRepository $userRepository
*/
public function __construct(UserRepository $userRepository)
{
$this->userRepository = $userRepository;
}
/**
* Display form for editing user
*
* @param User|null $user
*
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/
public function getEditUser(User $user = null)
{ {
// when no user specified, lets assume we want to edit "me" // when no user specified, lets assume we want to edit "me"
if (!$id) { if (!$user->exists()) {
$id = Auth::user()->id; $user = Auth::user();
} }
// try to find given user
$user = User::findOrFail($id);
$states = UserStates::getWithTranslations(); $states = UserStates::getWithTranslations();
$roles = UserRoles::getWithTranslations(); $roles = UserRoles::getWithTranslations();
@@ -35,49 +54,26 @@ class EditUser extends Controller
} }
/** /**
* Edit user - store information
*
* @param EditUserRequest $request * @param EditUserRequest $request
* @param $id * @param User $user
* *
* @return \Illuminate\Http\RedirectResponse * @return \Illuminate\Http\RedirectResponse
* @internal param $id
*/ */
public function postEdit(EditUserRequest $request, $id) public function postEdit(EditUserRequest $request, User $user)
{ {
$loggedUser = Auth::user(); $loggedUser = Auth::user();
$user = User::findOrFail($id);
// non-admin user is trying to edit someone else // non-admin user is trying to edit someone else
if ($loggedUser->role != User::ROLE_ADMIN && $id != $loggedUser->id) { if ($loggedUser->role != User::ROLE_ADMIN && $user->id != $loggedUser->id) {
return redirect() return redirect()
->back() ->back()
->with('error', trans('auth.accessDenied')); ->with('error', trans('auth.accessDenied'));
} }
// update username if set $this->userRepository->update($user, $request->all());
if (isset($request->username)) {
$user->username = $request->username;
}
// change name (if set)
if (isset($request->name)) {
$user->name = $request->name;
}
if (isset($request->role)) {
$user->role = $request->role;
}
if (isset($request->status)) {
$user->status = $request->status;
}
if (isset($request->password)) {
$user->password = Hash::make($request->password);
}
$user->email = $request->email;
$user->save();
// fire event about editing user // fire event about editing user
Event::fire(new EditUserEvent($user)); Event::fire(new EditUserEvent($user));
@@ -22,18 +22,14 @@ class UserDetail extends Controller
$this->log = $log; $this->log = $log;
} }
public function getDetail($id = null) public function getDetail(User $user = null)
{ {
// when no user specified, lets assume we want to edit "me" // when no user specified, lets assume we want to edit "me"
if (!$id) { if (!$user->exists()) {
$id = Auth::user()->id; $id = Auth::user();
} }
// try to find given user $actions = $this->log->getUserActions($user->id, 10);
$user = User::findOrFail($id);
$actions = $this->log->getUserActions($id, 10);
$roles = UserRoles::getWithTranslations(); $roles = UserRoles::getWithTranslations();
$states = UserStates::getWithTranslations(); $states = UserStates::getWithTranslations();
@@ -3,6 +3,7 @@
namespace App\Http\Controllers\Admin\Widgets\Areas; namespace App\Http\Controllers\Admin\Widgets\Areas;
use App\CMS\Repositories\Widgets\WidgetArea as WidgetAreaRepository; use App\CMS\Repositories\Widgets\WidgetArea as WidgetAreaRepository;
use App\Events\DeleteWidgetArea;
use App\Http\Controllers\Admin\Controller; use App\Http\Controllers\Admin\Controller;
use App\Http\Requests\EditWidgetAreaRequest; use App\Http\Requests\EditWidgetAreaRequest;
use App\Models\Widgets\Widget; use App\Models\Widgets\Widget;
@@ -39,6 +40,7 @@ class EditWidgetArea extends Controller
*/ */
public function edit(WidgetArea $widgetArea) public function edit(WidgetArea $widgetArea)
{ {
return view("test");
$associatedWidgetIds = WidgetInWidgetArea::getWidgetIdsFromArea($widgetArea->id); $associatedWidgetIds = WidgetInWidgetArea::getWidgetIdsFromArea($widgetArea->id);
$widgets = Widget::where('language', LaravelLocalization::getCurrentLocale()) $widgets = Widget::where('language', LaravelLocalization::getCurrentLocale())
->paginate(25); ->paginate(25);
@@ -83,26 +85,14 @@ class EditWidgetArea extends Controller
} }
// delete area // delete area
$area->delete(); $widgetArea->delete();
// fire event with new widget area // fire event with new widget area
Event::fire(new \App\Events\DeleteWidgetArea($area)); Event::fire(new DeleteWidgetArea($widgetArea));
// redirect and inform user // redirect and inform user
return redirect() return redirect()
->route('widgetareas.overview') ->route('widgetareas.overview')
->with('success', trans('admin/widgetAreas.successfullyDeleted')); ->with('success', trans('admin/widgetAreas.successfullyDeleted'));
} }
/**
* Redirect user to overview with message about invalid widget area
*
* @return \Illuminate\Http\RedirectResponse
*/
private function invalidArea()
{
return redirect()
->route('widgetareas.overview')
->with('error', trans('admin/widgetAreas.invalidArea'));
}
} }
+1 -1
View File
@@ -23,7 +23,7 @@ class Controller extends BaseController
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/ */
public static function VisitorsView($template, $data = [], $mergeData = []) public static function visitorsView($template, $data = [], $mergeData = [])
{ {
$view = Template::name($template); $view = Template::name($template);
+1 -1
View File
@@ -65,7 +65,7 @@ class ContentPage extends Controller
$displayPipeline = app('displayPipeline'); $displayPipeline = app('displayPipeline');
$page = $displayPipeline->run($page); $page = $displayPipeline->run($page);
return Controller::VisitorsView($page->template, ['page' => $page]); return Controller::visitorsView($page->template, ['page' => $page]);
} }
} }
+2 -6
View File
@@ -18,9 +18,7 @@ class Kernel extends HttpKernel
{ {
/** /**
* The application's global HTTP middleware stack. * The application's global HTTP middleware stack.
*
* These middleware are run during every request to your application. * These middleware are run during every request to your application.
*
* @var array * @var array
*/ */
protected $middleware = [ protected $middleware = [
@@ -33,7 +31,6 @@ class Kernel extends HttpKernel
]; ];
/** /**
* The application's route middleware groups. * The application's route middleware groups.
*
* @var array * @var array
*/ */
protected $middlewareGroups = [ protected $middlewareGroups = [
@@ -53,9 +50,7 @@ class Kernel extends HttpKernel
]; ];
/** /**
* The application's route middleware. * The application's route middleware.
*
* These middleware may be assigned to groups or used individually. * These middleware may be assigned to groups or used individually.
*
* @var array * @var array
*/ */
protected $routeMiddleware = [ protected $routeMiddleware = [
@@ -66,6 +61,7 @@ class Kernel extends HttpKernel
'throttle' => ThrottleRequests::class, 'throttle' => ThrottleRequests::class,
'localize' => LaravelLocalizationRoutes::class, 'localize' => LaravelLocalizationRoutes::class,
'localizationRedirect' => LaravelLocalizationRedirectFilter::class, 'localizationRedirect' => LaravelLocalizationRedirectFilter::class,
'localeSessionRedirect' => LocaleSessionRedirect::class 'localeSessionRedirect' => LocaleSessionRedirect::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
]; ];
} }
+2 -2
View File
@@ -11,7 +11,7 @@ Route::pattern('url', '[0-9\-a-z]+');
/*******************************************************************************/ /*******************************************************************************/
Route::group(['prefix' => LaravelLocalization::setLocale()], function () { Route::group(['prefix' => LaravelLocalization::setLocale(), 'middleware' => ['bindings']], function () {
/** /**
* This route group serves to handle request in admin * This route group serves to handle request in admin
*/ */
@@ -65,7 +65,7 @@ Route::group(['prefix' => LaravelLocalization::setLocale()], function () {
->name('login'); ->name('login');
// route for sitemap // route for sitemap
Route::get('sitemap.xml', 'Sitemap@getMap') Route::get('sitemap.xml', 'Visitor\Sitemap@getMap')
->name('sitemap'); ->name('sitemap');
// route for all content pages. This rule must be specified last (because it matches every route) // route for all content pages. This rule must be specified last (because it matches every route)
+8 -8
View File
@@ -9,34 +9,34 @@ Route::group(['namespace' => 'Contents'], function () {
->name('content.new'); ->name('content.new');
// form for editing existing static page // form for editing existing static page
Route::get('content/edit/{id}', 'EditContent@edit') Route::get('content/edit/{page}', 'EditContent@edit')
->name('content.edit'); ->name('content.edit');
// post method for creating new static page // post method for creating new static page
Route::post('content/new/{moduleId}', 'CreateNewContent@store') Route::post('content/new/{module}', 'CreateNewContent@store')
->name('content.newPost'); ->name('content.newPost');
// post method for creating new static page // post method for creating new static page
Route::post('content/edit/{id}', 'EditContent@update') Route::post('content/edit/{page}', 'EditContent@update')
->name('content.editPost'); ->name('content.editPost');
// change status of page (protected, public or draft) // change status of page (protected, public or draft)
Route::get('content/status/{id}/{status}', 'ContentActions@changeStatus') Route::get('content/status/{page}/{status}', 'ContentActions@changeStatus')
->name('content.changeStatus'); ->name('content.changeStatus');
// set homepage // set homepage
Route::get('content/homepage/{id}', 'ContentActions@setHomepage') Route::get('content/homepage/{page}', 'ContentActions@setHomepage')
->name('content.setHomepage'); ->name('content.setHomepage');
// delete page // delete page
Route::get('content/delete/{id}', 'ContentActions@delete') Route::get('content/delete/{page}', 'ContentActions@delete')
->name('content.delete'); ->name('content.delete');
// history of changes for specified page // history of changes for specified page
Route::get('history/{id}', 'History@getOverview') Route::get('history/{page}', 'History@getOverview')
->name('content.history'); ->name('content.history');
// history of changes for specified page // history of changes for specified page
Route::get('history/{revision}/{id}', 'History@getDiff') Route::get('history/{revision}', 'History@getDiff')
->name('history.diff'); ->name('history.diff');
}); });
-3
View File
@@ -5,9 +5,6 @@ Route::group(['namespace' => 'FileManager'], function () {
->name('upload.overview'); ->name('upload.overview');
// uploader methods // uploader methods
Route::get('directories/new/{parentDirectory?}', 'CreateNewDirectory@create')
->name('upload.newDirectory');
Route::get('directories/edit/{directory}', 'EditDirectory@edit') Route::get('directories/edit/{directory}', 'EditDirectory@edit')
->name('upload.editDirectory'); ->name('upload.editDirectory');
+3 -3
View File
@@ -1,15 +1,15 @@
<?php <?php
// these routes are available only for user with role admin // these routes are available only for user with role admin
Route::group(['middleware' => 'onlyAdmin', 'namespace' => 'Templates'], function () { Route::group(['middleware' => 'onlyAdmin', 'namespace' => 'Templates'], function () {
Route::get('templates/overview/path/{id}', 'TemplateOverview@getPath') Route::get('templates/overview/path/{templatePath}', 'TemplateOverview@getPath')
->name('templates.overview'); ->name('templates.overview');
Route::post('templates/copy', 'CopyTemplate@createCopy') Route::post('templates/copy', 'CopyTemplate@createCopy')
->name('templates.postCopy'); ->name('templates.postCopy');
Route::get('templates/edit/{id}', 'EditTemplate@getEdit') Route::get('templates/edit/{template}', 'EditTemplate@getEdit')
->name('templates.edit'); ->name('templates.edit');
Route::post('templates/edit/{id}', 'EditTemplate@postEdit') Route::post('templates/edit/{template}', 'EditTemplate@postEdit')
->name('templates.postEdit'); ->name('templates.postEdit');
}); });
+3 -3
View File
@@ -10,15 +10,15 @@ Route::group(['namespace' => 'Users'], function () {
->name('users.newPost'); ->name('users.newPost');
// display form for edit of existing user // display form for edit of existing user
Route::get('users/edit/{id}', 'EditUser@getEditUser') Route::get('users/edit/{user}', 'EditUser@getEditUser')
->name('users.edit'); ->name('users.edit');
// display user detail in admin // display user detail in admin
Route::get('users/detail/{id?}', 'UserDetail@getDetail') Route::get('users/detail/{user?}', 'UserDetail@getDetail')
->name('users.detail'); ->name('users.detail');
// method for saving edited data of user // method for saving edited data of user
Route::post('users/edit/{id}', 'EditUser@postEdit') Route::post('users/edit/{user}', 'EditUser@postEdit')
->name('users.editPost'); ->name('users.editPost');
// display list of all users registered into our system // display list of all users registered into our system
+9 -14
View File
@@ -3,23 +3,16 @@
namespace App\Listeners; namespace App\Listeners;
use App\Events\UploadFile; use App\Events\UploadFile;
use App\Models\FileManager\File;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Support\Facades\File as FileFacade; use Illuminate\Support\Facades\File as FileFacade;
use Illuminate\Support\Str; use Illuminate\Support\Str;
use Intervention\Image\Constraint; use Intervention\Image\Constraint;
use Intervention\Image\Facades\Image; use Intervention\Image\Facades\Image;
use Symfony\Component\HttpFoundation\File\File as SymphonyFile; use Symfony\Component\HttpFoundation\File\File as SymphonyFile;
class CreateImageThumbnail class CreateImageThumbnail implements ShouldQueue
{ {
/**
* Create the event listener.
*
* @return void
*/
public function __construct()
{
}
/** /**
* Handle the event. * Handle the event.
* *
@@ -29,10 +22,10 @@ class CreateImageThumbnail
*/ */
public function handle(UploadFile $event) public function handle(UploadFile $event)
{ {
$uploadedFile = $event->uploadedFile; $uploadedFile = $event->file;
// is uploaded file an image? // is uploaded file an image?
if (!Str::startsWith($uploadedFile->getMimeType(), 'image')) { if (!Str::startsWith($uploadedFile->mime_type, 'image')) {
return; return;
} }
// yes, create thumbnail // yes, create thumbnail
@@ -42,10 +35,12 @@ class CreateImageThumbnail
/** /**
* Create thumbnail of given image * Create thumbnail of given image
* *
* @param SymphonyFile $file * @param File $uploadedFile
*/ */
private function createThumbnail(SymphonyFile $file) private function createThumbnail(File $uploadedFile)
{ {
$file = new SymphonyFile(config('app.upload_path') . '/' . $uploadedFile->filename);
// does thumbnail directory exist? // does thumbnail directory exist?
if (!is_dir(config('app.thumbnail_path'))) { if (!is_dir(config('app.thumbnail_path'))) {
FileFacade::makeDirectory(config('app.thumbnail_path')); FileFacade::makeDirectory(config('app.thumbnail_path'));
+20 -17
View File
@@ -2,30 +2,33 @@
namespace App\Listeners\Loggers; namespace App\Listeners\Loggers;
use App\Events\Uploadfile; use App\Events\UploadFile;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
class LogUploadFile class LogUploadFile extends Logger
{ {
/**
* Create the event listener.
*
* @return void
*/
public function __construct()
{
//
}
/** /**
* Handle the event. * Handle the event.
* *
* @param Uploadfile $event * @param CreateNewWidget $event
*
* @return void * @return void
*/ */
public function handle(Uploadfile $event) public function handle(UploadFile $event)
{ {
// $parameters = [
'name' => $event->file->filename,
'mime' => $event->file->mime_type,
];
$this->saveLog($parameters);
}
/**
* Getter for action name. Used only internally
* @return mixed
*/
protected function getName()
{
return 'newFile';
} }
} }
+13 -10
View File
@@ -6,6 +6,7 @@ use App\CMS\Contracts\Repositories\Content as ContentContract;
use App\CMS\Helpers\Traits\Nullable; use App\CMS\Helpers\Traits\Nullable;
use App\CMS\Observers\Content as ContentObserver; use App\CMS\Observers\Content as ContentObserver;
use App\Models\FileManager\File; use App\Models\FileManager\File;
use App\Models\Module;
use App\Models\User; use App\Models\User;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Database\Eloquent\SoftDeletes;
@@ -55,7 +56,6 @@ class Content extends Model
/** /**
* Mark relationship with its historical records * Mark relationship with its historical records
*
* @return \Illuminate\Database\Eloquent\Relations\HasMany * @return \Illuminate\Database\Eloquent\Relations\HasMany
*/ */
public function history() public function history()
@@ -65,7 +65,6 @@ class Content extends Model
/** /**
* Mark relationship with users table * Mark relationship with users table
*
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
*/ */
public function author() public function author()
@@ -75,7 +74,6 @@ class Content extends Model
/** /**
* Related files to content page * Related files to content page
*
* @return \Illuminate\Database\Eloquent\Relations\BelongsToMany * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
*/ */
public function files() public function files()
@@ -85,7 +83,6 @@ class Content extends Model
/** /**
* Category of content page * Category of content page
*
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
*/ */
public function category() public function category()
@@ -95,7 +92,6 @@ class Content extends Model
/** /**
* Subpages assigned to page * Subpages assigned to page
*
* @return \Illuminate\Database\Eloquent\Relations\HasMany * @return \Illuminate\Database\Eloquent\Relations\HasMany
*/ */
public function subpages() public function subpages()
@@ -103,9 +99,17 @@ class Content extends Model
return $this->hasMany(Content::class, 'parentId'); return $this->hasMany(Content::class, 'parentId');
} }
/**
* Module relationship
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
*/
public function module()
{
return $this->belongsTo(Module::class, 'moduleHandler', 'handler');
}
/** /**
* Parent page * Parent page
*
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
*/ */
public function parentPage() public function parentPage()
@@ -115,7 +119,6 @@ class Content extends Model
/** /**
* Is current content draft? * Is current content draft?
*
* @return bool * @return bool
*/ */
public function isDraft() public function isDraft()
@@ -125,7 +128,6 @@ class Content extends Model
/** /**
* Is current content visible for all visitors? * Is current content visible for all visitors?
*
* @return bool * @return bool
*/ */
public function isPublic() public function isPublic()
@@ -135,7 +137,6 @@ class Content extends Model
/** /**
* Is current content visible only for logged users? * Is current content visible only for logged users?
*
* @return bool * @return bool
*/ */
public function isProtected() public function isProtected()
@@ -145,7 +146,6 @@ class Content extends Model
/** /**
* Is current content visible for logged user OR for everyone? * Is current content visible for logged user OR for everyone?
*
* @return bool * @return bool
*/ */
public function isVisible() public function isVisible()
@@ -164,6 +164,9 @@ class Content extends Model
return parent::save($options); return parent::save($options);
} }
/**
* Increment number of viewed content
*/
public function view() public function view()
{ {
$this->timestamps = false; $this->timestamps = false;
+4 -4
View File
@@ -45,15 +45,15 @@ trait File
$uploadedFile = $file->move($destination, $filename); $uploadedFile = $file->move($destination, $filename);
// insert record into database // insert record into database
$id = $this->saveIntoDatabase($uploadedFile, $data, $file->getClientOriginalName()); $fileInDB = $this->saveIntoDatabase($uploadedFile, $data, $file->getClientOriginalName());
// fire event about new file // fire event about new file
Event::fire(new UploadFile($uploadedFile, $id)); Event::fire(new UploadFile($fileInDB));
return [ return [
'filename' => $filename, 'filename' => $filename,
'file' => $file, 'file' => $file,
'id' => $id 'id' => $fileInDB->id
]; ];
} }
@@ -89,6 +89,6 @@ trait File
'keywords' => isset($request->keyword) ? $request->keyword : '' 'keywords' => isset($request->keyword) ? $request->keyword : ''
]); ]);
return $newFile->id; return $newFile;
} }
} }
-113
View File
@@ -1,113 +0,0 @@
<?php
namespace App\Models\ModelTraits;
use App\CMS\Contracts\Modules\AppHandler;
use App\CMS\Contracts\Modules\TemplateHandler;
use App\Models\Module as ModuleModel;
use App\Models\Templates\TemplatePath;
use Illuminate\Support\Facades\App;
trait Module
{
/**
* Create new module in database
*
* @param $name
* @param $alias
* @param string $description
* @param null $handler
* @param $parentModuleId
* @param array $settings
*
* @return Module
* @throws \ErrorException
*/
public static function install($name, $alias, $description, $handler, $parentModuleId, $settings)
{
// check if user does not want to install module in runtime
if (!App::runningInConsole()) {
throw new \ErrorException('Modules can be installed only via Artisan!');
}
$managesContent = $handler ? in_array(AppHandler::class, class_implements($handler)) : false;
$isTemplate = $handler ? in_array(TemplateHandler::class, class_implements($handler)) : false;
$supportCategories = $managesContent ? call_user_func([$handler, 'supportCategories']) : false;
if ($parentModuleId) {
$parentModule = ModuleModel::findOrFail($parentModuleId);
$parentModule->has_submodules = true;
$parentModule->save();
}
// insert module into database
$module = ModuleModel::create([
'name' => $name,
'description' => $description,
'handler' => $handler,
'manages_content' => $managesContent,
'support_categories' => $supportCategories,
'alias' => $alias,
'module_settings' => json_encode($settings),
'parent_id' => $parentModuleId ? $parentModuleId : null,
'enabled' => 1,
'is_template' => $isTemplate
]);
// install something module-specific
if ($handler && is_callable([$handler, 'install'])) {
call_user_func([$handler, 'install']);
}
return $module;
}
/**
* Delete module from database and uninstall its dependencies
*
* @throws \ErrorException
*/
public function uninstall()
{
// check if user does not want to install module in runtime
if (!App::runningInConsole()) {
throw new \ErrorException('Modules can be uninstalled only via Artisan!');
}
// delete everything in /resources/views/visitor
if ($this->is_template) {
$this->deleteDirectory(resource_path('views/visitor'));
$this->deleteDirectory(resource_path('views/modules'));
$this->deleteDirectory(public_path('assets'));
// delete all template paths
TemplatePath::getQuery()
->delete();
}
if ($this->handler && is_callable([$this->handler, 'uninstall'])) {
call_user_func([$this->handler, 'uninstall'], $this);
}
$this->delete();
}
/**
* Delete directory when uninstalling module.
*
* @param $directory
*
* @throws \ErrorException
*/
private function deleteDirectory($directory)
{
if (!is_dir($directory)) {
return;
}
$success = \File::deleteDirectory($directory, true);
if (!$success) {
throw new \ErrorException('Cannot delete ' . $directory);
}
}
}
+20 -1
View File
@@ -9,13 +9,13 @@ use Illuminate\Database\Eloquent\Model;
*/ */
class Module extends Model class Module extends Model
{ {
use ModelTraits\Module;
public $timestamps = false; public $timestamps = false;
protected $fillable = [ protected $fillable = [
'handler', 'handler',
'parent_id', 'parent_id',
'name', 'name',
'description', 'description',
'static_name', // @todo instalace potrebuje naplnit tento sloupec!
'alias', 'alias',
'module_settings', 'module_settings',
'enabled', 'enabled',
@@ -23,4 +23,23 @@ class Module extends Model
'manages_content', 'manages_content',
'is_template' 'is_template'
]; ];
protected $casts = [
'module_settings' => 'array',
'is_template' => 'boolean',
'has_submodules' => 'boolean'
];
public function getRouteKeyName()
{
return 'alias';
}
public function submodules()
{
return $this->hasMany(Module::class, 'parent_id');
}
public function parent() {
return $this->belongsTo(Module::class, 'parent_id');
}
} }
-2
View File
@@ -7,8 +7,6 @@ use Mcamara\LaravelLocalization\Facades\LaravelLocalization;
class Settings extends Model class Settings extends Model
{ {
use ModelTraits\Settings;
protected $table = 'settings'; protected $table = 'settings';
public $timestamps = false; public $timestamps = false;
protected $fillable = ['key', 'value', 'language']; protected $fillable = ['key', 'value', 'language'];
+10
View File
@@ -0,0 +1,10 @@
<?php
return [
'namespace' => 'Modules',
'paths' => [
'modules' => base_path('modules'),
'assets' => public_path('modules'),
'stubs' => base_path('app/CMS/Modules/Stubs'),
]
];
+64
View File
@@ -0,0 +1,64 @@
<?php
namespace App\ModuleManager;
use App\CMS\Contracts\Modules\AppHandler;
use App\CMS\Contracts\Modules\TemplateHandler;
use App\Models\Module;
use Illuminate\Support\Facades\App;
class Installer
{
/**
* Create new module in database
*
* @param $name
* @param $alias
* @param string $description
* @param null $handler
* @param $parentModuleId
* @param array $settings
*
* @return Module
* @throws \ErrorException
*/
public static function install($name, $alias, $staticName, $description, $handler, $parentModuleId, $settings)
{
// check if user does not want to install module in runtime
if (!App::runningInConsole()) {
throw new \ErrorException('Modules can be installed only via Artisan!');
}
$managesContent = $handler ? in_array(AppHandler::class, class_implements($handler)) : false;
$isTemplate = $handler ? in_array(TemplateHandler::class, class_implements($handler)) : false;
$supportCategories = $managesContent ? call_user_func([$handler, 'supportCategories']) : false;
if ($parentModuleId) {
$parentModule = Module::findOrFail($parentModuleId);
$parentModule->has_submodules = true;
$parentModule->save();
}
// insert module into database
$module = Module::create([
'name' => $name,
'description' => $description,
'handler' => $handler,
'static_name' => $staticName,
'manages_content' => $managesContent,
'support_categories' => $supportCategories,
'alias' => $alias,
'module_settings' => $settings,
'parent_id' => $parentModuleId ? $parentModuleId : null,
'enabled' => 1,
'is_template' => $isTemplate
]);
// install something module-specific
if ($handler && is_callable([$handler, 'install'])) {
call_user_func([$handler, 'install']);
}
return $module;
}
}
@@ -0,0 +1,48 @@
<?php
namespace App\ModuleManager\Providers;
use App\Models\Module;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\ServiceProvider;
class ModuleManager extends ServiceProvider
{
/**
* Bootstrap the application services.
* @return void
*/
public function boot()
{
// this service provider needs published config - config is merged right after this service provider
$modules = Cache::rememberForever('enabled-modules', function () {
return Module::where('enabled', true)
->where('is_template', false)
->get();
});
// iterate over all modules and enable or disable them
foreach ($modules as $module) {
if (isset($module->module_settings['providers']) && !empty($module->module_settings['providers'])) {
foreach ($module->module_settings['providers'] as $provider) {
$this->app->register($provider);
}
}
// include files (if any)
if (isset($module->module_settings['files']) && !empty($module->module_settings['files'])) {
foreach ($module->module_settings['files'] as $file) {
include config('modules.paths.modules') . '/' . $module->static_name . '/' . $file;
}
}
}
}
/**
* Register the application services.
* @return void
*/
public function register()
{
}
}
+60
View File
@@ -0,0 +1,60 @@
<?php
namespace App\ModuleManager;
use App\Models\Module;
use App\Models\Templates\TemplatePath;
use Illuminate\Support\Facades\App;
class Uninstaller {
/**
* Delete module from database and uninstall its dependencies
*
* @param Module $module
*
* @throws \ErrorException
*/
public static function uninstall(Module $module)
{
// check if user does not want to install module in runtime
if (!App::runningInConsole()) {
throw new \ErrorException('Modules can be uninstalled only via Artisan!');
}
// delete everything in /resources/views/visitor
if ($module->is_template) {
self::deleteDirectory(resource_path('views/visitor'));
self::deleteDirectory(resource_path('views/modules'));
self::deleteDirectory(public_path('assets'));
// delete all template paths
TemplatePath::getQuery()
->delete();
}
if ($module->handler && is_callable([$module->handler, 'uninstall'])) {
call_user_func([$module->handler, 'uninstall'], $module);
}
$module->delete();
}
/**
* Delete directory when uninstalling module.
*
* @param $directory
*
* @throws \ErrorException
*/
private static function deleteDirectory($directory)
{
if (!is_dir($directory)) {
return;
}
$success = \File::deleteDirectory($directory, true);
if (!$success) {
throw new \ErrorException('Cannot delete ' . $directory);
}
}
}
+2 -6
View File
@@ -28,8 +28,6 @@ use App\CMS\Widgets\Menu\Menu;
use Barryvdh\Debugbar\ServiceProvider as DebugBarServiceProvider; use Barryvdh\Debugbar\ServiceProvider as DebugBarServiceProvider;
use Illuminate\Support\Facades\App; use Illuminate\Support\Facades\App;
use Illuminate\Support\ServiceProvider; use Illuminate\Support\ServiceProvider;
use Pingpong\Menus\MenusServiceProvider;
use Pingpong\Modules\ModulesServiceProvider;
class AppServiceProvider extends ServiceProvider class AppServiceProvider extends ServiceProvider
{ {
@@ -64,13 +62,11 @@ class AppServiceProvider extends ServiceProvider
} }
// register PingPong module extension // register PingPong module extension
$this->app->register(ModulesServiceProvider::class);
$this->app->register(MenusServiceProvider::class);
$this->app->register(LaravelLocalizationServiceProvider::class); $this->app->register(LaravelLocalizationServiceProvider::class);
// create singletons for registering widgets // create singletons for registering widgets
$this->app->singleton('registerWidget', function ($app) { $this->app->singleton('registerWidget', function ($app) {
return new WidgetRegistrator($app); return new WidgetRegistrator();
}); });
// create singleton for display pipeline - pipeline used for displaying visitor pages // create singleton for display pipeline - pipeline used for displaying visitor pages
@@ -85,7 +81,7 @@ class AppServiceProvider extends ServiceProvider
// create registrator for template directories // create registrator for template directories
$this->app->singleton('registerTemplateDir', function ($app) { $this->app->singleton('registerTemplateDir', function ($app) {
return new TemplateRegistrator($app); return new TemplateRegistrator();
}); });
$this->app->singleton('registerSettingsExtension', function ($app) { $this->app->singleton('registerSettingsExtension', function ($app) {
-93
View File
@@ -1,93 +0,0 @@
<?php
namespace App\Providers;
use App\Models\Module;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\ServiceProvider;
class ModuleManager extends ServiceProvider
{
/**
* Bootstrap the application services.
* @return void
*/
public function boot()
{
// this service provider needs published config - config is merged right after this service provider
$modules = Cache::rememberForever('enabled-modules', function () {
$modules = Module::where('enabled', true)
->get();
foreach ($modules as $module) {
$module->module_settings = json_decode($module->module_settings);
}
return $modules;
});
// iterate over all modules and enable or disable them
foreach ($modules as $module) {
if ($module->is_template) {
if (isset($module->module_settings->providers) && !empty($module->module_settings->providers)) {
foreach ($module->module_settings->providers as $provider) {
$this->app->register($provider);
}
}
continue;
}
$this->createModulesJson($module);
}
}
/**
* Register the application services.
* @return void
*/
public function register()
{
}
/**
* Read config file and merge it with module config in database.
* This method REQUIRES published config of given module (otherwise config(modulename) is not available)!
*
* @param Module $module
*
* @throws \ErrorException when module.json is not writable
*/
private function createModulesJson(Module $module)
{
$config = $module->module_settings;
if (is_null($config)) {
return;
}
// path to module.json
$path = config('modules.paths.modules') . DIRECTORY_SEPARATOR . $config->staticName . DIRECTORY_SEPARATOR . 'module.json';
// check if module config is writable
if (!is_writable(dirname($path))) {
Log::warning('Cannot write to ' . $path);
return;
}
// set enabled/disabled status for this module
$data = new \stdClass();
$data->name = $config->staticName;
$data->description = $module->description;
$data->alias = $module->alias;
$data->providers = $config->providers;
$data->aliases = $config->aliases;
$data->order = $config->order;
$data->files = $config->files;
$data->active = $module->enabled;
// create file
file_put_contents($path, json_encode($data));
}
}
+18 -16
View File
@@ -2,43 +2,45 @@
namespace App\Providers; namespace App\Providers;
use Illuminate\Routing\Router;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider; use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Route;
class RouteServiceProvider extends ServiceProvider class RouteServiceProvider extends ServiceProvider
{ {
/** /**
* This namespace is applied to the controller routes in your routes file. * This namespace is applied to your controller routes.
*
* In addition, it is set as the URL generator's root namespace. * In addition, it is set as the URL generator's root namespace.
*
* @var string * @var string
*/ */
protected $namespace = 'App\Http\Controllers'; protected $namespace = 'App\Http\Controllers';
/** /**
* Define your route model bindings, pattern filters, etc. * Define your route model bindings, pattern filters, etc.
*
* @param \Illuminate\Routing\Router $router
* @return void * @return void
*/ */
public function boot(Router $router) public function boot()
{ {
// parent::boot();
parent::boot($router);
} }
/** /**
* Define the routes for the application. * Define the routes for the application.
*
* @param \Illuminate\Routing\Router $router
* @return void * @return void
*/ */
public function map(Router $router) public function map()
{ {
$router->group(['namespace' => $this->namespace], function ($router) { $this->mapWebRoutes();
require app_path('Http/routes.php'); }
});
/**
* Define the "web" routes for the application.
* These routes all receive session state, CSRF protection, etc.
* @return void
*/
protected function mapWebRoutes()
{
Route::namespace($this->namespace)
->middleware('web')
->group(app_path('Http/routes.php'));
} }
} }
-64
View File
@@ -1,64 +0,0 @@
<?php
namespace App\Providers;
use Illuminate\Contracts\Filesystem\FileNotFoundException;
use Illuminate\Support\ServiceProvider;
use Pingpong\Modules\Json;
class SubmodulesManager extends ServiceProvider
{
/**
* Boot submodules
*
* @return void
*/
public function boot()
{
$enabledModules = \Module::enabled();
foreach ($enabledModules as $module) {
$modulePath = $module->getPath();
$config = new Json($modulePath . DIRECTORY_SEPARATOR . 'module.json');
// Does this module specify any providers? If not, consider this module with submodules and register them
if ($config->get('providers')) {
continue;
}
$submodules = \File::directories($modulePath);
foreach ($submodules as $submodulePath) {
try {
$config = new Json($submodulePath . DIRECTORY_SEPARATOR . 'module.json');
if (!$config->get('active')) {
continue;
}
$serviceProviders = $config->get('providers', []);
foreach ($serviceProviders as $serviceProvider) {
$this->app->register($serviceProvider);
}
$initFiles = $config->get('files', []);
foreach ($initFiles as $file) {
require $submodulePath . DIRECTORY_SEPARATOR . $file;
}
} catch (FileNotFoundException $e) {
// ignore missing module and do not register this submodule
}
}
}
}
/**
* Register the service provider.
*
* @return void
*/
public function register()
{
}
}
+1 -1
View File
@@ -94,7 +94,7 @@ class TemplateServiceProvider extends ServiceProvider
return; return;
} }
$templateDir = base_path('templates/' . $template->module_settings->staticName . '/Resources'); $templateDir = base_path('templates/' . $template->static_name. '/Resources');
$assetsDir = $templateDir . '/' . TemplateContract::ASSETS_DIRECTORY; $assetsDir = $templateDir . '/' . TemplateContract::ASSETS_DIRECTORY;
$viewsDir = $templateDir . '/views'; $viewsDir = $templateDir . '/views';
+2 -2
View File
@@ -4,14 +4,14 @@
"devDependencies": {}, "devDependencies": {},
"dependencies": { "dependencies": {
"animate.css": "~3.4.0", "animate.css": "~3.4.0",
"bootstrap": "v4.0.0-alpha.3", "bootstrap": "v4.0.0-alpha.5",
"font-awesome": "~4.5.0", "font-awesome": "~4.5.0",
"jquery": "~2.1.4", "jquery": "~2.1.4",
"metisMenu": "~2.0.3", "metisMenu": "~2.0.3",
"nprogress": "~0.2.0", "nprogress": "~0.2.0",
"responsive-bootstrap-toolkit": "~2.5.0", "responsive-bootstrap-toolkit": "~2.5.0",
"Sortable": "~1.4.2", "Sortable": "~1.4.2",
"tether": "~1.1.1", "tether": "~1.3.7",
"tinycolor": "~1.2.1", "tinycolor": "~1.2.1",
"dropzone": "~4.2.0", "dropzone": "~4.2.0",
"jquery.are-you-sure": "~1.9" "jquery.are-you-sure": "~1.9"
+4 -6
View File
@@ -8,15 +8,14 @@
"type": "project", "type": "project",
"require": { "require": {
"php": ">=5.5.9", "php": ">=5.5.9",
"laravel/framework": "5.2.*", "laravel/framework": "5.4.*",
"pingpong/modules": "~2.0",
"pingpong/menus": "^2.2",
"watson/sitemap": "^2.0", "watson/sitemap": "^2.0",
"mcamara/laravel-localization": "^1.1", "mcamara/laravel-localization": "^1.1",
"franzose/closure-table": "^4.1", "franzose/closure-table": "5.*",
"intervention/image": "^2.3", "intervention/image": "^2.3",
"webwizo/laravel-shortcodes": "1.0.4", "webwizo/laravel-shortcodes": "1.0.4",
"greggilbert/recaptcha": "^2.2@dev" "greggilbert/recaptcha": "^2.2@dev",
"nwidart/laravel-menus": "dev-master"
}, },
"require-dev": { "require-dev": {
"fzaninotto/faker": "~1.4", "fzaninotto/faker": "~1.4",
@@ -24,7 +23,6 @@
"phpunit/phpunit": "~4.0", "phpunit/phpunit": "~4.0",
"symfony/css-selector": "2.8.*|3.0.*", "symfony/css-selector": "2.8.*|3.0.*",
"symfony/dom-crawler": "2.8.*|3.0.*", "symfony/dom-crawler": "2.8.*|3.0.*",
"ignasbernotas/laravel-model-generator": "^1.0",
"barryvdh/laravel-debugbar": "^2.1" "barryvdh/laravel-debugbar": "^2.1"
}, },
"autoload": { "autoload": {
Generated
+614 -1512
View File
File diff suppressed because it is too large Load Diff
+4 -7
View File
@@ -154,11 +154,9 @@ return [
Illuminate\Validation\ValidationServiceProvider::class, Illuminate\Validation\ValidationServiceProvider::class,
Illuminate\View\ViewServiceProvider::class, Illuminate\View\ViewServiceProvider::class,
Mcamara\LaravelLocalization\LaravelLocalizationServiceProvider::class, Mcamara\LaravelLocalization\LaravelLocalizationServiceProvider::class,
// this class must be before ModulesServiceProvider from PingPong, because it handles files module.json \App\ModuleManager\Providers\ModuleManager::class,
App\Providers\ModuleManager::class, \Nwidart\Menus\MenusServiceProvider::class,
Pingpong\Modules\ModulesServiceProvider::class, // Pingpong\Menus\MenusServiceProvider::class,
Pingpong\Menus\MenusServiceProvider::class,
App\Providers\SubmodulesManager::class,
Franzose\ClosureTable\ClosureTableServiceProvider::class, Franzose\ClosureTable\ClosureTableServiceProvider::class,
\Watson\Sitemap\SitemapServiceProvider::class, \Watson\Sitemap\SitemapServiceProvider::class,
Intervention\Image\ImageServiceProvider::class, Intervention\Image\ImageServiceProvider::class,
@@ -205,8 +203,7 @@ return [
'Lang' => Illuminate\Support\Facades\Lang::class, 'Lang' => Illuminate\Support\Facades\Lang::class,
'Log' => Illuminate\Support\Facades\Log::class, 'Log' => Illuminate\Support\Facades\Log::class,
'Mail' => Illuminate\Support\Facades\Mail::class, 'Mail' => Illuminate\Support\Facades\Mail::class,
'Menu' => Pingpong\Menus\MenuFacade::class, 'Menu' => Nwidart\Menus\Facades\Menu::class,
'Module' => Pingpong\Modules\Facades\Module::class,
'Password' => Illuminate\Support\Facades\Password::class, 'Password' => Illuminate\Support\Facades\Password::class,
'Queue' => Illuminate\Support\Facades\Queue::class, 'Queue' => Illuminate\Support\Facades\Queue::class,
'Redirect' => Illuminate\Support\Facades\Redirect::class, 'Redirect' => Illuminate\Support\Facades\Redirect::class,
-6
View File
@@ -3,12 +3,6 @@
return [ return [
'styles' => [ 'styles' => [
'navbar' => 'Pingpong\Menus\Presenters\Bootstrap\NavbarPresenter',
'navbar-right' => 'Pingpong\Menus\Presenters\Bootstrap\NavbarRightPresenter',
'nav-pills' => 'Pingpong\Menus\Presenters\Bootstrap\NavPillsPresenter',
'nav-tab' => 'Pingpong\Menus\Presenters\Bootstrap\NavTabPresenter',
'sidebar' => 'Pingpong\Menus\Presenters\Bootstrap\SidebarMenuPresenter',
'navmenu' => 'Pingpong\Menus\Presenters\Bootstrap\NavMenuPresenter',
'foundation-drilldown' => App\CMS\MenuPresenters\FoundationDrilldownMenuPresenter::class, 'foundation-drilldown' => App\CMS\MenuPresenters\FoundationDrilldownMenuPresenter::class,
'foundation-dropdown' => App\CMS\MenuPresenters\FoundationDropdownMenuPresenter::class, 'foundation-dropdown' => App\CMS\MenuPresenters\FoundationDropdownMenuPresenter::class,
'foundation-dropdown-initialized' => App\CMS\MenuPresenters\FoundationInitializedDropdownMenuPresenter::class, 'foundation-dropdown-initialized' => App\CMS\MenuPresenters\FoundationInitializedDropdownMenuPresenter::class,
+5 -155
View File
@@ -1,160 +1,10 @@
<?php <?php
return [ return [
/*
|--------------------------------------------------------------------------
| Module Namespace
|--------------------------------------------------------------------------
|
| Default module namespace.
|
*/
'namespace' => 'Modules', 'namespace' => 'Modules',
'paths' => [
/* 'modules' => base_path('modules'),
|-------------------------------------------------------------------------- 'assets' => public_path('modules'),
| Module Stubs 'stubs' => base_path('app/ModuleManager/Stubs'),
|-------------------------------------------------------------------------- ]
|
| Default module stubs.
|
*/
'stubs' => [
'enabled' => false,
'path' => base_path().'/vendor/pingpong/modules/src/Pingpong/Modules/Commands/stubs',
'files' => [
'start' => 'start.php',
'routes' => 'Http/routes.php',
'json' => 'module.json',
'views/index' => 'Resources/views/index.blade.php',
'views/master' => 'Resources/views/layouts/master.blade.php',
'scaffold/config' => 'Config/config.php',
'composer' => 'composer.json',
],
'replacements' => [
'start' => ['LOWER_NAME'],
'routes' => ['LOWER_NAME', 'STUDLY_NAME', 'MODULE_NAMESPACE'],
'json' => ['LOWER_NAME', 'STUDLY_NAME', 'MODULE_NAMESPACE'],
'views/index' => ['LOWER_NAME'],
'views/master' => ['STUDLY_NAME'],
'scaffold/config' => ['STUDLY_NAME'],
'composer' => [
'LOWER_NAME',
'STUDLY_NAME',
'VENDOR',
'AUTHOR_NAME',
'AUTHOR_EMAIL',
'MODULE_NAMESPACE',
],
],
],
'paths' => [
/*
|--------------------------------------------------------------------------
| Modules path
|--------------------------------------------------------------------------
|
| This path used for save the generated module. This path also will added
| automatically to list of scanned folders.
|
*/
'modules' => base_path('modules'),
/*
|--------------------------------------------------------------------------
| Modules assets path
|--------------------------------------------------------------------------
|
| Here you may update the modules assets path.
|
*/
'assets' => public_path('modules'),
/*
|--------------------------------------------------------------------------
| The migrations path
|--------------------------------------------------------------------------
|
| Where you run 'module:publish-migration' command, where do you publish the
| the migration files?
|
*/
'migration' => base_path('database/migrations'),
/*
|--------------------------------------------------------------------------
| Generator path
|--------------------------------------------------------------------------
|
| Here you may update the modules generator path.
|
*/
'generator' => [
'assets' => 'Assets',
'config' => 'Config',
'command' => 'Console',
'migration' => 'Database/Migrations',
'model' => 'Entities',
'repository' => 'Repositories',
'seeder' => 'Database/Seeders',
'controller' => 'Http/Controllers',
'filter' => 'Http/Middleware',
'request' => 'Http/Requests',
'provider' => 'Providers',
'lang' => 'Resources/lang',
'views' => 'Resources/views',
'test' => 'Tests',
],
],
/*
|--------------------------------------------------------------------------
| Scan Path
|--------------------------------------------------------------------------
|
| Here you define which folder will be scanned. By default will scan vendor
| directory. This is useful if you host the package in packagist website.
|
*/
'scan' => [
'enabled' => false,
'paths' => [
base_path('vendor/*/*'),
],
],
/*
|--------------------------------------------------------------------------
| Composer File Template
|--------------------------------------------------------------------------
|
| Here is the config for composer.json file, generated by this package
| in every module since version >= 1.2.0.
|
*/
'composer' => [
'vendor' => 'pingpong-modules',
'author' => [
'name' => 'Pingpong Labs',
'email' => 'pingpong.labs@gmail.com',
],
],
/*
|--------------------------------------------------------------------------
| Caching
|--------------------------------------------------------------------------
|
| Here is the config for setting up caching feature.
|
*/
'cache' => [
'enabled' => false,
'key' => 'pingpong-modules',
'lifetime' => 60,
],
]; ];
@@ -0,0 +1,38 @@
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class AddStaticNameToModulesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('modules', function (Blueprint $table) {
$table->string('static_name')->after('description');
});
$modules = \App\Models\Module::all();
foreach ($modules as $module) {
$module->update(['static_name' => $module->static_name]);
}
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('modules', function (Blueprint $table) {
$table->dropColumn('static_name');
});
}
}
@@ -0,0 +1,29 @@
<?php
use Illuminate\Database\Migrations\Migration;
class AddNewActionLogType extends Migration
{
/**
* Run the migrations.
* @return void
*/
public function up()
{
\App\Models\ActionLog\ActionLogType::create([
'string_id' => 'newFile',
'name' => 'admin/actionLog.nameNewFile',
'value' => 'admin/actionLog.newFile'
]);
}
/**
* Reverse the migrations.
* @return void
*/
public function down()
{
\App\Models\ActionLog\ActionLogType::where('string_id', 'newFile')
->delete();
}
}
@@ -1,8 +1,8 @@
<?php <?php
namespace Modules\Blog\Article\Http\Controllers\Admin; namespace Modules\Blog\Article\Http\Controllers\Admin;
use App\Http\Controllers\Admin\Controller;
use Modules\Blog\Article\Entities\Comment; use Modules\Blog\Article\Entities\Comment;
use Pingpong\Modules\Routing\Controller;
class CommentsOverview extends Controller class CommentsOverview extends Controller
{ {
@@ -1,17 +1,18 @@
<?php <?php
namespace Modules\Blog\Article\Http\Controllers\Visitor; namespace Modules\Blog\Article\Http\Controllers\Visitor;
use App\Models\Content\Content; use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Event; use Illuminate\Support\Facades\Event;
use Modules\Blog\Article\Entities\Article;
use Modules\Blog\Article\Entities\Comment; use Modules\Blog\Article\Entities\Comment;
use Modules\Blog\Article\Events\CreatedComment; use Modules\Blog\Article\Events\CreatedComment;
use Modules\Blog\Article\Handlers\Article; use Modules\Blog\Article\Http\Requests\CreateNewComment as CreateNewCommentRequest;
use Pingpong\Modules\Routing\Controller;
class CreateNewComment extends Controller class CreateNewComment extends Controller
{ {
public function store(\Modules\Blog\Article\Http\Requests\CreateNewComment $request, \Modules\Blog\Article\Entities\Article $article) public function store(CreateNewCommentRequest $request, Article $article)
{ {
if (!isset($article->moduleSettings['allowComments']) || !$article->moduleSettings['allowComments']) { if (!isset($article->moduleSettings['allowComments']) || !$article->moduleSettings['allowComments']) {
return redirect() return redirect()
@@ -30,13 +31,13 @@ class CreateNewComment extends Controller
} }
$comment = Comment::create([ $comment = Comment::create([
'user_id' => $user ? $user->id : null, 'user_id' => $user ? $user->id : null,
'content_id' => $article->id, 'content_id' => $article->id,
'name' => $name, 'name' => $name,
'email' => $email, 'email' => $email,
'content' => $content, 'content' => $content,
'approved' => !is_null($user) 'approved' => !is_null($user)
]); ]);
// fire event about new comment // fire event about new comment
Event::fire(new CreatedComment($comment)); Event::fire(new CreatedComment($comment));
@@ -23,14 +23,4 @@ class ArticleEventServiceProvider extends ServiceProvider
DeletedComment::class => [LogDeletedComment::class], DeletedComment::class => [LogDeletedComment::class],
CreatedComment::class => [LogNewComment::class], CreatedComment::class => [LogNewComment::class],
]; ];
public function boot(DispatcherContract $events)
{
parent::boot($events);
}
protected function setModulePath()
{
$this->path = __DIR__;
}
} }
@@ -1,14 +1,13 @@
<?php namespace Modules\Blog\Article\Providers; <?php namespace Modules\Blog\Article\Providers;
use App\Providers\ModuleServiceProvider; use App\CMS\Modules\ServiceProviders\ServiceProvider;
use Modules\Blog\Article\Pipeline\DisplayContent\LoadCommentsForBlogpost; use Modules\Blog\Article\Pipeline\DisplayContent\LoadCommentsForBlogpost;
use Modules\Blog\Article\Pipeline\SaveContent\TurnCommentsOnOrOff; use Modules\Blog\Article\Pipeline\SaveContent\TurnCommentsOnOrOff;
class ArticleServiceProvider extends ModuleServiceProvider class ArticleServiceProvider extends ServiceProvider
{ {
/** /**
* Boot the application events. * Boot the application events.
*
* @return void * @return void
*/ */
public function boot() public function boot()
@@ -1,9 +1,9 @@
<?php namespace Modules\Blog\ArticleList\Providers; <?php namespace Modules\Blog\ArticleList\Providers;
use App\Providers\ModuleServiceProvider; use App\CMS\Modules\ServiceProviders\ServiceProvider;
use Modules\Blog\ArticleList\Pipeline\DisplayContent\LoadArticlesForList; use Modules\Blog\ArticleList\Pipeline\DisplayContent\LoadArticlesForList;
class ArticleListServiceProvider extends ModuleServiceProvider class ArticleListServiceProvider extends ServiceProvider
{ {
protected function setModuleAlias() protected function setModuleAlias()
{ {
@@ -1,9 +1,8 @@
<?php namespace Modules\Categories\Http\Controllers; <?php namespace Modules\Categories\Http\Controllers;
use App\CMS\Enumerations\ModuleNamesWithIds; use App\CMS\Enumerations\ModuleNamesWithIds;
use App\Models\Module; use App\Http\Controllers\Admin\Controller;
use Modules\Categories\Entities\Category; use Modules\Categories\Entities\Category;
use Pingpong\Modules\Routing\Controller;
class CategoriesOverview extends Controller class CategoriesOverview extends Controller
{ {
@@ -1,17 +1,16 @@
<?php namespace Modules\Categories\Http\Controllers; <?php namespace Modules\Categories\Http\Controllers;
use App\Http\Controllers\Admin\Controller;
use App\Http\Requests\Request; use App\Http\Requests\Request;
use App\Models\Module; use App\Models\Module;
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Str; use Illuminate\Support\Str;
use Modules\Categories\Entities\Category; use Modules\Categories\Entities\Category;
use Pingpong\Modules\Routing\Controller;
class CreateNewCategory extends Controller class CreateNewCategory extends Controller
{ {
/** /**
* Display form for new category * Display form for new category
*
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/ */
public function getNew() public function getNew()
@@ -1,10 +1,10 @@
<?php namespace Modules\Categories\Http\Controllers; <?php namespace Modules\Categories\Http\Controllers;
use App\Http\Controllers\Admin\Controller;
use App\Http\Requests\Request; use App\Http\Requests\Request;
use App\Models\Module; use App\Models\Module;
use Illuminate\Support\Str; use Illuminate\Support\Str;
use Modules\Categories\Entities\Category; use Modules\Categories\Entities\Category;
use Pingpong\Modules\Routing\Controller;
class EditCategory extends Controller class EditCategory extends Controller
{ {
@@ -1,11 +1,11 @@
<?php <?php
namespace Modules\Categories\Providers; namespace Modules\Categories\Providers;
use App\Providers\ModuleServiceProvider; use App\CMS\Modules\ServiceProviders\ServiceProvider;
use Modules\Categories\Contracts\Repositories\Category as ICategory; use Modules\Categories\Contracts\Repositories\Category as ICategory;
use Modules\Categories\Repositories\Category as Category; use Modules\Categories\Repositories\Category as Category;
class CategoriesServiceProvider extends ModuleServiceProvider class CategoriesServiceProvider extends ServiceProvider
{ {
protected function setModuleAlias() protected function setModuleAlias()
{ {

Some files were not shown because too many files have changed in this diff Show More