diff --git a/app/Handlers/Handler.php b/app/Handlers/Handler.php index 7b12c432..7bde37d3 100644 --- a/app/Handlers/Handler.php +++ b/app/Handlers/Handler.php @@ -1,7 +1,6 @@ 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' ]; } diff --git a/app/Handlers/History.php b/app/Handlers/History.php index f2713bb7..86aded65 100644 --- a/app/Handlers/History.php +++ b/app/Handlers/History.php @@ -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(); diff --git a/app/Http/Controllers/Admin/CreateNewContent.php b/app/Http/Controllers/Admin/CreateNewContent.php index 44cd120a..3522b4cb 100644 --- a/app/Http/Controllers/Admin/CreateNewContent.php +++ b/app/Http/Controllers/Admin/CreateNewContent.php @@ -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)); diff --git a/app/Http/Controllers/Admin/EditContent.php b/app/Http/Controllers/Admin/EditContent.php index 2e3ad79f..7dfe5996 100644 --- a/app/Http/Controllers/Admin/EditContent.php +++ b/app/Http/Controllers/Admin/EditContent.php @@ -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) { diff --git a/app/Models/Content.php b/app/Models/Content.php index 44eb2123..a8e62673 100644 --- a/app/Models/Content.php +++ b/app/Models/Content.php @@ -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); + } } diff --git a/app/Models/ContentHasFile.php b/app/Models/ContentHasFile.php new file mode 100644 index 00000000..91921889 --- /dev/null +++ b/app/Models/ContentHasFile.php @@ -0,0 +1,17 @@ +has($field)) { + if (isset($request->{$field})) { $snakeField = snake_case($field); $newFile->$snakeField = $request->$field; diff --git a/database/migrations/2016_07_28_192556_assignFilesToPages.php b/database/migrations/2016_07_28_192556_assignFilesToPages.php new file mode 100644 index 00000000..0d81d2ac --- /dev/null +++ b/database/migrations/2016_07_28_192556_assignFilesToPages.php @@ -0,0 +1,44 @@ +integer('content_id'); + $table->integer('file_id'); + $table->primary(['content_id', 'file_id']); + + $table->foreign('content_id') + ->references('id') + ->on('contents') + ->onDelete('cascade') + ->onUpdate('cascade'); + + $table->foreign('file_id') + ->references('id') + ->on('files') + ->onDelete('cascade') + ->onUpdate('cascade'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::drop('contents_has_files'); + } +} diff --git a/modules/StaticPages/Resources/views/admin/editForm.blade.php b/modules/StaticPages/Resources/views/admin/editForm.blade.php index 33db8c49..814e7161 100644 --- a/modules/StaticPages/Resources/views/admin/editForm.blade.php +++ b/modules/StaticPages/Resources/views/admin/editForm.blade.php @@ -27,6 +27,10 @@
  • @lang('staticpages::admin.appearance')
  • + +
  • + @lang('staticpages::admin.files') +
  • @@ -169,6 +173,20 @@
    +
    +
    +
    + +
    +
    +
    + diff --git a/resources/lang/cs/admin/contents.php b/resources/lang/cs/admin/contents.php index 949a873f..e2660403 100644 --- a/resources/lang/cs/admin/contents.php +++ b/resources/lang/cs/admin/contents.php @@ -13,10 +13,12 @@ return [ "field_published_to" => "Publikováno do", "field_title" => "Titulek stránky", "field_url" => "URL", +"files" => "Soubory", "homepageProtected" => "Domovská stránka je zobrazena jen pro přihlášené uživatele. Toto může i nemusí být chyba.", "homepageSetup" => "Domovská stránka úspěšně nastavena.", "invalidPage" => "Požadovaná stránka neexistuje.", "invalidStatus" => "Nelze změnit stav stránky na něco nedefinovaného.", +"lockUrl" => "Zachovat URL?", "makeDraft" => "Převést na koncept", "makeProtected" => "Zobrazit jen pro přihlášené", "makePublic" => "Publikovat", diff --git a/resources/lang/cs/admin/history.php b/resources/lang/cs/admin/history.php index b2f90aad..a82b3831 100644 --- a/resources/lang/cs/admin/history.php +++ b/resources/lang/cs/admin/history.php @@ -3,6 +3,7 @@ return [ "backToEdit" => "Zpět na editaci obsahu", "backToOverview" => "Zpět na přehled historie", "changedFromTo" => "Změna z :from na :to", +"columnFile" => "Přiřazené soubory", "columnIs_homepage" => "Domovská stránka", "columnMetaDescription" => "Popis", "columnMetaKeywords" => "Klíčová slova", @@ -13,10 +14,12 @@ return [ "columnTitle" => "Titulek", "columnTitlePhotoFilename" => "Titulní obrázek", "columnUrl" => "URL", +"deletedFile" => "Odebrán soubor :file.", "diff" => "Rozdíl", "diffPageName" => "Rozdíl v :column", "emptyValue" => "nic", "numOfChanges" => "Jedna změna|:count změny|:count změn", "pageName" => "Historie :name", "setupAsHomepage" => "Nastaveno jako domovská stránka", +"uploadedFile" => "Nahrán soubor :file.", ]; diff --git a/resources/lang/en/admin/contents.php b/resources/lang/en/admin/contents.php index 63f6f422..3434c99e 100644 --- a/resources/lang/en/admin/contents.php +++ b/resources/lang/en/admin/contents.php @@ -43,5 +43,6 @@ return [ 'homepageProtected' => 'Your homepage is displayed only for logged in users. This may or may not be an error.', 'parentPage' => 'Parent page', 'alreadyHomepage' => 'Homepage', + 'files' => 'Files', 'lockUrl' => 'Keep URL' ]; \ No newline at end of file diff --git a/resources/lang/en/admin/history.php b/resources/lang/en/admin/history.php index 09632f62..1e7d03da 100644 --- a/resources/lang/en/admin/history.php +++ b/resources/lang/en/admin/history.php @@ -7,6 +7,7 @@ return [ 'columnMetaKeywords' => 'Meta keywords', 'columnMetaDescription' => 'Description', 'columnStatus' => 'Page visibility', + 'columnFile' => 'Assigned file', 'columnTemplate' => 'Template', 'columnIs_homepage' => 'Homepage', 'columnParentPage' => 'Parent page', @@ -18,6 +19,7 @@ return [ 'diffPageName' => 'Difference of :column', 'backToOverview' => 'Back to history overview', 'backToEdit' => 'Back to editation form', - 'setupAsHomepage' => 'Setup as homepage' - + 'setupAsHomepage' => 'Setup as homepage', + 'uploadedFile' => 'File :file was uploaded.', + 'deletedFile' => 'File :file was removed from this page.', ]; \ No newline at end of file diff --git a/resources/views/admin/content/formParts/files.blade.php b/resources/views/admin/content/formParts/files.blade.php new file mode 100644 index 00000000..c865baab --- /dev/null +++ b/resources/views/admin/content/formParts/files.blade.php @@ -0,0 +1,20 @@ +
    + + @if(count($page->files)) +
    + +
    + @endif + +
    + +
    +
    \ No newline at end of file