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
+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);
}
}