From 6e6be7f79004b5384143a24075c4ff7d9cb99919 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Kv=C3=A1=C4=8Dek?= Date: Mon, 7 Mar 2016 16:27:00 +0100 Subject: [PATCH] FEATURE: add copying of templates --- app/Http/Controllers/Admin/CopyTemplate.php | 99 ++++++++++++++++++- app/Http/Requests/CopyTemplateRequest.php | 2 +- resources/lang/en/admin/templates.php | 6 +- .../admin/templates/templatesTiles.blade.php | 14 ++- 4 files changed, 111 insertions(+), 10 deletions(-) diff --git a/app/Http/Controllers/Admin/CopyTemplate.php b/app/Http/Controllers/Admin/CopyTemplate.php index 1832e337..27e7c90f 100644 --- a/app/Http/Controllers/Admin/CopyTemplate.php +++ b/app/Http/Controllers/Admin/CopyTemplate.php @@ -2,14 +2,105 @@ namespace App\Http\Controllers\Admin; -use Illuminate\Http\Request; - -use App\Http\Requests; use App\Http\Controllers\Controller; +use App\Http\Requests; +use App\Http\Requests\CopyTemplateRequest; +use App\Models\Template; +use Illuminate\Http\Request; class CopyTemplate extends Controller { - public function createCopy(Requests\CopyTemplateRequest $request) { + /** + * Method for copying given template. + * + * This method is supposed to be called by POST method. + * + * @param CopyTemplateRequest $request + * + * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\RedirectResponse + */ + public function createCopy(CopyTemplateRequest $request) + { + // get variables from request + $newName = preg_replace('/[^a-z0-9_]/i', '', $request->newName); + $oldTemplateId = $request->templateId; + // get template path + $template = Template::findOrFail($oldTemplateId); + + // get template absolute paths + $realTemplatePath = $template->getPathToTemplate(); + $customTemplatePath = $template->getPathToTemplate(Template::CUSTOM_EDIT_DIRECTORY); + $path = dirname($customTemplatePath); + + // create file copy + $data = file_get_contents($realTemplatePath); + $written = file_put_contents($path . DIRECTORY_SEPARATOR . $newName . Template::TEMPLATE_SUFFIX, $data); + + // were data written? + if ($written === false) { + return $this->copyFailed($request, $template); + } + + // insert record into database (**custom paths are not crawled) + $newTemplate = Template::create([ + 'template_name' => $newName, + 'name' => $newName, + 'path' => $template->path, + 'description' => $template->description, + 'editable' => 1 + ]); + + // inform user about successfull copying + return $this->copySuccessfull($request, $newTemplate); + } + + /** + * Handle failed template copying + * + * @param CopyTemplateRequest $request + * @param Template $template + * + * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\RedirectResponse + * + */ + private function copyFailed(CopyTemplateRequest $request, Template $template) + { + $message = trans('admin/templates.copyFailed', ['name' => $template->name]); + + if ($request->ajax()) { + return response()->json([ + 'status' => 'fail', + 'redirectUrl' => route('templates.overview', ['path' => $template->path]), + 'message' => $message + ]); + } else { + return redirect() + ->route('templates.overview', ['path' => $template->path]) + ->with('error', $message); + } + } + + /** + * Handle (redirect/send response) successfully copied template + * + * @param CopyTemplateRequest $request + * @param Template $newTemplate + * + * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\RedirectResponse + */ + private function copySuccessfull(CopyTemplateRequest $request, Template $newTemplate) + { + if ($request->ajax()) { + return response()->json([ + 'status' => 'success', + 'redirectUrl' => route('templates.overview', ['path' => $newTemplate->path]), + 'message' => trans('admin/templates.copySuccessfull', ['name' => $newTemplate->name]) + ]); + } else { + return redirect() + ->route(route('templates.overview', ['path' => $newTemplate->path])) + ->with('success', trans('admin/templates.copySuccessfull', ['name' => $newTemplate->name])); + } } } diff --git a/app/Http/Requests/CopyTemplateRequest.php b/app/Http/Requests/CopyTemplateRequest.php index 703b6160..a64592ba 100644 --- a/app/Http/Requests/CopyTemplateRequest.php +++ b/app/Http/Requests/CopyTemplateRequest.php @@ -13,7 +13,7 @@ class CopyTemplateRequest extends Request { return [ 'templateId' => 'required|exists:templates,id', - 'newTemplateName' => 'required' + 'newName' => 'required' ]; } } diff --git a/resources/lang/en/admin/templates.php b/resources/lang/en/admin/templates.php index 3d4b785f..95d5d2c6 100644 --- a/resources/lang/en/admin/templates.php +++ b/resources/lang/en/admin/templates.php @@ -15,5 +15,7 @@ return [ 'notWritable' => 'Cannot write to :file. Any submited changes in this file will not be saved!', 'cannotWriteContent' => 'Cannot save template content, directory has unsufficient permissions. Meta information were saved.', 'newTemplateName' => 'Template name used in Blade templates', - 'newTemplateNameSuffix' => 'copy' -]; \ No newline at end of file + 'newTemplateNameSuffix' => 'copy', + 'copySuccessfull' => 'Template :name successfully created by copying from other template.', + 'copyFailed' => 'Cannot copy template into :name. Check write permissions to proper template path.' +]; diff --git a/resources/views/admin/templates/templatesTiles.blade.php b/resources/views/admin/templates/templatesTiles.blade.php index 3aba639b..213603f4 100644 --- a/resources/views/admin/templates/templatesTiles.blade.php +++ b/resources/views/admin/templates/templatesTiles.blade.php @@ -40,12 +40,20 @@ var templateId = link.data ('template-id'); var templateName = link.data ('template-name'); - var newTemplateName = prompt ("@lang('admin/templates.newTemplateName')", templateName + "_"+"@lang('admin/templates.newTemplateNameSuffix')"); + var newTemplateName = prompt ("@lang('admin/templates.newTemplateName')", templateName + "_" + "@lang('admin/templates.newTemplateNameSuffix')"); + // no name given - give up if (newTemplateName == null) return; - $.ajax({ - 'url': '{{route('templates.copy')}}}' + // copy given template + $.post ('{{route('templates.postCopy')}}', { + templateId: templateId, + newName: newTemplateName, + _token: "{{csrf_token()}}" + }, function (data) { + if (data.status == 'success') { + location.reload (); + } }); });