FEATURE: add possibilityy to upload and assign files to content pages

This commit is contained in:
Michal Kváček
2016-07-29 01:22:49 +02:00
parent 790cc772a9
commit 0d5e6d4133
14 changed files with 275 additions and 28 deletions
+3 -2
View File
@@ -1,7 +1,6 @@
<?php
namespace App\Handlers;
use App\Enumerations\ModuleNamesWithIds;
use App\Enumerations\TemplatePathsHumanReadableRootOnly;
use App\Enumerations\WidgetTypes;
use App\Handlers\Contracts\AppHandler;
@@ -29,7 +28,8 @@ abstract class Handler implements AppHandler
'basicInfo' => trans('admin/contents.basicInfo'),
'meta' => trans('admin/contents.metaOptions'),
'publication' => trans('admin/contents.publicationOptions'),
'appearance' => trans('admin/contents.appearance')
'appearance' => trans('admin/contents.appearance'),
'files' => trans('admin/contents.files')
];
}
@@ -40,6 +40,7 @@ abstract class Handler implements AppHandler
'meta' => 'admin.content.formParts.metaInformation',
'publication' => 'admin.content.formParts.publicationSetup',
'appearance' => 'admin.content.formParts.appearance',
'files' => 'admin.content.formParts.files'
];
}
+9
View File
@@ -25,6 +25,15 @@ class History implements HistoryHandler
break;
case 'metaDescription':
return Differ::htmlDiff($changeset->old_value, $changeset->new_value);
break;
case 'file':
if (!$changeset->old_value) {
// old value is null -> new file was uploaded
return trans('admin/history.uploadedFile', ['file' => $changeset->new_value]);
} else {
return trans('admin/history.deletedFile', ['file' => $changeset->old_value]);
}
break;
case 'status':
$statuses = ContentStatuses::getWithTranslations();
@@ -4,7 +4,10 @@ namespace App\Http\Controllers\Admin;
use App\Enumerations\ActiveContentStatuses;
use App\Events\CreateNewContent as CreateNewContentEvent;
use App\Http\Requests\CreateNewContentRequest;
use App\Http\Requests\Request;
use App\Models\Content;
use App\Models\ContentHasFile;
use App\Models\Directory;
use App\Models\File;
use App\Models\Module;
use App\Models\Template;
@@ -105,17 +108,16 @@ class CreateNewContent extends Controller
}
// upload file - if provided
if ($request->hasFile('titlePhoto')) {
$file = $this->file->upload($request->file('titlePhoto'), $request);
$page->title_photo = $file['filename'];
}
$page->uploadTitlePhoto($request);
// save module-specific stuff
call_user_func_array([$module->handler, 'createNew'], [&$page, $request]);
$page->save();
// upload files assigned to content page
$page->uploadRelatedFiles($request);
// fire event about creating new content page
Event::fire(new CreateNewContentEvent($page));
+5 -5
View File
@@ -87,6 +87,9 @@ class EditContent extends Controller
public function postEdit(EditContentRequest $request, $id)
{
try {
/**
* @var $page Content
*/
$page = Content::findOrFail($id);
} catch (NotFoundHttpException $e) {
@@ -104,11 +107,7 @@ class EditContent extends Controller
$request->titlePhotoFilename = $page->title_photo;
// upload file - if provided
if ($request->hasFile('titlePhoto')) {
$file = $this->file->upload($request->file('titlePhoto'), $request);
$request->titlePhotoFilename = $file['filename'];
}
$page->uploadTitlePhoto($request);
// array of fields in database and fields from request
$fields = [
@@ -130,6 +129,7 @@ class EditContent extends Controller
list($revision, $changedColumns) = $page->updateWithHistory($fields, $data);
$changedColumns += call_user_func_array([$page->module_handler, 'edit'], [&$page, $request, $revision]);
$changedColumns += $page->uploadRelatedFiles($request, $revision);
// was something changed?
if ($changedColumns == 0) {
+141 -13
View File
@@ -3,7 +3,9 @@
namespace App\Models;
use App\Enumerations\ContentStatuses;
use App\Http\Requests\Request;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\DB;
use Mcamara\LaravelLocalization\Facades\LaravelLocalization;
@@ -38,6 +40,17 @@ class Content extends Model
const STATUS_DRAFT = 'draft';
const STATUS_PROTECTED = 'protected';
const STATUS_PUBLIC = 'public';
/**
* @var File
*/
private $file;
public function __construct(array $attributes = [])
{
parent::__construct($attributes);
$this->file = App::make(File::class);
}
/**
* Getter for query with setup filter for non-deleted and non-draft pages
@@ -209,7 +222,7 @@ class Content extends Model
* @param array $request
* @param string $revisionId
*
* @return int number of changed columns
* @return array revisionID and number of changed columns
*/
public function updateWithHistory(array $fields, array $request, $revisionId = null)
{
@@ -247,18 +260,7 @@ class Content extends Model
if (trim($fieldValue) != $request[$fieldRequest]) {
// setup history object
$history = [
'user_id' => \Auth::user()->id,
'content_id' => $this->id,
'edit_batch' => $revisionId,
'column' => $fieldRequest,
'old_value' => $fieldValue,
'new_value' => $request[$fieldRequest]
];
// save history
ContentHistory::create($history);
$this->saveHistory();
// save change into database
if ($commonField) {
@@ -281,6 +283,99 @@ class Content extends Model
return [$revisionId, $changed];
}
/**
* Upload and set some image as title photo
*
* @param Request $request
*/
public function uploadTitlePhoto(Request $request)
{
if ($request->hasFile('titlePhoto')) {
$file = $this->file->upload($request->file('titlePhoto'), $request);
$this->title_photo = $file['filename'];
}
}
/**
* Upload and assign files to newly created content page
*
* @param Request $request
* @param null $revisionId
*
* @return int
*/
public function uploadRelatedFiles(Request $request, $revisionId = null)
{
$files = $request->all()['files'];
$changed = 0;
// check if any file was removed
if ($revisionId) {
$changed += $this->removeRelatedFiles($revisionId, $request);
}
// allow uploading only on created pages
if (!$this->id || !$files[0]) {
return $changed;
}
// find or create new directory for files assigned to content
$directory = Directory::firstOrCreate([
'name' => '.content_files',
'hidden' => true
]);
$request->directoryId = $directory->id;
foreach ($files as $file) {
if (!$file) {
continue;
}
$uploaded = $this->file->upload($file, $request);
// add assignement
ContentHasFile::create([
'file_id' => $uploaded['id'],
'content_id' => $this->id
]);
if ($revisionId) {
$this->saveHistory($revisionId, 'file', null, ['file' => $uploaded['file']->getClientOriginalName()]);
}
$changed++;
}
return $changed;
}
/**
* Delete files from association
*
* @param $revisionId
* @param $request
*
* @return int
*/
private function removeRelatedFiles($revisionId, $request)
{
$files = array_keys((array)$request->keepAssigned);
$allFiles = $this->files()
->whereNotIn('id', $files)
->get();
foreach ($allFiles as $file) {
$this->saveHistory($revisionId, 'file', $file->original_filename, ['file' => null]);
ContentHasFile::where('content_id', $this->id)
->where('file_id', $file->id)
->delete();
}
return count($allFiles);
}
/**
* Mark relationship with its historical records
*
@@ -300,4 +395,37 @@ class Content extends Model
{
return $this->belongsTo('App\Models\User', 'user_id');
}
/**
* Related files to content page
*
* @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
*/
public function files()
{
return $this->belongsToMany(File::class, 'contents_has_files');
}
/**
* Save history entry into database
*
* @param $revisionId
* @param $fieldRequest
* @param $fieldValue
* @param $request
*/
private function saveHistory($revisionId, $fieldRequest, $fieldValue, $request)
{ // setup history object
$history = [
'user_id' => \Auth::user()->id,
'content_id' => $this->id,
'edit_batch' => $revisionId,
'column' => $fieldRequest,
'old_value' => $fieldValue,
'new_value' => $request[$fieldRequest]
];
// save history
ContentHistory::create($history);
}
}
+17
View File
@@ -0,0 +1,17 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class ContentHasFile extends Model
{
public $timestamps = false;
public $table = 'contents_has_files';
protected $fillable = [
'content_id',
'file_id'
];
}
+1 -1
View File
@@ -106,7 +106,7 @@ class File extends Model
// save optional fields
$optionalFields = ['name', 'description', 'keywords', 'directoryId'];
foreach ($optionalFields as $field) {
if ($request->has($field)) {
if (isset($request->{$field})) {
$snakeField = snake_case($field);
$newFile->$snakeField = $request->$field;