|
@@ -115,7 +112,7 @@
|
-
+ |
@@ -178,6 +175,12 @@ export default {
components: {
FileIcon
},
+ props: {
+ context: {
+ type: String,
+ required: false
+ }
+ },
data () {
return {
view: 'list',
@@ -197,14 +200,16 @@ export default {
localStorage.setItem('file-manager.view', view)
},
- generateInfoLink (item, directory) {
+ generateInfoLink (item, directory, context) {
if (directory) {
return Routing.generate('admin_file_manager_info', {
- file: item.path
+ file: item.path,
+ context: context
})
} else {
return Routing.generate('admin_file_manager_info', {
- file: item.path + '/' + item.basename
+ file: item.path + '/' + item.basename,
+ context: context
})
}
},
@@ -259,7 +264,8 @@ export default {
watch: {
directory (directory) {
axios.get(Routing.generate('admin_file_manager_api_directory', {
- directory: this.directory
+ directory: this.directory,
+ context: this.context
}))
.then((response) => {
this.buildBreadcrum(response.data.breadcrumb)
diff --git a/assets/js/admin/modules/editor.js b/assets/js/admin/modules/editor.js
index 849ef1a..d9e0652 100644
--- a/assets/js/admin/modules/editor.js
+++ b/assets/js/admin/modules/editor.js
@@ -1,4 +1,53 @@
const $ = require('jquery')
+const Vue = require('vue').default
+const FileManager = require('../components/file-manager/FileManager').default
+
+const createModal = function (url) {
+ let container = $('#file-manager-modal-container')
+ const body = $('body')
+
+ if (!container.length) {
+ container = $('')
+
+ body.append(container)
+ }
+
+ container.html(`
+
+`)
+
+ $(container).modal('show')
+
+ return $(container)
+}
+
+const fileManagerBrowser = function (callback) {
+ const container = createModal()
+
+ $('body').on('click', '#file-manager-insert', (e) => {
+ callback($(e.target).attr('data-value'), {})
+ $('#modal-container').modal('hide')
+ container.modal('hide')
+ })
+
+ new Vue({
+ el: '#file-manager-modal-content',
+ template: ' ',
+ components: {
+ FileManager
+ }
+ })
+}
if (typeof tinymce !== 'undefined') {
tinymce.murph = tinymce.murph || {}
@@ -13,6 +62,8 @@ if (typeof tinymce !== 'undefined') {
spellchecker_dialog: true,
tinycomments_mode: 'embedded',
convert_urls: false,
+ file_picker_callback: fileManagerBrowser,
+ file_picker_types: 'image',
init_instance_callback: function (editor) {
editor.on('SetContent', () => {
tinymce.triggerSave(false, true)
@@ -29,7 +80,7 @@ if (typeof tinymce !== 'undefined') {
tinymce.murph.modes.default = tinymce.murph.modes.default || {
plugins: 'print preview importcss searchreplace visualblocks visualchars fullscreen template table charmap hr pagebreak nonbreaking toc insertdatetime advlist lists wordcount textpattern noneditable help charmap quickbars link image code autoresize',
menubar: 'file edit view insert format tools table tc help',
- toolbar: 'undo redo | bold italic underline strikethrough | link image | fontselect fontsizeselect formatselect | alignleft aligncenter alignright alignjustify | outdent indent | numlist bullist checklist | forecolor backcolor casechange permanentpen formatpainter removeformat | pagebreak | charmap | fullscreen preview',
+ toolbar: 'undo redo | bold italic underline strikethrough | link image | fontselect fontsizeselect formatselect | alignleft aligncenter alignright alignjustify | outdent indent | numlist bullist checklist | forecolor backcolor casechange permanentpen formatpainter removeformat | pagebreak | charmap | fullscreen preview',
quickbars_selection_toolbar: 'bold italic | quicklink h2 h3 blockquote quickimage quicktable',
contextmenu: 'link image imagetools table configurepermanentpen'
}
diff --git a/assets/js/admin/modules/file-manager.js b/assets/js/admin/modules/file-manager.js
index 6dbb2fa..5485a83 100644
--- a/assets/js/admin/modules/file-manager.js
+++ b/assets/js/admin/modules/file-manager.js
@@ -1,4 +1,3 @@
-// file-manager
const Vue = require('vue').default
const FileManager = require('../components/file-manager/FileManager').default
diff --git a/assets/js/admin/modules/modal.js b/assets/js/admin/modules/modal.js
index a8d912b..4cae714 100644
--- a/assets/js/admin/modules/modal.js
+++ b/assets/js/admin/modules/modal.js
@@ -1,5 +1,28 @@
const $ = require('jquery')
+const openModal = function (url) {
+ let container = $('#modal-container')
+ const body = $('body')
+
+ if (!container.length) {
+ container = $(' ')
+
+ body.append(container)
+ }
+
+ const loader = $(' ')
+ loader.html(' Loading... ')
+ body.append(loader)
+
+ container.html('')
+
+ $(container).modal('show')
+
+ container.load(url, function () {
+ loader.remove()
+ })
+}
+
module.exports = function () {
let click = 0
@@ -18,32 +41,13 @@ module.exports = function () {
click = 0
- let container = $('#modal-container')
- const body = $('body')
-
- if (!container.length) {
- container = $(' ')
-
- body.append(container)
- }
-
- const loader = $(' ')
- loader.html(' Loading... ')
- body.append(loader)
-
- container.html('')
-
let url = $(e.target).attr('data-modal')
if (!url) {
url = $(e.target).parents('*[data-modal]').first().attr('data-modal')
}
- $(container).modal('show')
-
- container.load(url, function () {
- loader.remove()
- })
+ openModal(url)
}, 250)
})
@@ -51,6 +55,6 @@ module.exports = function () {
const dataModal = urlParams.get('data-modal')
if (dataModal) {
- $('*[data-modal="' + dataModal + '"]').first().click()
+ openModal(dataModal)
}
}
diff --git a/core/Controller/Admin/AdminController.php b/core/Controller/Admin/AdminController.php
index 67864e9..02d726e 100644
--- a/core/Controller/Admin/AdminController.php
+++ b/core/Controller/Admin/AdminController.php
@@ -16,6 +16,14 @@ abstract class AdminController extends AbstractController
$this->coreParameters = $parameters->get('core');
}
+ /**
+ * @Route("/_ping", name="_ping")
+ */
+ public function ping()
+ {
+ return $this->json(true);
+ }
+
/**
* {@inheritdoc}
*/
@@ -29,12 +37,4 @@ abstract class AdminController extends AbstractController
}
abstract protected function getSection(): string;
-
- /**
- * @Route("/_ping", name="_ping")
- */
- public function ping()
- {
- return $this->json(true);
- }
}
diff --git a/core/Controller/Admin/Crud/CrudController.php b/core/Controller/Admin/Crud/CrudController.php
index 2443d0e..a6351cf 100644
--- a/core/Controller/Admin/Crud/CrudController.php
+++ b/core/Controller/Admin/Crud/CrudController.php
@@ -61,7 +61,7 @@ abstract class CrudController extends AdminController
$form->handleRequest($request);
if ($form->isValid()) {
- if ($beforeCreate !== null) {
+ if (null !== $beforeCreate) {
call_user_func_array($beforeCreate, [$entity, $form, $request]);
}
@@ -104,7 +104,7 @@ abstract class CrudController extends AdminController
$form->handleRequest($request);
if ($form->isValid()) {
- if ($beforeUpdate !== null) {
+ if (null !== $beforeUpdate) {
call_user_func_array($beforeUpdate, [$entity, $form, $request]);
}
@@ -149,7 +149,7 @@ abstract class CrudController extends AdminController
foreach ($pager as $key => $entity) {
if (isset($items[$key + 1])) {
- $entity->$setter($items[$key + 1] + $orderStart);
+ $entity->{$setter}($items[$key + 1] + $orderStart);
$entityManager->update($entity);
}
@@ -192,7 +192,7 @@ abstract class CrudController extends AdminController
$query->useFilters($this->filters);
- if ($target === 'selection') {
+ if ('selection' === $target) {
$isSelection = true;
$pager = $query->paginate($page, $configuration->getMaxPerPage($context));
} else {
@@ -216,7 +216,7 @@ abstract class CrudController extends AdminController
$configuration = $this->getConfiguration();
if ($this->isCsrfTokenValid('delete'.$entity->getId(), $request->request->get('_token'))) {
- if ($beforeDelete !== null) {
+ if (null !== $beforeDelete) {
call_user_func($beforeDelete, $entity);
}
diff --git a/core/Controller/FileManager/FileManagerAdminController.php b/core/Controller/FileManager/FileManagerAdminController.php
index ac620d8..4615ab8 100644
--- a/core/Controller/FileManager/FileManagerAdminController.php
+++ b/core/Controller/FileManager/FileManagerAdminController.php
@@ -6,7 +6,9 @@ use App\Core\Controller\Admin\AdminController;
use App\Core\FileManager\FsFileManager;
use App\Core\Form\FileManager\DirectoryCreateType;
use App\Core\Form\FileManager\DirectoryRenameType;
+use App\Core\Form\FileManager\FileInformationType;
use App\Core\Form\FileManager\FileUploadType;
+use App\Core\Manager\EntityManager;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
@@ -35,22 +37,53 @@ class FileManagerAdminController extends AdminController
}
/**
- * @Route("/info", name="admin_file_manager_info", options={"expose"=true})
+ * @Route("/info/{tab}/{context}", name="admin_file_manager_info", options={"expose"=true})
*/
- public function info(FsFileManager $manager, Request $request): Response
- {
- $info = $manager->info($request->query->get('file'));
+ public function info(
+ FsFileManager $manager,
+ Request $request,
+ EntityManager $entityManager,
+ string $context = 'crud',
+ string $tab = 'information'
+ ): Response {
+ $splInfo = $manager->getSplInfo($request->query->get('file'));
- if (!$info) {
+ if (!$splInfo) {
throw $this->createNotFoundException();
}
- $path = $manager->getPathUri().'/'.$info->getRelativePathname();
+ $fileInfo = $manager->getFileInformation($request->query->get('file'));
+ $path = $manager->getPathUri().'/'.$splInfo->getRelativePathname();
+
+ $form = $this->createForm(FileInformationType::class, $fileInfo);
+
+ if ($request->isMethod('POST')) {
+ $form->handleRequest($request);
+
+ if ($form->isValid()) {
+ $entityManager->update($fileInfo);
+
+ $this->addFlash('success', 'The data has been saved.');
+ } else {
+ $this->addFlash('warning', 'The form is not valid.');
+ }
+
+ return $this->redirectToRoute('admin_file_manager_index', [
+ 'data-modal' => $this->generateUrl('admin_file_manager_info', [
+ 'file' => $request->query->get('file'),
+ 'tab' => 'attributes',
+ ]),
+ 'path' => $splInfo->getRelativePath(),
+ ]);
+ }
return $this->render('@Core/file_manager/info.html.twig', [
- 'info' => $info,
+ 'splInfo' => $splInfo,
'path' => $path,
- 'isLocked' => $manager->isLocked($info->getRelativePathname()),
+ 'isLocked' => $manager->isLocked($splInfo->getRelativePathname()),
+ 'tab' => $tab,
+ 'form' => $form->createView(),
+ 'context' => $context,
]);
}
@@ -59,13 +92,13 @@ class FileManagerAdminController extends AdminController
*/
public function directoryNew(FsFileManager $manager, Request $request): Response
{
- $info = $manager->info($request->query->get('file'));
+ $splInfo = $manager->getSplInfo($request->query->get('file'));
- if (!$info) {
+ if (!$splInfo) {
throw $this->createNotFoundException();
}
- if (!$info->isDir()) {
+ if (!$splInfo->isDir()) {
throw $this->createNotFoundException();
}
@@ -92,7 +125,7 @@ class FileManagerAdminController extends AdminController
}
return $this->redirectToRoute('admin_file_manager_index', [
- 'path' => $info->getRelativePath(),
+ 'path' => $splInfo->getRelativePath(),
]);
}
@@ -108,13 +141,13 @@ class FileManagerAdminController extends AdminController
*/
public function directoryRename(FsFileManager $manager, Request $request): Response
{
- $info = $manager->info($request->query->get('file'));
+ $splInfo = $manager->getSplInfo($request->query->get('file'));
- if (!$info) {
+ if (!$splInfo) {
throw $this->createNotFoundException();
}
- if (!$info->isDir()) {
+ if (!$splInfo->isDir()) {
throw $this->createNotFoundException();
}
@@ -142,7 +175,7 @@ class FileManagerAdminController extends AdminController
}
return $this->redirectToRoute('admin_file_manager_index', [
- 'path' => $info->getRelativePath(),
+ 'path' => $splInfo->getRelativePath(),
]);
}
@@ -158,13 +191,13 @@ class FileManagerAdminController extends AdminController
*/
public function upload(FsFileManager $manager, Request $request): Response
{
- $info = $manager->info($request->query->get('file'));
+ $splInfo = $manager->getSplInfo($request->query->get('file'));
- if (!$info) {
+ if (!$splInfo) {
throw $this->createNotFoundException();
}
- if (!$info->isDir()) {
+ if (!$splInfo->isDir()) {
throw $this->createAccessDeniedException();
}
@@ -189,7 +222,7 @@ class FileManagerAdminController extends AdminController
}
return $this->redirectToRoute('admin_file_manager_index', [
- 'path' => $info->getRelativePathname(),
+ 'path' => $splInfo->getRelativePathname(),
]);
}
@@ -206,9 +239,9 @@ class FileManagerAdminController extends AdminController
public function delete(FsFileManager $manager, Request $request): Response
{
$path = $request->request->get('file');
- $info = $manager->info($request->request->get('file'));
+ $splInfo = $manager->getSplInfo($request->request->get('file'));
- if (!$info) {
+ if (!$splInfo) {
throw $this->createNotFoundException();
}
@@ -221,7 +254,7 @@ class FileManagerAdminController extends AdminController
}
return $this->redirectToRoute('admin_file_manager_index', [
- 'path' => $info->getRelativePath(),
+ 'path' => $splInfo->getRelativePath(),
]);
}
diff --git a/core/Controller/Site/NodeAdminController.php b/core/Controller/Site/NodeAdminController.php
index d6dc8df..52cec5f 100644
--- a/core/Controller/Site/NodeAdminController.php
+++ b/core/Controller/Site/NodeAdminController.php
@@ -13,6 +13,7 @@ use App\Core\Form\Site\NodeMoveType;
use App\Core\Form\Site\NodeType as EntityType;
use App\Core\Manager\EntityManager;
use App\Core\Repository\Site\NodeRepository;
+use App\Core\Site\ControllerLocator;
use App\Core\Site\PageLocator;
use App\Core\Sitemap\SitemapBuilder;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
@@ -20,7 +21,6 @@ use Symfony\Component\Form\FormError;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
-use App\Core\Site\ControllerLocator;
/**
* @Route("/admin/site/node")
@@ -278,7 +278,8 @@ class NodeAdminController extends AdminController
$entity
->setPage($page)
- ->setAliasNode(null);
+ ->setAliasNode(null)
+ ;
} elseif ('existing' === $pageAction) {
if ($pageEntity) {
$entity->setPage($pageEntity);
@@ -291,7 +292,8 @@ class NodeAdminController extends AdminController
} elseif ('none' === $pageAction) {
$entity
->setPage(null)
- ->setAliasNode(null);
+ ->setAliasNode(null)
+ ;
}
}
}
diff --git a/core/Controller/Site/PageAdminController.php b/core/Controller/Site/PageAdminController.php
index 7e76350..18187ae 100644
--- a/core/Controller/Site/PageAdminController.php
+++ b/core/Controller/Site/PageAdminController.php
@@ -5,18 +5,16 @@ namespace App\Core\Controller\Site;
use App\Core\Controller\Admin\Crud\CrudController;
use App\Core\Crud\CrudConfiguration;
use App\Core\Crud\Field;
-use App\Core\Entity\EntityInterface;
-use App\Core\Manager\EntityManager;
use App\Core\Entity\Site\Page\Page as Entity;
-use App\Core\Form\Site\Page\PageType as Type;
use App\Core\Form\Site\Page\Filter\PageFilterType as FilterType;
+use App\Core\Form\Site\Page\PageType as Type;
+use App\Core\Manager\EntityManager;
use App\Core\Repository\Site\Page\PageRepositoryQuery as RepositoryQuery;
+use App\Core\Site\PageLocator;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\Routing\Annotation\Route;
-use App\Core\Site\PageLocator;
-use App\Core\Repository\Site\Page\PageRepositoryQuery;
class PageAdminController extends CrudController
{
@@ -53,8 +51,7 @@ class PageAdminController extends CrudController
RepositoryQuery $repositoryQuery,
PageLocator $pageLocator,
Request $request
- ): Response
- {
+ ): Response {
$entity = $repositoryQuery->filterById($entity)->findOne();
$this->getConfiguration()->setFormOptions('edit', [
@@ -98,12 +95,13 @@ class PageAdminController extends CrudController
])
->setField('index', 'Elements', Field\TextField::class, [
'view' => '@Core/site/page_admin/fields/nodes.html.twig',
- 'sort' => ['navigation', function(RepositoryQuery $query, $direction) {
+ 'sort' => ['navigation', function (RepositoryQuery $query, $direction) {
$query
->leftJoin('.nodes', 'node')
->leftJoin('node.menu', 'menu')
->leftJoin('menu.navigation', 'navigation')
- ->orderBy('navigation.label', $direction);
+ ->orderBy('navigation.label', $direction)
+ ;
}],
])
;
diff --git a/core/Controller/Site/PageController.php b/core/Controller/Site/PageController.php
index 6798495..3a081b7 100644
--- a/core/Controller/Site/PageController.php
+++ b/core/Controller/Site/PageController.php
@@ -31,7 +31,7 @@ class PageController extends AbstractController
{
$parameters = array_merge($this->getDefaultRenderParameters(), $parameters);
- if ($response === null) {
+ if (null === $response) {
$contentType = $this->siteRequest->getNode()->getContentType();
$response = new Response(null, 200, [
diff --git a/core/Controller/Site/TreeAdminController.php b/core/Controller/Site/TreeAdminController.php
index fd05a93..934d900 100644
--- a/core/Controller/Site/TreeAdminController.php
+++ b/core/Controller/Site/TreeAdminController.php
@@ -33,7 +33,8 @@ class TreeAdminController extends AdminController
if (null === $navigation) {
$navigation = $navigationQuery->create()
->orderBy('.sortOrder')
- ->findOne();
+ ->findOne()
+ ;
}
if (null === $navigation) {
diff --git a/core/Controller/Task/TaskAdminController.php b/core/Controller/Task/TaskAdminController.php
index e8f20e6..1b18573 100644
--- a/core/Controller/Task/TaskAdminController.php
+++ b/core/Controller/Task/TaskAdminController.php
@@ -5,13 +5,13 @@ namespace App\Core\Controller\Task;
use App\Core\Controller\Admin\AdminController;
use App\Core\Event\Task\TaskInitEvent;
use App\Core\Event\Task\TaskRunRequestedEvent;
+use SensioLabs\AnsiConverter\AnsiToHtmlConverter;
+use SensioLabs\AnsiConverter\Theme\SolarizedTheme;
use Symfony\Component\Console\Output\BufferedOutput;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
-use SensioLabs\AnsiConverter\AnsiToHtmlConverter;
-use SensioLabs\AnsiConverter\Theme\SolarizedTheme;
/**
* @Route("/admin/task")
diff --git a/core/Entity/FileInformation.php b/core/Entity/FileInformation.php
new file mode 100644
index 0000000..13b290f
--- /dev/null
+++ b/core/Entity/FileInformation.php
@@ -0,0 +1,48 @@
+id;
+ }
+
+ public function setId(string $id): self
+ {
+ $this->id = $id;
+
+ return $this;
+ }
+
+ public function getAttributes()
+ {
+ return json_decode($this->attributes, true);
+ }
+
+ public function setAttributes($attributes): self
+ {
+ $this->attributes = json_encode($attributes);
+
+ return $this;
+ }
+}
diff --git a/core/Entity/Site/Page/CollectionBlock.php b/core/Entity/Site/Page/CollectionBlock.php
index 323eb90..015652a 100644
--- a/core/Entity/Site/Page/CollectionBlock.php
+++ b/core/Entity/Site/Page/CollectionBlock.php
@@ -3,7 +3,6 @@
namespace App\Core\Entity\Site\Page;
use Doctrine\ORM\Mapping as ORM;
-use Symfony\Component\HttpFoundation\File\File;
/**
* @ORM\Entity
diff --git a/core/Entity/Site/Page/Page.php b/core/Entity/Site/Page/Page.php
index 689132e..fd6608a 100644
--- a/core/Entity/Site/Page/Page.php
+++ b/core/Entity/Site/Page/Page.php
@@ -242,7 +242,7 @@ class Page implements EntityInterface
public function setOgImage($ogImage): self
{
- if ($this->ogImage !== null && $ogImage === null) {
+ if (null !== $this->ogImage && null === $ogImage) {
return $this;
}
diff --git a/core/Factory/FileInformationFactory.php b/core/Factory/FileInformationFactory.php
new file mode 100644
index 0000000..d8b081a
--- /dev/null
+++ b/core/Factory/FileInformationFactory.php
@@ -0,0 +1,16 @@
+setId($id);
+
+ return $entity;
+ }
+}
diff --git a/core/Factory/NavigationSettingFactory.php b/core/Factory/NavigationSettingFactory.php
index 9b4f883..a0d84f4 100644
--- a/core/Factory/NavigationSettingFactory.php
+++ b/core/Factory/NavigationSettingFactory.php
@@ -18,7 +18,8 @@ class NavigationSettingFactory implements FactoryInterface
$entity
->setNavigation($navigation)
- ->setCode($code);
+ ->setCode($code)
+ ;
return $entity;
}
diff --git a/core/FileManager/FsFileManager.php b/core/FileManager/FsFileManager.php
index 052255a..3b306c1 100644
--- a/core/FileManager/FsFileManager.php
+++ b/core/FileManager/FsFileManager.php
@@ -2,7 +2,10 @@
namespace App\Core\FileManager;
+use App\Core\Entity\FileInformation;
+use App\Core\Factory\FileInformationFactory;
use App\Core\Form\FileUploadHandler;
+use App\Core\Repository\FileInformationRepositoryQuery;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\Finder\Finder;
@@ -21,12 +24,21 @@ class FsFileManager
protected string $pathUri;
protected array $pathLocked;
protected FileUploadHandler $uploadHandler;
+ protected FileInformationFactory $fileInformationFactory;
+ protected FileInformationRepositoryQuery $fileInformationRepositoryQuery;
- public function __construct(ParameterBagInterface $params, FileUploadHandler $uploadHandler)
- {
+ public function __construct(
+ ParameterBagInterface $params,
+ FileUploadHandler $uploadHandler,
+ FileInformationFactory $fileInformationFactory,
+ FileInformationRepositoryQuery $fileInformationRepositoryQuery
+ ) {
$config = $params->get('core')['file_manager'];
$this->uploadHandler = $uploadHandler;
+ $this->fileInformationFactory = $fileInformationFactory;
+ $this->fileInformationRepositoryQuery = $fileInformationRepositoryQuery;
+
$this->mimes = $config['mimes'];
$this->path = $config['path'];
$this->pathUri = $this->normalizePath($config['path_uri']);
@@ -85,7 +97,7 @@ class FsFileManager
return $data;
}
- public function info(string $path): ?SplFileInfo
+ public function getSplInfo(string $path): ?SplFileInfo
{
$path = $this->normalizePath($path);
@@ -95,6 +107,7 @@ class FsFileManager
$finder = new Finder();
$finder->in($this->path)
+ ->depth('== '.substr_count($path, '/'))
->name(basename($path))
;
@@ -113,9 +126,36 @@ class FsFileManager
return null;
}
+ public function getFileInformation(string $path): ?FileInformation
+ {
+ $file = $this->getSplInfo($path);
+
+ if (!$file) {
+ return null;
+ }
+
+ if ($file->isDir()) {
+ return null;
+ }
+
+ $hash = hash_file('sha384', $file->getPathName());
+
+ $info = $this->fileInformationRepositoryQuery
+ ->where('.id = :hash')
+ ->setParameter(':hash', $hash)
+ ->findOne()
+ ;
+
+ if (!$info) {
+ $info = $this->fileInformationFactory->create($hash);
+ }
+
+ return $info;
+ }
+
public function createDirectory(string $name, string $path): bool
{
- $file = $this->info($path);
+ $file = $this->getSplInfo($path);
if (!$file || $this->isLocked($path)) {
return false;
@@ -135,7 +175,7 @@ class FsFileManager
public function renameDirectory(string $name, string $path): bool
{
- $file = $this->info($path);
+ $file = $this->getSplInfo($path);
if (!$file || $this->isLocked($path)) {
return false;
@@ -166,7 +206,7 @@ class FsFileManager
public function delete(string $path): bool
{
- $file = $this->info($path);
+ $file = $this->getSplInfo($path);
if ($this->isLocked($file)) {
return false;
@@ -182,7 +222,7 @@ class FsFileManager
public function isLocked($path): bool
{
- $file = $this->info($path);
+ $file = $this->getSplInfo($path);
if (!$file) {
return false;
diff --git a/core/Form/FileManager/DirectoryCreateType.php b/core/Form/FileManager/DirectoryCreateType.php
index 61971d8..fdc7dba 100644
--- a/core/Form/FileManager/DirectoryCreateType.php
+++ b/core/Form/FileManager/DirectoryCreateType.php
@@ -3,14 +3,11 @@
namespace App\Core\Form\FileManager;
use Symfony\Component\Form\AbstractType;
+use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
-use Symfony\Component\Form\Extension\Core\Type\FileType;
-use Symfony\Component\Validator\Constraints\File;
-use Symfony\Component\Validator\Constraints\All;
-use Symfony\Component\Form\Extension\Core\Type\TextType;
-use Symfony\Component\Validator\Constraints\Regex;
use Symfony\Component\Validator\Constraints\NotBlank;
+use Symfony\Component\Validator\Constraints\Regex;
class DirectoryCreateType extends AbstractType
{
diff --git a/core/Form/FileManager/DirectoryRenameType.php b/core/Form/FileManager/DirectoryRenameType.php
index fb70e8a..a4eac6d 100644
--- a/core/Form/FileManager/DirectoryRenameType.php
+++ b/core/Form/FileManager/DirectoryRenameType.php
@@ -3,14 +3,11 @@
namespace App\Core\Form\FileManager;
use Symfony\Component\Form\AbstractType;
+use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
-use Symfony\Component\Form\Extension\Core\Type\FileType;
-use Symfony\Component\Validator\Constraints\File;
-use Symfony\Component\Validator\Constraints\All;
-use Symfony\Component\Form\Extension\Core\Type\TextType;
-use Symfony\Component\Validator\Constraints\Regex;
use Symfony\Component\Validator\Constraints\NotBlank;
+use Symfony\Component\Validator\Constraints\Regex;
class DirectoryRenameType extends AbstractType
{
diff --git a/core/Form/FileManager/FileInformationAttributeType.php b/core/Form/FileManager/FileInformationAttributeType.php
new file mode 100644
index 0000000..8bca9b0
--- /dev/null
+++ b/core/Form/FileManager/FileInformationAttributeType.php
@@ -0,0 +1,49 @@
+add(
+ 'label',
+ TextType::class,
+ [
+ 'label' => 'Label',
+ 'required' => true,
+ 'attr' => [
+ ],
+ 'constraints' => [
+ new NotBlank(),
+ ],
+ ]
+ );
+
+ $builder->add(
+ 'value',
+ TextType::class,
+ [
+ 'label' => 'Value',
+ 'required' => false,
+ 'attr' => [
+ ],
+ 'constraints' => [
+ ],
+ ]
+ );
+ }
+
+ public function configureOptions(OptionsResolver $resolver)
+ {
+ $resolver->setDefaults([
+ 'data_class' => null,
+ ]);
+ }
+}
diff --git a/core/Form/FileManager/FileInformationType.php b/core/Form/FileManager/FileInformationType.php
new file mode 100644
index 0000000..839ea0d
--- /dev/null
+++ b/core/Form/FileManager/FileInformationType.php
@@ -0,0 +1,34 @@
+add(
+ 'attributes',
+ CollectionType::class,
+ [
+ 'entry_type' => FileInformationAttributeType::class,
+ 'by_reference' => false,
+ 'allow_add' => true,
+ 'allow_delete' => true,
+ 'prototype' => true,
+ ]
+ );
+ }
+
+ public function configureOptions(OptionsResolver $resolver)
+ {
+ $resolver->setDefaults([
+ 'data_class' => FileInformation::class,
+ ]);
+ }
+}
diff --git a/core/Form/FileManager/FileUploadType.php b/core/Form/FileManager/FileUploadType.php
index 6c53287..fec3fd0 100644
--- a/core/Form/FileManager/FileUploadType.php
+++ b/core/Form/FileManager/FileUploadType.php
@@ -3,11 +3,11 @@
namespace App\Core\Form\FileManager;
use Symfony\Component\Form\AbstractType;
+use Symfony\Component\Form\Extension\Core\Type\FileType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
-use Symfony\Component\Form\Extension\Core\Type\FileType;
-use Symfony\Component\Validator\Constraints\File;
use Symfony\Component\Validator\Constraints\All;
+use Symfony\Component\Validator\Constraints\File;
class FileUploadType extends AbstractType
{
diff --git a/core/Form/Site/NavigationAdditionalDomainType.php b/core/Form/Site/NavigationAdditionalDomainType.php
index bf58ba3..cc4ecf4 100644
--- a/core/Form/Site/NavigationAdditionalDomainType.php
+++ b/core/Form/Site/NavigationAdditionalDomainType.php
@@ -3,11 +3,11 @@
namespace App\Core\Form\Site;
use Symfony\Component\Form\AbstractType;
+use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
+use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
-use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Validator\Constraints\NotBlank;
-use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
class NavigationAdditionalDomainType extends AbstractType
{
diff --git a/core/Form/Site/NavigationType.php b/core/Form/Site/NavigationType.php
index 549a1db..9ccf546 100644
--- a/core/Form/Site/NavigationType.php
+++ b/core/Form/Site/NavigationType.php
@@ -4,14 +4,13 @@ namespace App\Core\Form\Site;
use App\Core\Entity\Site\Navigation;
use Symfony\Component\Form\AbstractType;
+use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
+use Symfony\Component\Form\Extension\Core\Type\CollectionType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Validator\Constraints\Length;
use Symfony\Component\Validator\Constraints\NotBlank;
-use App\Core\Form\Site\NavigationAdditionalDomainType;
-use Symfony\Component\Form\Extension\Core\Type\CollectionType;
-use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
class NavigationType extends AbstractType
{
diff --git a/core/Form/Site/NodeType.php b/core/Form/Site/NodeType.php
index ed00e97..5c9b314 100644
--- a/core/Form/Site/NodeType.php
+++ b/core/Form/Site/NodeType.php
@@ -7,13 +7,13 @@ use App\Core\Entity\Site\Page\Page;
use Doctrine\ORM\EntityRepository;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
+use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\CollectionType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Validator\Constraints\NotBlank;
-use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
class NodeType extends AbstractType
{
@@ -181,7 +181,7 @@ class NodeType extends AbstractType
'required' => false,
'class' => Node::class,
'choice_label' => 'label',
- 'choices' => call_user_func(function() use ($options, $builder) {
+ 'choices' => call_user_func(function () use ($options, $builder) {
$nodes = [];
foreach ($options['navigation']->getMenus() as $menu) {
diff --git a/core/Form/Site/Page/CollectionBlockType.php b/core/Form/Site/Page/CollectionBlockType.php
index a42b71c..3f46657 100644
--- a/core/Form/Site/Page/CollectionBlockType.php
+++ b/core/Form/Site/Page/CollectionBlockType.php
@@ -4,13 +4,11 @@ namespace App\Core\Form\Site\Page;
use App\Core\Entity\Site\Page\Block;
use Symfony\Component\Form\AbstractType;
-use Symfony\Component\Form\Extension\Core\Type\TextType;
-use Symfony\Component\Form\FormBuilderInterface;
-use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\CollectionType;
-use Symfony\Component\Form\FormView;
+use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormInterface;
-use Symfony\Component\Form\CallbackTransformer;
+use Symfony\Component\Form\FormView;
+use Symfony\Component\OptionsResolver\OptionsResolver;
class CollectionBlockType extends AbstractType
{
diff --git a/core/Maker/MakeRepositoryQuery.php b/core/Maker/MakeRepositoryQuery.php
index 9986e94..21b27d5 100644
--- a/core/Maker/MakeRepositoryQuery.php
+++ b/core/Maker/MakeRepositoryQuery.php
@@ -48,9 +48,9 @@ class MakeRepositoryQuery extends AbstractMaker
);
$queryDetails = $generator->createClassNameDetails(
- $repositoryClass,
+ $repositoryClass.'Query',
'Repository\\',
- 'Query'
+ ''
);
$id = u($queryDetails->getShortName())
diff --git a/core/Repository/FileInformationRepository.php b/core/Repository/FileInformationRepository.php
new file mode 100644
index 0000000..faad05a
--- /dev/null
+++ b/core/Repository/FileInformationRepository.php
@@ -0,0 +1,21 @@
+
- {% if info.type == 'file' %}
-
-
-
-
+
-
{% if not isLocked %}
-
{% endif %}
+
+
+
+
+
diff --git a/core/Resources/views/site/node_admin/_form.html.twig b/core/Resources/views/site/node_admin/_form.html.twig
index 736f6c8..cd75181 100644
--- a/core/Resources/views/site/node_admin/_form.html.twig
+++ b/core/Resources/views/site/node_admin/_form.html.twig
@@ -1,4 +1,4 @@
-
+
-
{{ 'Content'|trans }}
diff --git a/core/Twig/Extension/FileInformationExtension.php b/core/Twig/Extension/FileInformationExtension.php
new file mode 100644
index 0000000..e1c39e0
--- /dev/null
+++ b/core/Twig/Extension/FileInformationExtension.php
@@ -0,0 +1,85 @@
+fsManager = $fsManager;
+ $this->query = $query;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getFilters()
+ {
+ return [
+ new TwigFilter('file_attribute', [$this, 'fileAttribute']),
+ new TwigFilter('file_attributes', [$this, 'fileAttributes']),
+ ];
+ }
+
+ public function fileAttribute(string $file, string $label): ?string
+ {
+ $file = u($file);
+ $pathUri = $this->fsManager->getPathUri();
+ $pathUri2 = '/'.$pathUri;
+
+ if ($file->startsWith($pathUri) || $file->startsWith($pathUri2)) {
+ $file = $file->replaceMatches('#^'.preg_quote($pathUri).'#', '');
+ $file = $file->replaceMatches('#^'.preg_quote($pathUri2).'#', '');
+ }
+
+ $fileInfo = $this->fsManager->getFileInformation((string) $file);
+
+ if ($fileInfo) {
+ foreach ($fileInfo->getAttributes() as $attribute) {
+ if ($attribute['label'] === $label) {
+ return $attribute['value'];
+ }
+ }
+ }
+
+ return null;
+ }
+
+ public function fileAttributes(?string $content): ?string
+ {
+ preg_match_all('#\{\{\s*fattr://(?P[a-z0-9]+)\/(?P
|