FEATURE: more translations
This commit is contained in:
@@ -29,15 +29,32 @@ class TranslateAll extends Command
|
||||
|
||||
/**
|
||||
* Execute the console command.
|
||||
* @return mixed
|
||||
*/
|
||||
public function handle()
|
||||
{
|
||||
$this->call('translate:dir', ['dir' => 'resources/lang']);
|
||||
|
||||
$modules = File::directories('modules');
|
||||
foreach ($modules as $module) {
|
||||
$this->call('translate:dir', ['dir' => $module.'/Resources/lang']);
|
||||
$this->crawlDirectory('modules');
|
||||
$this->crawlDirectory('templates', ['templates/Base']);
|
||||
$this->crawlDirectory('templates/Base');
|
||||
}
|
||||
|
||||
/**
|
||||
* Crawl directories and search for directories with translations
|
||||
*
|
||||
* @param $directory
|
||||
* @param array $ignoredDirectories
|
||||
*/
|
||||
protected function crawlDirectory($directory, $ignoredDirectories = [])
|
||||
{
|
||||
$directories = File::directories($directory);
|
||||
foreach ($directories as $dir) {
|
||||
|
||||
if (in_array($dir, $ignoredDirectories)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$this->call('translate:dir', ['dir' => $dir . '/Resources/lang']);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -6,7 +6,7 @@ use Illuminate\Console\Command;
|
||||
use Illuminate\Support\Facades\File;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
class Translations extends Command
|
||||
class TranslateDirectory extends Command
|
||||
{
|
||||
/**
|
||||
* The name and signature of the console command.
|
||||
@@ -25,7 +25,6 @@ class Translations extends Command
|
||||
|
||||
/**
|
||||
* Execute the console command.
|
||||
* @return mixed
|
||||
*/
|
||||
public function handle()
|
||||
{
|
||||
@@ -33,15 +32,16 @@ class Translations extends Command
|
||||
$defaultLocales = config('app.fallback_locale');
|
||||
$currentLocales = config('app.locale');
|
||||
|
||||
$defaultLocalesDir = $dir . '/' . $defaultLocales;
|
||||
$currentLocalesDir = $dir . '/' . $currentLocales;
|
||||
$defaultLocalesDir = base_path($dir . '/' . $defaultLocales);
|
||||
$currentLocalesDir = base_path($dir . '/' . $currentLocales);
|
||||
|
||||
if (!is_dir($defaultLocalesDir)) {
|
||||
// this is the place for checking for submodules
|
||||
|
||||
$modulePath = dirname(dirname($dir));
|
||||
|
||||
if (file_exists($modulePath . '/info.php')) {
|
||||
// does exist directory with translations?
|
||||
if (is_dir(base_path($modulePath . '/Resources/lang')) || file_exists(base_path($modulePath.DIRECTORY_SEPARATOR.'info.php'))) {
|
||||
$modules = File::directories($modulePath);
|
||||
foreach ($modules as $module) {
|
||||
$this->call('translate:dir', ['dir' => $module . '/Resources/lang']);
|
||||
@@ -18,7 +18,7 @@ class Kernel extends ConsoleKernel
|
||||
Commands\ChangePassword::class,
|
||||
Commands\InstallModule::class,
|
||||
Commands\InstallAllModules::class,
|
||||
Commands\Translations::class,
|
||||
Commands\TranslateDirectory::class,
|
||||
Commands\TranslateAll::class,
|
||||
Commands\InitDatabaseSchema::class,
|
||||
Commands\SetTemplate::class,
|
||||
|
||||
@@ -1,18 +0,0 @@
|
||||
<?php
|
||||
namespace App\Enumerations;
|
||||
|
||||
use App\Models\Content;
|
||||
|
||||
class ActiveContentStatuses extends BaseEnumeration
|
||||
{
|
||||
protected static function init()
|
||||
{
|
||||
foreach (ContentStatuses::getWithTranslations() as $key => $value) {
|
||||
if ($key == Content::STATUS_DELETED) {
|
||||
continue;
|
||||
}
|
||||
|
||||
self::push($key, $value);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -9,7 +9,6 @@ class ContentStatuses extends BaseEnumeration
|
||||
{
|
||||
$roles = [
|
||||
Content::STATUS_DRAFT => 'admin/contents.status_' . Content::STATUS_DRAFT,
|
||||
Content::STATUS_DELETED => 'admin/contents.status_' . Content::STATUS_DELETED,
|
||||
Content::STATUS_PROTECTED => 'admin/contents.status_' . Content::STATUS_PROTECTED,
|
||||
Content::STATUS_PUBLIC => 'admin/contents.status_' . Content::STATUS_PUBLIC
|
||||
];
|
||||
|
||||
@@ -15,7 +15,6 @@ class UserStates extends BaseEnumeration
|
||||
public static function init()
|
||||
{
|
||||
$items = [
|
||||
User::STATE_DELETED => 'admin/userManagement.status_' . User::STATE_DELETED,
|
||||
User::STATE_BLOCKED => 'admin/userManagement.status_' . User::STATE_BLOCKED,
|
||||
User::STATE_ACTIVE => 'admin/userManagement.status_' . User::STATE_ACTIVE
|
||||
];
|
||||
|
||||
@@ -12,7 +12,6 @@ class DeleteContent extends Event
|
||||
* @var Content
|
||||
*/
|
||||
public $page;
|
||||
public $revision;
|
||||
|
||||
/**
|
||||
* Create a new event instance.
|
||||
@@ -20,9 +19,8 @@ class DeleteContent extends Event
|
||||
* @param Content $page
|
||||
* @param $revision
|
||||
*/
|
||||
public function __construct(Content $page, $revision)
|
||||
public function __construct(Content $page)
|
||||
{
|
||||
$this->page = $page;
|
||||
$this->revision = $revision;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,8 +5,6 @@ use App\Models\User;
|
||||
|
||||
interface BaseModuleHandler
|
||||
{
|
||||
// public static function getModuleId();
|
||||
|
||||
/**
|
||||
* Register admin menu (or multiple ones)
|
||||
*
|
||||
@@ -18,9 +16,10 @@ interface BaseModuleHandler
|
||||
public static function registerAdminMenu(User $user);
|
||||
|
||||
/**
|
||||
* Install module
|
||||
* Install module.
|
||||
*
|
||||
* @return mixed
|
||||
* This method is called after inserting info about module into database. It can be called only using Artisan in
|
||||
* CLI.
|
||||
*/
|
||||
public static function install();
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
<?php
|
||||
namespace App\Handlers\Contracts;
|
||||
|
||||
use App\Models\Content;
|
||||
|
||||
/**
|
||||
* Interface ContentTitles
|
||||
*
|
||||
* Classes which implement this interface get the ability to rewrite default text on edit/create/overview of content
|
||||
* page.
|
||||
*
|
||||
* @package App\Handlers\Contracts
|
||||
*/
|
||||
interface 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();
|
||||
|
||||
/**
|
||||
* Title displayed above for for creating new content page
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function getCreateNewTitle();
|
||||
|
||||
/**
|
||||
* Title for form displayed for editin content page
|
||||
*
|
||||
* @param Content $content
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public static function getEditTitle(Content $content);
|
||||
}
|
||||
@@ -2,6 +2,7 @@
|
||||
namespace App\Handlers;
|
||||
|
||||
use App\Handlers\Contracts\AppHandler;
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\Content;
|
||||
|
||||
/**
|
||||
@@ -29,6 +30,19 @@ abstract class Handler extends BaseHandler implements AppHandler
|
||||
return History::class;
|
||||
}
|
||||
|
||||
/**
|
||||
* Render given module into visitor area.
|
||||
*
|
||||
* @param Content $content DB model from table contents
|
||||
* @param array $parameters parameters used for modifications/custom settings of given model
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public function render(Content $content, $parameters)
|
||||
{
|
||||
return Controller::VisitorsView($content->template, ['page' => $content, 'extra' => $parameters]);
|
||||
}
|
||||
|
||||
public static function getExtendedFormSections()
|
||||
{
|
||||
return [
|
||||
|
||||
@@ -28,6 +28,10 @@ class TemplateRegistrator
|
||||
* @var int ID of module
|
||||
*/
|
||||
protected $moduleId;
|
||||
/**
|
||||
* @var array list of all registered template paths
|
||||
*/
|
||||
protected $paths = [];
|
||||
|
||||
/**
|
||||
* Set base path
|
||||
@@ -64,7 +68,7 @@ class TemplateRegistrator
|
||||
*/
|
||||
public function setNamespace($namespace)
|
||||
{
|
||||
$this->namespace = $namespace . '::';
|
||||
$this->namespace = $namespace;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -80,25 +84,46 @@ class TemplateRegistrator
|
||||
* Registers new template path.
|
||||
* This method registeres given path itself with all subdirectories
|
||||
*
|
||||
* @param $baseDirectory
|
||||
* @param string $path path relatively to root of the project
|
||||
* @param string $name human readable identification of given template path
|
||||
*
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function register($path, $name)
|
||||
public function register($baseDirectory, $path, $name)
|
||||
{
|
||||
// check if base directory was set
|
||||
if (!$this->baseDirectory || !is_dir($this->baseDirectory)) {
|
||||
throw new \Exception('Set $baseDirectory before registering template path.');
|
||||
$this->paths[] = [
|
||||
'namespace' => $this->namespace,
|
||||
'moduleId' => $this->moduleId,
|
||||
'baseDirectory' => $baseDirectory,
|
||||
'path' => $this->baseDirectory . DIRECTORY_SEPARATOR . $path,
|
||||
'name' => $name
|
||||
];
|
||||
$this->unsetNamespace();
|
||||
}
|
||||
|
||||
$this->registeredPath = $this->baseDirectory . DIRECTORY_SEPARATOR . $path;
|
||||
/**
|
||||
* Save templates into database
|
||||
*/
|
||||
public function saveTemplates()
|
||||
{
|
||||
if (!is_array($this->paths) || empty($this->paths)) {
|
||||
return;
|
||||
}
|
||||
|
||||
foreach ($this->paths as $path) {
|
||||
if (!empty($path['namespace'])) {
|
||||
$this->setNamespace($path['namespace'] . '::');
|
||||
}
|
||||
$this->setModuleId($path['moduleId']);
|
||||
$this->setBaseDirectory($path['baseDirectory']);
|
||||
|
||||
$this->registeredPath = $this->baseDirectory . DIRECTORY_SEPARATOR . $path['path'];
|
||||
// register path
|
||||
$this->registerPath($this->registeredPath, $name);
|
||||
|
||||
$this->registerPath($this->registeredPath, $path['name']);
|
||||
$this->unsetNamespace();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get relative path to project root
|
||||
|
||||
@@ -3,32 +3,41 @@ namespace App\Handlers\Registrators;
|
||||
|
||||
use App\Enumerations\WidgetTypesWithHandlers;
|
||||
use App\Models\WidgetType;
|
||||
use App\Widgets\Contracts\PublicWidget;
|
||||
use Symfony\Component\Process\Exception\InvalidArgumentException;
|
||||
|
||||
class WidgetRegistrator
|
||||
{
|
||||
protected $widgets;
|
||||
protected $registeredWidgets = [];
|
||||
|
||||
function __construct()
|
||||
{
|
||||
$this->widgets = WidgetTypesWithHandlers::getSimple();
|
||||
}
|
||||
|
||||
/**
|
||||
* Method used for registering new widgets
|
||||
*
|
||||
* @param $classname
|
||||
* @param null $templateId
|
||||
* @param null $moduleId
|
||||
*/
|
||||
public function register($classname)
|
||||
public function register($classname, $templateId = null, $moduleId = null)
|
||||
{
|
||||
$class = new $classname;
|
||||
if (!$class instanceof PublicWidget) {
|
||||
throw new InvalidArgumentException($class . ' must implement PublicWidget interface.');
|
||||
$this->registeredWidgets[] = [
|
||||
'class' => $classname,
|
||||
'templateId' => $templateId,
|
||||
'moduleId' => $moduleId
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Install all non-installed widgets
|
||||
*/
|
||||
public function installWidgets()
|
||||
{
|
||||
$installed = WidgetTypesWithHandlers::getSimple();
|
||||
foreach ($this->registeredWidgets as $registeredWidget) {
|
||||
$classname = $registeredWidget['class'];
|
||||
$templateId = $registeredWidget['templateId'];
|
||||
$moduleId = $registeredWidget['moduleId'];
|
||||
|
||||
// register widget as new widget type
|
||||
if (!in_array($classname, $this->widgets)) {
|
||||
if (!in_array($classname, $installed)) {
|
||||
$widgetName = call_user_func($classname . '::getName');
|
||||
$widgetDescription = call_user_func($classname . '::getDescription');
|
||||
|
||||
@@ -36,6 +45,8 @@ class WidgetRegistrator
|
||||
WidgetType::create([
|
||||
'handler' => $classname,
|
||||
'name' => $widgetName,
|
||||
'module_id' => $moduleId,
|
||||
'template_id' => $templateId,
|
||||
'description' => $widgetDescription
|
||||
]);
|
||||
|
||||
@@ -44,3 +55,4 @@ class WidgetRegistrator
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -27,6 +27,7 @@ class Files extends Search
|
||||
$token = $this->tokenize($term);
|
||||
|
||||
return File::where('original_filename', 'LIKE', $token)
|
||||
->orWhere('name', 'LIKE', $token)
|
||||
->orWhere('keywords', 'LIKE', $token)
|
||||
->orWhere('description', 'LIKE', $token)
|
||||
->orWhere('mime_type', 'LIKE', $token)
|
||||
|
||||
@@ -0,0 +1,57 @@
|
||||
<?php
|
||||
namespace App\Helpers;
|
||||
|
||||
use App\Models\Module;
|
||||
|
||||
class CurrentTemplate
|
||||
{
|
||||
protected static $template;
|
||||
protected static $initialized = false;
|
||||
|
||||
/**
|
||||
* Getter for currently set template
|
||||
*
|
||||
* @return Module
|
||||
*/
|
||||
public static function get()
|
||||
{
|
||||
if (!self::$initialized) {
|
||||
self::$template = Module::where('is_template', true)
|
||||
->where('enabled', true)
|
||||
->first();
|
||||
|
||||
if (self::$template) {
|
||||
self::$template->module_settings = json_decode(self::$template->module_settings);
|
||||
}
|
||||
|
||||
self::$initialized = true;
|
||||
}
|
||||
|
||||
return self::$template;
|
||||
}
|
||||
|
||||
/**
|
||||
* Shortcut for getting template handler
|
||||
*
|
||||
* @return string
|
||||
* @throws \ErrorException
|
||||
*/
|
||||
public static function handler()
|
||||
{
|
||||
$template = self::get();
|
||||
|
||||
if (!$template) {
|
||||
throw new \ErrorException('No template selected, no handler available!');
|
||||
}
|
||||
|
||||
return $template->handler;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reset currently set template and load another one on next call of get() method.
|
||||
*/
|
||||
public static function reset()
|
||||
{
|
||||
self::$initialized = false;
|
||||
}
|
||||
}
|
||||
+21
-28
@@ -17,34 +17,42 @@ class FileManager
|
||||
switch ($type) {
|
||||
case 'image':
|
||||
|
||||
// try to check if file have thumbnail
|
||||
if (file_exists(config('app.thumbnail_url') . '/' . $file->filename)) {
|
||||
$url = config('app.thumbnail_url') . '/' . $file->filename;
|
||||
} else {
|
||||
$url = config('app.upload_url') . '/' . $file->filename;
|
||||
}
|
||||
$url = Template::thumbnail($file->filename);
|
||||
|
||||
return '<img src="' . $url . '" alt="' . $file->description . '" />';
|
||||
break;
|
||||
case 'text':
|
||||
return '<i class="fa fa-2x fa-file-text-o"></i>';
|
||||
return self::getIcon($file, 'fa-file-text-o');
|
||||
break;
|
||||
case 'application':
|
||||
switch ($subtype) {
|
||||
case 'pdf':
|
||||
return '<i class="fa fa-2x fa-file-pdf-o"></i>';
|
||||
return self::getIcon($file, 'fa-file-pdf-o');
|
||||
break;
|
||||
default:
|
||||
return '<i class="fa fa-2x fa-newspaper-o"></i>';
|
||||
return self::getIcon($file, 'fa-newspaper-o');
|
||||
break;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
return '<i class="fa fa-2x fa-question"></i>';
|
||||
return self::getIcon($file, 'fa-question');
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Shortcut for displaying icons
|
||||
*
|
||||
* @param $file
|
||||
* @param $icon
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected static function getIcon($file, $icon)
|
||||
{
|
||||
return '<p><i class="fa fa-2x ' . $icon . '"></i><br /><span>' . e(str_limit($file->original_filename, 15)) . '</span></p>';
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
@@ -83,7 +91,6 @@ class FileManager
|
||||
return '<img src="' . $url . '" alt="' . $file->description . '" />';
|
||||
break;
|
||||
case 'text':
|
||||
|
||||
$string = '<pre><code>';
|
||||
$string .= htmlspecialchars(file_get_contents($path));
|
||||
$string .= '</pre></code>';
|
||||
@@ -91,14 +98,7 @@ class FileManager
|
||||
return $string;
|
||||
break;
|
||||
case 'application':
|
||||
switch ($subtype) {
|
||||
case 'pdf':
|
||||
return '<i class="fa fa-file-pdf-o"></i>';
|
||||
break;
|
||||
default:
|
||||
return '<i class="fa fa-newspaper-o"></i>';
|
||||
break;
|
||||
}
|
||||
return '<iframe src = "'.asset('resources/assets/admin/js/viewerJs/').'/#'.Template::upload($file->filename).'" style="width: 100%; height: 50em" allowfullscreen webkitallowfullscreen></iframe>';
|
||||
break;
|
||||
default:
|
||||
return self::getPreview($file);
|
||||
@@ -119,19 +119,12 @@ class FileManager
|
||||
|
||||
switch ($type) {
|
||||
case 'text':
|
||||
|
||||
return [
|
||||
trans('admin/fileManager.encoding') => mb_detect_encoding(file_get_contents($path))
|
||||
];
|
||||
return [trans('admin/fileManager.encoding') => mb_detect_encoding(file_get_contents($path))];
|
||||
break;
|
||||
|
||||
case 'image':
|
||||
list ($width, $height) = getimagesize($path);
|
||||
|
||||
return [
|
||||
trans('admin/fileManager.resolution') => $height . ' x ' . $width,
|
||||
];
|
||||
|
||||
return [trans('admin/fileManager.resolution') => $height . ' x ' . $width,];
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,39 @@
|
||||
<?php
|
||||
namespace App\Helpers;
|
||||
|
||||
use App\Handlers\Contracts\AppHandler;
|
||||
use App\Models\Content;
|
||||
|
||||
/**
|
||||
* Class PageRenderer
|
||||
*
|
||||
* Simple class for rendering page for visitor
|
||||
*
|
||||
* @package App\Helpers
|
||||
*/
|
||||
class PageRenderer
|
||||
{
|
||||
/**
|
||||
* Render page
|
||||
*
|
||||
* @param Content $page
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public static function render(Content $page)
|
||||
{
|
||||
// decode module settings
|
||||
$page->module_settings = json_decode($page->module_settings);
|
||||
|
||||
// do something template-specific
|
||||
$parameters = call_user_func_array([CurrentTemplate::handler(), 'beforeRender'], [&$page]);
|
||||
|
||||
/**
|
||||
* @var $handler AppHandler
|
||||
*/
|
||||
// get handler
|
||||
$handler = new $page->module_handler;
|
||||
// render page
|
||||
return $handler->render($page, $parameters);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,83 @@
|
||||
<?php
|
||||
|
||||
namespace App\Helpers;
|
||||
|
||||
use App\Models\Settings as SettingsModel;
|
||||
|
||||
/**
|
||||
* Class Settings
|
||||
*
|
||||
* Helper class for easier obtaining system settings
|
||||
*
|
||||
* @package App\Helpers
|
||||
*/
|
||||
class Settings
|
||||
{
|
||||
/**
|
||||
* @var array List of all used settings
|
||||
*/
|
||||
protected static $settings;
|
||||
/**
|
||||
* @var bool Are data already initialized?
|
||||
*/
|
||||
protected static $initialized = false;
|
||||
|
||||
/**
|
||||
* Getter for settings determined with key.
|
||||
*
|
||||
* @param string $key settings key
|
||||
* @param string|null $default default value, which will be returned when given key does not exist
|
||||
*
|
||||
* @param null $exists
|
||||
*
|
||||
* @return null|string
|
||||
*/
|
||||
public static function get($key, $default = null, & $exists = null)
|
||||
{
|
||||
self::init();
|
||||
|
||||
if (isset(self::$settings->$key)) {
|
||||
$exists = true;
|
||||
self::$initialized = true;
|
||||
return self::$settings->$key;
|
||||
}
|
||||
|
||||
$exists = false;
|
||||
return $default;
|
||||
}
|
||||
|
||||
/**
|
||||
* Shortcut for obtaining settings saved as JSON
|
||||
*
|
||||
* @param $key
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public static function getJson($key)
|
||||
{
|
||||
return json_decode(self::get($key, '{}'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all settings
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public static function all()
|
||||
{
|
||||
self::init();
|
||||
|
||||
return self::$settings;
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize settings array
|
||||
*/
|
||||
private static function init()
|
||||
{
|
||||
if (!self::$initialized) {
|
||||
$model = new SettingsModel();
|
||||
self::$settings = $model->getAll();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -61,6 +61,18 @@ class Template
|
||||
return config('app.upload_url') . '/' . $filename;
|
||||
}
|
||||
|
||||
public static function thumbnail($filename)
|
||||
{
|
||||
// try to check if file have thumbnail
|
||||
if (file_exists(config('app.thumbnail_path') . '/' . $filename)) {
|
||||
$url = config('app.thumbnail_url') . '/' . $filename;
|
||||
} else {
|
||||
$url = self::upload($filename);
|
||||
}
|
||||
|
||||
return $url;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get path to given asset
|
||||
*
|
||||
|
||||
@@ -12,3 +12,19 @@ function e($value)
|
||||
{
|
||||
return htmlspecialchars($value, ENT_QUOTES, 'UTF-8');
|
||||
}
|
||||
|
||||
/**
|
||||
* Shortcut for \App\Helpers\Settings::get()
|
||||
*
|
||||
* @param $key
|
||||
* @param null $default
|
||||
*
|
||||
* @return null|string
|
||||
*/
|
||||
function setting($key, $default = null) {
|
||||
return \App\Helpers\Settings::get($key, $default);
|
||||
}
|
||||
|
||||
function asset_path($path) {
|
||||
return env('SITE_URL').'/assets/'.$path;
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Admin\ActionLog;
|
||||
|
||||
use App\Http\Controllers\Admin\Controller;
|
||||
use App\Models\ActionLog;
|
||||
use App\Models\User;
|
||||
use Illuminate\Support\Facades\Input;
|
||||
|
||||
class Overview extends Controller
|
||||
{
|
||||
/**
|
||||
* @var ActionLog
|
||||
*/
|
||||
private $log;
|
||||
|
||||
/**
|
||||
* ActionLog constructor.
|
||||
*
|
||||
* @param ActionLog $log
|
||||
*/
|
||||
public function __construct(ActionLog $log)
|
||||
{
|
||||
parent::__construct();
|
||||
$this->log = $log;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get overview of logged actions
|
||||
*
|
||||
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
|
||||
*/
|
||||
public function getOverview()
|
||||
{
|
||||
$user = null;
|
||||
$userId = Input::get('userId');
|
||||
|
||||
$actions = $this->log->getLogActionsQuery(true);
|
||||
|
||||
if ($userId) {
|
||||
$user = User::findOrFail($userId);
|
||||
$actions->where('users.id', $userId);
|
||||
}
|
||||
|
||||
$actions = $actions->paginate(25);
|
||||
|
||||
$this->log->translateLogMessages($actions);
|
||||
|
||||
return view('admin.actionLog.overview', ['actions' => $actions, 'user' => $user]);
|
||||
}
|
||||
}
|
||||
@@ -1,35 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Admin;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Http\Requests;
|
||||
use App\Models\ActionLog;
|
||||
|
||||
class ActionLogOverview extends Controller
|
||||
{
|
||||
/**
|
||||
* @var ActionLog
|
||||
*/
|
||||
private $log;
|
||||
|
||||
/**
|
||||
* ActionLog constructor.
|
||||
*
|
||||
* @param ActionLog $log
|
||||
*/
|
||||
public function __construct(ActionLog $log)
|
||||
{
|
||||
$this->log = $log;
|
||||
}
|
||||
|
||||
public function getOverview()
|
||||
{
|
||||
$actions = $this->log->getLogActionsQuery(true)
|
||||
->paginate(25);
|
||||
|
||||
$this->log->translateLogMessages($actions);
|
||||
|
||||
return view('admin.actionLog.overview', ['actions' => $actions]);
|
||||
}
|
||||
}
|
||||
+2
-1
@@ -1,7 +1,8 @@
|
||||
<?php
|
||||
namespace App\Http\Controllers\Admin;
|
||||
namespace App\Http\Controllers\Admin\Contents;
|
||||
|
||||
use App\Enumerations\ContentStatuses;
|
||||
use App\Http\Controllers\Admin\Controller;
|
||||
use App\Models\Content;
|
||||
use App\Models\Module;
|
||||
use Illuminate\Support\Facades\Input;
|
||||
+39
-14
@@ -1,8 +1,10 @@
|
||||
<?php
|
||||
namespace App\Http\Controllers\Admin;
|
||||
namespace App\Http\Controllers\Admin\Contents;
|
||||
|
||||
use App\Enumerations\ActiveContentStatuses;
|
||||
use App\Enumerations\ContentStatuses;
|
||||
use App\Events\CreateNewContent as CreateNewContentEvent;
|
||||
use App\Helpers\CurrentTemplate;
|
||||
use App\Http\Controllers\Admin\Controller;
|
||||
use App\Http\Requests\CreateNewContentRequest;
|
||||
use App\Models\Content;
|
||||
use App\Models\File;
|
||||
@@ -15,6 +17,13 @@ use Modules\Categories\Entities\Category;
|
||||
use Pingpong\Modules\Facades\Module as ModuleInstance;
|
||||
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
|
||||
|
||||
/**
|
||||
* Class CreateNewContent
|
||||
*
|
||||
* Controller for creating new content page.
|
||||
*
|
||||
* @package App\Http\Controllers\Admin\Contents
|
||||
*/
|
||||
class CreateNewContent extends Controller
|
||||
{
|
||||
/**
|
||||
@@ -26,6 +35,14 @@ class CreateNewContent extends Controller
|
||||
*/
|
||||
private $content;
|
||||
|
||||
/**
|
||||
* CreateNewContent constructor.
|
||||
*
|
||||
* Sets File and Content models into class variables
|
||||
*
|
||||
* @param File $file
|
||||
* @param Content $content
|
||||
*/
|
||||
public function __construct(File $file, Content $content)
|
||||
{
|
||||
parent::__construct();
|
||||
@@ -43,16 +60,23 @@ class CreateNewContent extends Controller
|
||||
public function getNew($moduleId)
|
||||
{
|
||||
$module = Module::findOrFail($moduleId);
|
||||
$statuses = ActiveContentStatuses::getWithTranslations();
|
||||
$statuses = ContentStatuses::getWithTranslations();
|
||||
|
||||
// set default page title
|
||||
$pageHeading = trans('admin/contents.new', ['name' => trans($module->name)]);
|
||||
if (is_callable([$module->handler, 'getCreateNewTitle'])) {
|
||||
$pageHeading = call_user_func([$module->handler, 'getCreateNewTitle']);
|
||||
}
|
||||
|
||||
// get list of usable templates
|
||||
$templates = Template::where('module_id', $moduleId)
|
||||
->select(['template_name', 'name', 'description'])
|
||||
->get();
|
||||
$categoryModule = ModuleInstance::get('categories');
|
||||
|
||||
// add categories, if supported
|
||||
$categoryModule = ModuleInstance::get('categories');
|
||||
$categories = [];
|
||||
if ($module->support_categories && $categoryModule->enabled()) {
|
||||
if ($module->support_categories && !is_null($categoryModule) && $categoryModule->enabled()) {
|
||||
$categories = Category::where('module_id', $moduleId)
|
||||
->get();
|
||||
}
|
||||
@@ -62,6 +86,7 @@ class CreateNewContent extends Controller
|
||||
|
||||
// render view
|
||||
return view('admin.content.new', [
|
||||
'pageHeading' => $pageHeading,
|
||||
'contentStatuses' => $statuses,
|
||||
'templates' => $templates,
|
||||
'moduleId' => $moduleId,
|
||||
@@ -87,10 +112,6 @@ class CreateNewContent extends Controller
|
||||
*/
|
||||
public function postNew(CreateNewContentRequest $request, $moduleId)
|
||||
{
|
||||
$page = new Content();
|
||||
$template = Module::where('is_template', true)
|
||||
->where('enabled', true)
|
||||
->first();
|
||||
try {
|
||||
$module = Module::findOrFail($moduleId);
|
||||
} catch (NotFoundHttpException $e) {
|
||||
@@ -100,6 +121,10 @@ class CreateNewContent extends Controller
|
||||
->with('error', trans('admin/contents.invalidModule'));
|
||||
}
|
||||
|
||||
// create new page
|
||||
$page = new Content();
|
||||
$page->template = $request->template;
|
||||
|
||||
// setup basic info
|
||||
$page->user_id = \Auth::user()->id;
|
||||
$page->language = LaravelLocalization::getCurrentLocale();
|
||||
@@ -111,10 +136,10 @@ class CreateNewContent extends Controller
|
||||
$page->meta_description = $request->metaDescription;
|
||||
$page->content = $request->pageContent;
|
||||
$page->status = $request->status;
|
||||
$page->template = $request->template;
|
||||
$page->module_handler = $module->handler;
|
||||
$page->category_id = (int)$request->category > 0 ? $request->category : null;
|
||||
|
||||
// is any parent page specified?
|
||||
if ($request->parentPage) {
|
||||
$page->parent_id = $request->parentPage;
|
||||
}
|
||||
@@ -124,13 +149,13 @@ class CreateNewContent extends Controller
|
||||
|
||||
$page->title_photo = $file ? $file['filename'] : null;
|
||||
|
||||
// let template to modify request and content page
|
||||
|
||||
call_user_func_array([$template->handler, 'beforeSave'], [&$page, $request]);
|
||||
|
||||
// save module-specific stuff
|
||||
call_user_func_array([$module->handler, 'createNew'], [&$page, $request]);
|
||||
|
||||
// let template to modify request and content page
|
||||
call_user_func_array([CurrentTemplate::handler(), 'beforeSave'], [&$page, $request]);
|
||||
|
||||
// save content of page before (possible) uploading related files
|
||||
$page->save();
|
||||
|
||||
// upload files assigned to content page
|
||||
+33
-34
@@ -1,14 +1,15 @@
|
||||
<?php
|
||||
namespace App\Http\Controllers\Admin;
|
||||
namespace App\Http\Controllers\Admin\Contents;
|
||||
|
||||
use App\Enumerations\ContentStatuses;
|
||||
use App\Enumerations\ModulesHandlerToId;
|
||||
use App\Events\AttemptToEditInvalidContent;
|
||||
use App\Events\DeleteContent;
|
||||
use App\Events\EditContent as EditContentEvent;
|
||||
use App\Events\MakeDraftFromContent;
|
||||
use App\Events\PublishContent;
|
||||
use App\Events\SetHomepage;
|
||||
use App\Helpers\CurrentTemplate;
|
||||
use App\Http\Controllers\Admin\Controller;
|
||||
use App\Http\Requests\EditContentRequest;
|
||||
use App\Http\Requests\Request;
|
||||
use App\Models\Content;
|
||||
@@ -34,6 +35,14 @@ class EditContent extends Controller
|
||||
*/
|
||||
private $file;
|
||||
|
||||
/**
|
||||
* EditContent constructor.
|
||||
*
|
||||
* Load ContentHistory and File into this controller
|
||||
*
|
||||
* @param ContentHistory $history
|
||||
* @param File $file
|
||||
*/
|
||||
public function __construct(ContentHistory $history, File $file)
|
||||
{
|
||||
$this->history = $history;
|
||||
@@ -56,13 +65,14 @@ class EditContent extends Controller
|
||||
$page = Content::findOrFail($id);
|
||||
$page->module_settings = json_decode($page->module_settings);
|
||||
|
||||
// select template
|
||||
$template = Module::where('is_template', true)
|
||||
->where('enabled', true)
|
||||
->first();
|
||||
|
||||
// get module ID
|
||||
$module = Module::where('handler', $page->module_handler)->firstOrFail();
|
||||
$module = Module::where('handler', $page->module_handler)
|
||||
->firstOrFail();
|
||||
|
||||
$pageHeading = trans('admin/contents.edit', ['name' => e($page->title)]);
|
||||
if (is_callable([$module->handler, 'getCreateNewTitle'])) {
|
||||
$pageHeading = call_user_func([$module->handler, 'getEditTitle'], $page);
|
||||
}
|
||||
|
||||
// get all Blade templates for rendering page
|
||||
$templates = Template::where('module_id', $module->id)
|
||||
@@ -74,18 +84,19 @@ class EditContent extends Controller
|
||||
|
||||
// add categories, if supported
|
||||
$categories = [];
|
||||
if ($module->support_categories && $categoryModule->enabled()) {
|
||||
if ($module->support_categories && !is_null($categoryModule) && $categoryModule->enabled()) {
|
||||
$categories = Category::where('module_id', $module->id)
|
||||
->get();
|
||||
}
|
||||
|
||||
// modify data for edit form according to installed template
|
||||
call_user_func_array([$template->handler, 'beforePopulatingEditForm'], [&$page]);
|
||||
call_user_func_array([CurrentTemplate::handler(), 'beforePopulatingEditForm'], [&$page]);
|
||||
|
||||
$history = $this->history->getStructuredHistoryOf($page);
|
||||
|
||||
// render view
|
||||
return view('admin.content.edit', [
|
||||
'pageHeading' => $pageHeading,
|
||||
'contentStatuses' => $statuses,
|
||||
'page' => $page,
|
||||
'module' => $module,
|
||||
@@ -116,10 +127,6 @@ class EditContent extends Controller
|
||||
* @var $page Content
|
||||
*/
|
||||
$page = Content::findOrFail($id);
|
||||
|
||||
$template = Module::where('is_template', true)
|
||||
->where('enabled', true)
|
||||
->first();
|
||||
} catch (NotFoundHttpException $e) {
|
||||
|
||||
// log attempt of invalid edit
|
||||
@@ -135,13 +142,16 @@ class EditContent extends Controller
|
||||
$file = $page->uploadTitlePhoto($request);
|
||||
|
||||
// let template to modify request and content page
|
||||
call_user_func_array([$template->handler, 'beforeSave'], [&$page, $request]);
|
||||
call_user_func_array([CurrentTemplate::handler(), 'beforeSave'], [&$page, $request]);
|
||||
|
||||
$request->url = Str::slug($request->url);
|
||||
$request->parentPage = $request->parentPage ? $request->parentPage : null;
|
||||
|
||||
$request->titlePhotoFilename = $file ? $file['filename'] : null;
|
||||
|
||||
if (!$file) {
|
||||
$request->titlePhotoFilename = empty($request->existingTitlePhoto) ? null : $request->existingTitlePhoto;
|
||||
} else {
|
||||
$request->titlePhotoFilename = $file['filename'];
|
||||
}
|
||||
|
||||
// array of fields in database and fields from request
|
||||
$fields = [
|
||||
@@ -179,7 +189,7 @@ class EditContent extends Controller
|
||||
|
||||
// something was changed, inform user
|
||||
return redirect()
|
||||
->route('content.edit', ['id' => $page->id])
|
||||
->route('content.overview')
|
||||
->with('success', trans('admin/contents.successfullyEdited'));
|
||||
}
|
||||
|
||||
@@ -197,7 +207,6 @@ class EditContent extends Controller
|
||||
{
|
||||
// get possible statuses
|
||||
$statuses = ContentStatuses::getWithTranslations();
|
||||
unset($statuses[Content::STATUS_DELETED]);
|
||||
|
||||
// check if given status is valid
|
||||
if (!isset($statuses[$status])) {
|
||||
@@ -260,23 +269,13 @@ class EditContent extends Controller
|
||||
|
||||
// change url to something unique
|
||||
$oldURL = $page->url;
|
||||
$page->url = uniqid($page->url . '_deleted');
|
||||
$page->save();
|
||||
|
||||
list ($revision, $changedColumns) = $page->updateWithHistory(['status' => 'status'], ['status' => Content::STATUS_DELETED]);
|
||||
$page->delete();
|
||||
|
||||
// let module to delete some extra content created during page's life
|
||||
call_user_func([$page->module_handler, 'delete'], $page);
|
||||
|
||||
// was something changed?
|
||||
if ($changedColumns == 0) {
|
||||
return redirect()
|
||||
->route('content.edit', ['id' => $page->id])
|
||||
->with('error', trans('admin/contents.nothingToEdit'));
|
||||
}
|
||||
|
||||
// trigger delete event
|
||||
Event::fire(new DeleteContent($page, $revision));
|
||||
Event::fire(new DeleteContent($page));
|
||||
|
||||
// redirect back to overview with info for user
|
||||
return redirect()
|
||||
@@ -305,7 +304,7 @@ class EditContent extends Controller
|
||||
} catch (NotFoundHttpException $e) {
|
||||
// page not found
|
||||
return redirect()
|
||||
->route('content.overview')
|
||||
->back()
|
||||
->with('error', trans('admin/contents.invalidPage'));
|
||||
}
|
||||
|
||||
@@ -320,7 +319,7 @@ class EditContent extends Controller
|
||||
// was something changed?
|
||||
if ($changedColumns == 0) {
|
||||
return redirect()
|
||||
->route('content.overview')
|
||||
->back()
|
||||
->with('error', trans('admin/contents.nothingToEdit'));
|
||||
}
|
||||
|
||||
@@ -329,7 +328,7 @@ class EditContent extends Controller
|
||||
|
||||
// redirect back to overview with info for user
|
||||
return redirect()
|
||||
->route('content.overview')
|
||||
->back()
|
||||
->with('success', trans('admin/contents.homepageSetup', [
|
||||
'name' => $page->title,
|
||||
'url' => $page->url
|
||||
+2
-1
@@ -1,6 +1,7 @@
|
||||
<?php
|
||||
namespace App\Http\Controllers\Admin;
|
||||
namespace App\Http\Controllers\Admin\Contents;
|
||||
|
||||
use App\Http\Controllers\Admin\Controller;
|
||||
use App\Models\Content;
|
||||
use App\Models\ContentHistory;
|
||||
|
||||
+2
-1
@@ -1,10 +1,11 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Admin;
|
||||
namespace App\Http\Controllers\Admin\CustomFields;
|
||||
|
||||
use App\Enumerations\CustomFieldResources;
|
||||
use App\Enumerations\CustomFieldTypes;
|
||||
use App\Events\CreateNewCustomField as CreateNewCustomFieldEvent;
|
||||
use App\Http\Controllers\Admin\Controller;
|
||||
use App\Http\Requests\NewCustomFieldRequest;
|
||||
use App\Models\CustomField;
|
||||
use Illuminate\Support\Facades\Event;
|
||||
+2
-3
@@ -1,11 +1,10 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Admin;
|
||||
namespace App\Http\Controllers\Admin\CustomFields;
|
||||
|
||||
use App\Enumerations\CustomFieldResources;
|
||||
use App\Enumerations\CustomFieldTypes;
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Http\Requests;
|
||||
use App\Http\Controllers\Admin\Controller;
|
||||
use App\Models\CustomField;
|
||||
|
||||
class CustomFieldsOverview extends Controller
|
||||
+2
-3
@@ -1,13 +1,12 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Admin;
|
||||
namespace App\Http\Controllers\Admin\CustomFields;
|
||||
|
||||
use App\Enumerations\CustomFieldResources;
|
||||
use App\Enumerations\CustomFieldTypes;
|
||||
use App\Events\DeleteCustomField;
|
||||
use App\Events\EditCustomField as EditCustomFieldEvent;
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Http\Requests;
|
||||
use App\Http\Controllers\Admin\Controller;
|
||||
use App\Http\Requests\EditCustomFieldRequest;
|
||||
use App\Models\CustomField;
|
||||
use Illuminate\Support\Facades\Event;
|
||||
@@ -1,17 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Admin;
|
||||
|
||||
use Illuminate\Http\Request;
|
||||
use App\Http\Requests;
|
||||
use Illuminate\Support\Facades\Session;
|
||||
|
||||
class Dashboard extends Controller
|
||||
{
|
||||
public function getIndex(Request $request) {
|
||||
|
||||
return redirect()->route('content.overview');
|
||||
|
||||
// return view('admin.dashboard');
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Admin\Dashboard;
|
||||
|
||||
use App\Http\Controllers\Admin\Controller;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class Dashboard extends Controller
|
||||
{
|
||||
public function getIndex(Request $request)
|
||||
{
|
||||
return redirect()->route('content.overview');
|
||||
}
|
||||
}
|
||||
+4
-4
@@ -1,8 +1,8 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Admin;
|
||||
namespace App\Http\Controllers\Admin\FileManager;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Http\Controllers\Admin\Controller;
|
||||
use App\Http\Requests;
|
||||
use App\Models\Directory;
|
||||
|
||||
@@ -30,8 +30,8 @@ class CreateNewDirectory extends Controller
|
||||
} else {
|
||||
return redirect()
|
||||
->route('upload.overview', ['id' => $request->parentDirectory])
|
||||
->with('error', trans('admin/fileManager.subdirectoryExists'))
|
||||
->withInput();
|
||||
->withInput()
|
||||
->with('error', trans('admin/fileManager.subdirectoryExists'));
|
||||
}
|
||||
}
|
||||
|
||||
+5
-5
@@ -1,8 +1,8 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Admin;
|
||||
namespace App\Http\Controllers\Admin\FileManager;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Http\Controllers\Admin\Controller;
|
||||
use App\Http\Requests;
|
||||
use App\Models\Directory;
|
||||
|
||||
@@ -12,7 +12,7 @@ class EditDirectory extends Controller
|
||||
* @param Requests\EditDirectoryRequest $request
|
||||
* @param $directoryId
|
||||
*
|
||||
* @return $this|\Illuminate\Http\JsonResponse
|
||||
* @return $this|\Illuminate\Http\JsonResponse|\Illuminate\Http\RedirectResponse
|
||||
*/
|
||||
public function postEdit(Requests\EditDirectoryRequest $request, $directoryId)
|
||||
{
|
||||
@@ -34,8 +34,8 @@ class EditDirectory extends Controller
|
||||
} else {
|
||||
return redirect()
|
||||
->route('upload.overview', ['id' => $directoryId])
|
||||
->with('error', trans('admin/fileManager.subdirectoryExists'))
|
||||
->withInput();
|
||||
->withInput()
|
||||
->with('error', trans('admin/fileManager.subdirectoryExists'));
|
||||
}
|
||||
}
|
||||
|
||||
+2
-2
@@ -1,10 +1,10 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Admin;
|
||||
namespace App\Http\Controllers\Admin\FileManager;
|
||||
|
||||
use App\Events\EditFile;
|
||||
use App\Helpers\FileManager;
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Http\Controllers\Admin\Controller;
|
||||
use App\Http\Requests\EditUploadedFileRequest;
|
||||
use App\Models\File;
|
||||
use Illuminate\Support\Facades\Event;
|
||||
+13
-31
@@ -1,8 +1,9 @@
|
||||
<?php
|
||||
namespace App\Http\Controllers\Admin;
|
||||
namespace App\Http\Controllers\Admin\FileManager;
|
||||
|
||||
use App\Models\File;
|
||||
use App\Http\Controllers\Admin\Controller;
|
||||
use App\Http\Requests\Request;
|
||||
use App\Models\File;
|
||||
use Symfony\Component\HttpFoundation\File\Exception\FileException;
|
||||
|
||||
class UploadFile extends Controller
|
||||
@@ -18,11 +19,12 @@ class UploadFile extends Controller
|
||||
$this->file = $file;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Uploads any file
|
||||
*
|
||||
* @return \Illuminate\Http\RedirectResponse
|
||||
* @param Request $request
|
||||
*
|
||||
* @return \Illuminate\Http\JsonResponse|\Illuminate\Http\RedirectResponse
|
||||
*/
|
||||
public function postFile(Request $request)
|
||||
{
|
||||
@@ -38,12 +40,6 @@ class UploadFile extends Controller
|
||||
$uploadedFiles[] = $uploadedFile;
|
||||
}
|
||||
|
||||
// we do not want to redirect
|
||||
if ($request->ajax()) {
|
||||
return $this->jsonResponse($uploadedFiles);
|
||||
}
|
||||
|
||||
// upload was not performed via ajax, redirect user
|
||||
return redirect()
|
||||
->route('upload.overview', ['directory' => $request->directoryId])
|
||||
->with('success', trans_choice('admin/fileManager.uploadSuccessfull', $successfullUploads));
|
||||
@@ -52,31 +48,17 @@ class UploadFile extends Controller
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Send message and redirect to upload.overview when upload failed
|
||||
*
|
||||
* @param $message
|
||||
*
|
||||
* @return \Illuminate\Http\RedirectResponse
|
||||
*/
|
||||
protected function invalidUpload($message)
|
||||
{
|
||||
return redirect()
|
||||
->route('upload.overview')
|
||||
->with('error', trans('admin/fileManager.' . $message));
|
||||
}
|
||||
|
||||
/**
|
||||
* Send response about uploaded file as JSON
|
||||
*
|
||||
* @param $uploadedFile
|
||||
*
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
*/
|
||||
private function jsonResponse($uploadedFile)
|
||||
{
|
||||
$filename = $uploadedFile['file']->getFilename();
|
||||
$url = config('app.upload_path') . DIRECTORY_SEPARATOR . $filename;
|
||||
|
||||
$data = [
|
||||
'filename' => $filename,
|
||||
'url' => $url,
|
||||
'id' => $uploadedFile['id']
|
||||
];
|
||||
|
||||
return response()->json($data);
|
||||
}
|
||||
}
|
||||
+2
-4
@@ -1,9 +1,7 @@
|
||||
<?php
|
||||
namespace App\Http\Controllers\Admin\FileManager;
|
||||
|
||||
namespace App\Http\Controllers\Admin;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Http\Requests;
|
||||
use App\Http\Controllers\Admin\Controller;
|
||||
use App\Models\Directory;
|
||||
use App\Models\File;
|
||||
use Illuminate\Support\Facades\Input;
|
||||
@@ -17,6 +17,16 @@ use Illuminate\Support\Facades\Hash;
|
||||
*/
|
||||
class Login extends Controller
|
||||
{
|
||||
/**
|
||||
* Display login form
|
||||
*
|
||||
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
|
||||
*/
|
||||
public function getLogin()
|
||||
{
|
||||
return view('admin.loginForm');
|
||||
}
|
||||
|
||||
/**
|
||||
* Login handler
|
||||
*
|
||||
@@ -51,6 +61,23 @@ class Login extends Controller
|
||||
return $this->loginFailed();
|
||||
}
|
||||
|
||||
/**
|
||||
* Logs out user
|
||||
*
|
||||
* @return \Illuminate\Http\RedirectResponse
|
||||
*/
|
||||
public function logout()
|
||||
{
|
||||
|
||||
// remove user information
|
||||
\Auth::logout();
|
||||
|
||||
// redirect to login form with info about successfull logout
|
||||
return redirect()
|
||||
->route('login')
|
||||
->with('success', trans('admin/common.logoutSuccessfull'));
|
||||
}
|
||||
|
||||
private function loginFailed()
|
||||
{
|
||||
return redirect()
|
||||
|
||||
+2
-9
@@ -1,12 +1,10 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Admin;
|
||||
namespace App\Http\Controllers\Admin\Templates;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Http\Requests;
|
||||
use App\Http\Controllers\Admin\Controller;
|
||||
use App\Http\Requests\CopyTemplateRequest;
|
||||
use App\Models\Template;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class CopyTemplate extends Controller
|
||||
{
|
||||
@@ -28,11 +26,6 @@ class CopyTemplate extends Controller
|
||||
// get template path
|
||||
$template = Template::findOrFail($oldTemplateId);
|
||||
|
||||
// @todo add check for uniqueness of template_name
|
||||
|
||||
// get template path
|
||||
$template = Template::findOrFail($oldTemplateId);
|
||||
|
||||
$namespace = null;
|
||||
if (strpos($template->template_name, '::')) {
|
||||
list($namespace) = explode('::', $template->template_name);
|
||||
+4
-1
@@ -1,6 +1,6 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Admin;
|
||||
namespace App\Http\Controllers\Admin\Templates;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Http\Requests;
|
||||
@@ -20,6 +20,9 @@ class EditTemplate extends Controller
|
||||
*/
|
||||
public function getEdit($template)
|
||||
{
|
||||
/**
|
||||
* @var $template Template
|
||||
*/
|
||||
$template = Template::findOrFail($template);
|
||||
$path = $template->getPath();
|
||||
|
||||
+2
-4
@@ -1,11 +1,9 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Admin;
|
||||
namespace App\Http\Controllers\Admin\Templates;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Http\Requests;
|
||||
use App\Http\Controllers\Admin\Controller;
|
||||
use App\Models\TemplatePath;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class TemplateOverview extends Controller
|
||||
{
|
||||
@@ -1,14 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Admin;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Http\Requests;
|
||||
use App\Http\Requests\CreateNewUserRequest;
|
||||
use App\Models\User;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Hash;
|
||||
|
||||
class UserProfile extends Controller {
|
||||
|
||||
}
|
||||
+2
-3
@@ -1,11 +1,10 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Admin;
|
||||
namespace App\Http\Controllers\Admin\Users;
|
||||
|
||||
use App\Enumerations\UserRoles;
|
||||
use App\Events\CreateNewUser as CreateNewUserEvent;
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Http\Requests;
|
||||
use App\Http\Controllers\Admin\Controller;
|
||||
use App\Http\Requests\CreateNewUserRequest;
|
||||
use App\Models\User;
|
||||
use Illuminate\Support\Facades\Event;
|
||||
+4
-8
@@ -1,12 +1,11 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Admin;
|
||||
namespace App\Http\Controllers\Admin\Users;
|
||||
|
||||
use App\Enumerations\UserRoles;
|
||||
use App\Enumerations\UserStates;
|
||||
use App\Events\EditUser as EditUserEvent;
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Http\Requests;
|
||||
use App\Http\Controllers\Admin\Controller;
|
||||
use App\Http\Requests\EditUserRequest;
|
||||
use App\Models\User;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
@@ -22,11 +21,8 @@ class EditUser extends Controller
|
||||
$id = Auth::user()->id;
|
||||
}
|
||||
|
||||
// @todo add some authorization (e.g. via can/cannot methods)
|
||||
|
||||
// try to find given user
|
||||
$user = User::where('status', '!=', User::STATE_DELETED)
|
||||
->findOrFail($id);
|
||||
$user = User::findOrFail($id);
|
||||
|
||||
$states = UserStates::getWithTranslations();
|
||||
$roles = UserRoles::getWithTranslations();
|
||||
@@ -87,7 +83,7 @@ class EditUser extends Controller
|
||||
Event::fire(new EditUserEvent($user));
|
||||
|
||||
return redirect()
|
||||
->route('users.detail', ['id' => $id])
|
||||
->back()
|
||||
->with('success', trans('admin/userManagement.userSuccessfullyEdited'));
|
||||
}
|
||||
}
|
||||
+3
-3
@@ -1,10 +1,10 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Admin;
|
||||
namespace App\Http\Controllers\Admin\Users;
|
||||
|
||||
use App\Enumerations\UserRoles;
|
||||
use App\Enumerations\UserStates;
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Http\Controllers\Admin\Controller;
|
||||
use App\Http\Requests;
|
||||
use App\Models\ActionLog;
|
||||
use App\Models\User;
|
||||
@@ -32,7 +32,7 @@ class UserDetail extends Controller
|
||||
// try to find given user
|
||||
$user = User::findOrFail($id);
|
||||
|
||||
$actions = $this->log->getUserActions($id);
|
||||
$actions = $this->log->getUserActions($id, 10);
|
||||
|
||||
$roles = UserRoles::getWithTranslations();
|
||||
$states = UserStates::getWithTranslations();
|
||||
+3
-6
@@ -1,24 +1,21 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Admin;
|
||||
namespace App\Http\Controllers\Admin\Users;
|
||||
|
||||
use App\Enumerations\UserRoles;
|
||||
use App\Enumerations\UserStates;
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Http\Requests;
|
||||
use App\Http\Controllers\Admin\Controller;
|
||||
use App\Models\User;
|
||||
|
||||
class UsersOverview extends Controller
|
||||
{
|
||||
public function getOverview($status = null, $perPage = 12)
|
||||
{
|
||||
$users = User::where('status', '<>', User::STATE_DELETED)
|
||||
->orderBy('id', 'desc');
|
||||
$users = User::orderBy('id', 'desc');
|
||||
|
||||
// get statuses
|
||||
$statuses = UserStates::getWithTranslations();
|
||||
$statuses[''] = trans('admin/userManagement.allStatuses');
|
||||
unset($statuses[User::STATE_DELETED]);
|
||||
|
||||
// filter using status
|
||||
if (!is_null($status) && isset($statuses[$status])) {
|
||||
+3
-4
@@ -1,9 +1,8 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Admin;
|
||||
namespace App\Http\Controllers\Admin\Widgets\Areas;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Http\Requests;
|
||||
use App\Http\Controllers\Admin\Controller;
|
||||
use App\Http\Requests\NewWidgetAreaRequest;
|
||||
use App\Models\WidgetArea;
|
||||
use Illuminate\Support\Facades\Event;
|
||||
@@ -17,7 +16,7 @@ class CreateNewWidgetArea extends Controller
|
||||
*/
|
||||
public function getNew()
|
||||
{
|
||||
return view('admin.widgets.area.new');
|
||||
return view('admin.widgets.area.new', ['area' => new WidgetArea()]);
|
||||
}
|
||||
|
||||
/**
|
||||
+20
-3
@@ -1,20 +1,37 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Admin;
|
||||
namespace App\Http\Controllers\Admin\Widgets\Areas;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Http\Controllers\Admin\Controller;
|
||||
use App\Http\Requests\EditWidgetAreaRequest;
|
||||
use App\Models\Widget;
|
||||
use App\Models\WidgetArea;
|
||||
use App\Models\WidgetInWidgetArea;
|
||||
use Illuminate\Database\Eloquent\ModelNotFoundException;
|
||||
use Illuminate\Support\Facades\Event;
|
||||
use Mcamara\LaravelLocalization\Facades\LaravelLocalization;
|
||||
|
||||
class EditWidgetArea extends Controller
|
||||
{
|
||||
/**
|
||||
* Display form for editing given widget area
|
||||
*
|
||||
* @param $id
|
||||
*
|
||||
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
|
||||
*/
|
||||
public function getEdit($id)
|
||||
{
|
||||
$area = WidgetArea::findOrFail($id);
|
||||
$associatedWidgetIds = WidgetInWidgetArea::getWidgetIdsFromArea($area->id);
|
||||
$widgets = Widget::where('language', LaravelLocalization::getCurrentLocale())
|
||||
->paginate(25);
|
||||
|
||||
return view('admin.widgets.area.edit', ['area' => $area]);
|
||||
return view('admin.widgets.area.edit', [
|
||||
'area' => $area,
|
||||
'widgets' => $widgets,
|
||||
'associatedWidgetIds' => $associatedWidgetIds
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
+2
-2
@@ -1,8 +1,8 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Admin;
|
||||
namespace App\Http\Controllers\Admin\Widgets\Areas;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Http\Controllers\Admin\Controller;
|
||||
use App\Http\Requests;
|
||||
use App\Models\WidgetArea;
|
||||
|
||||
+3
-4
@@ -1,11 +1,10 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Admin;
|
||||
namespace App\Http\Controllers\Admin\Widgets;
|
||||
|
||||
use App\Events\AssignWidget;
|
||||
use App\Events\RemoveWidgetFromArea;
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Http\Requests;
|
||||
use App\Http\Controllers\Admin\Controller;
|
||||
use App\Models\Widget;
|
||||
use App\Models\WidgetArea;
|
||||
use App\Models\WidgetInWidgetArea;
|
||||
@@ -46,7 +45,7 @@ class AssociateWidget extends Controller
|
||||
Event::fire(new AssignWidget($widget, $widgetArea));
|
||||
|
||||
return redirect()
|
||||
->route('widgets.associate', ['widgetArea' => $widgetAreaId])
|
||||
->back()
|
||||
->with('success', trans('admin/widgets.successfullyAssociated'));
|
||||
}
|
||||
|
||||
+2
-2
@@ -1,8 +1,8 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Admin;
|
||||
namespace App\Http\Controllers\Admin\Widgets;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Http\Controllers\Admin\Controller;
|
||||
use App\Http\Requests\NewWidgetRequest;
|
||||
use App\Models\Widget;
|
||||
use App\Models\WidgetType;
|
||||
+2
-1
@@ -1,6 +1,7 @@
|
||||
<?php
|
||||
namespace App\Http\Controllers\Admin;
|
||||
namespace App\Http\Controllers\Admin\Widgets;
|
||||
|
||||
use App\Http\Controllers\Admin\Controller;
|
||||
use App\Http\Requests\EditWidgetRequest;
|
||||
use App\Models\Widget;
|
||||
use App\Widgets\Exceptions\MissingParameterException;
|
||||
+2
-1
@@ -1,6 +1,7 @@
|
||||
<?php
|
||||
namespace App\Http\Controllers\Admin;
|
||||
namespace App\Http\Controllers\Admin\Widgets;
|
||||
|
||||
use App\Http\Controllers\Admin\Controller;
|
||||
use App\Models\Widget;
|
||||
use Mcamara\LaravelLocalization\Facades\LaravelLocalization;
|
||||
|
||||
@@ -2,11 +2,9 @@
|
||||
|
||||
namespace App\Http\Controllers\Visitor;
|
||||
|
||||
use App\Helpers\PageRenderer;
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Http\Requests;
|
||||
use App\Models\Content;
|
||||
use App\Models\Module;
|
||||
use App\Models\Template;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
|
||||
class ContentPage extends Controller
|
||||
@@ -55,18 +53,6 @@ class ContentPage extends Controller
|
||||
// add one new "view" for page
|
||||
$page->view();
|
||||
|
||||
// decode module settings
|
||||
$page->module_settings = json_decode($page->module_settings);
|
||||
|
||||
// get handler
|
||||
$handler = new $page->module_handler;
|
||||
|
||||
$template = Module::where('is_template', true)->where('enabled', true)->first();
|
||||
|
||||
// do something template-specific
|
||||
call_user_func_array([$template->handler, 'beforeRender'], [&$page]);
|
||||
|
||||
// render page
|
||||
return $handler->render($page, '');
|
||||
return PageRenderer::render($page);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,10 +17,10 @@ class Homepage extends ContentPage
|
||||
}
|
||||
|
||||
// render page
|
||||
try {
|
||||
// try {
|
||||
return $this->renderPage($page);
|
||||
} catch (\Exception $e) {
|
||||
return view('errors.homepageNotAvailable', ['exception' => $e, 'reason' => 'exception']);
|
||||
}
|
||||
// } catch (\Exception $e) {
|
||||
// return view('errors.homepageNotAvailable', ['exception' => $e, 'reason' => 'exception']);
|
||||
// }
|
||||
}
|
||||
}
|
||||
|
||||
+18
-6
@@ -2,8 +2,13 @@
|
||||
|
||||
namespace App\Http;
|
||||
|
||||
use App\Http\Middleware\TemplatePathInstaller;
|
||||
use App\Http\Middleware\WidgetInstaller;
|
||||
use Illuminate\Foundation\Http\Kernel as HttpKernel;
|
||||
use Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode;
|
||||
use Illuminate\Routing\Middleware\ThrottleRequests;
|
||||
use Illuminate\Session\Middleware\StartSession;
|
||||
use Illuminate\View\Middleware\ShareErrorsFromSession;
|
||||
use Mcamara\LaravelLocalization\Middleware\LaravelLocalizationRedirectFilter;
|
||||
use Mcamara\LaravelLocalization\Middleware\LaravelLocalizationRoutes;
|
||||
use Mcamara\LaravelLocalization\Middleware\LocaleSessionRedirect;
|
||||
@@ -18,7 +23,12 @@ class Kernel extends HttpKernel
|
||||
* @var array
|
||||
*/
|
||||
protected $middleware = [
|
||||
\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
|
||||
LocaleSessionRedirect::class,
|
||||
LaravelLocalizationRedirectFilter::class,
|
||||
Middleware\EncryptCookies::class,
|
||||
StartSession::class,
|
||||
ShareErrorsFromSession::class,
|
||||
Middleware\VerifyCsrfToken::class
|
||||
];
|
||||
/**
|
||||
* The application's route middleware groups.
|
||||
@@ -27,11 +37,13 @@ class Kernel extends HttpKernel
|
||||
*/
|
||||
protected $middlewareGroups = [
|
||||
'web' => [
|
||||
Middleware\EncryptCookies::class,
|
||||
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
|
||||
\Illuminate\Session\Middleware\StartSession::class,
|
||||
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
|
||||
Middleware\VerifyCsrfToken::class,
|
||||
CheckForMaintenanceMode::class,
|
||||
],
|
||||
'admin' => [
|
||||
Middleware\Authenticate::class,
|
||||
Middleware\AdminMenuRegistrator::class,
|
||||
TemplatePathInstaller::class,
|
||||
WidgetInstaller::class,
|
||||
],
|
||||
'api' => [
|
||||
'throttle:60,1',
|
||||
|
||||
@@ -33,6 +33,9 @@ class AdminMenuRegistrator
|
||||
|
||||
// iterate over all enabled modules
|
||||
foreach ($modules as $key => $module) {
|
||||
if (!is_callable([$module->handler, 'registerAdminMenu']))
|
||||
continue;
|
||||
|
||||
// try to register menus
|
||||
try {
|
||||
call_user_func([$module->handler, 'registerAdminMenu'], $user);
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Middleware;
|
||||
|
||||
use App\Handlers\Registrators\TemplateRegistrator;
|
||||
use Closure;
|
||||
use Illuminate\Support\Facades\App;
|
||||
|
||||
class TemplatePathInstaller
|
||||
{
|
||||
/**
|
||||
* Handle an incoming request.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @param \Closure $next
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public function handle($request, Closure $next)
|
||||
{
|
||||
/**
|
||||
* @var $registator TemplateRegistrator
|
||||
*/
|
||||
$registator = App::make('registerTemplateDir');
|
||||
|
||||
// install registered widgets
|
||||
$registator->saveTemplates();
|
||||
|
||||
return $next($request);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Middleware;
|
||||
|
||||
use App\Handlers\Registrators\WidgetRegistrator;
|
||||
use Closure;
|
||||
use Illuminate\Support\Facades\App;
|
||||
|
||||
class WidgetInstaller
|
||||
{
|
||||
/**
|
||||
* Handle an incoming request.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @param \Closure $next
|
||||
* @return mixed
|
||||
*/
|
||||
public function handle($request, Closure $next)
|
||||
{
|
||||
/**
|
||||
* @var $registator WidgetRegistrator
|
||||
*/
|
||||
$registator = App::make('registerWidget');
|
||||
|
||||
// install registered widgets
|
||||
$registator->installWidgets();
|
||||
|
||||
return $next($request);
|
||||
}
|
||||
}
|
||||
@@ -15,7 +15,6 @@ class CreateNewContentRequest extends Request
|
||||
'titlePhoto' => 'image',
|
||||
'title' => 'required',
|
||||
'url' => 'required|unique:contents,url',
|
||||
'template' => 'required|exists:templates,template_name',
|
||||
'status' => 'required|in:draft,protected,public',
|
||||
'title_photo' => 'exists:files,id',
|
||||
'parentPage' => 'exists:contents,id',
|
||||
|
||||
@@ -20,7 +20,6 @@ class EditContentRequest extends Request
|
||||
return [
|
||||
'title' => 'required',
|
||||
'url' => 'required|unique:contents,url,' . $this->id,
|
||||
'template' => 'required|exists:templates,template_name',
|
||||
'published_from' => 'date',
|
||||
'published_to' => 'date',
|
||||
'title_photo' => 'exists:files,id',
|
||||
|
||||
+12
-223
@@ -13,246 +13,36 @@ Route::pattern('url', '[0-9\-a-z]+');
|
||||
|
||||
Route::group([
|
||||
'prefix' => LaravelLocalization::setLocale(),
|
||||
'middleware' => ['localeSessionRedirect', 'localizationRedirect']
|
||||
], function () {
|
||||
/**
|
||||
* This route group serves to handle request in admin
|
||||
*/
|
||||
Route::group([
|
||||
'middleware' => ['web', 'auth', 'adminMenu'],
|
||||
'middleware' => ['admin'],
|
||||
'namespace' => 'Admin',
|
||||
'prefix' => 'admin'
|
||||
], function () {
|
||||
|
||||
// these routes are available only for user with role admin
|
||||
Route::group(['middleware' => 'onlyAdmin'], function () {
|
||||
// display form for creating new user
|
||||
Route::get('users/new', 'CreateNewUser@getNewUser')
|
||||
->name('users.new');
|
||||
|
||||
// POST methods
|
||||
// display form for creating new user
|
||||
Route::post('users/new', 'CreateNewUser@postRegistration')
|
||||
->name('users.newPost');
|
||||
|
||||
// display form for edit of existing user
|
||||
Route::get('users/edit/{id}', 'EditUser@getEditUser')
|
||||
->name('users.edit');
|
||||
|
||||
// form for adding new custom field
|
||||
Route::get('customfields/new', 'CreateNewCustomField@getNew')
|
||||
->name('customfields.new');
|
||||
|
||||
// form for editing custom field
|
||||
Route::get('customfields/edit/{id}', 'EditCustomField@getEditCustomField')
|
||||
->name('customfields.edit');
|
||||
|
||||
// form for adding new custom field
|
||||
Route::post('customfields/new', 'CreateNewCustomField@postNew')
|
||||
->name('customfields.newPost');
|
||||
|
||||
// form for editing custom field
|
||||
Route::post('customfields/edit/{id}', 'EditCustomField@postEditCustomField')
|
||||
->name('customfields.editPost');
|
||||
|
||||
Route::get('customfields/delete/{id}', 'EditCustomField@deleteCustomField')
|
||||
->name('customfields.delete');
|
||||
|
||||
Route::get('templates/overview/path/{id}', 'TemplateOverview@getPath')
|
||||
->name('templates.overview');
|
||||
|
||||
Route::post('templates/copy', 'CopyTemplate@createCopy')
|
||||
->name('templates.postCopy');
|
||||
|
||||
// Route::get('templates/new/{pathId}', 'TemplateOverview@getPath')
|
||||
// ->name('templates.new');
|
||||
|
||||
Route::get('templates/edit/{id}', 'EditTemplate@getEdit')
|
||||
->name('templates.edit');
|
||||
|
||||
Route::post('templates/edit/{id}', 'EditTemplate@postEdit')
|
||||
->name('templates.postEdit');
|
||||
});
|
||||
|
||||
// list of all static pages
|
||||
Route::get('content/overview/{moduleId?}/{status?}', 'ContentOverview@getOverview')
|
||||
->name('content.overview');
|
||||
|
||||
// form for creating new static page
|
||||
Route::get('content/new/{moduleId}', 'CreateNewContent@getNew')
|
||||
->name('content.new');
|
||||
|
||||
// form for editing existing static page
|
||||
Route::get('content/edit/{id}', 'EditContent@getEdit')
|
||||
->name('content.edit');
|
||||
|
||||
// post method for creating new static page
|
||||
Route::post('content/new/{moduleId}', 'CreateNewContent@postNew')
|
||||
->name('content.newPost');
|
||||
|
||||
// post method for creating new static page
|
||||
Route::post('content/edit/{id}', 'EditContent@postEdit')
|
||||
->name('content.editPost');
|
||||
|
||||
// routes for quick actions
|
||||
|
||||
// change status of page (protected, public or draft)
|
||||
Route::get('content/status/{id}/{status}', 'EditContent@changeStatus')
|
||||
->name('content.changeStatus');
|
||||
|
||||
// set homepage
|
||||
Route::get('content/homepage/{id}', 'EditContent@setHomepage')
|
||||
->name('content.setHomepage');
|
||||
|
||||
// delete page
|
||||
Route::get('content/delete/{id}', 'EditContent@deletePage')
|
||||
->name('content.delete');
|
||||
|
||||
// these routes are available for all logged (authenticated) users
|
||||
// include all routes in routes/admin subfolder
|
||||
$files = ['contents', 'fileManager', 'settings', 'templates', 'users', 'widgets'];
|
||||
foreach ($files as $file) {
|
||||
require_once __DIR__ . DIRECTORY_SEPARATOR . 'routes' . DIRECTORY_SEPARATOR . 'admin' . DIRECTORY_SEPARATOR . $file . '.php';
|
||||
}
|
||||
|
||||
// display dashboard with some usefull information
|
||||
Route::get('/', 'Dashboard@getIndex')
|
||||
Route::get('/', 'Dashboard\Dashboard@getIndex')
|
||||
->name('admin.dashboard');
|
||||
|
||||
// display user detail in admin
|
||||
Route::get('users/detail/{id?}', 'UserDetail@getDetail')
|
||||
->name('users.detail');
|
||||
|
||||
// method for saving edited data of user
|
||||
Route::post('users/edit/{id}', 'EditUser@postEdit')
|
||||
->name('users.editPost');
|
||||
|
||||
// display list of all users registered into our system
|
||||
Route::get('users/overview/{state?}/{perPage?}', 'UsersOverview@getOverview')
|
||||
->name('users.overview');
|
||||
|
||||
// history of changes for specified page
|
||||
Route::get('history/{id}', 'History@getOverview')
|
||||
->name('content.history');
|
||||
|
||||
// history of changes for specified page
|
||||
Route::get('history/{revision}/{id}', 'History@getDiff')
|
||||
->name('history.diff');
|
||||
|
||||
// list of all actions
|
||||
Route::get('actions', 'ActionLogOverview@getOverview')
|
||||
Route::get('actions', 'ActionLog\Overview@getOverview')
|
||||
->name('log.overview');
|
||||
|
||||
// routes for widget areas
|
||||
Route::get('widgets/areas/overview', 'WidgetAreaOverview@getOverview')
|
||||
->name('widgetareas.overview');
|
||||
|
||||
// form for new widget area
|
||||
Route::get('widgets/areas/new', 'CreateNewWidgetArea@getNew')
|
||||
->name('widgetareas.new');
|
||||
|
||||
// form for new widget area
|
||||
Route::post('widgets/areas/new', 'CreateNewWidgetArea@postNew')
|
||||
->name('widgetareas.postNew');
|
||||
|
||||
// edit form for widget area
|
||||
Route::get('widgets/areas/edit/{id}', 'EditWidgetArea@getEdit')
|
||||
->name('widgetareas.edit');
|
||||
|
||||
Route::post('widgets/areas/edit/{id}', 'EditWidgetArea@postEdit')
|
||||
->name('widgetareas.postEdit');
|
||||
|
||||
// edit form for widget area
|
||||
Route::get('widgets/areas/delete/{id}', 'EditWidgetArea@deleteArea')
|
||||
->name('widgetareas.delete');
|
||||
|
||||
// list of all installed widget types
|
||||
Route::get('widgets/overview', 'WidgetsOverview@getOverview')
|
||||
->name('widgets.overview');
|
||||
|
||||
// create new instance of widget of given type
|
||||
Route::get('widgets/new/{type}', 'CreateNewWidget@getNew')
|
||||
->name('widgets.new');
|
||||
|
||||
Route::post('widgets/new/{type}', 'CreateNewWidget@postNew')
|
||||
->name('widgets.postNew');
|
||||
|
||||
// edit widget settings
|
||||
Route::get('widgets/edit/{id}', 'EditWidget@getEdit')
|
||||
->name('widgets.edit');
|
||||
|
||||
// delete widget settings
|
||||
Route::get('widgets/delete/{id}', 'EditWidget@deleteWidget')
|
||||
->name('widgets.delete');
|
||||
|
||||
Route::post('widgets/edit/{id}', 'EditWidget@postEdit')
|
||||
->name('widgets.postEdit');
|
||||
|
||||
// display form for association of widget and widget area
|
||||
Route::get('widgets/associate/{widgetArea}', 'AssociateWidget@getList')
|
||||
->name('widgets.associate');
|
||||
|
||||
Route::get('widgets/deassociate/{widgetId}/{widgetArea}', 'AssociateWidget@deleteAssociation')
|
||||
->name('widgets.deleteAssociation');
|
||||
|
||||
Route::get('widgets/associate/{widgetId}/{widgetArea}', 'AssociateWidget@makeAssociation')
|
||||
->name('widgets.makeAssociation');
|
||||
|
||||
// uploader methods
|
||||
Route::get('directories/new/{id?}', 'CreateNewDirectory@getNew')
|
||||
->name('upload.newDirectory');
|
||||
|
||||
Route::get('directories/edit/{id}', 'EditDirectory@getEdit')
|
||||
->name('upload.editDirectory');
|
||||
|
||||
Route::post('directories/edit/{id}', 'EditDirectory@postEdit')
|
||||
->name('upload.postEditDirectory');
|
||||
|
||||
Route::get('files/overview/{id?}/{type?}/{subtype?}', 'UploadedFilesOverview@getOverview')
|
||||
->name('upload.overview');
|
||||
|
||||
route::post('directories/new', 'CreateNewDirectory@postNew')
|
||||
->name('upload.postNewDirectory');
|
||||
|
||||
Route::get('upload/detail/{id}', 'EditUploadedFile@getDetail')
|
||||
->name('upload.detail');
|
||||
|
||||
Route::post('upload/detail/{id}', 'EditUploadedFile@postEdit')
|
||||
->name('upload.postEdit');
|
||||
|
||||
Route::get('upload/delete/{id}', 'EditUploadedFile@deleteFile')
|
||||
->name('upload.delete');
|
||||
|
||||
// uploader methods
|
||||
Route::post('upload/file', 'UploadFile@postFile')
|
||||
->name('upload.postFile');
|
||||
|
||||
Route::post('upload/image', 'UploadFile@postImage')
|
||||
->name('upload.postImage');
|
||||
|
||||
// form with settings
|
||||
Route::get('settings', 'Settings@getOverview')
|
||||
->name('settings.overview');
|
||||
|
||||
Route::post('settings', 'Settings@saveSettings')
|
||||
->name('settings.save');
|
||||
|
||||
// search form with results
|
||||
Route::get('search', 'Search@getSearch')
|
||||
->name('search');
|
||||
|
||||
// custom fields
|
||||
// ------------------------------
|
||||
|
||||
// list of all custom fields
|
||||
Route::get('customfields/overview', 'CustomFieldsOverview@getOverview')
|
||||
->name('customfields.overview');
|
||||
|
||||
// logout method
|
||||
Route::get('logout', function () {
|
||||
|
||||
// remove user information
|
||||
\Auth::logout();
|
||||
|
||||
// redirect to login form with info about successfull logout
|
||||
return redirect()
|
||||
->route('login')
|
||||
->with('success', trans('admin/common.logoutSuccessfull'));
|
||||
})
|
||||
Route::get('logout', 'Login@logout')
|
||||
->name('logout');
|
||||
});
|
||||
|
||||
@@ -264,13 +54,12 @@ Route::group([
|
||||
|
||||
Route::group(['middleware' => ['web']], function () {
|
||||
|
||||
// Homepage
|
||||
Route::get('/', 'Visitor\Homepage@getIndex')
|
||||
->name('page.index');
|
||||
|
||||
// display login form
|
||||
Route::get('admin/login', function () {
|
||||
return view('admin.loginForm');
|
||||
})
|
||||
Route::get('admin/login', 'Admin\Login@getLogin')
|
||||
->name('loginForm');
|
||||
|
||||
// handle login
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
<?php
|
||||
Route::group(['namespace' => 'Contents'], function () {
|
||||
// list of all static pages
|
||||
Route::get('content/overview/{moduleId?}/{status?}', 'ContentOverview@getOverview')
|
||||
->name('content.overview');
|
||||
|
||||
// form for creating new static page
|
||||
Route::get('content/new/{moduleId}', 'CreateNewContent@getNew')
|
||||
->name('content.new');
|
||||
|
||||
// form for editing existing static page
|
||||
Route::get('content/edit/{id}', 'EditContent@getEdit')
|
||||
->name('content.edit');
|
||||
|
||||
// post method for creating new static page
|
||||
Route::post('content/new/{moduleId}', 'CreateNewContent@postNew')
|
||||
->name('content.newPost');
|
||||
|
||||
// post method for creating new static page
|
||||
Route::post('content/edit/{id}', 'EditContent@postEdit')
|
||||
->name('content.editPost');
|
||||
|
||||
// change status of page (protected, public or draft)
|
||||
Route::get('content/status/{id}/{status}', 'EditContent@changeStatus')
|
||||
->name('content.changeStatus');
|
||||
|
||||
// set homepage
|
||||
Route::get('content/homepage/{id}', 'EditContent@setHomepage')
|
||||
->name('content.setHomepage');
|
||||
|
||||
// delete page
|
||||
Route::get('content/delete/{id}', 'EditContent@deletePage')
|
||||
->name('content.delete');
|
||||
|
||||
// history of changes for specified page
|
||||
Route::get('history/{id}', 'History@getOverview')
|
||||
->name('content.history');
|
||||
|
||||
// history of changes for specified page
|
||||
Route::get('history/{revision}/{id}', 'History@getDiff')
|
||||
->name('history.diff');
|
||||
});
|
||||
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
Route::group(['namespace' => 'FileManager'], function () {
|
||||
|
||||
Route::get('files/overview/{id?}/{type?}/{subtype?}', 'UploadedFilesOverview@getOverview')
|
||||
->name('upload.overview');
|
||||
|
||||
// uploader methods
|
||||
Route::get('directories/new/{id?}', 'CreateNewDirectory@getNew')
|
||||
->name('upload.newDirectory');
|
||||
|
||||
Route::get('directories/edit/{id}', 'EditDirectory@getEdit')
|
||||
->name('upload.editDirectory');
|
||||
|
||||
Route::post('directories/edit/{id}', 'EditDirectory@postEdit')
|
||||
->name('upload.postEditDirectory');
|
||||
|
||||
route::post('directories/new', 'CreateNewDirectory@postNew')
|
||||
->name('upload.postNewDirectory');
|
||||
|
||||
Route::get('upload/detail/{id}', 'EditUploadedFile@getDetail')
|
||||
->name('upload.detail');
|
||||
|
||||
Route::post('upload/detail/{id}', 'EditUploadedFile@postEdit')
|
||||
->name('upload.postEdit');
|
||||
|
||||
Route::get('upload/delete/{id}', 'EditUploadedFile@deleteFile')
|
||||
->name('upload.delete');
|
||||
|
||||
// uploader methods
|
||||
Route::post('upload', 'UploadFile@postFile')
|
||||
->name('upload.postFile');
|
||||
});
|
||||
@@ -0,0 +1,7 @@
|
||||
<?php
|
||||
// form with settings
|
||||
Route::get('settings', 'Settings@getOverview')
|
||||
->name('settings.overview');
|
||||
|
||||
Route::post('settings', 'Settings@saveSettings')
|
||||
->name('settings.save');
|
||||
@@ -0,0 +1,15 @@
|
||||
<?php
|
||||
// these routes are available only for user with role admin
|
||||
Route::group(['middleware' => 'onlyAdmin', 'namespace' => 'Templates'], function () {
|
||||
Route::get('templates/overview/path/{id}', 'TemplateOverview@getPath')
|
||||
->name('templates.overview');
|
||||
|
||||
Route::post('templates/copy', 'CopyTemplate@createCopy')
|
||||
->name('templates.postCopy');
|
||||
|
||||
Route::get('templates/edit/{id}', 'EditTemplate@getEdit')
|
||||
->name('templates.edit');
|
||||
|
||||
Route::post('templates/edit/{id}', 'EditTemplate@postEdit')
|
||||
->name('templates.postEdit');
|
||||
});
|
||||
@@ -0,0 +1,27 @@
|
||||
<?php
|
||||
Route::group(['namespace' => 'Users'], function () {
|
||||
// display form for creating new user
|
||||
Route::get('users/new', 'CreateNewUser@getNewUser')
|
||||
->name('users.new');
|
||||
|
||||
// POST methods
|
||||
// display form for creating new user
|
||||
Route::post('users/new', 'CreateNewUser@postRegistration')
|
||||
->name('users.newPost');
|
||||
|
||||
// display form for edit of existing user
|
||||
Route::get('users/edit/{id}', 'EditUser@getEditUser')
|
||||
->name('users.edit');
|
||||
|
||||
// display user detail in admin
|
||||
Route::get('users/detail/{id?}', 'UserDetail@getDetail')
|
||||
->name('users.detail');
|
||||
|
||||
// method for saving edited data of user
|
||||
Route::post('users/edit/{id}', 'EditUser@postEdit')
|
||||
->name('users.editPost');
|
||||
|
||||
// display list of all users registered into our system
|
||||
Route::get('users/overview/{state?}/{perPage?}', 'UsersOverview@getOverview')
|
||||
->name('users.overview');
|
||||
});
|
||||
@@ -0,0 +1,60 @@
|
||||
<?php
|
||||
// routes for widget areas
|
||||
Route::group(['namespace' => 'Widgets'], function () {
|
||||
|
||||
// list of all installed widget types
|
||||
Route::get('widgets/overview', 'WidgetsOverview@getOverview')
|
||||
->name('widgets.overview');
|
||||
|
||||
// create new instance of widget of given type
|
||||
Route::get('widgets/new/{type}', 'CreateNewWidget@getNew')
|
||||
->name('widgets.new');
|
||||
|
||||
Route::post('widgets/new/{type}', 'CreateNewWidget@postNew')
|
||||
->name('widgets.postNew');
|
||||
|
||||
// edit widget settings
|
||||
Route::get('widgets/edit/{id}', 'EditWidget@getEdit')
|
||||
->name('widgets.edit');
|
||||
|
||||
// delete widget settings
|
||||
Route::get('widgets/delete/{id}', 'EditWidget@deleteWidget')
|
||||
->name('widgets.delete');
|
||||
|
||||
Route::post('widgets/edit/{id}', 'EditWidget@postEdit')
|
||||
->name('widgets.postEdit');
|
||||
|
||||
// display form for association of widget and widget area
|
||||
Route::get('widgets/associate/{widgetArea}', 'AssociateWidget@getList')
|
||||
->name('widgets.associate');
|
||||
|
||||
Route::get('widgets/deassociate/{widgetId}/{widgetArea}', 'AssociateWidget@deleteAssociation')
|
||||
->name('widgets.deleteAssociation');
|
||||
|
||||
Route::get('widgets/associate/{widgetId}/{widgetArea}', 'AssociateWidget@makeAssociation')
|
||||
->name('widgets.makeAssociation');
|
||||
|
||||
Route::group(['namespace' => 'Areas'], function () {
|
||||
Route::get('widgets/areas/overview', 'WidgetAreaOverview@getOverview')
|
||||
->name('widgetareas.overview');
|
||||
|
||||
// form for new widget area
|
||||
Route::get('widgets/areas/new', 'CreateNewWidgetArea@getNew')
|
||||
->name('widgetareas.new');
|
||||
|
||||
// form for new widget area
|
||||
Route::post('widgets/areas/new', 'CreateNewWidgetArea@postNew')
|
||||
->name('widgetareas.postNew');
|
||||
|
||||
// edit form for widget area
|
||||
Route::get('widgets/areas/edit/{id}', 'EditWidgetArea@getEdit')
|
||||
->name('widgetareas.edit');
|
||||
|
||||
Route::post('widgets/areas/edit/{id}', 'EditWidgetArea@postEdit')
|
||||
->name('widgetareas.postEdit');
|
||||
|
||||
// edit form for widget area
|
||||
Route::get('widgets/areas/delete/{id}', 'EditWidgetArea@deleteArea')
|
||||
->name('widgetareas.delete');
|
||||
});
|
||||
});
|
||||
@@ -22,7 +22,6 @@ class LogDeleteContent extends Logger
|
||||
'id' => $event->page->id,
|
||||
'url' => $event->page->url,
|
||||
'title' => $event->page->title,
|
||||
'revision' => $event->revision
|
||||
];
|
||||
|
||||
$this->saveLog($parameters);
|
||||
|
||||
@@ -5,6 +5,7 @@ namespace App\Models;
|
||||
use App\Enumerations\ContentStatuses;
|
||||
use App\Http\Requests\Request;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||
use Illuminate\Support\Facades\App;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Mcamara\LaravelLocalization\Facades\LaravelLocalization;
|
||||
@@ -15,6 +16,7 @@ use Modules\Categories\Entities\Category;
|
||||
*/
|
||||
class Content extends Model
|
||||
{
|
||||
use SoftDeletes;
|
||||
public $timestamps = true;
|
||||
protected $fillable = [
|
||||
'user_id',
|
||||
@@ -38,7 +40,6 @@ class Content extends Model
|
||||
protected $guarded = [];
|
||||
protected $subpages = [];
|
||||
protected $subpagesInit = false;
|
||||
const STATUS_DELETED = 'deleted';
|
||||
const STATUS_DRAFT = 'draft';
|
||||
const STATUS_PROTECTED = 'protected';
|
||||
const STATUS_PUBLIC = 'public';
|
||||
@@ -59,8 +60,7 @@ class Content extends Model
|
||||
*/
|
||||
public function getPageQuery()
|
||||
{
|
||||
return Content::where('status', '!=', Content::STATUS_DELETED)
|
||||
->where('status', '!=', Content::STATUS_DRAFT);
|
||||
return Content::where('status', '!=', Content::STATUS_DRAFT);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -179,6 +179,7 @@ class Content extends Model
|
||||
* @param bool $handler
|
||||
* @param bool $status
|
||||
* @param bool $joinAuthor
|
||||
* @param bool $joinParent
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
@@ -186,9 +187,10 @@ class Content extends Model
|
||||
{
|
||||
$query = DB::table('contents')
|
||||
->select('contents.*', 'modules.name AS module_name', 'modules.id AS module_id')
|
||||
->where('contents.status', '<>', self::STATUS_DELETED)
|
||||
->where('contents.language', LaravelLocalization::getCurrentLocale())
|
||||
->join('modules', 'modules.handler', '=', 'contents.module_handler')
|
||||
->whereNull('contents.deleted_at')
|
||||
->where('contents.language', LaravelLocalization::getCurrentLocale())
|
||||
->where('modules.enabled', 1)
|
||||
->orderBy('created_at', 'DESC');
|
||||
|
||||
// filter results using handler
|
||||
|
||||
@@ -4,9 +4,13 @@ namespace App\Models;
|
||||
|
||||
use App\Events\UploadFile;
|
||||
use App\Http\Requests\Request;
|
||||
use Franzose\ClosureTable\Extensions\Str;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\Support\Facades\Event;
|
||||
use Illuminate\Support\Facades\File as FileFacade;
|
||||
use Intervention\Image\Constraint;
|
||||
use Intervention\Image\Facades\Image;
|
||||
use Symfony\Component\HttpFoundation\File\File as SymphonyFile;
|
||||
use Symfony\Component\HttpFoundation\File\UploadedFile;
|
||||
|
||||
@@ -63,6 +67,12 @@ class File extends Model
|
||||
// save file into physical location (local FS)
|
||||
$uploadedFile = $file->move($destination, $filename);
|
||||
|
||||
// is uploaded file an image?
|
||||
if (Str::startsWith($uploadedFile->getMimeType(), 'image')) {
|
||||
// yes, create thumbnail
|
||||
$this->createThumbnail($uploadedFile);
|
||||
}
|
||||
|
||||
// insert record into database
|
||||
$id = $this->saveIntoDatabase($uploadedFile, $request, $file->getClientOriginalName());
|
||||
|
||||
@@ -118,4 +128,29 @@ class File extends Model
|
||||
|
||||
return $newFile->id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create thumbnail of given image
|
||||
*
|
||||
* @param SymphonyFile $file
|
||||
*/
|
||||
private function createThumbnail(SymphonyFile $file)
|
||||
{
|
||||
// does thumbnail directory exist?
|
||||
if (!is_dir(config('app.thumbnail_path'))) {
|
||||
FileFacade::makeDirectory(config('app.thumbnail_path'));
|
||||
}
|
||||
|
||||
// get image instance
|
||||
$image = Image::make(config('app.upload_path') . DIRECTORY_SEPARATOR . $file->getFilename());
|
||||
|
||||
// resize image and keep aspect ration
|
||||
$image->resize(env('THUMBNAIL_WIDTH', 300), null, function (Constraint $constraint) {
|
||||
$constraint->aspectRatio();
|
||||
$constraint->upsize();
|
||||
});
|
||||
|
||||
// save thumbnail with lower quality
|
||||
$image->save(config('app.thumbnail_path') . DIRECTORY_SEPARATOR . $file->getFilename(), 75);
|
||||
}
|
||||
}
|
||||
+3
-2
@@ -6,6 +6,7 @@ use App\Helpers\Gravatar;
|
||||
use Illuminate\Auth\Authenticatable;
|
||||
use Illuminate\Contracts\Auth\Authenticatable as AuthenticableInterface;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||
use Illuminate\Foundation\Auth\Access\Authorizable;
|
||||
|
||||
/**
|
||||
@@ -13,8 +14,8 @@ use Illuminate\Foundation\Auth\Access\Authorizable;
|
||||
*/
|
||||
class User extends Model implements AuthenticableInterface
|
||||
{
|
||||
use Authenticatable, Authorizable;
|
||||
public $timestamps = false;
|
||||
use SoftDeletes, Authenticatable, Authorizable;
|
||||
public $timestamps = true;
|
||||
protected $fillable = [
|
||||
'email',
|
||||
'username',
|
||||
|
||||
@@ -17,7 +17,9 @@ class Widget extends Model
|
||||
'user_id',
|
||||
'name',
|
||||
'settings',
|
||||
'description'
|
||||
'language',
|
||||
'description',
|
||||
'deletable'
|
||||
];
|
||||
protected $guarded = [];
|
||||
|
||||
@@ -31,7 +33,6 @@ class Widget extends Model
|
||||
*/
|
||||
public function createNew(WidgetType $widgetType, $data)
|
||||
{
|
||||
|
||||
// convert array or whatever into object
|
||||
if (!is_object($data)) {
|
||||
$data = (object)$data;
|
||||
|
||||
@@ -15,7 +15,8 @@ class WidgetArea extends Model
|
||||
protected $fillable = [
|
||||
'name',
|
||||
'code',
|
||||
'description'
|
||||
'description',
|
||||
'deletable'
|
||||
];
|
||||
protected $guarded = [];
|
||||
|
||||
|
||||
@@ -15,6 +15,8 @@ class WidgetType extends Model
|
||||
protected $fillable = [
|
||||
'handler',
|
||||
'name',
|
||||
'template_id',
|
||||
'module_id',
|
||||
'description'
|
||||
];
|
||||
|
||||
|
||||
@@ -16,6 +16,7 @@ use App\Widgets\HtmlCode\HtmlCode;
|
||||
use App\Widgets\Menu\Menu;
|
||||
use App\Widgets\OrbitSlider\OrbitSlider;
|
||||
use Illuminate\Support\Facades\App;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\Support\Facades\File;
|
||||
use Illuminate\Support\ServiceProvider;
|
||||
use Symfony\Component\Process\Exception\InvalidArgumentException;
|
||||
@@ -34,7 +35,6 @@ class AppServiceProvider extends ServiceProvider
|
||||
}
|
||||
|
||||
$this->registerWidgets();
|
||||
$this->registerTemplates();
|
||||
$this->registerSettings();
|
||||
$this->registerSearch();
|
||||
}
|
||||
@@ -97,24 +97,6 @@ class AppServiceProvider extends ServiceProvider
|
||||
$registrator->register(HtmlCode::class);
|
||||
$registrator->register(Menu::class);
|
||||
$registrator->register(OrbitSlider::class);
|
||||
|
||||
// register some menu extensions
|
||||
// $menuExtensions = $this->app->make('registerMenuExtension');
|
||||
// $menuExtensions->register(new URL());
|
||||
}
|
||||
|
||||
/**
|
||||
* Register path with editable contents
|
||||
*/
|
||||
private function registerTemplates()
|
||||
{
|
||||
/**
|
||||
* @var $registrator TemplateRegistrator
|
||||
*/
|
||||
// $registrator = $this->app->make('registerTemplateDir');
|
||||
// $registrator->setBaseDirectory('resources/views/visitor');
|
||||
|
||||
// $registrator->register(config('app.theme'), 'admin/templates.core');
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -21,11 +21,11 @@ class GlobalViewDataProvider extends ServiceProvider
|
||||
return;
|
||||
}
|
||||
|
||||
$settings = new Settings();
|
||||
|
||||
foreach ($settings->getForView() as $key => $value) {
|
||||
view()->share($key, $value);
|
||||
}
|
||||
// $settings = new Settings();
|
||||
//
|
||||
// foreach ($settings->getForView() as $key => $value) {
|
||||
// view()->share($key, $value);
|
||||
// }
|
||||
|
||||
$this->extendBlade();
|
||||
}
|
||||
@@ -65,7 +65,7 @@ class GlobalViewDataProvider extends ServiceProvider
|
||||
return preg_replace($pattern, $code, $view);
|
||||
});
|
||||
|
||||
// shortcut for loading uploaded images
|
||||
// shortcut for loading uploaded files
|
||||
Blade::extend(function ($view) {
|
||||
$pattern = $this->createPattern('upload');
|
||||
$code = '<?php echo \App\Helpers\Template::upload($2); ?>';
|
||||
@@ -73,6 +73,14 @@ class GlobalViewDataProvider extends ServiceProvider
|
||||
return preg_replace($pattern, $code, $view);
|
||||
});
|
||||
|
||||
// shortcut for loading thumbnails of uploaded images
|
||||
Blade::extend(function ($view) {
|
||||
$pattern = $this->createPattern('thumbnail');
|
||||
$code = '<?php echo \App\Helpers\Template::thumbnail($2); ?>';
|
||||
|
||||
return preg_replace($pattern, $code, $view);
|
||||
});
|
||||
|
||||
// shortcut for displaying Gravatar
|
||||
Blade::extend(function ($view) {
|
||||
$pattern = $this->createPattern('gravatar');
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
namespace App\Providers;
|
||||
|
||||
use App\Models\Module;
|
||||
use Illuminate\Support\Facades\App;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use Illuminate\Support\ServiceProvider;
|
||||
|
||||
@@ -17,7 +16,7 @@ class ModuleManager extends ServiceProvider
|
||||
{
|
||||
// this service provider needs published config - config is merged right after this service provider
|
||||
try {
|
||||
$modules = Module::where('is_template', false)
|
||||
$modules = Module::where('enabled', true)
|
||||
->get();
|
||||
} catch (\Exception $e) {
|
||||
// ignore error
|
||||
@@ -26,6 +25,20 @@ class ModuleManager extends ServiceProvider
|
||||
|
||||
// iterate over all modules and enable or disable them
|
||||
foreach ($modules as $module) {
|
||||
|
||||
$module->module_settings = json_decode($module->module_settings);
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
@@ -48,7 +61,7 @@ class ModuleManager extends ServiceProvider
|
||||
*/
|
||||
private function createModulesJson(Module $module)
|
||||
{
|
||||
$config = json_decode($module->module_settings);
|
||||
$config = $module->module_settings;
|
||||
|
||||
if (is_null($config)) {
|
||||
return;
|
||||
|
||||
@@ -9,11 +9,11 @@ use Pingpong\Modules\Json;
|
||||
class SubmodulesManager extends ServiceProvider
|
||||
{
|
||||
/**
|
||||
* Register the service provider.
|
||||
* Boot submodules
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function register()
|
||||
public function boot()
|
||||
{
|
||||
$enabledModules = \Module::enabled();
|
||||
|
||||
@@ -52,4 +52,14 @@ class SubmodulesManager extends ServiceProvider
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Register the service provider.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function register()
|
||||
{
|
||||
// TODO: Implement register() method.
|
||||
}
|
||||
}
|
||||
@@ -3,32 +3,13 @@
|
||||
namespace App\Providers;
|
||||
|
||||
use App\Handlers\Registrators\TemplateRegistrator;
|
||||
use App\Models\Module;
|
||||
use App\Helpers\CurrentTemplate;
|
||||
use App\Models\Template;
|
||||
use Illuminate\Support\Facades\App;
|
||||
use Illuminate\Support\ServiceProvider;
|
||||
use InvalidArgumentException;
|
||||
|
||||
class TemplateServiceProvider extends ServiceProvider
|
||||
{
|
||||
private function getTemplate()
|
||||
{
|
||||
// select template
|
||||
try {
|
||||
$template = Module::where('is_template', true)
|
||||
->where('enabled', true)
|
||||
->first();
|
||||
|
||||
if ($template) {
|
||||
$template->settings = json_decode($template->module_settings);
|
||||
}
|
||||
} catch (\Exception $e) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return $template;
|
||||
}
|
||||
|
||||
public function boot()
|
||||
{
|
||||
// ignore running from artisan
|
||||
@@ -38,28 +19,24 @@ class TemplateServiceProvider extends ServiceProvider
|
||||
return;
|
||||
}
|
||||
|
||||
$template = $this->getTemplate();
|
||||
$template = CurrentTemplate::get();
|
||||
|
||||
if (!$template) {
|
||||
throw new \ErrorException('Template is not set, cannot continue');
|
||||
}
|
||||
|
||||
// include files
|
||||
$files = isset($template->settings->files) ? $template->settings->files : [];
|
||||
$files = isset($template->module_settings->files) ? $template->module_settings->files : [];
|
||||
|
||||
foreach ($files as $file) {
|
||||
include_once $file;
|
||||
}
|
||||
|
||||
// register templates
|
||||
$publicTemplates = call_user_func([$template->handler, 'getPublicTemplatePaths']);
|
||||
$publicTemplates = call_user_func([CurrentTemplate::handler(), 'getPublicTemplatePaths']);
|
||||
|
||||
if (!is_array($publicTemplates)) {
|
||||
throw new \ErrorException($template->handler . '::getPublicTemplatePaths() must return array!');
|
||||
}
|
||||
|
||||
if (empty($publicTemplates)) {
|
||||
return;
|
||||
throw new \ErrorException(CurrentTemplate::handler() . '::getPublicTemplatePaths() must return array!');
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -70,17 +47,16 @@ class TemplateServiceProvider extends ServiceProvider
|
||||
// setup some global variables
|
||||
$module = strtolower($template['module']);
|
||||
$namespace = isset($template['namespace']) ? $template['namespace'] : strtolower($template['module']);
|
||||
try {
|
||||
$registrator->setBaseDirectory('resources/views/modules/' . $module);
|
||||
$registrator->setNamespace($namespace);
|
||||
$registrator->setModuleId(call_user_func([config($module . '.handler'), 'getModuleId']));
|
||||
|
||||
// register path with current template name
|
||||
$registrator->register('visitor', $template['templateName']);
|
||||
} catch (InvalidArgumentException $e) {
|
||||
// ignore this exception
|
||||
}
|
||||
|
||||
$registrator->setNamespace($namespace);
|
||||
$registrator->setModuleId(call_user_func([config($module . '.handler'), 'getModuleId']));
|
||||
$registrator->register('resources/views/modules/' . $module, 'visitor', $template['templateName']);
|
||||
}
|
||||
|
||||
// register also global resources/views/visitor directory
|
||||
$registrator->register('resources/views/', 'visitor', 'admin/templates.core');
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -97,12 +73,12 @@ class TemplateServiceProvider extends ServiceProvider
|
||||
*/
|
||||
private function publishViewResources()
|
||||
{
|
||||
$template = $this->getTemplate();
|
||||
$template = CurrentTemplate::get();
|
||||
if (!$template) {
|
||||
return;
|
||||
}
|
||||
|
||||
$templateDir = app_path('../templates/' . $template->settings->staticName . '/Resources');
|
||||
$templateDir = base_path('templates/' . $template->module_settings->staticName . '/Resources');
|
||||
$assetsDir = $templateDir . '/' . Template::ASSETS_DIRECTORY;
|
||||
$viewsDir = $templateDir . '/views';
|
||||
|
||||
|
||||
@@ -72,8 +72,7 @@ class Menu extends NonInstallableWidget
|
||||
|
||||
public static function selectContentPages($ids)
|
||||
{
|
||||
$pages = Content::where('status', '!=', Content::STATUS_DELETED)
|
||||
->where('language', LaravelLocalization::getCurrentLocale())
|
||||
$pages = Content::where('language', LaravelLocalization::getCurrentLocale())
|
||||
->whereIn('id', $ids)
|
||||
->get();
|
||||
$used = [];
|
||||
|
||||
+2
-1
@@ -13,7 +13,8 @@
|
||||
"pingpong/menus": "^2.2",
|
||||
"watson/sitemap": "^2.0",
|
||||
"mcamara/laravel-localization": "^1.1",
|
||||
"franzose/closure-table": "^4.1"
|
||||
"franzose/closure-table": "^4.1",
|
||||
"intervention/image": "^2.3"
|
||||
},
|
||||
"require-dev": {
|
||||
"fzaninotto/faker": "~1.4",
|
||||
|
||||
Generated
+179
-2
@@ -4,8 +4,8 @@
|
||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
|
||||
"This file is @generated automatically"
|
||||
],
|
||||
"hash": "34fec17afe62b99ed90d0f72d3536a7b",
|
||||
"content-hash": "58f7e332f9be3faf1f8d481191cf1bb1",
|
||||
"hash": "066078c74cc6b8d99111c0e9b4b385d6",
|
||||
"content-hash": "1574402e32047ac8589b6fc08d6d744c",
|
||||
"packages": [
|
||||
{
|
||||
"name": "classpreloader/classpreloader",
|
||||
@@ -704,6 +704,133 @@
|
||||
],
|
||||
"time": "2016-07-08 08:19:46"
|
||||
},
|
||||
{
|
||||
"name": "guzzlehttp/psr7",
|
||||
"version": "dev-master",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/guzzle/psr7.git",
|
||||
"reference": "64862e854f876bc5aee2996cab2f552db8586065"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/guzzle/psr7/zipball/64862e854f876bc5aee2996cab2f552db8586065",
|
||||
"reference": "64862e854f876bc5aee2996cab2f552db8586065",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.4.0",
|
||||
"psr/http-message": "~1.0"
|
||||
},
|
||||
"provide": {
|
||||
"psr/http-message-implementation": "1.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "~4.0"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "1.4-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"GuzzleHttp\\Psr7\\": "src/"
|
||||
},
|
||||
"files": [
|
||||
"src/functions_include.php"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Michael Dowling",
|
||||
"email": "mtdowling@gmail.com",
|
||||
"homepage": "https://github.com/mtdowling"
|
||||
},
|
||||
{
|
||||
"name": "Tobias Schultze",
|
||||
"homepage": "https://github.com/Tobion"
|
||||
}
|
||||
],
|
||||
"description": "PSR-7 message implementation that also provides common utility methods",
|
||||
"keywords": [
|
||||
"http",
|
||||
"message",
|
||||
"request",
|
||||
"response",
|
||||
"stream",
|
||||
"uri",
|
||||
"url"
|
||||
],
|
||||
"time": "2016-08-03 09:33:34"
|
||||
},
|
||||
{
|
||||
"name": "intervention/image",
|
||||
"version": "dev-master",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/Intervention/image.git",
|
||||
"reference": "4064a980324f6c3bfa2bd981dfb247afa705ec3c"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/Intervention/image/zipball/4064a980324f6c3bfa2bd981dfb247afa705ec3c",
|
||||
"reference": "4064a980324f6c3bfa2bd981dfb247afa705ec3c",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"ext-fileinfo": "*",
|
||||
"guzzlehttp/psr7": "~1.1",
|
||||
"php": ">=5.4.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"mockery/mockery": "~0.9.2",
|
||||
"phpunit/phpunit": "3.*"
|
||||
},
|
||||
"suggest": {
|
||||
"ext-gd": "to use GD library based image processing.",
|
||||
"ext-imagick": "to use Imagick based image processing.",
|
||||
"intervention/imagecache": "Caching extension for the Intervention Image library"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "2.3-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Intervention\\Image\\": "src/Intervention/Image"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Oliver Vogel",
|
||||
"email": "oliver@olivervogel.net",
|
||||
"homepage": "http://olivervogel.net/"
|
||||
}
|
||||
],
|
||||
"description": "Image handling and manipulation library with support for Laravel integration",
|
||||
"homepage": "http://image.intervention.io/",
|
||||
"keywords": [
|
||||
"gd",
|
||||
"image",
|
||||
"imagick",
|
||||
"laravel",
|
||||
"thumbnail",
|
||||
"watermark"
|
||||
],
|
||||
"time": "2016-09-01 17:04:03"
|
||||
},
|
||||
{
|
||||
"name": "jakub-onderka/php-console-color",
|
||||
"version": "0.1",
|
||||
@@ -1632,6 +1759,56 @@
|
||||
"description": "Support Component of Pingpong Sky Package",
|
||||
"time": "2016-01-07 08:23:04"
|
||||
},
|
||||
{
|
||||
"name": "psr/http-message",
|
||||
"version": "dev-master",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/php-fig/http-message.git",
|
||||
"reference": "f6561bf28d520154e4b0ec72be95418abe6d9363"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363",
|
||||
"reference": "f6561bf28d520154e4b0ec72be95418abe6d9363",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.3.0"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "1.0.x-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Psr\\Http\\Message\\": "src/"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "PHP-FIG",
|
||||
"homepage": "http://www.php-fig.org/"
|
||||
}
|
||||
],
|
||||
"description": "Common interface for HTTP messages",
|
||||
"homepage": "https://github.com/php-fig/http-message",
|
||||
"keywords": [
|
||||
"http",
|
||||
"http-message",
|
||||
"psr",
|
||||
"psr-7",
|
||||
"request",
|
||||
"response"
|
||||
],
|
||||
"time": "2016-08-06 14:39:51"
|
||||
},
|
||||
{
|
||||
"name": "psr/log",
|
||||
"version": "dev-master",
|
||||
|
||||
@@ -17,4 +17,5 @@
|
||||
!services.php
|
||||
!session.php
|
||||
!sitemap.php
|
||||
!image.php
|
||||
!view.php
|
||||
|
||||
@@ -161,6 +161,7 @@ return [
|
||||
App\Providers\SubmodulesManager::class,
|
||||
Franzose\ClosureTable\ClosureTableServiceProvider::class,
|
||||
\Watson\Sitemap\SitemapServiceProvider::class,
|
||||
Intervention\Image\ImageServiceProvider::class,
|
||||
/*
|
||||
* Application Service Providers...
|
||||
*/
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
<?php
|
||||
|
||||
return array(
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Image Driver
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Intervention Image supports "GD Library" and "Imagick" to process images
|
||||
| internally. You may choose one of them according to your PHP
|
||||
| configuration. By default PHP's "GD Library" implementation is used.
|
||||
|
|
||||
| Supported: "gd", "imagick"
|
||||
|
|
||||
*/
|
||||
|
||||
'driver' => 'gd'
|
||||
|
||||
);
|
||||
@@ -0,0 +1,53 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
class AddSoftDeletesToContent extends Migration
|
||||
{
|
||||
public function __construct()
|
||||
{
|
||||
$platform = Schema::getConnection()
|
||||
->getDoctrineSchemaManager()
|
||||
->getDatabasePlatform();
|
||||
$platform->registerDoctrineTypeMapping('enum', 'string');
|
||||
}
|
||||
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
|
||||
Schema::table('contents', function (Blueprint $table) {
|
||||
$table->softDeletes()
|
||||
->after('updated_at');
|
||||
});
|
||||
|
||||
DB::statement("
|
||||
ALTER TABLE `contents`
|
||||
CHANGE `status` `status` enum('draft','protected','public') COLLATE 'utf8_unicode_ci' NOT NULL DEFAULT 'draft' AFTER `module_settings`
|
||||
");
|
||||
|
||||
DB::statement('UPDATE contents SET status="protected", deleted_at=NOW() WHERE status=""');
|
||||
DB::statement('DELETE FROM content_history WHERE new_value="deleted" OR old_value="deleted"');
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
Schema::table('contents', function (Blueprint $table) {
|
||||
$table->dropSoftDeletes();
|
||||
});
|
||||
|
||||
DB::statement("ALTER TABLE `contents`
|
||||
CHANGE `status` `status` enum('draft','protected','public', 'deleted') COLLATE 'utf8_unicode_ci' NULL DEFAULT 'draft' AFTER `module_settings`;");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
|
||||
class AddSoftDeletesToUsers extends Migration
|
||||
{
|
||||
public function __construct()
|
||||
{
|
||||
$platform = Schema::getConnection()
|
||||
->getDoctrineSchemaManager()
|
||||
->getDatabasePlatform();
|
||||
$platform->registerDoctrineTypeMapping('enum', 'string');
|
||||
}
|
||||
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::table('users', function (Blueprint $table) {
|
||||
$table->timestamp('created_at')
|
||||
->nullable()
|
||||
->after('id');
|
||||
$table->timestamp('updated_at')
|
||||
->nullable()
|
||||
->after('created_at');
|
||||
$table->timestamp('deleted_at')
|
||||
->nullable()
|
||||
->after('updated_at');
|
||||
});
|
||||
|
||||
DB::statement("
|
||||
ALTER TABLE `users`
|
||||
CHANGE `status` `status` enum('blocked','active') COLLATE 'utf8_unicode_ci' NOT NULL DEFAULT 'active'
|
||||
");
|
||||
|
||||
DB::statement('UPDATE users SET created_at=NOW(), updated_at=NOW()');
|
||||
DB::statement('UPDATE users SET status="blocked", deleted_at=NOW() WHERE status=""');
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
Schema::table('users', function (Blueprint $table) {
|
||||
$table->dropTimestamps();
|
||||
$table->dropSoftDeletes();
|
||||
});
|
||||
|
||||
DB::statement("
|
||||
ALTER TABLE `users`
|
||||
CHANGE `status` `status` enum('blocked','active', 'deleted') COLLATE 'utf8_unicode_ci' NOT NULL DEFAULT 'active'
|
||||
");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
|
||||
class FixForeignKeysOnActionLog extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::table('action_log', function (Blueprint $table) {
|
||||
$table->dropForeign('fk_action_log_action_log_type1');
|
||||
$table->dropForeign('fk_action_log_user1');
|
||||
|
||||
|
||||
$table->foreign('type_id')
|
||||
->references('id')
|
||||
->on('action_log_types')
|
||||
->onDelete('cascade')
|
||||
->onUpdate('cascade');
|
||||
|
||||
|
||||
$table->foreign('user_id')
|
||||
->references('id')
|
||||
->on('users')
|
||||
->onDelete('cascade')
|
||||
->onUpdate('cascade');
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
// do nothing
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
|
||||
class RenameForeignKeyInWidgets extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::table('widgets', function (Blueprint $table) {
|
||||
|
||||
$table->dropForeign('fk_widget_user1');
|
||||
|
||||
$table->foreign('user_id')
|
||||
->references('id')
|
||||
->on('users')
|
||||
->onDelete('no action')
|
||||
->onUpdate('no action');
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
// do nothing
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
|
||||
class MakeUserIdNullableAtWidgets extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::table('widgets', function (Blueprint $table) {
|
||||
|
||||
$table->dropForeign(['user_id']);
|
||||
|
||||
$table->integer('user_id')
|
||||
->nullable(true)
|
||||
->default(null)
|
||||
->comment('User ID who created this widget. NULL for widget created by template.')->change();
|
||||
|
||||
$table->foreign('user_id')
|
||||
->references('id')
|
||||
->on('users')
|
||||
->onDelete('cascade')
|
||||
->onUpdate('cascade');
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
Schema::table('widgets', function (Blueprint $table) {
|
||||
$table->dropForeign(['user_id']);
|
||||
});
|
||||
|
||||
Schema::table('widgets', function (Blueprint $table) {
|
||||
$table->integer('user_id')
|
||||
->nullable(false)
|
||||
->comment('User ID who created this widget. ')->change();
|
||||
|
||||
$table->foreign('user_id')
|
||||
->references('id')
|
||||
->on('users')
|
||||
->onDelete('no action')
|
||||
->onUpdate('no action');
|
||||
});
|
||||
}
|
||||
}
|
||||
+29
@@ -0,0 +1,29 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
class RemoveOnUpdateCurrentTimestampFromContentsUpdatedAt extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
DB::statement('ALTER TABLE `contents`
|
||||
CHANGE `updated_at` `updated_at` timestamp NULL AFTER `created_at`;');
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
// do nothing
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
<?php
|
||||
namespace Modules\Blog\Article\Events;
|
||||
|
||||
use App\Events\Event;
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
use Modules\Blog\Article\Entities\Comment;
|
||||
|
||||
class ApprovedComment extends Event
|
||||
{
|
||||
use SerializesModels;
|
||||
/**
|
||||
* @var Comment
|
||||
*/
|
||||
public $comment;
|
||||
|
||||
public function __construct(Comment $comment)
|
||||
{
|
||||
$this->comment = $comment;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
<?php
|
||||
namespace Modules\Blog\Article\Events;
|
||||
|
||||
use App\Events\Event;
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
use Modules\Blog\Article\Entities\Comment;
|
||||
|
||||
class CreatedComment extends Event
|
||||
{
|
||||
use SerializesModels;
|
||||
/**
|
||||
* @var Comment
|
||||
*/
|
||||
public $comment;
|
||||
|
||||
public function __construct(Comment $comment)
|
||||
{
|
||||
$this->comment = $comment;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
<?php
|
||||
namespace Modules\Blog\Article\Events;
|
||||
|
||||
use App\Events\Event;
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
use Modules\Blog\Article\Entities\Comment;
|
||||
|
||||
class DeletedComment extends Event
|
||||
{
|
||||
use SerializesModels;
|
||||
/**
|
||||
* @var Comment
|
||||
*/
|
||||
public $comment;
|
||||
|
||||
public function __construct(Comment $comment)
|
||||
{
|
||||
$this->comment = $comment;
|
||||
}
|
||||
}
|
||||
@@ -2,15 +2,17 @@
|
||||
namespace Modules\Blog\Article\Handlers;
|
||||
|
||||
use App\Enumerations\ModulesHandlerToId;
|
||||
use App\Handlers\Contracts\ContentTitles;
|
||||
use App\Handlers\Handler;
|
||||
use App\Http\Controllers\Admin\EditContent;
|
||||
use App\Http\Controllers\Admin\Contents\EditContent;
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Http\Requests\Request;
|
||||
use App\Models\ActionLogType;
|
||||
use App\Models\Content;
|
||||
use App\Models\User;
|
||||
use Modules\Blog\Article\Entities\Comment;
|
||||
|
||||
class Article extends Handler
|
||||
class Article extends Handler implements ContentTitles
|
||||
{
|
||||
/**
|
||||
* Render given module into visitor area.
|
||||
@@ -30,7 +32,7 @@ class Article extends Handler
|
||||
->get();
|
||||
}
|
||||
|
||||
return Controller::VisitorsView($content->template, ['page' => $content]);
|
||||
return Controller::VisitorsView($content->template, ['page' => $content, 'extra' => $parameters]);
|
||||
}
|
||||
|
||||
public static function getExtendedFormInputsCreate()
|
||||
@@ -88,12 +90,8 @@ class Article extends Handler
|
||||
return $changedColumns;
|
||||
}
|
||||
|
||||
public static function getOverviewTitle()
|
||||
{
|
||||
return trans('article::module.allArticles');
|
||||
}
|
||||
|
||||
/**
|
||||
* Register admin menu
|
||||
*
|
||||
* @param User $user
|
||||
*/
|
||||
@@ -130,10 +128,63 @@ class Article extends Handler
|
||||
|
||||
/**
|
||||
* Install module
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public static function install()
|
||||
{
|
||||
$types = [
|
||||
[
|
||||
'string_id' => 'commentCreated',
|
||||
'name' => 'article::comments.events.names.commentCreated',
|
||||
'value' => 'article::comments.events.descriptions.commentCreated',
|
||||
],
|
||||
[
|
||||
'string_id' => 'commentDeleted',
|
||||
'name' => 'article::comments.events.names.commentDeleted',
|
||||
'value' => 'article::comments.events.descriptions.commentDeleted',
|
||||
],
|
||||
[
|
||||
'string_id' => 'commentApproved',
|
||||
'name' => 'article::comments.events.names.commentApproved',
|
||||
'value' => 'article::comments.events.descriptions.commentApproved',
|
||||
],
|
||||
|
||||
];
|
||||
foreach ($types as $type) {
|
||||
ActionLogType::create($type);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 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()
|
||||
{
|
||||
return trans('article::module.allArticles');
|
||||
}
|
||||
|
||||
/**
|
||||
* Title displayed above for for creating new content page
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function getCreateNewTitle()
|
||||
{
|
||||
return trans('article::module.newArticle');
|
||||
}
|
||||
|
||||
/**
|
||||
* Title for form displayed for editin content page
|
||||
*
|
||||
* @param Content $content
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public static function getEditTitle(Content $content)
|
||||
{
|
||||
return trans('article::module.editArticle');
|
||||
}
|
||||
}
|
||||
@@ -12,7 +12,7 @@ class CommentsOverview extends Controller
|
||||
->with('author')
|
||||
->orderBy('approved')
|
||||
->orderBy('created_at', 'DESC')
|
||||
->paginate(20);
|
||||
->paginate(25);
|
||||
|
||||
return view('article::admin/comments.overview', ['comments' => $comments]);
|
||||
}
|
||||
|
||||
@@ -1,7 +1,10 @@
|
||||
<?php
|
||||
namespace Modules\Blog\Article\Http\Controllers\Admin;
|
||||
|
||||
use Illuminate\Support\Facades\Event;
|
||||
use Modules\Blog\Article\Entities\Comment;
|
||||
use Modules\Blog\Article\Events\ApprovedComment;
|
||||
use Modules\Blog\Article\Events\DeletedComment;
|
||||
use Pingpong\Modules\Routing\Controller;
|
||||
|
||||
class EditComment extends Controller
|
||||
@@ -12,7 +15,7 @@ class EditComment extends Controller
|
||||
$comment->approved = 1;
|
||||
$comment->save();
|
||||
|
||||
// Event::fire(ApprovedComment);
|
||||
Event::fire(new ApprovedComment($comment));
|
||||
|
||||
return redirect()
|
||||
->back()
|
||||
@@ -22,9 +25,10 @@ class EditComment extends Controller
|
||||
public function delete($id)
|
||||
{
|
||||
$comment = Comment::findOrFail($id);
|
||||
$comment->delete();
|
||||
|
||||
// Event::fire(DeletedComment);
|
||||
Event::fire(new DeletedComment($comment));
|
||||
|
||||
$comment->delete();
|
||||
|
||||
return redirect()
|
||||
->back()
|
||||
|
||||
@@ -3,7 +3,9 @@ namespace Modules\Blog\Article\Http\Controllers\Visitor;
|
||||
|
||||
use App\Models\Content;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\Support\Facades\Event;
|
||||
use Modules\Blog\Article\Entities\Comment;
|
||||
use Modules\Blog\Article\Events\CreatedComment;
|
||||
use Modules\Blog\Article\Handlers\Article;
|
||||
use Pingpong\Modules\Routing\Controller;
|
||||
|
||||
@@ -33,7 +35,7 @@ class CreateNewComment extends Controller
|
||||
$email = $request->email;
|
||||
}
|
||||
|
||||
Comment::create([
|
||||
$comment = Comment::create([
|
||||
'user_id' => $user ? $user->id : null,
|
||||
'content_id' => $article->id,
|
||||
'name' => $name,
|
||||
@@ -41,6 +43,9 @@ class CreateNewComment extends Controller
|
||||
'content' => $content
|
||||
]);
|
||||
|
||||
// fire event about new comment
|
||||
Event::fire(new CreatedComment($comment));
|
||||
|
||||
return redirect()
|
||||
->route('page.content', ['url' => $article->url])
|
||||
->with('success', trans('article::comments.saved'));
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
<?php
|
||||
// routes for comments
|
||||
|
||||
Route::group([
|
||||
'prefix' => LaravelLocalization::setLocale(),
|
||||
'middleware' => ['localeSessionRedirect', 'localizationRedirect'],
|
||||
'namespace' => 'Modules\Blog\Article\Http\Controllers\Admin'
|
||||
], function () {
|
||||
Route::group([
|
||||
'middleware' => ['web', 'auth', 'adminMenu'],
|
||||
'prefix' => 'admin/comments',
|
||||
'namespace' => 'Modules\Blog\Article\Http\Controllers\Admin'
|
||||
], function () {
|
||||
|
||||
Route::get('/', 'CommentsOverview@getOverview')
|
||||
@@ -17,12 +19,10 @@ Route::group([
|
||||
->name('comments.approve');
|
||||
});
|
||||
|
||||
Route::group([
|
||||
'middleware' => ['web'],
|
||||
'prefix' => 'comments',
|
||||
'namespace' => 'Modules\Blog\Article\Http\Controllers\Visitor'
|
||||
], function () {
|
||||
// public routes
|
||||
Route::group(['middleware' => ['web']], function () {
|
||||
|
||||
Route::post('/new/{id}', 'CreateNewComment@postNew')
|
||||
Route::post('comments/new/{id}', 'CreateNewComment@postNew')
|
||||
->name('comments.new');
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,35 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Blog\Article\Listeners;
|
||||
|
||||
use App\Listeners\Logger;
|
||||
use Modules\Blog\Article\Events\ApprovedComment;
|
||||
|
||||
class LogCommentApproval extends Logger
|
||||
{
|
||||
/**
|
||||
* Handle the event.
|
||||
*
|
||||
* @param ApprovedComment $event
|
||||
*/
|
||||
public function handle(ApprovedComment $event)
|
||||
{
|
||||
$parameters = [
|
||||
'author' => $event->comment->name,
|
||||
'email' => $event->comment->email,
|
||||
'content' => $event->comment->content
|
||||
];
|
||||
|
||||
$this->saveLog($parameters);
|
||||
}
|
||||
|
||||
/**
|
||||
* Getter for action name. Used only internally
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
protected function getName()
|
||||
{
|
||||
return 'commentApproved';
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user