REFACTORING #1880 @4h30m: another ugly refactoring commit
This commit is contained in:
@@ -21,12 +21,11 @@ interface AdvancedContentModifier {
|
||||
* Reason why it is separated from createNew() method is simple - we need to save history of changes.
|
||||
*
|
||||
* @param Content $content
|
||||
* @param Request $request
|
||||
* @param string $revisionId
|
||||
* @param $request
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public static function edit(Content &$content, Request $request, $revisionId);
|
||||
public static function edit(Content $content, $request);
|
||||
/**
|
||||
* Method called right after content page is marked as deleted
|
||||
*
|
||||
|
||||
@@ -1,9 +1,21 @@
|
||||
<?php
|
||||
namespace App\CMS\Contracts;
|
||||
|
||||
use App\Http\Requests\Request;
|
||||
|
||||
interface Interaction {
|
||||
public function handle(Request $request, $parameters);
|
||||
public function getValidationRules($parameters);
|
||||
/**
|
||||
* Perform given action
|
||||
*
|
||||
* @param $data array input data
|
||||
* @param $parameters array parameters
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public function handle($data, $parameters);
|
||||
|
||||
/**
|
||||
* @param $data array input data
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getValidationRules($data = []);
|
||||
}
|
||||
@@ -48,7 +48,7 @@ interface TemplateHandler extends BaseModuleHandler
|
||||
* This way we can do almost whatever we want - even in template
|
||||
*
|
||||
* @param Content $content
|
||||
* @param Request $request
|
||||
* @param $request
|
||||
*/
|
||||
public static function beforeSave(Content & $content, Request $request);
|
||||
public static function beforeSave(Content & $content, $request);
|
||||
}
|
||||
@@ -4,8 +4,8 @@ namespace App\CMS\Contracts\Repositories;
|
||||
use App\Models\Content\Content as ContentModel;
|
||||
use App\Models\Module as ModuleModel;
|
||||
|
||||
interface Module extends BaseRepository {
|
||||
|
||||
interface Module extends BaseRepository
|
||||
{
|
||||
public function getCreateContentTitle(ModuleModel $module);
|
||||
|
||||
public function getUpdateContentTitle(ModuleModel $module, ContentModel $content = null);
|
||||
@@ -14,5 +14,7 @@ interface Module extends BaseRepository {
|
||||
|
||||
public function getByHandler($handler);
|
||||
|
||||
public function call(ModuleModel $module, $method, ...$parameters);
|
||||
public function call(ModuleModel $module, $method, $parameters = []);
|
||||
|
||||
public function callOnString($moduleHandler, $method, $parameters = []);
|
||||
}
|
||||
@@ -43,7 +43,7 @@ class History implements HistoryHandler
|
||||
'to' => $statuses[$changeset->new_value]
|
||||
]);
|
||||
break;
|
||||
case 'is_homepage':
|
||||
case 'isHomepage':
|
||||
return trans('admin/history.setupAsHomepage');
|
||||
break;
|
||||
default:
|
||||
|
||||
@@ -3,30 +3,37 @@ namespace App\Cms\Handlers\Interactions;
|
||||
|
||||
use App\CMS\Contracts\Interaction as InteractionContract;
|
||||
use App\CMS\Exceptions\Validation\ValidationFailedException;
|
||||
use App\Http\Requests\Request;
|
||||
use Illuminate\Support\Facades\App;
|
||||
use Illuminate\Support\Facades\Validator;
|
||||
|
||||
class Interaction {
|
||||
class Interaction
|
||||
{
|
||||
/**
|
||||
* Handle interaction with application
|
||||
*
|
||||
* @param Request $request
|
||||
* @param InteractionContract $interaction
|
||||
* @param array $parameters
|
||||
* @param string $interactionClass
|
||||
* @param array $data
|
||||
* @param array $extraParameters
|
||||
*
|
||||
* @return mixed
|
||||
* @throws ValidationFailedException
|
||||
*/
|
||||
public static function handle(Request $request, InteractionContract $interaction, ...$parameters) {
|
||||
public static function handle($interactionClass, $data, ...$extraParameters)
|
||||
{
|
||||
/**
|
||||
* @var $interaction InteractionContract
|
||||
*/
|
||||
|
||||
$interaction = App::make($interactionClass);
|
||||
// validate interaction
|
||||
$validator = Validator::make($request->all(), $interaction->getValidationRules($parameters));
|
||||
$validator = Validator::make($data, $interaction->getValidationRules($extraParameters));
|
||||
|
||||
if ($validator->fails()) {
|
||||
throw new ValidationFailedException($validator);
|
||||
}
|
||||
|
||||
// handle it
|
||||
return $interaction->handle($request, $parameters);
|
||||
|
||||
return $interaction->handle($data, $extraParameters);
|
||||
}
|
||||
}
|
||||
@@ -1,12 +1,13 @@
|
||||
<?php
|
||||
namespace App\CMS\Helpers;
|
||||
|
||||
use App\CMS\Contracts\Modules\TemplateHandler;
|
||||
use App\Models\Content\Content;
|
||||
use App\Models\Module;
|
||||
use DebugBar\Bridge\MonologCollector;
|
||||
use App\Models\User;
|
||||
use Illuminate\Database\QueryException;
|
||||
use Monolog\Logger;
|
||||
|
||||
class CurrentTemplate
|
||||
class CurrentTemplate implements TemplateHandler
|
||||
{
|
||||
protected static $template;
|
||||
protected static $initialized = false;
|
||||
@@ -20,14 +21,14 @@ class CurrentTemplate
|
||||
{
|
||||
if (!self::$initialized) {
|
||||
try {
|
||||
self::$template = Module::where('is_template', true)
|
||||
->where('enabled', true)
|
||||
->first();
|
||||
self::$template = Module::where('is_template', true)
|
||||
->where('enabled', true)
|
||||
->first();
|
||||
} catch (QueryException $e) {
|
||||
throw new \ErrorException('DB not migrated, please, do so!');
|
||||
}
|
||||
if (self::$template) {
|
||||
self::$template->module_settings = json_decode(self::$template->module_settings);
|
||||
self::$template->moduleSettings = json_decode(self::$template->moduleSettings);
|
||||
}
|
||||
|
||||
self::$initialized = true;
|
||||
@@ -60,4 +61,68 @@ class CurrentTemplate
|
||||
{
|
||||
self::$initialized = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Register admin menu (or multiple ones)
|
||||
*
|
||||
* This cannot be in ServiceProvider because Session is started at middleware. And ServiceProvider is called before
|
||||
* starting any middleware..
|
||||
*
|
||||
* @param User $user model of logged user
|
||||
*/
|
||||
public static function registerAdminMenu(User $user)
|
||||
{
|
||||
call_user_func_array([self::handler(), 'registerAdminMenu'], [$user]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get list of registered templates and supported modules.
|
||||
*
|
||||
* Returned array is expected to be array of arrays with following items: module, namespace and templateName.
|
||||
* Example:
|
||||
* return [
|
||||
* ['module' => 'Article', 'templateName' => 'article::template.name']
|
||||
* ];
|
||||
*
|
||||
* When no "namespace" is specified, value strtolower(module) is used instaed.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public static function getPublicTemplatePaths()
|
||||
{
|
||||
return call_user_func([self::handler(), 'getPublicTemplatePaths']);
|
||||
}
|
||||
|
||||
/**
|
||||
* Prepare Content object to be rendered using Blade template
|
||||
*
|
||||
* @param Content $content
|
||||
*/
|
||||
public static function beforeRender(Content & $content)
|
||||
{
|
||||
call_user_func_array([self::handler(), 'beforeRender'], [&$content]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Modify input data into format which can be understood by edit template
|
||||
*
|
||||
* @param Content $content
|
||||
*/
|
||||
public static function beforePopulatingEditForm(Content & $content)
|
||||
{
|
||||
call_user_func_array([self::handler(), 'beforePopulatingEditForm'], [&$content]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Slightly modify Content object before saving into database.
|
||||
*
|
||||
* This way we can do almost whatever we want - even in template
|
||||
*
|
||||
* @param Content $content
|
||||
* @param $request
|
||||
*/
|
||||
public static function beforeSave(Content & $content, $request)
|
||||
{
|
||||
call_user_func_array([self::handler(), 'beforeSave'], [&$content, $request]);
|
||||
}
|
||||
}
|
||||
@@ -24,7 +24,7 @@ class PageRenderer
|
||||
public static function render(Content $page)
|
||||
{
|
||||
// decode module settings
|
||||
$page->module_settings = json_decode($page->module_settings);
|
||||
$page->moduleSettings = json_decode($page->moduleSettings);
|
||||
|
||||
// do something template-specific
|
||||
$parameters = call_user_func_array([CurrentTemplate::handler(), 'beforeRender'], [&$page]);
|
||||
@@ -33,7 +33,7 @@ class PageRenderer
|
||||
* @var $handler AppHandler
|
||||
*/
|
||||
// get handler
|
||||
$handler = new $page->module_handler;
|
||||
$handler = new $page->moduleHandler;
|
||||
|
||||
$page->content = Shortcode::compile($page->content);
|
||||
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
<?php
|
||||
namespace App\CMS\Helpers\Traits;
|
||||
|
||||
use Carbon\Carbon;
|
||||
|
||||
/**
|
||||
* Class Nullable
|
||||
*
|
||||
* @package App\CMS\Helpers\Traits
|
||||
*/
|
||||
trait Nullable {
|
||||
/**
|
||||
* Get null or parsed date
|
||||
*
|
||||
* @param $date
|
||||
*
|
||||
* @return null|string
|
||||
*/
|
||||
public function nullableDate($date) {
|
||||
return empty($date) ? null : Carbon::parse($date)->toDateTimeString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get null or input value
|
||||
*
|
||||
* @param $string
|
||||
*
|
||||
* @return null
|
||||
*/
|
||||
public function nullable($string) {
|
||||
return empty($string) ? null : $string;
|
||||
}
|
||||
}
|
||||
@@ -27,4 +27,8 @@ function setting($key, $default = null) {
|
||||
|
||||
function asset_path($path) {
|
||||
return env('SITE_URL').'/assets/'.$path;
|
||||
}
|
||||
|
||||
function template_name($name, $throwExceptions = true) {
|
||||
return \App\CMS\Helpers\Template::name($name, $throwExceptions);
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
<?php
|
||||
namespace App\CMS\Interactions\Admin\Content;
|
||||
|
||||
use App\CMS\Contracts\Interaction;
|
||||
use App\Http\Requests\Request;
|
||||
|
||||
class ChangeStatus implements Interaction {
|
||||
public function handle(Request $data, $parameters)
|
||||
{
|
||||
$statuses = ContentStatuses::getWithTranslations();
|
||||
|
||||
// check if given status is valid
|
||||
if (!isset($statuses[$status])) {
|
||||
return redirect()
|
||||
->route('content.overview')
|
||||
->with('error', trans('admin/contents.invalidStatus'));
|
||||
}
|
||||
}
|
||||
|
||||
public function getValidationRules($parameters)
|
||||
{
|
||||
// TODO: Implement getValidationRules() method.
|
||||
}
|
||||
}
|
||||
@@ -7,6 +7,8 @@ use App\CMS\Enumerations\ContentStatuses;
|
||||
use App\CMS\Helpers\CurrentTemplate;
|
||||
use App\Events\EditContent as EditContentEvent;
|
||||
use App\Http\Requests\Request;
|
||||
use App\Models\Content\Content;
|
||||
use App\Models\FileManager\File;
|
||||
use Illuminate\Support\Facades\App;
|
||||
use Illuminate\Support\Facades\Event;
|
||||
use Illuminate\Support\Str;
|
||||
@@ -17,74 +19,59 @@ class EditContent implements Interaction
|
||||
* @var Module
|
||||
*/
|
||||
protected $module;
|
||||
/**
|
||||
* @var File
|
||||
*/
|
||||
protected $file;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->module = App::make(Module::class);
|
||||
$this->file = App::make(File::class);
|
||||
}
|
||||
|
||||
public function handle(Request $request, $parameters)
|
||||
/**
|
||||
* Edit page
|
||||
*
|
||||
* @param array $data
|
||||
* @param array $parameters
|
||||
*
|
||||
* @return mixed|void
|
||||
*/
|
||||
public function handle($data, $parameters)
|
||||
{
|
||||
$page = $parameters[0];
|
||||
|
||||
// upload file - if provided
|
||||
// todo use interaction
|
||||
$file = $page->uploadTitlePhoto($request);
|
||||
/**
|
||||
* @var $page Content
|
||||
*/
|
||||
list($page, $titlePhoto, $relatedFiles) = $parameters;
|
||||
|
||||
// let template to modify request and content page
|
||||
call_user_func_array([CurrentTemplate::handler(), 'beforeSave'], [&$page, $request]);
|
||||
CurrentTemplate::beforeSave($page, $data);
|
||||
|
||||
$request->url = Str::slug($request->url);
|
||||
$request->parentPage = $request->parentPage ? $request->parentPage : null;
|
||||
$request->publishedFrom = empty($request->publishedFrom) ? null : $request->publishedFrom;
|
||||
$request->publishedTo = empty($request->publishedTo) ? null : $request->publishedTo;
|
||||
// upload file - if provided
|
||||
$data['titlePhoto'] = isset($data['existingTitlePhoto']) ? $data['existingTitlePhoto'] : null;
|
||||
|
||||
if (!$file) {
|
||||
$request->titlePhotoFilename = empty($request->existingTitlePhoto) ? null : $request->existingTitlePhoto;
|
||||
} else {
|
||||
$request->titlePhotoFilename = $file['filename'];
|
||||
if (!is_null($titlePhoto)) {
|
||||
$file = $this->file->upload($titlePhoto);
|
||||
$data['titlePhoto'] = $file ? $file['filename'] : null;
|
||||
}
|
||||
|
||||
// array of fields in database and fields from request
|
||||
$fields = [
|
||||
'title' => 'title',
|
||||
'url' => 'url',
|
||||
'template' => 'template',
|
||||
'published_from' => 'publishedFrom',
|
||||
'published_to' => 'publishedTo',
|
||||
'meta_keywords' => 'metaKeywords',
|
||||
'meta_description' => 'metaDescription',
|
||||
'content' => 'pageContent',
|
||||
'parent_id' => 'parentPage',
|
||||
'status' => 'status',
|
||||
'title_photo' => 'titlePhotoFilename',
|
||||
'category_id' => 'category'
|
||||
];
|
||||
|
||||
// save new values with history
|
||||
// todo move this method out of the controller!
|
||||
$data = \App\Http\Controllers\Admin\Contents\EditContent::getFields($request, array_values($fields));
|
||||
|
||||
// todo use Model Observer and model::original attributes
|
||||
|
||||
list($revision, $changedColumns) = $page->updateWithHistory($fields, $data);
|
||||
|
||||
$module = $this->module->getByHandler($page->module_handler);
|
||||
|
||||
|
||||
$changedColumns += $this->module->call($module, 'edit', [&$page, $request, $revision]);
|
||||
|
||||
$page->update($data);
|
||||
$this->module->callOnString($page->moduleHandler, 'edit', [$page, $data]);
|
||||
|
||||
// move to interaction
|
||||
$changedColumns += $page->uploadRelatedFiles($request, $revision);
|
||||
|
||||
if ($changedColumns > 0) {
|
||||
Event::fire(new EditContentEvent($page, $revision));
|
||||
}
|
||||
|
||||
return [$page, $revision, $changedColumns];
|
||||
$keepAssigned = isset($data->keepAssigned) ? $data->keepAssigned : [];
|
||||
$page->uploadRelatedFiles($relatedFiles, $keepAssigned);
|
||||
}
|
||||
|
||||
public function getValidationRules($parameters)
|
||||
/**
|
||||
* Validate this interaction
|
||||
*
|
||||
* @param array $parameters
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getValidationRules($parameters = [])
|
||||
{
|
||||
$id = $parameters[0]->id;
|
||||
|
||||
@@ -97,7 +84,7 @@ class EditContent implements Interaction
|
||||
'url' => 'required|unique:contents,url,' . $id,
|
||||
'publishedFrom' => 'date',
|
||||
'publishedTo' => 'date',
|
||||
'title_photo' => 'exists:files,id',
|
||||
'titlePhoto' => 'exists:files,id',
|
||||
'status' => 'required|in:' . $statuses,
|
||||
'parentPage' => 'exists:contents,id'
|
||||
];
|
||||
|
||||
@@ -2,10 +2,13 @@
|
||||
namespace App\Cms\Interactions\Admin\Content;
|
||||
|
||||
use App\CMS\Contracts\Interaction;
|
||||
use App\CMS\Contracts\Repositories\Content as ContentRepository;
|
||||
use App\CMS\Contracts\Repositories\Module;
|
||||
use App\CMS\Helpers\CurrentTemplate;
|
||||
use App\Events\CreateNewContent;
|
||||
use App\Http\Requests\Request;
|
||||
use App\Models\Content\Content;
|
||||
use App\Models\FileManager\File;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Support\Facades\App;
|
||||
use Illuminate\Support\Facades\Event;
|
||||
use Illuminate\Support\Str;
|
||||
@@ -13,73 +16,70 @@ use Mcamara\LaravelLocalization\Facades\LaravelLocalization;
|
||||
|
||||
class NewContent implements Interaction
|
||||
{
|
||||
/**
|
||||
* @var ContentRepository
|
||||
*/
|
||||
protected $content;
|
||||
/**
|
||||
* @var File
|
||||
*/
|
||||
protected $file;
|
||||
/**
|
||||
* @var Module
|
||||
*/
|
||||
protected $module;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->content = App::make(\App\CMS\Contracts\Repositories\Content::class);
|
||||
$this->content = App::make(ContentRepository::class);
|
||||
$this->module = App::make(Module::class);
|
||||
$this->file = App::make(File::class);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Request $request
|
||||
* Create new content page
|
||||
*
|
||||
* @param array $data
|
||||
* @param $parameters
|
||||
*
|
||||
* @return Content
|
||||
*/
|
||||
public function handle(Request $request, $parameters)
|
||||
public function handle($data, $parameters)
|
||||
{
|
||||
list($moduleHandler) = $parameters;
|
||||
|
||||
// create new page
|
||||
$page = new Content();
|
||||
$page->template = $request->template;
|
||||
|
||||
// setup basic info
|
||||
$page->user_id = \Auth::user()->id;
|
||||
$page->language = LaravelLocalization::getCurrentLocale();
|
||||
$page->title = $request->title;
|
||||
$page->url = Str::slug($request->url);
|
||||
$page->published_from = empty($request->publishedFrom) ? null : $request->publishedFrom;
|
||||
$page->published_to = empty($request->publishedTo) ? null : $request->publishedTo;
|
||||
$page->meta_keywords = $request->metaKeywords;
|
||||
$page->meta_description = $request->metaDescription;
|
||||
$page->content = $request->pageContent;
|
||||
$page->status = $request->status;
|
||||
$page->module_handler = $moduleHandler;
|
||||
$page->category_id = (int)$request->category > 0 ? $request->category : null;
|
||||
$page->parent_id = $request->parentPage ? $request->parentPage : null;
|
||||
list($moduleHandler, $titlePhoto, $relatedFiles) = $parameters;
|
||||
|
||||
// upload file - if provided
|
||||
$file = $page->uploadTitlePhoto($request);
|
||||
$file = !is_null($titlePhoto) ? $this->file->upload($titlePhoto) : null;
|
||||
|
||||
$page->title_photo = $file ? $file['filename'] : null;
|
||||
$data['userId'] = \Auth::user()->id;
|
||||
$data['language'] = LaravelLocalization::getCurrentLocale();
|
||||
$data['titlePhoto'] = $file ? $file['filename'] : null;
|
||||
$data['moduleHandler'] = $moduleHandler;
|
||||
|
||||
$page = Content::create($data);
|
||||
|
||||
// save module-specific stuff
|
||||
call_user_func_array([$request->handler, 'createNew'], [&$page, $request]);
|
||||
$this->module->callOnString($moduleHandler, 'createNew', [&$page, $data]);
|
||||
|
||||
// let template to modify request and content page
|
||||
call_user_func_array([CurrentTemplate::handler(), 'beforeSave'], [&$page, $request]);
|
||||
// let template to modify data and content page
|
||||
CurrentTemplate::beforeSave($page, $data);
|
||||
|
||||
// save content of page before (possible) uploading related files
|
||||
$page->save();
|
||||
|
||||
// upload files assigned to content page
|
||||
$page->uploadRelatedFiles($request);
|
||||
|
||||
Event::fire(new CreateNewContent($this));
|
||||
|
||||
$page->uploadRelatedFiles($relatedFiles);
|
||||
|
||||
return $page;
|
||||
}
|
||||
|
||||
public function getValidationRules($parameters)
|
||||
public function getValidationRules($parameters = [])
|
||||
{
|
||||
return [
|
||||
'titlePhoto' => 'image',
|
||||
'title' => 'required',
|
||||
'url' => 'required|unique:contents,url',
|
||||
'status' => 'required|in:draft,protected,public',
|
||||
'title_photo' => 'exists:files,id',
|
||||
'parentPage' => 'exists:contents,id',
|
||||
'publishedFrom' => 'date',
|
||||
'publishedTo' => 'date',
|
||||
|
||||
@@ -0,0 +1,102 @@
|
||||
<?php
|
||||
namespace App\CMS\Observers;
|
||||
|
||||
use App\Events\CreateNewContent;
|
||||
use App\Models\Content\Content as ContentModel;
|
||||
use App\Models\Content\ContentHistory;
|
||||
use Illuminate\Support\Facades\Event;
|
||||
|
||||
class Content
|
||||
{
|
||||
protected $changeset;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->changeset = uniqid();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param ContentModel $content
|
||||
*/
|
||||
public function created(ContentModel $content)
|
||||
{
|
||||
Event::fire(new CreateNewContent($content));
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all dirty changed from model.
|
||||
*
|
||||
* If user did not change moduleSettings column, return result from ContentModel::getDirty(). Otherwise append all
|
||||
* changed columns from module settings.
|
||||
*
|
||||
* @param $changed
|
||||
* @param $original
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function getDirtyFields($changed, $original)
|
||||
{
|
||||
unset($changed['updated_at']);
|
||||
|
||||
$changes = $this->getNewAndOldValues(array_keys($changed), $changed, $original);
|
||||
|
||||
if (!isset($changed['moduleSettings']))
|
||||
return $changes;
|
||||
|
||||
$moduleSettings = (array)json_decode($changed['moduleSettings']);
|
||||
$originalSettings = (array)json_decode($original['moduleSettings']);
|
||||
unset($changed['moduleSettings']);
|
||||
|
||||
$settingChanged = array_keys(array_diff_assoc($moduleSettings, $originalSettings));
|
||||
$changesInSettings = $this->getNewAndOldValues($settingChanged, $moduleSettings, $originalSettings);
|
||||
|
||||
return array_merge($changes, $changesInSettings);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
* @param $fields
|
||||
* @param $new
|
||||
* @param $original
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function getNewAndOldValues($fields, $new, $original) {
|
||||
$changes = [];
|
||||
foreach ($fields as $field) {
|
||||
$changes[$field] = [
|
||||
'new' => isset($new[$field]) ? $new[$field] : null,
|
||||
'old' => isset($original[$field])? $original[$field] : null
|
||||
];
|
||||
}
|
||||
|
||||
return $changes;
|
||||
}
|
||||
|
||||
public function updated(ContentModel $content)
|
||||
{
|
||||
$fields = $this->getDirtyFields($content->getDirty(), $content->getOriginal());
|
||||
|
||||
foreach ($fields as $field => $change) {
|
||||
$history = [
|
||||
'user_id' => \Auth::user()->id,
|
||||
'content_id' => $content->id,
|
||||
'edit_batch' => $this->changeset,
|
||||
'column' => $field,
|
||||
'old_value' => $change['old'],
|
||||
'new_value' => $change['new']
|
||||
];
|
||||
|
||||
// save history
|
||||
ContentHistory::create($history);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param ContentModel $content
|
||||
*/
|
||||
public function deleted(ContentModel $content)
|
||||
{
|
||||
}
|
||||
}
|
||||
@@ -29,14 +29,14 @@ class Content extends Repository implements IContent
|
||||
return ContentModel::where('status', '!=', IContent::STATUS_DRAFT)
|
||||
->select('contents.*')
|
||||
->with('author')
|
||||
->join('modules', 'modules.handler', '=', 'contents.module_handler')
|
||||
->join('modules', 'modules.handler', '=', 'contents.moduleHandler')
|
||||
->where(function ($query) {
|
||||
$query->where('published_from', '<', Carbon::now())
|
||||
->orWhereNull('published_from');
|
||||
$query->where('publishedFrom', '<=', Carbon::now())
|
||||
->orWhereNull('publishedFrom');
|
||||
})
|
||||
->where(function ($query) {
|
||||
$query->where('published_to', '>', Carbon::now())
|
||||
->orWhereNull('published_to');
|
||||
$query->where('publishedTo', '>=', Carbon::now())
|
||||
->orWhereNull('publishedTo');
|
||||
})
|
||||
->where('language', LaravelLocalization::getCurrentLocale())
|
||||
->whereNull('contents.deleted_at')
|
||||
@@ -46,9 +46,14 @@ class Content extends Repository implements IContent
|
||||
public function all()
|
||||
{
|
||||
return $this->getPageQuery()
|
||||
->get();
|
||||
->get();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $id
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public function getOne($id = null)
|
||||
{
|
||||
if (is_null($id)) {
|
||||
@@ -56,16 +61,9 @@ class Content extends Repository implements IContent
|
||||
$page->user_id = \Auth::user()->id;
|
||||
$page->language = LaravelLocalization::getCurrentLocale();
|
||||
$page->status = IContent::STATUS_DRAFT;
|
||||
$page->module_settings = [];
|
||||
$page->moduleSettings = [];
|
||||
} else {
|
||||
if (is_numeric($id)) {
|
||||
$page = $this->model->findOrFail($id);
|
||||
} else {
|
||||
$page = $this->model->where('language', LaravelLocalization::getCurrentLocale())
|
||||
->where('url', $id)
|
||||
->firstOrFail();
|
||||
}
|
||||
$page->module_settings = json_decode($page->module_settings);
|
||||
}
|
||||
|
||||
return $page;
|
||||
@@ -78,8 +76,9 @@ class Content extends Repository implements IContent
|
||||
public function getHomepage()
|
||||
{
|
||||
return $this->getPageQuery()
|
||||
->where('is_homepage', 1)
|
||||
->first();
|
||||
->where('isHomepage', 1)
|
||||
->first();
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -91,9 +90,17 @@ class Content extends Repository implements IContent
|
||||
*/
|
||||
public function getByURL($url)
|
||||
{
|
||||
return $this->getPageQuery()
|
||||
->where('url', $url)
|
||||
->first();
|
||||
$page = $this->getPageQuery()
|
||||
->where('url', $url)
|
||||
->first();
|
||||
|
||||
if (is_null($page)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$page->moduleSettings = json_decode($page->moduleSettings);
|
||||
|
||||
return $page;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -108,8 +115,8 @@ class Content extends Repository implements IContent
|
||||
public function getOverview($handler = null, $statuses = null)
|
||||
{
|
||||
$query = ContentModel::select('contents.*', 'modules.name AS module_name', 'modules.id AS module_id')
|
||||
->join('modules', 'modules.handler', '=', 'contents.module_handler')
|
||||
->join('users', 'users.id', '=', 'contents.user_id')
|
||||
->join('modules', 'modules.handler', '=', 'contents.moduleHandler')
|
||||
->join('users', 'users.id', '=', 'contents.userId')
|
||||
->addSelect(DB::raw('COALESCE(users.name, users.email) AS author_name'))
|
||||
->addSelect('users.email AS author_email')
|
||||
->whereNull('contents.deleted_at')
|
||||
@@ -119,7 +126,7 @@ class Content extends Repository implements IContent
|
||||
|
||||
// filter results using handler
|
||||
if (!is_null($handler)) {
|
||||
$query = $query->where('contents.module_handler', $handler);
|
||||
$query = $query->where('contents.moduleHandler', $handler);
|
||||
}
|
||||
|
||||
// add filtering by status
|
||||
@@ -127,6 +134,8 @@ class Content extends Repository implements IContent
|
||||
$query = $query->whereIn('contents.status', $statuses);
|
||||
}
|
||||
|
||||
return $query->paginate(20);
|
||||
$pages = $query->paginate(setting('paginatedResults', 20));
|
||||
|
||||
return $pages;
|
||||
}
|
||||
}
|
||||
@@ -36,8 +36,8 @@ class Module extends Repository implements IModule
|
||||
|
||||
public function getUpdateContentTitle(ModuleModel $module, Content $content = null)
|
||||
{
|
||||
$pageHeading = trans('admin/contents.new', ['name' => trans($module->name)]);
|
||||
$moduleHeading = $this->call($module, 'getEditTitle', $content);
|
||||
$pageHeading = trans('admin/contents.edit', ['name' => trans($module->name)]);
|
||||
$moduleHeading = $this->call($module, 'getEditTitle', [$content]);
|
||||
|
||||
return is_null($moduleHeading) ? $pageHeading : $moduleHeading;
|
||||
}
|
||||
@@ -62,7 +62,7 @@ class Module extends Repository implements IModule
|
||||
->firstOrFail();
|
||||
}
|
||||
|
||||
public function call(ModuleModel $module, $method, ...$parameters)
|
||||
public function call(ModuleModel $module, $method, $parameters = [])
|
||||
{
|
||||
if (!is_null($module) && is_callable([$module->handler, $method])) {
|
||||
return call_user_func_array([$module->handler, $method], $parameters);
|
||||
@@ -70,4 +70,13 @@ class Module extends Repository implements IModule
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public function callOnString($moduleHandler, $method, $parameters = [])
|
||||
{
|
||||
if (is_callable([$moduleHandler, $method])) {
|
||||
return call_user_func_array([$moduleHandler, $method], $parameters);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -54,8 +54,8 @@ class Menu implements WidgetRenderer
|
||||
}
|
||||
|
||||
$page = $pages[$pageId];
|
||||
$active = ($page->is_homepage && $route == 'page.index') || ($route == 'page.content' && isset($parameters['url']) && $parameters['url'] == $page->url);
|
||||
$route = $page->is_homepage ? route('page.index') : route('page.content', ['url' => $page->url]);
|
||||
$active = ($page->isHomepage && $route == 'page.index') || ($route == 'page.content' && isset($parameters['url']) && $parameters['url'] == $page->url);
|
||||
$route = $page->isHomepage ? route('page.index') : route('page.content', ['url' => $page->url]);
|
||||
|
||||
$code .= '<li';
|
||||
if ($active) {
|
||||
|
||||
Reference in New Issue
Block a user