FEATURE: split controllers/admin into more smaller directories
This commit is contained in:
@@ -0,0 +1,111 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Admin\Templates;
|
||||
|
||||
use App\Http\Controllers\Admin\Controller;
|
||||
use App\Http\Requests\CopyTemplateRequest;
|
||||
use App\Models\Template;
|
||||
|
||||
class CopyTemplate extends Controller
|
||||
{
|
||||
/**
|
||||
* 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);
|
||||
|
||||
$namespace = null;
|
||||
if (strpos($template->template_name, '::')) {
|
||||
list($namespace) = explode('::', $template->template_name);
|
||||
$namespace .= '::';
|
||||
}
|
||||
|
||||
// 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' => $namespace . $newName,
|
||||
'name' => $newName,
|
||||
'path' => $template->path,
|
||||
'module_id' => $template->module_id,
|
||||
'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]));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,187 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Admin\Templates;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Http\Requests;
|
||||
use App\Http\Requests\EditTemplateRequest;
|
||||
use App\Models\Template;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\File;
|
||||
|
||||
class EditTemplate extends Controller
|
||||
{
|
||||
/**
|
||||
* Render form for editing template
|
||||
*
|
||||
* @param $template
|
||||
*
|
||||
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
|
||||
*/
|
||||
public function getEdit($template)
|
||||
{
|
||||
/**
|
||||
* @var $template Template
|
||||
*/
|
||||
$template = Template::findOrFail($template);
|
||||
$path = $template->getPath();
|
||||
|
||||
// load template content
|
||||
$absolutePath = $template->getPathToTemplate();
|
||||
$content = @file_get_contents($absolutePath);
|
||||
|
||||
return view('admin.templates.edit', [
|
||||
'template' => $template,
|
||||
'templateContent' => $content,
|
||||
'isWritable' => is_writable(dirname($absolutePath)),
|
||||
'path' => $path,
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Save meta information about template and edited content
|
||||
*
|
||||
* @param EditTemplateRequest $request
|
||||
* @param $templateId
|
||||
*
|
||||
* @return \Illuminate\Http\RedirectResponse
|
||||
*/
|
||||
public function postEdit(EditTemplateRequest $request, $templateId)
|
||||
{
|
||||
// find template
|
||||
$template = Template::findOrFail($templateId);
|
||||
|
||||
// setup meta information
|
||||
$template->name = $request->name;
|
||||
|
||||
if ($request->description) {
|
||||
$template->description = $request->description;
|
||||
}
|
||||
|
||||
// save meta information into database
|
||||
$template->save();
|
||||
|
||||
// try to save content
|
||||
return $this->saveContent($template, $request);
|
||||
}
|
||||
|
||||
/**
|
||||
* Save physical content of given template
|
||||
*
|
||||
* @param Template $template
|
||||
* @param EditTemplateRequest $request
|
||||
*
|
||||
* @return \Illuminate\Http\RedirectResponse
|
||||
*/
|
||||
private function saveContent(Template $template, EditTemplateRequest $request)
|
||||
{
|
||||
// get templates with paths
|
||||
$originalTemplate = $template->getPathToTemplate();
|
||||
$customTemplate = $template->getPathToTemplate(Template::CUSTOM_EDIT_DIRECTORY);
|
||||
|
||||
// get paths
|
||||
$originalDir = dirname($originalTemplate);
|
||||
$customDir = dirname($customTemplate);
|
||||
|
||||
// try to save content
|
||||
if (!is_writable($customDir) && !is_writable($originalDir)) {
|
||||
return redirect()
|
||||
->route('templates.edit', ['id' => $request->id])
|
||||
->withInput()
|
||||
->with('warning', trans('admin/templates.cannotWriteContent'));
|
||||
}
|
||||
|
||||
// save new content only if something was changed
|
||||
if ($template->editable && $this->isContentDifferent($originalTemplate, $customTemplate, $request->templateContent)) {
|
||||
|
||||
// create directory for custom updates
|
||||
if (!is_dir($customDir)) {
|
||||
File::makeDirectory($customDir);
|
||||
}
|
||||
|
||||
// make copy of existing template (if exists)
|
||||
$this->backupTemplates($customTemplate);
|
||||
|
||||
// save content
|
||||
File::put($customTemplate, $request->templateContent);
|
||||
}
|
||||
|
||||
return redirect()
|
||||
->route('templates.overview', ['id' => $template->path])
|
||||
->with('success', trans('admin/templates.editSuccessfull'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Get last "revision" of edited template.
|
||||
*
|
||||
* Template changes are not discarded, however new file is created. Last template is renamed to
|
||||
* <template>.blade.php.<num>, where <num> is result of this method.
|
||||
*
|
||||
* @param $template
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
private function getNewRevisionNumber($template)
|
||||
{
|
||||
// nothing to backup - no template in custom directory exists
|
||||
if (!File::exists($template)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$number = 0;
|
||||
while (File::exists($template . '.' . $number)) {
|
||||
$number++;
|
||||
}
|
||||
|
||||
return $number;
|
||||
}
|
||||
|
||||
/**
|
||||
* If exists previously edited template, rename it to <template>.blade.php.<number>
|
||||
*
|
||||
* @param $template
|
||||
*/
|
||||
private function backupTemplates($template)
|
||||
{
|
||||
// get last sequence number
|
||||
$number = $this->getNewRevisionNumber($template);
|
||||
|
||||
// nothing to backup
|
||||
if (is_null($number)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// rename template
|
||||
File::move($template, $template . '.' . $number);
|
||||
}
|
||||
|
||||
/**
|
||||
* Compare data from previous/original template
|
||||
*
|
||||
* @param $originalTemplate
|
||||
* @param $customTemplate
|
||||
* @param $currentContent
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
private function isContentDifferent($originalTemplate, $customTemplate, $currentContent)
|
||||
{
|
||||
/**
|
||||
* get last revision of template - we need to substract 1 from result from getNewRevisionNumber(),
|
||||
* because this method returns number of first non-existing template
|
||||
*/
|
||||
$lastRevision = $this->getNewRevisionNumber($customTemplate) - 1;
|
||||
|
||||
// select compared file
|
||||
if ($lastRevision < 0) {
|
||||
$diffFile = $originalTemplate;
|
||||
} else {
|
||||
$diffFile = $customTemplate . '.' . $lastRevision;
|
||||
}
|
||||
|
||||
// get content
|
||||
$originalContent = file_get_contents($diffFile);
|
||||
|
||||
return $originalContent != $currentContent;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Admin\Templates;
|
||||
|
||||
use App\Http\Controllers\Admin\Controller;
|
||||
use App\Models\TemplatePath;
|
||||
|
||||
class TemplateOverview extends Controller
|
||||
{
|
||||
public function getPath($path)
|
||||
{
|
||||
$path = TemplatePath::findOrFail($path);
|
||||
|
||||
return view('admin.templates.list', [
|
||||
'directory' => $path,
|
||||
'isWritable' => is_writable(base_path($path->path)),
|
||||
'templates' => $path->templates()
|
||||
->get(),
|
||||
'subdirectories' => $path->subdirectories()
|
||||
->get()
|
||||
]);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user