From e8dbc4da58ae86618bceb67ed35ce23e5e54d2ed Mon Sep 17 00:00:00 2001 From: Christian F Date: Wed, 3 May 2023 13:47:19 +0200 Subject: [PATCH 01/66] [Security] Improved sanatizing of `pimcore_log` parameter (#15084) * added some more chars to remove * Update Pimcore.php --- lib/Pimcore.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/Pimcore.php b/lib/Pimcore.php index 6b31a88cae9..393118ac006 100644 --- a/lib/Pimcore.php +++ b/lib/Pimcore.php @@ -306,8 +306,7 @@ public static function initLogger() if (array_key_exists('pimcore_log', $_REQUEST) && self::inDebugMode()) { $requestLogName = date('Y-m-d_H-i-s'); if (!empty($_REQUEST['pimcore_log'])) { - // slashed are not allowed, replace them with hyphens - $requestLogName = str_replace('/', '-', $_REQUEST['pimcore_log']); + $requestLogName = str_replace(['/', '\\', '..'], '-', $_REQUEST['pimcore_log']); } $requestLogFile = resolvePath(PIMCORE_LOG_DIRECTORY . '/request-' . $requestLogName . '.log'); From 71f054613f6d9d5cef7fa590c5b4ed1798da8415 Mon Sep 17 00:00:00 2001 From: Blackbit Date: Tue, 9 May 2023 11:56:27 +0300 Subject: [PATCH 02/66] [Data objects] Relations get truncated when using multiple object bricks (#13974) * add index to context for objectbricks * add index to context for objectbricks * add index to context for objectbricks * migrate localized relational fields in object bricks * migrate localized relational fields in object bricks * fix hard-coded field name --- .../Migrations/Version20230320131322.php | 101 ++++++++++++++++++ models/DataObject/Localizedfield/Dao.php | 4 +- .../Traits/ContextPersistenceTrait.php | 2 +- 3 files changed, 104 insertions(+), 3 deletions(-) create mode 100644 bundles/CoreBundle/Migrations/Version20230320131322.php diff --git a/bundles/CoreBundle/Migrations/Version20230320131322.php b/bundles/CoreBundle/Migrations/Version20230320131322.php new file mode 100644 index 00000000000..2f2ca6b685e --- /dev/null +++ b/bundles/CoreBundle/Migrations/Version20230320131322.php @@ -0,0 +1,101 @@ +getClasses() as $classDefinition) { + $relations = Db::get()->fetchAllAssociative('SELECT src_id, ownername, fieldname, position FROM object_relations_'.$classDefinition->getId().' WHERE ownertype=\'localizedfield\' AND ownername LIKE \'/objectbrick~%\''); + foreach($relations as $relationItem) { + if(preg_match('/^\/objectbrick~([^\/]+)/', $relationItem['ownername'], $match)) { + $object = Concrete::getById($relationItem['src_id']); + if(!$object instanceof Concrete) { + continue; + } + $objectBrickContainerField = $match[1]; + $brickGetter = 'get'.$objectBrickContainerField; + + /** @var \Pimcore\Model\DataObject\Objectbrick $brickContainer */ + $brickContainer = $object->$brickGetter(); + + /** @var AbstractData $objectBrick */ + foreach($brickContainer->getItems() as $objectBrick) { + $brickDefinition = $objectBrick->getDefinition(); + $localizedFieldDefinition = $brickDefinition->getFieldDefinition('localizedfields'); + if($localizedFieldDefinition instanceof Localizedfields) { + if($localizedFieldDefinition->getFieldDefinition($relationItem['fieldname'])) { + $fieldGetter = 'get'.$relationItem['fieldname']; + $fieldSetter = 'set'.$relationItem['fieldname']; + $objectBrick->$fieldSetter($objectBrick->$fieldGetter($relationItem['position']), $relationItem['position']); + $objectBrick->markFieldDirty('localizedfields'); + $objectBrick->markFieldDirty($relationItem['fieldname']); + if(!method_exists($objectBrick, 'getLocalizedfields')) { + // this cannot happen, because we already checked that there are localized fields via $brickDefinition->getFieldDefinition('localizedfields') but PhpStan complains... + continue; + } + /** @var Localizedfield $localizedFields */ + $localizedFields = $objectBrick->getLocalizedfields(); + $localizedFields->markLanguageAsDirty($relationItem['position']); + $localizedFields->markFieldDirty($relationItem['fieldname']); + + Db::get()->executeStatement('DELETE FROM object_relations_'.$classDefinition->getId().' WHERE src_id=? AND fieldname=? AND ownertype=\'localizedfield\' AND ownername LIKE \'/objectbrick~%\'', [$object->getId(), $relationItem['fieldname']]); + + $objectBrick->save($object, [ + 'isUntouchable' => false, + 'isUpdate' => true, + 'context' => [ + 'containerType' => 'object', + ], + 'owner' => $object, + 'fieldname' => $objectBrickContainerField, + 'saveRelationalData' => ['saveLocalizedRelations' => true] + ]); + continue 2; + } + } + } + + Cache::remove('object_'.$object->getId()); + } + } + } + } + + public function down(Schema $schema): void + { + $this->up($schema); + } +} diff --git a/models/DataObject/Localizedfield/Dao.php b/models/DataObject/Localizedfield/Dao.php index b909d50b0cb..c8fd86c4ec6 100644 --- a/models/DataObject/Localizedfield/Dao.php +++ b/models/DataObject/Localizedfield/Dao.php @@ -425,7 +425,7 @@ public function save($params = []) if ($context['containerType'] === 'objectbrick') { $inheritanceRelationContext = [ 'ownertype' => 'localizedfield', - 'ownername' => '/objectbrick~' . $context['fieldname'] . '//localizedfield~localizedfield', + 'ownername' => '/objectbrick~' . $context['fieldname'] . '/' . $context['containerKey'] . '/localizedfield~localizedfield', ]; } else { $inheritanceRelationContext = [ @@ -561,7 +561,7 @@ public function delete($deleteQuery = true, $isUpdate = true) if ($container instanceof DataObject\Fieldcollection\Definition) { $objectId = $object->getId(); - $index = $context['index'] ?? null; + $index = $context['index'] ?? $context['containerKey'] ?? null; $containerName = $context['fieldname']; if (!$context['containerType']) { throw new \Exception('no container type set'); diff --git a/models/DataObject/Traits/ContextPersistenceTrait.php b/models/DataObject/Traits/ContextPersistenceTrait.php index 00f5da867d4..2e85d900583 100644 --- a/models/DataObject/Traits/ContextPersistenceTrait.php +++ b/models/DataObject/Traits/ContextPersistenceTrait.php @@ -58,7 +58,7 @@ protected function enrichDataRow($object, array $params, ?string &$classId, &$ro $context = $object->getContext(); if (isset($context['containerType']) && ($context['containerType'] === 'fieldcollection' || $context['containerType'] === 'objectbrick')) { $fieldname = $context['fieldname']; - $index = $context['index'] ?? null; + $index = $context['index'] ?? $context['containerKey'] ?? null; $row['ownername'] = '/' . $context['containerType'] . '~' . $fieldname . '/' . $index . '/localizedfield~' . $row['ownername']; } From 212044d146eb7ffcf832b14440bff01e955f97da Mon Sep 17 00:00:00 2001 From: Corepex Date: Tue, 9 May 2023 08:58:30 +0000 Subject: [PATCH 03/66] Apply php-cs-fixer changes --- bundles/CoreBundle/Migrations/Version20230320131322.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/bundles/CoreBundle/Migrations/Version20230320131322.php b/bundles/CoreBundle/Migrations/Version20230320131322.php index 2f2ca6b685e..e852629d385 100644 --- a/bundles/CoreBundle/Migrations/Version20230320131322.php +++ b/bundles/CoreBundle/Migrations/Version20230320131322.php @@ -81,8 +81,9 @@ public function up(Schema $schema): void ], 'owner' => $object, 'fieldname' => $objectBrickContainerField, - 'saveRelationalData' => ['saveLocalizedRelations' => true] + 'saveRelationalData' => ['saveLocalizedRelations' => true], ]); + continue 2; } } From c37a282e1cfa981452c035bbcbf249816156681e Mon Sep 17 00:00:00 2001 From: Matthias Schuhmayer <38959016+mattamon@users.noreply.github.com> Date: Tue, 9 May 2023 12:11:58 +0200 Subject: [PATCH 04/66] Improve static routes docs (#14803) * Improve docs so it can be testet in public demo * Remove routing grid dot * Image improvement --- .../04_Routing_and_URLs/02_Custom_Routes.md | 2 +- .../img/Routing_grid2.png | Bin 44334 -> 22763 bytes .../img/custom-routes.png | Bin 136148 -> 58547 bytes .../img/custom-routes2.png | Bin 48668 -> 22972 bytes 4 files changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/Development_Documentation/02_MVC/04_Routing_and_URLs/02_Custom_Routes.md b/doc/Development_Documentation/02_MVC/04_Routing_and_URLs/02_Custom_Routes.md index 3e8f872d59c..eefa6080c13 100644 --- a/doc/Development_Documentation/02_MVC/04_Routing_and_URLs/02_Custom_Routes.md +++ b/doc/Development_Documentation/02_MVC/04_Routing_and_URLs/02_Custom_Routes.md @@ -52,7 +52,7 @@ class NewsController extends FrontendController { public function detailAction(Request $request) { - $id = $request->get('id'); + $id = $request->get('news'); $text = $request->get('text'); // ... diff --git a/doc/Development_Documentation/img/Routing_grid2.png b/doc/Development_Documentation/img/Routing_grid2.png index d5f612900cd87e4a67963dbfbe0d62a75a1a67df..be511779e149e3f01e776eee1ed60e682ea26d5e 100644 GIT binary patch literal 22763 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 H{So>v64v{O4OGbF9QGoYUQVowE+N1 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 z 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 XOd4O1nIc|dYudV|Z=zRn$u9bLH&$OT literal 136148 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

2I~lz$YLwEr~8btoLBwj0Okp5t?i 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 z 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�@LB2eRUiCd{!J0 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 RvVTBZJ#C;C>hbgN{{W@07*7BI literal 48668 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 Date: Mon, 24 Apr 2023 17:02:38 +0200 Subject: [PATCH 05/66] fix AreabrickPass to work on Windows Areabricks were not automatically registered on Windows because hardcoded forward-slash was used here but bellow in str_replace calls DIRECTORY_SEPARATOR was used which caused mismatch on Windows. Was already reported previously as #12938 (was closed without fix). --- .../CoreBundle/DependencyInjection/Compiler/AreabrickPass.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bundles/CoreBundle/DependencyInjection/Compiler/AreabrickPass.php b/bundles/CoreBundle/DependencyInjection/Compiler/AreabrickPass.php index 1ccf82a21ae..c12d49ba904 100644 --- a/bundles/CoreBundle/DependencyInjection/Compiler/AreabrickPass.php +++ b/bundles/CoreBundle/DependencyInjection/Compiler/AreabrickPass.php @@ -204,7 +204,7 @@ protected function handleContainerAwareDefinition(ContainerBuilder $container, D protected function findBundleBricks(ContainerBuilder $container, string $name, array $metadata, array $excludedClasses = []): array { $sourcePath = is_dir($metadata['path'].'/src') ? $metadata['path'].'/src' : $metadata['path']; - $directory = $sourcePath.'/Document/Areabrick'; + $directory = $sourcePath.DIRECTORY_SEPARATOR.'Document'.DIRECTORY_SEPARATOR.'Areabrick'; // update cache when directory is added/removed $container->addResource(new FileExistenceResource($directory)); From 9b43c1ca853826196c7ab9f7603626de83ee274b Mon Sep 17 00:00:00 2001 From: Cameron Jenkins Date: Wed, 26 Apr 2023 10:44:16 -0300 Subject: [PATCH 06/66] load first page in search --- .../AdminBundle/Resources/public/js/pimcore/settings/website.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bundles/AdminBundle/Resources/public/js/pimcore/settings/website.js b/bundles/AdminBundle/Resources/public/js/pimcore/settings/website.js index 1607daee09b..516635e7e57 100644 --- a/bundles/AdminBundle/Resources/public/js/pimcore/settings/website.js +++ b/bundles/AdminBundle/Resources/public/js/pimcore/settings/website.js @@ -81,7 +81,7 @@ pimcore.settings.website = Class.create({ var input = field; var proxy = this.store.getProxy(); proxy.extraParams.filter = input.getValue(); - this.store.load(); + this.store.loadPage(1); } }.bind(this) } From 972ec362cab26ce5c23eb42fe10ee046e95f6ed1 Mon Sep 17 00:00:00 2001 From: Divesh Pahuja Date: Tue, 9 May 2023 18:47:35 +0200 Subject: [PATCH 07/66] [Admin][Events] Trigger Login Redirect event on login page not on authentication (#15137) --- .../Controller/Admin/LoginController.php | 34 +++++++++++++------ .../Authenticator/AdminLoginAuthenticator.php | 7 +--- .../Security/Guard/AdminAuthenticator.php | 7 +--- 3 files changed, 25 insertions(+), 23 deletions(-) diff --git a/bundles/AdminBundle/Controller/Admin/LoginController.php b/bundles/AdminBundle/Controller/Admin/LoginController.php index 0798b044b18..2a1034e7784 100644 --- a/bundles/AdminBundle/Controller/Admin/LoginController.php +++ b/bundles/AdminBundle/Controller/Admin/LoginController.php @@ -53,6 +53,7 @@ class LoginController extends AdminController implements BruteforceProtectedCont { public function __construct( protected ResponseHelper $responseHelper, + protected EventDispatcherInterface $eventDispatcher, ) { } @@ -94,8 +95,14 @@ public function onKernelResponseEvent(ResponseEvent $event) */ public function loginAction(Request $request, CsrfProtectionHandler $csrfProtection, Config $config) { + $queryParams = $request->query->all(); if ($request->get('_route') === 'pimcore_admin_login_fallback') { - return $this->redirectToRoute('pimcore_admin_login', $request->query->all(), Response::HTTP_MOVED_PERMANENTLY); + return $this->redirectToRoute('pimcore_admin_login', $queryParams, Response::HTTP_MOVED_PERMANENTLY); + } + + $redirectUrl = $this->dispatchLoginRedirect($queryParams); + if ($this->generateUrl('pimcore_admin_login', $queryParams) != $redirectUrl) { + return new RedirectResponse($redirectUrl); } $csrfProtection->regenerateCsrfToken(); @@ -172,7 +179,7 @@ public function loginCheckAction() /** * @Route("/login/lostpassword", name="pimcore_admin_login_lostpassword") */ - public function lostpasswordAction(Request $request, ?BruteforceProtectionHandler $bruteforceProtectionHandler, CsrfProtectionHandler $csrfProtection, Config $config, EventDispatcherInterface $eventDispatcher, RateLimiterFactory $resetPasswordLimiter) + public function lostpasswordAction(Request $request, ?BruteforceProtectionHandler $bruteforceProtectionHandler, CsrfProtectionHandler $csrfProtection, Config $config, RateLimiterFactory $resetPasswordLimiter) { $params = $this->buildLoginPageViewParams($config); $error = null; @@ -220,7 +227,7 @@ public function lostpasswordAction(Request $request, ?BruteforceProtectionHandle try { $event = new LostPasswordEvent($user, $loginUrl); - $eventDispatcher->dispatch($event, AdminEvents::LOGIN_LOSTPASSWORD); + $this->eventDispatcher->dispatch($event, AdminEvents::LOGIN_LOSTPASSWORD); // only send mail if it wasn't prevented in event if ($event->getSendMail()) { @@ -261,7 +268,7 @@ public function lostpasswordAction(Request $request, ?BruteforceProtectionHandle /** * @Route("/login/deeplink", name="pimcore_admin_login_deeplink") */ - public function deeplinkAction(Request $request, EventDispatcherInterface $eventDispatcher) + public function deeplinkAction(Request $request) { // check for deeplink $queryString = $_SERVER['QUERY_STRING']; @@ -271,26 +278,22 @@ public function deeplinkAction(Request $request, EventDispatcherInterface $event $perspective = strip_tags($request->get('perspective', '')); if (strpos($queryString, 'token')) { - $event = new LoginRedirectEvent('pimcore_admin_login', [ + $url = $this->dispatchLoginRedirect([ 'deeplink' => $deeplink, 'perspective' => $perspective, ]); - $eventDispatcher->dispatch($event, AdminEvents::LOGIN_REDIRECT); - - $url = $this->generateUrl($event->getRouteName(), $event->getRouteParams()); $url .= '&' . $queryString; return $this->redirect($url); } elseif ($queryString) { - $event = new LoginRedirectEvent('pimcore_admin_login', [ + $url = $this->dispatchLoginRedirect([ 'deeplink' => 'true', 'perspective' => $perspective, ]); - $eventDispatcher->dispatch($event, AdminEvents::LOGIN_REDIRECT); return $this->render('@PimcoreAdmin/Admin/Login/deeplink.html.twig', [ 'tab' => $deeplink, - 'redirect' => $this->generateUrl($event->getRouteName(), $event->getRouteParams()), + 'redirect' => $url, ]); } } @@ -364,4 +367,13 @@ public function detectBrowser() return $supported; } + + + private function dispatchLoginRedirect(array $routeParams = []): string + { + $event = new LoginRedirectEvent('pimcore_admin_login', $routeParams); + $this->eventDispatcher->dispatch($event, AdminEvents::LOGIN_REDIRECT); + + return $this->generateUrl($event->getRouteName(), $event->getRouteParams()); + } } diff --git a/bundles/AdminBundle/Security/Authenticator/AdminLoginAuthenticator.php b/bundles/AdminBundle/Security/Authenticator/AdminLoginAuthenticator.php index a73a6434fbc..75b839298d0 100644 --- a/bundles/AdminBundle/Security/Authenticator/AdminLoginAuthenticator.php +++ b/bundles/AdminBundle/Security/Authenticator/AdminLoginAuthenticator.php @@ -57,12 +57,7 @@ public function start(Request $request, AuthenticationException $authException = return $response; } - $event = new LoginRedirectEvent(self::PIMCORE_ADMIN_LOGIN, ['perspective' => strip_tags($request->get('perspective', ''))]); - $this->dispatcher->dispatch($event, AdminEvents::LOGIN_REDIRECT); - - $url = $this->router->generate($event->getRouteName(), $event->getRouteParams()); - - return new RedirectResponse($url); + return new RedirectResponse($this->router->generate(self::PIMCORE_ADMIN_LOGIN, ['perspective' => strip_tags($request->get('perspective', ''))])); } /** diff --git a/bundles/AdminBundle/Security/Guard/AdminAuthenticator.php b/bundles/AdminBundle/Security/Guard/AdminAuthenticator.php index bfc4c761952..8bf310878ce 100644 --- a/bundles/AdminBundle/Security/Guard/AdminAuthenticator.php +++ b/bundles/AdminBundle/Security/Guard/AdminAuthenticator.php @@ -136,12 +136,7 @@ public function start(Request $request, AuthenticationException $authException = return $response; } - $event = new LoginRedirectEvent('pimcore_admin_login', ['perspective' => strip_tags($request->get('perspective', ''))]); - $this->dispatcher->dispatch($event, AdminEvents::LOGIN_REDIRECT); - - $url = $this->router->generate($event->getRouteName(), $event->getRouteParams()); - - return new RedirectResponse($url); + return new RedirectResponse($this->router->generate('pimcore_admin_login', ['perspective' => strip_tags($request->get('perspective', ''))])); } /** From 5a1eb5590dfcdb6c6d5c15c0836ce5ee78e1fd54 Mon Sep 17 00:00:00 2001 From: kingjia90 Date: Tue, 9 May 2023 16:50:11 +0000 Subject: [PATCH 08/66] Apply php-cs-fixer changes --- bundles/AdminBundle/Controller/Admin/LoginController.php | 1 - .../Security/Authenticator/AdminLoginAuthenticator.php | 1 - bundles/AdminBundle/Security/Guard/AdminAuthenticator.php | 1 - 3 files changed, 3 deletions(-) diff --git a/bundles/AdminBundle/Controller/Admin/LoginController.php b/bundles/AdminBundle/Controller/Admin/LoginController.php index 2a1034e7784..db3134035a3 100644 --- a/bundles/AdminBundle/Controller/Admin/LoginController.php +++ b/bundles/AdminBundle/Controller/Admin/LoginController.php @@ -368,7 +368,6 @@ public function detectBrowser() return $supported; } - private function dispatchLoginRedirect(array $routeParams = []): string { $event = new LoginRedirectEvent('pimcore_admin_login', $routeParams); diff --git a/bundles/AdminBundle/Security/Authenticator/AdminLoginAuthenticator.php b/bundles/AdminBundle/Security/Authenticator/AdminLoginAuthenticator.php index 75b839298d0..9d713662b02 100644 --- a/bundles/AdminBundle/Security/Authenticator/AdminLoginAuthenticator.php +++ b/bundles/AdminBundle/Security/Authenticator/AdminLoginAuthenticator.php @@ -17,7 +17,6 @@ use Pimcore\Bundle\AdminBundle\Security\User\User; use Pimcore\Event\Admin\Login\LoginFailedEvent; -use Pimcore\Event\Admin\Login\LoginRedirectEvent; use Pimcore\Event\AdminEvents; use Pimcore\Tool\Authentication; use Symfony\Component\HttpFoundation\RedirectResponse; diff --git a/bundles/AdminBundle/Security/Guard/AdminAuthenticator.php b/bundles/AdminBundle/Security/Guard/AdminAuthenticator.php index 8bf310878ce..88bc8d86635 100644 --- a/bundles/AdminBundle/Security/Guard/AdminAuthenticator.php +++ b/bundles/AdminBundle/Security/Guard/AdminAuthenticator.php @@ -21,7 +21,6 @@ use Pimcore\Cache\RuntimeCache; use Pimcore\Event\Admin\Login\LoginCredentialsEvent; use Pimcore\Event\Admin\Login\LoginFailedEvent; -use Pimcore\Event\Admin\Login\LoginRedirectEvent; use Pimcore\Event\AdminEvents; use Pimcore\Model\User as UserModel; use Pimcore\Tool\Admin; From 8f33c246acd7017a9f9a27f60062b7aac59ccff4 Mon Sep 17 00:00:00 2001 From: Bernhard Rusch Date: Wed, 10 May 2023 08:48:22 +0200 Subject: [PATCH 09/66] SecurityHelper: there could be numeric values as well, which shouldn't be casted to string (#15105) * SecurityHelper: there could be numeric values as well, which shouldn't be casted to string * Update SecurityHelper.php --------- Co-authored-by: Christian F --- lib/Security/SecurityHelper.php | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/Security/SecurityHelper.php b/lib/Security/SecurityHelper.php index 9deeb9d4dbd..354a4dcc6cd 100644 --- a/lib/Security/SecurityHelper.php +++ b/lib/Security/SecurityHelper.php @@ -1,5 +1,7 @@ Date: Wed, 10 May 2023 09:00:17 +0200 Subject: [PATCH 10/66] [Bug] Add auto increment primary key to notes_data table (#15068) * add auto increment primary key to notes_data table * add auto increment primary key to notes_data table - add to install.sql * Update bundles/CoreBundle/Migrations/Version20230428112302.php Co-authored-by: mcop1 <89011527+mcop1@users.noreply.github.com> * Update bundles/CoreBundle/Migrations/Version20230428112302.php Co-authored-by: mcop1 <89011527+mcop1@users.noreply.github.com> --------- Co-authored-by: mcop1 <89011527+mcop1@users.noreply.github.com> --- .../Migrations/Version20230428112302.php | 43 +++++++++++++++++++ bundles/InstallBundle/Resources/install.sql | 4 +- 2 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 bundles/CoreBundle/Migrations/Version20230428112302.php diff --git a/bundles/CoreBundle/Migrations/Version20230428112302.php b/bundles/CoreBundle/Migrations/Version20230428112302.php new file mode 100644 index 00000000000..604d3eb56bc --- /dev/null +++ b/bundles/CoreBundle/Migrations/Version20230428112302.php @@ -0,0 +1,43 @@ +getTable('notes_data'); + + if (!$notesData->hasColumn('auto_id')) { + $notesData->addColumn('auto_id', 'integer', [ + 'autoincrement' => true, + ]); + + $notesData->dropPrimaryKey(); + $notesData->setPrimaryKey(['auto_id']); + $notesData->addUniqueIndex(['id', 'name'], 'UNIQ_E5A8E5E2BF3967505E237E06'); + } + } + + public function down(Schema $schema): void + { + $notesData = $schema->getTable('notes_data'); + + if ($notesData->hasColumn('auto_id')) { + $notesData->dropPrimaryKey(); + $notesData->dropColumn('auto_id'); + $notesData->setPrimaryKey(['id', 'name']); + $notesData->dropIndex('UNIQ_E5A8E5E2BF3967505E237E06'); + } + } +} diff --git a/bundles/InstallBundle/Resources/install.sql b/bundles/InstallBundle/Resources/install.sql index bd2d19c7f88..bdd63055da6 100644 --- a/bundles/InstallBundle/Resources/install.sql +++ b/bundles/InstallBundle/Resources/install.sql @@ -357,11 +357,13 @@ CREATE TABLE `notes` ( DROP TABLE IF EXISTS `notes_data`; CREATE TABLE `notes_data` ( + `auto_id` int(11) NOT NULL AUTO_INCREMENT, `id` int(11) NOT NULL, `name` varchar(255) NOT NULL, `type` enum('text','date','document','asset','object','bool') DEFAULT NULL, `data` text, - PRIMARY KEY (`id`, `name`) + PRIMARY KEY (`auto_id`), + UNIQUE KEY `UNIQ_E5A8E5E2BF3967505E237E06` (`id`,`name`) ) DEFAULT CHARSET=utf8mb4; DROP TABLE IF EXISTS `objects`; From ca49e023ccdd8685c2249ed69f02843a2983ab3e Mon Sep 17 00:00:00 2001 From: mcop1 Date: Wed, 10 May 2023 07:02:08 +0000 Subject: [PATCH 11/66] Apply php-cs-fixer changes --- .../CoreBundle/Migrations/Version20230428112302.php | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/bundles/CoreBundle/Migrations/Version20230428112302.php b/bundles/CoreBundle/Migrations/Version20230428112302.php index 604d3eb56bc..073cfc7cbf6 100644 --- a/bundles/CoreBundle/Migrations/Version20230428112302.php +++ b/bundles/CoreBundle/Migrations/Version20230428112302.php @@ -2,6 +2,19 @@ declare(strict_types=1); +/** + * Pimcore + * + * This source file is available under two different licenses: + * - GNU General Public License version 3 (GPLv3) + * - Pimcore Commercial License (PCL) + * Full copyright and license information is available in + * LICENSE.md which is distributed with this source code. + * + * @copyright Copyright (c) Pimcore GmbH (http://www.pimcore.org) + * @license http://www.pimcore.org/license GPLv3 and PCL + */ + namespace Pimcore\Bundle\CoreBundle\Migrations; use Doctrine\DBAL\Schema\Schema; From f735f09583cad7d75d27c55381f145434c1f144b Mon Sep 17 00:00:00 2001 From: Matthias Schuhmayer <38959016+mattamon@users.noreply.github.com> Date: Wed, 10 May 2023 15:17:22 +0200 Subject: [PATCH 12/66] Cache translations (#15126) * Cache translations * Add test method to check if cache gets invalidated after save * Add key * Change bracket position --- models/Translation/Listing/Dao.php | 20 +++++++++++++------- tests/Unit/Translation/TranslatorTest.php | 18 ++++++++++++++++++ 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/models/Translation/Listing/Dao.php b/models/Translation/Listing/Dao.php index cc7de759ab2..b28c7adf870 100644 --- a/models/Translation/Listing/Dao.php +++ b/models/Translation/Listing/Dao.php @@ -125,18 +125,24 @@ public function loadRaw() */ public function load() { - //$allTranslations = $this->getAllTranslations(); - $translations = []; $this->model->setGroupBy($this->getDatabaseTableName() . '.key', false); $queryBuilder = $this->getQueryBuilder([$this->getDatabaseTableName() . '.key']); - $translationsData = $this->db->fetchAllAssociative((string) $queryBuilder, $this->model->getConditionVariables()); + $cacheKey = $this->getDatabaseTableName().'_data_' . md5((string)$queryBuilder); - foreach ($translationsData as $t) { - $transObj = Model\Translation::getByKey(id: $t['key'], domain: $this->model->getDomain(), languages: $this->model->getLanguages()); + if (!empty($this->model->getConditionParams()) || !$translations = Cache::load($cacheKey)) { + $translations = []; + $translationsData = $this->db->fetchAllAssociative((string) $queryBuilder, $this->model->getConditionVariables()); + foreach ($translationsData as $t) { + $transObj = Model\Translation::getByKey(id: $t['key'], domain: $this->model->getDomain(), languages: $this->model->getLanguages()); - if ($transObj) { - $translations[] = $transObj; + if ($transObj) { + $translations[] = $transObj; + } + } + + if (empty($this->model->getConditionParams())) { + Cache::save($translations, $cacheKey, ['translator', 'translate'], null, 999); } } diff --git a/tests/Unit/Translation/TranslatorTest.php b/tests/Unit/Translation/TranslatorTest.php index ff20e2ba5d7..2de73b9ca79 100644 --- a/tests/Unit/Translation/TranslatorTest.php +++ b/tests/Unit/Translation/TranslatorTest.php @@ -229,4 +229,22 @@ public function testLoadingTranslationList() $translationValues = $translations[0]->getTranslations(); $this->assertArrayNotHasKey('fr', $translationValues); } + + public function testCacheGetsInvalidatedOnSave() + { + $translationsListing = new Translation\Listing(); + $translationsListing->setDomain('messages'); + $beforeAdd = $translationsListing->load(); + + $translation = new Translation(); + $translation->setDomain('messages'); + $translation->setKey('test'); + $translation->setTranslations(['en' => 'test']); + $translation->save(); + + $afterAdd = $translationsListing->load(); + + $this->assertCount(count($beforeAdd) + 1, $afterAdd); + } } + From cfda8c11b4692cf92ba94767e2738b282a91dd42 Mon Sep 17 00:00:00 2001 From: dvesh3 Date: Wed, 10 May 2023 13:19:21 +0000 Subject: [PATCH 13/66] Apply php-cs-fixer changes --- tests/Unit/Translation/TranslatorTest.php | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/Unit/Translation/TranslatorTest.php b/tests/Unit/Translation/TranslatorTest.php index 2de73b9ca79..299180d75dc 100644 --- a/tests/Unit/Translation/TranslatorTest.php +++ b/tests/Unit/Translation/TranslatorTest.php @@ -247,4 +247,3 @@ public function testCacheGetsInvalidatedOnSave() $this->assertCount(count($beforeAdd) + 1, $afterAdd); } } - From bef45d271352cccd717d128ab2bc5631591df5e6 Mon Sep 17 00:00:00 2001 From: mcop1 <89011527+mcop1@users.noreply.github.com> Date: Wed, 10 May 2023 15:51:43 +0200 Subject: [PATCH 14/66] [Bug] Classification Store - Call to undefined function (#15147) * Return necessary values only * Refactored `getConfigItem` method * Adapted phpDoc annotation * Added type hints instead of php doc annotation --- .../ClassificationstoreController.php | 42 ++++++++++--------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/bundles/AdminBundle/Controller/Admin/DataObject/ClassificationstoreController.php b/bundles/AdminBundle/Controller/Admin/DataObject/ClassificationstoreController.php index 597650e003c..e36f1b5c2af 100644 --- a/bundles/AdminBundle/Controller/Admin/DataObject/ClassificationstoreController.php +++ b/bundles/AdminBundle/Controller/Admin/DataObject/ClassificationstoreController.php @@ -366,7 +366,7 @@ public function collectionsAction(Request $request): JsonResponse $config->save(); - return $this->adminJson(['success' => true, 'data' => $config]); + return $this->adminJson(['success' => true, 'data' => $this->getConfigItem($config)]); } return $this->adminJson(['success' => false]); @@ -528,7 +528,7 @@ public function groupsAction(Request $request): JsonResponse $config->save(); - return $this->adminJson(['success' => true, 'data' => $config]); + return $this->adminJson(['success' => true, 'data' => $this->getConfigItem($config)]); } return $this->adminJson(['success' => false]); @@ -1322,7 +1322,7 @@ public function propertiesGetAction(Request $request): JsonResponse $data = []; foreach ($configList as $config) { - $item = $this->getConfigItem($config); + $item = $this->getKeyConfigItem($config); $data[] = $item; } $rootElement['data'] = $data; @@ -1358,7 +1358,7 @@ public function propertiesAction(Request $request): JsonResponse } $config->save(); - $item = $this->getConfigItem($config); + $item = $this->getKeyConfigItem($config); return $this->adminJson(['success' => true, 'data' => $item]); } @@ -1366,32 +1366,17 @@ public function propertiesAction(Request $request): JsonResponse return $this->adminJson(['success' => false]); } - /** - * @param Classificationstore\KeyConfig $config - * - * @return array - */ - protected function getConfigItem($config): array + protected function getConfigItem(Classificationstore\KeyConfig|Classificationstore\CollectionConfig|Classificationstore\GroupConfig $config): array { $name = $config->getName(); - $groupDescription = null; $item = [ 'storeId' => $config->getStoreId(), 'id' => $config->getId(), 'name' => $name, 'description' => $config->getDescription(), - 'type' => $config->getType() ? $config->getType() : 'input', - 'definition' => $config->getDefinition(), ]; - if ($config->getDefinition()) { - $definition = json_decode($config->getDefinition(), true); - if ($definition) { - $item['title'] = $definition['title']; - } - } - if ($config->getCreationDate()) { $item['creationDate'] = $config->getCreationDate(); } @@ -1403,6 +1388,23 @@ protected function getConfigItem($config): array return $item; } + protected function getKeyConfigItem(Classificationstore\KeyConfig $config): array + { + $item = $this->getConfigItem($config); + $item['type'] = $config->getType() ? $config->getType() : 'input'; + $definition = $config->getDefinition(); + $item['definition'] = $definition; + + if ($definition) { + $definition = json_decode($definition, true); + if ($definition) { + $item['title'] = $definition['title']; + } + } + + return $item; + } + /** * @Route("/add-property", name="addproperty", methods={"POST"}) * From f33cb780b8f6bf49338e669dd2e5b4941c992760 Mon Sep 17 00:00:00 2001 From: Niklas Date: Thu, 11 May 2023 10:55:29 +0200 Subject: [PATCH 15/66] =?UTF-8?q?Cleanup=20in=2003=5FNavigation.md:=20Whit?= =?UTF-8?q?espace/indentation,=20consistent=20parameter=20keys,=20?= =?UTF-8?q?=E2=80=A6=20(#14800)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../03_Documents/03_Navigation.md | 250 +++++++++--------- 1 file changed, 118 insertions(+), 132 deletions(-) diff --git a/doc/Development_Documentation/03_Documents/03_Navigation.md b/doc/Development_Documentation/03_Documents/03_Navigation.md index 7e26af8d902..0cea97df8f7 100644 --- a/doc/Development_Documentation/03_Documents/03_Navigation.md +++ b/doc/Development_Documentation/03_Documents/03_Navigation.md @@ -52,7 +52,6 @@ Having set up the navigation container as shown above, you can easily use it to maxDepth: 1, ulClass: 'nav navbar-nav' }) }} - ``` @@ -69,14 +68,14 @@ Having set up the navigation container as shown above, you can easily use it to 2: 'nav navbar-nav-third' } }) }} - + {# alternatively, you can use 'default' key to apply class on all depth levels #} {{ pimcore_render_nav(mainNavigation, 'menu', 'renderMenu', { maxDepth: 2, ulClass: { - 'default': 'nav navbar-nav' + default: 'nav navbar-nav' } - }) }} + }) }} ``` @@ -278,7 +277,6 @@ In the following example we're adding news items (objects) to the navigation usi navigationHelper = $navigationHelper; - $this->$newsLinkGenerator = $newsLinkGenerator; - } - /** - * @return array|TwigFunction[] - */ - public function getFunctions() - { - return [ - new TwigFunction('app_navigation_news_links', [$this, 'getDataLinks']) - ]; - } - - /** - * @param Document $document - * @param Document $startNode - * - * @return \Pimcore\Navigation\Container - * @throws \Exception - */ - public function getNewsLinks(Document $document, Document $startNode) - { - $navigation = $this->navigationHelper->build([ - 'active' => $document, - 'root' => $startNode, - 'pageCallback' => function($page, $document) { - /** @var \Pimcore\Model\Document $document */ - /** @var \Pimcore\Navigation\Page\Document $page */ - if($document->getProperty("templateType") == "news") { - $list = new \Pimcore\Model\DataObject\News\Listing; - $list->load(); - foreach($list as $news) { - $detailLink = $this->newsLinkGenerator->generate($news, ['document' => $document]); - $uri = new \Pimcore\Navigation\Page\Document([ - "label" => $news->getTitle(), - "id" => "object-" . $news->getId(), - "uri" => $detailLink, - ]); - $page->addPage($uri); - } - } + protected Navigation $navigationHelper; + protected NewsLinkGenerator $newsLinkGenerator; + + /** + * @param Navigation $navigationHelper + * @param NewsLinkGenerator $newsLinkGenerator + */ + public function __construct(Navigation $navigationHelper, NewsLinkGenerator $newsLinkGenerator) + { + $this->navigationHelper = $navigationHelper; + $this->$newsLinkGenerator = $newsLinkGenerator; + } + + /** + * @return TwigFunction[] + */ + public function getFunctions() + { + return [ + new TwigFunction('app_navigation_news_links', [$this, 'getDataLinks']) + ]; + } + + /** + * @param Document $document + * @param Document $startNode + * + * @return \Pimcore\Navigation\Container + * @throws \Exception + */ + public function getNewsLinks(Document $document, Document $startNode) + { + $navigation = $this->navigationHelper->build([ + 'active' => $document, + 'root' => $startNode, + 'pageCallback' => function($page, $document) { + /** @var \Pimcore\Model\Document $document */ + /** @var \Pimcore\Navigation\Page\Document $page */ + if($document->getProperty("templateType") == "news") { + $list = new \Pimcore\Model\DataObject\News\Listing; + $list->load(); + foreach($list as $news) { + $detailLink = $this->newsLinkGenerator->generate($news, ['document' => $document]); + $uri = new \Pimcore\Navigation\Page\Document([ + "label" => $news->getTitle(), + "id" => "object-" . $news->getId(), + "uri" => $detailLink, + ]); + $page->addPage($uri); } - ]); - - return $navigation; + } } -} + ]); -?> + return $navigation; + } +} ``` ```twig {% set mainNav = pimcore_build_nav({ active: document, root: mainNavStartNode, - }) %} + {% set mainNavigation = app_navigation_news_links(document, navStartNode) %}

{{ pimcore_render_nav(navigation, 'menu', 'renderMenu', { expandSiblingNodesOfActiveBranch: true, ulClass: { - 'default': 'nav my-sidenav' + default: 'nav my-sidenav' } }) }}
@@ -392,54 +383,49 @@ use Twig\TwigFunction; class NavigationExtension extends AbstractExtension { - /** - * @var Navigation - */ - protected $navigationHelper; - - /** - * @param Navigation $navigationHelper - */ - public function __construct(Navigation $navigationHelper) - { - $this->navigationHelper = $navigationHelper; - } - - /** - * @return array|TwigFunction[] - */ - public function getFunctions() - { - return [ - new TwigFunction('app_navigation_custom', [$this, 'getCustomNavigation']) - ]; - } - - /** - * @param Document $document - * @param Document $startNode - * - * @return \Pimcore\Navigation\Container - * @throws \Exception - */ - public function getCustomNavigation(Document $document, Document $startNode) - { - $navigation = $this->navigationHelper->build([ - 'active' => $document, - 'root' => $startNode, - 'pageCallback' => function ($page, $document) { - $page->setCustomSetting("myCustomProperty", $document->getProperty("myCustomProperty")); - $page->setCustomSetting("subListClass", $document->getProperty("subListClass")); - $page->setCustomSetting("title", $document->getTitle()); - $page->setCustomSetting("headline", $document->getEditable("headline")->getData()); - }] - ); - - return $navigation; - } -} + protected Navigation $navigationHelper; + + /** + * @param Navigation $navigationHelper + */ + public function __construct(Navigation $navigationHelper) + { + $this->navigationHelper = $navigationHelper; + } -?> + /** + * @return TwigFunction[] + */ + public function getFunctions() + { + return [ + new TwigFunction('app_navigation_custom', [$this, 'getCustomNavigation']) + ]; + } + + /** + * @param Document $document + * @param Document $startNode + * + * @return \Pimcore\Navigation\Container + * @throws \Exception + */ + public function getCustomNavigation(Document $document, Document $startNode) + { + $navigation = $this->navigationHelper->build([ + 'active' => $document, + 'root' => $startNode, + 'pageCallback' => function ($page, $document) { + $page->setCustomSetting("myCustomProperty", $document->getProperty("myCustomProperty")); + $page->setCustomSetting("subListClass", $document->getProperty("subListClass")); + $page->setCustomSetting("title", $document->getTitle()); + $page->setCustomSetting("headline", $document->getEditable("headline")->getData()); + }] + ); + + return $navigation; + } +} ``` ```twig @@ -453,16 +439,16 @@ Later in the template of the navigation (`navigation/partials/navigation.html.tw ```twig {% for page in pages %} - {% if page.isVisible() %} - {% set activeClass = page.getActive(true) ? 'active' : '' %} -
  • - {{ page.getLabel() }} - -
  • - {% endif %} - {% endfor %} + {% if page.isVisible() %} + {% set activeClass = page.getActive(true) ? 'active' : '' %} +
  • + {{ page.getLabel() }} + +
  • + {% endif %} +{% endfor %} ``` Using this method will dramatically improve the performance of your navigation. @@ -472,15 +458,15 @@ Using this method will dramatically improve the performance of your navigation. Sometimes it's necessary to manually set the key for the navigation cache. ```twig -pimcore_build_nav({active: document, root: navStartNode, cache: 'yourindividualkey'}) +{% pimcore_build_nav({active: document, root: navStartNode, cache: 'yourindividualkey'}) %} ``` ### Disabling the Navigation Cache -You can disable the navigation cache by setting the 5th argument to `false`. +You can disable the navigation cache by setting the `cache` argument to `false`. ```twig -pimcore_build_nav({active: document, root: navStartNode, cache: false}) +{% pimcore_build_nav({active: document, root: navStartNode, cache: false}) %} ``` ## FAQ @@ -500,10 +486,10 @@ The homepage will not appear in the navigation by default. You can add the homep ```twig {% do navigation.addPage({ - 'order': -1, - 'uri': '/', - 'label': 'Home'|trans, - 'title': 'Home'|trans, + order: -1, + uri: '/', + label: 'Home'|trans, + title: 'Home'|trans, }) %} ``` From 4c35c74eae6ab38b0f8d3458e7f5fa8cb6742718 Mon Sep 17 00:00:00 2001 From: Jacob Dreesen Date: Thu, 11 May 2023 10:56:29 +0200 Subject: [PATCH 16/66] Add missing `cache.end()` call in the performance docs (#14767) --- .../03_System_Setup_and_Hosting/09_Performance_Guide.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/Development_Documentation/23_Installation_and_Upgrade/03_System_Setup_and_Hosting/09_Performance_Guide.md b/doc/Development_Documentation/23_Installation_and_Upgrade/03_System_Setup_and_Hosting/09_Performance_Guide.md index a79e456919a..3a5e6732cc3 100644 --- a/doc/Development_Documentation/23_Installation_and_Upgrade/03_System_Setup_and_Hosting/09_Performance_Guide.md +++ b/doc/Development_Documentation/23_Installation_and_Upgrade/03_System_Setup_and_Hosting/09_Performance_Guide.md @@ -381,7 +381,7 @@ You can cache part of a template like: {% set navStartNode = pimcore_document(1) %} {% endif %} - {% set mainNavigation = app_navigation_data_links(document, navStartNode) %} + {% set mainNavigation = app_navigation_data_links(document, navStartNode) %}
    ... {{ @@ -396,6 +396,7 @@ You can cache part of a template like: }} ...
    + {% do cache.end() %} {% endif %} ``` From 41cf6166d83f93d2e02b0a13b6892f9ec6736ffd Mon Sep 17 00:00:00 2001 From: Christian F Date: Thu, 11 May 2023 11:24:57 +0200 Subject: [PATCH 17/66] [Bug] Removed serverside html sanitizer (#15111) * removed `SecurityHelper::convertHtmlSpecialChars`, added `Ext.util.Format.htmlEncode` to renderer * added htmlEncode to deleteConfirm modal * Update WebsiteSetting.php * removed onchange encode from value field * removed `SecurityHelper::convertHtmlSpecialChars` from config property * removed on change listener of config field * removed serverside html sanitizer * added `renderer: Ext.util.Format.htmlEncode` to all operators * removed `change` listeners, removed `convertHtmlSpecialChars` --- .../element/helpers/gridColumnConfig.js | 4 +- .../Resources/public/js/pimcore/helpers.js | 11 --- .../object/gridcolumn/operator/Alias.js | 3 +- .../object/gridcolumn/operator/Anonymizer.js | 4 +- .../object/gridcolumn/operator/AnyGetter.js | 6 +- .../object/gridcolumn/operator/Arithmetic.js | 3 +- .../operator/AssetMetadataGetter.js | 6 +- .../object/gridcolumn/operator/Base64.js | 3 +- .../object/gridcolumn/operator/Boolean.js | 3 +- .../gridcolumn/operator/BooleanFormatter.js | 9 ++- .../gridcolumn/operator/CaseConverter.js | 3 +- .../object/gridcolumn/operator/CharCounter.js | 3 +- .../gridcolumn/operator/Concatenator.js | 9 ++- .../gridcolumn/operator/DateFormatter.js | 3 +- .../gridcolumn/operator/ElementCounter.js | 3 +- .../operator/FieldCollectionGetter.js | 9 ++- .../gridcolumn/operator/GeopointRenderer.js | 3 +- .../operator/HotspotimageRenderer.js | 3 +- .../gridcolumn/operator/ImageRenderer.js | 3 +- .../object/gridcolumn/operator/IsEqual.js | 3 +- .../object/gridcolumn/operator/Iterator.js | 3 +- .../object/gridcolumn/operator/JSON.js | 3 +- .../object/gridcolumn/operator/LFExpander.js | 3 +- .../gridcolumn/operator/LocaleSwitcher.js | 3 +- .../object/gridcolumn/operator/Merge.js | 3 +- .../gridcolumn/operator/ObjectFieldGetter.js | 9 ++- .../pimcore/object/gridcolumn/operator/PHP.js | 3 +- .../object/gridcolumn/operator/PHPCode.js | 6 +- .../gridcolumn/operator/PropertyGetter.js | 6 +- .../object/gridcolumn/operator/RequiredBy.js | 3 +- .../gridcolumn/operator/StringContains.js | 6 +- .../gridcolumn/operator/StringReplace.js | 9 ++- .../object/gridcolumn/operator/Substring.js | 3 +- .../object/gridcolumn/operator/Text.js | 3 +- .../gridcolumn/operator/TranslateValue.js | 6 +- .../object/gridcolumn/operator/Trimmer.js | 3 +- .../gridcolumn/operator/WorkflowState.js | 3 +- .../object/quantityvalue/unitsettings.js | 17 +++-- .../pimcore/settings/metadata/predefined.js | 6 +- .../pimcore/settings/properties/predefined.js | 71 +++++++++++++++---- .../js/pimcore/settings/staticroutes.js | 17 ++--- .../public/js/pimcore/settings/website.js | 20 +++--- .../PricingManager/Rule.php | 2 +- .../public/js/pricing/config/item.js | 6 +- .../Operator/AbstractOperator.php | 4 +- .../GridColumnConfig/Operator/AnyGetter.php | 8 +-- models/DataObject/QuantityValue/Unit.php | 11 ++- models/Property/Predefined.php | 11 ++- models/Staticroute.php | 14 ++-- models/WebsiteSetting.php | 5 +- 50 files changed, 219 insertions(+), 142 deletions(-) diff --git a/bundles/AdminBundle/Resources/public/js/pimcore/element/helpers/gridColumnConfig.js b/bundles/AdminBundle/Resources/public/js/pimcore/element/helpers/gridColumnConfig.js index d2ca9d2f56a..3e51a38d34e 100644 --- a/bundles/AdminBundle/Resources/public/js/pimcore/element/helpers/gridColumnConfig.js +++ b/bundles/AdminBundle/Resources/public/js/pimcore/element/helpers/gridColumnConfig.js @@ -25,9 +25,7 @@ pimcore.element.helpers.gridColumnConfig = { length: 50, allowBlank: false, value: this.settings.gridConfigName ? this.settings.gridConfigName : defaultName, - listeners: { - change: pimcore.helpers.htmlEncodeTextField - } + renderer: Ext.util.Format.htmlEncode }); var descriptionField = new Ext.form.TextArea({ diff --git a/bundles/AdminBundle/Resources/public/js/pimcore/helpers.js b/bundles/AdminBundle/Resources/public/js/pimcore/helpers.js index 7c01e49dbf5..3c38c819a6f 100644 --- a/bundles/AdminBundle/Resources/public/js/pimcore/helpers.js +++ b/bundles/AdminBundle/Resources/public/js/pimcore/helpers.js @@ -22,17 +22,6 @@ pimcore.helpers.sanitizeUrlSlug = function (slug) { return slug.replace(/[^a-z0-9-_+/]/gi, ''); }; -pimcore.helpers.htmlEncodeTextField = function (textField) { - if(textField.getValue()) { - textField.suspendEvent('change'); - const decodedValue = Ext.util.Format.htmlDecode(textField.getValue()); - textField.setValue( - Ext.util.Format.htmlEncode(decodedValue) - ); - textField.resumeEvent('change'); - } -}; - pimcore.helpers.registerKeyBindings = function (bindEl, ExtJS) { if (!ExtJS) { diff --git a/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/Alias.js b/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/Alias.js index 5da55522e2f..a9745567811 100644 --- a/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/Alias.js +++ b/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/Alias.js @@ -87,7 +87,8 @@ pimcore.object.gridcolumn.operator.alias = Class.create(pimcore.object.gridcolum fieldLabel: t('label'), length: 255, width: 200, - value: this.node.data.configAttributes.label + value: this.node.data.configAttributes.label, + renderer: Ext.util.Format.htmlEncode }); diff --git a/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/Anonymizer.js b/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/Anonymizer.js index c1ce283e1ef..25f0b60cff0 100644 --- a/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/Anonymizer.js +++ b/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/Anonymizer.js @@ -72,7 +72,6 @@ pimcore.object.gridcolumn.operator.anonymizer = Class.create(pimcore.object.grid label: source.data.text, type: this.type, class: this.class - } }); @@ -87,7 +86,8 @@ pimcore.object.gridcolumn.operator.anonymizer = Class.create(pimcore.object.grid fieldLabel: t('label'), length: 255, width: 200, - value: this.node.data.configAttributes.label + value: this.node.data.configAttributes.label, + renderer: Ext.util.Format.htmlEncode }); var mode = this.node.data.configAttributes.mode; diff --git a/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/AnyGetter.js b/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/AnyGetter.js index 274279575d9..42987e256f5 100644 --- a/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/AnyGetter.js +++ b/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/AnyGetter.js @@ -84,7 +84,7 @@ pimcore.object.gridcolumn.operator.anygetter = Class.create(pimcore.object.gridc length: 255, width: 200, value: this.node.data.configAttributes.label, - listeners: {'change': pimcore.helpers.htmlEncodeTextField } + renderer: Ext.util.Format.htmlEncode }); this.attributeField = new Ext.form.TextField({ @@ -92,7 +92,7 @@ pimcore.object.gridcolumn.operator.anygetter = Class.create(pimcore.object.gridc length: 255, width: 200, value: this.node.data.configAttributes.attribute, - listeners: {'change': pimcore.helpers.htmlEncodeTextField } + renderer: Ext.util.Format.htmlEncode }); this.param1Field = new Ext.form.TextField({ @@ -100,7 +100,7 @@ pimcore.object.gridcolumn.operator.anygetter = Class.create(pimcore.object.gridc length: 255, width: 200, value: this.node.data.configAttributes.param1, - listeners: {'change': pimcore.helpers.htmlEncodeTextField } + renderer: Ext.util.Format.htmlEncode }); this.returnLastResultField = new Ext.form.Checkbox({ diff --git a/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/Arithmetic.js b/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/Arithmetic.js index 998221d5dc7..eeb1c6ba10a 100644 --- a/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/Arithmetic.js +++ b/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/Arithmetic.js @@ -86,7 +86,8 @@ pimcore.object.gridcolumn.operator.arithmetic = Class.create(pimcore.object.grid fieldLabel: t('label'), length: 255, width: 200, - value: this.node.data.configAttributes.label + value: this.node.data.configAttributes.label, + renderer: Ext.util.Format.htmlEncode }); var operator = this.node.data.configAttributes.operator; diff --git a/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/AssetMetadataGetter.js b/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/AssetMetadataGetter.js index 9c51ce0f58c..1594e5bccd4 100644 --- a/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/AssetMetadataGetter.js +++ b/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/AssetMetadataGetter.js @@ -83,7 +83,8 @@ pimcore.object.gridcolumn.operator.assetmetadatagetter = Class.create(pimcore.ob fieldLabel: t('label'), length: 255, width: 200, - value: this.node.data.configAttributes.label + value: this.node.data.configAttributes.label, + renderer: Ext.util.Format.htmlEncode }); var data = []; @@ -102,7 +103,8 @@ pimcore.object.gridcolumn.operator.assetmetadatagetter = Class.create(pimcore.ob fieldLabel: t('metadata_field'), length: 255, width: 200, - value: this.node.data.configAttributes.metaField + value: this.node.data.configAttributes.metaField, + renderer: Ext.util.Format.htmlEncode }); var options = { diff --git a/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/Base64.js b/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/Base64.js index e26d63b1b46..e7aac2cbce2 100644 --- a/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/Base64.js +++ b/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/Base64.js @@ -88,7 +88,8 @@ pimcore.object.gridcolumn.operator.base64 = Class.create(pimcore.object.gridcolu fieldLabel: t('label'), length: 255, width: 200, - value: this.node.data.configAttributes.label + value: this.node.data.configAttributes.label, + renderer: Ext.util.Format.htmlEncode }); var mode = this.node.data.configAttributes.mode; diff --git a/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/Boolean.js b/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/Boolean.js index 77fc80a493e..ea0ce9839b2 100644 --- a/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/Boolean.js +++ b/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/Boolean.js @@ -86,7 +86,8 @@ pimcore.object.gridcolumn.operator.boolean = Class.create(pimcore.object.gridcol fieldLabel: t('label'), length: 255, width: 200, - value: this.node.data.configAttributes.label + value: this.node.data.configAttributes.label, + renderer: Ext.util.Format.htmlEncode }); var operator = this.node.data.configAttributes.operator; diff --git a/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/BooleanFormatter.js b/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/BooleanFormatter.js index 81a227eaa78..c7997823c5c 100644 --- a/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/BooleanFormatter.js +++ b/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/BooleanFormatter.js @@ -85,21 +85,24 @@ pimcore.object.gridcolumn.operator.booleanformatter = Class.create(pimcore.objec fieldLabel: t('label'), length: 255, width: 200, - value: this.node.data.configAttributes.label + value: this.node.data.configAttributes.label, + renderer: Ext.util.Format.htmlEncode }); this.yesValueField = new Ext.form.TextField({ fieldLabel: t('yes_value'), length: 255, width: 200, - value: this.node.data.configAttributes.yesValue + value: this.node.data.configAttributes.yesValue, + renderer: Ext.util.Format.htmlEncode }); this.noValueField = new Ext.form.TextField({ fieldLabel: t('no_value'), length: 255, width: 200, - value: this.node.data.configAttributes.noValue + value: this.node.data.configAttributes.noValue, + renderer: Ext.util.Format.htmlEncode }); diff --git a/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/CaseConverter.js b/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/CaseConverter.js index b0ca9180e3c..3b1e9697042 100644 --- a/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/CaseConverter.js +++ b/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/CaseConverter.js @@ -87,7 +87,8 @@ pimcore.object.gridcolumn.operator.caseconverter = Class.create(pimcore.object.g fieldLabel: t('label'), length: 255, width: 200, - value: this.node.data.configAttributes.label + value: this.node.data.configAttributes.label, + renderer: Ext.util.Format.htmlEncode }); var capitalization = this.node.data.configAttributes.capitalization; diff --git a/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/CharCounter.js b/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/CharCounter.js index c873c755696..ecdbfc19a10 100644 --- a/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/CharCounter.js +++ b/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/CharCounter.js @@ -83,7 +83,8 @@ pimcore.object.gridcolumn.operator.charcounter = Class.create(pimcore.object.gri fieldLabel: t('label'), length: 255, width: 200, - value: this.node.data.configAttributes.label + value: this.node.data.configAttributes.label, + renderer: Ext.util.Format.htmlEncode }); diff --git a/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/Concatenator.js b/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/Concatenator.js index b33739d592a..f84d64bc7ea 100644 --- a/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/Concatenator.js +++ b/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/Concatenator.js @@ -82,21 +82,24 @@ pimcore.object.gridcolumn.operator.concatenator = Class.create(pimcore.object.gr fieldLabel: t('label'), length: 255, width: 200, - value: this.node.data.configAttributes.label + value: this.node.data.configAttributes.label, + renderer: Ext.util.Format.htmlEncode }); this.glue = new Ext.form.TextField({ fieldLabel: t('glue'), length: 255, width: 200, - value: this.node.data.configAttributes.glue + value: this.node.data.configAttributes.glue, + renderer: Ext.util.Format.htmlEncode }); this.forceValue = new Ext.form.Checkbox({ fieldLabel: t('force_value'), length: 255, width: 200, - value: this.node.data.configAttributes.forceValue + value: this.node.data.configAttributes.forceValue, + renderer: Ext.util.Format.htmlEncode }); diff --git a/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/DateFormatter.js b/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/DateFormatter.js index bb24844693e..a41cac40de3 100644 --- a/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/DateFormatter.js +++ b/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/DateFormatter.js @@ -88,7 +88,8 @@ pimcore.object.gridcolumn.operator.dateformatter = Class.create(pimcore.object.g fieldLabel: t('date_format'), length: 255, width: 200, - value: this.node.data.configAttributes.format + value: this.node.data.configAttributes.format, + renderer: Ext.util.Format.htmlEncode }); var helpButton = new Ext.Button({ diff --git a/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/ElementCounter.js b/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/ElementCounter.js index c14e8148c73..57a859def63 100644 --- a/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/ElementCounter.js +++ b/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/ElementCounter.js @@ -82,7 +82,8 @@ pimcore.object.gridcolumn.operator.elementcounter = Class.create(pimcore.object. fieldLabel: t('label'), length: 255, width: 200, - value: this.node.data.configAttributes.label + value: this.node.data.configAttributes.label, + renderer: Ext.util.Format.htmlEncode }); this.countEmptyField = new Ext.form.Checkbox({ diff --git a/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/FieldCollectionGetter.js b/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/FieldCollectionGetter.js index ec35c580445..ac669db536f 100644 --- a/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/FieldCollectionGetter.js +++ b/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/FieldCollectionGetter.js @@ -90,7 +90,8 @@ pimcore.object.gridcolumn.operator.fieldcollectiongetter = Class.create(pimcore. length: 255, width: 200, value: this.node.data.configAttributes.label, - allowBlank: true + allowBlank: true, + renderer: Ext.util.Format.htmlEncode }); this.attributeField = new Ext.form.TextField({ @@ -98,7 +99,8 @@ pimcore.object.gridcolumn.operator.fieldcollectiongetter = Class.create(pimcore. length: 255, width: 200, value: this.node.data.configAttributes.attr, - allowBlank: false + allowBlank: false, + renderer: Ext.util.Format.htmlEncode }); this.indexField = new Ext.form.NumberField({ @@ -114,7 +116,8 @@ pimcore.object.gridcolumn.operator.fieldcollectiongetter = Class.create(pimcore. length: 255, width: 200, value: this.node.data.configAttributes.colAttr, - allowBlank: false + allowBlank: false, + renderer: Ext.util.Format.htmlEncode }); diff --git a/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/GeopointRenderer.js b/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/GeopointRenderer.js index bab8439e29e..87c1fabcd6f 100644 --- a/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/GeopointRenderer.js +++ b/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/GeopointRenderer.js @@ -88,7 +88,8 @@ pimcore.object.gridcolumn.operator.geopointrenderer = Class.create(pimcore.objec this.textField = new Ext.form.TextField({ fieldLabel: t('label'), labelWidth: 200, - value: this.node.data.configAttributes.label + value: this.node.data.configAttributes.label, + renderer: Ext.util.Format.htmlEncode }); this.configPanel = new Ext.Panel({ diff --git a/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/HotspotimageRenderer.js b/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/HotspotimageRenderer.js index fb0e0585efd..25120b89563 100644 --- a/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/HotspotimageRenderer.js +++ b/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/HotspotimageRenderer.js @@ -88,7 +88,8 @@ pimcore.object.gridcolumn.operator.hotspotimagerenderer = Class.create(pimcore.o this.textField = new Ext.form.TextField({ fieldLabel: t('label'), labelWidth: 200, - value: this.node.data.configAttributes.label + value: this.node.data.configAttributes.label, + renderer: Ext.util.Format.htmlEncode }); this.configPanel = new Ext.Panel({ diff --git a/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/ImageRenderer.js b/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/ImageRenderer.js index 91fcbd1e856..71818c82dc5 100644 --- a/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/ImageRenderer.js +++ b/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/ImageRenderer.js @@ -88,7 +88,8 @@ pimcore.object.gridcolumn.operator.imagerenderer = Class.create(pimcore.object.g this.textField = new Ext.form.TextField({ fieldLabel: t('label'), labelWidth: 200, - value: this.node.data.configAttributes.label + value: this.node.data.configAttributes.label, + renderer: Ext.util.Format.htmlEncode }); this.configPanel = new Ext.Panel({ diff --git a/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/IsEqual.js b/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/IsEqual.js index 0c24d800139..03f454f03b7 100644 --- a/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/IsEqual.js +++ b/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/IsEqual.js @@ -86,7 +86,8 @@ pimcore.object.gridcolumn.operator.isequal = Class.create(pimcore.object.gridcol fieldLabel: t('label'), length: 255, width: 200, - value: this.node.data.configAttributes.label + value: this.node.data.configAttributes.label, + renderer: Ext.util.Format.htmlEncode }); this.skipNullField = new Ext.form.Checkbox({ diff --git a/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/Iterator.js b/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/Iterator.js index affdd9566f1..64755baf20e 100644 --- a/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/Iterator.js +++ b/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/Iterator.js @@ -87,7 +87,8 @@ pimcore.object.gridcolumn.operator.iterator = Class.create(pimcore.object.gridco fieldLabel: t('label'), length: 255, width: 200, - value: this.node.data.configAttributes.label + value: this.node.data.configAttributes.label, + renderer: Ext.util.Format.htmlEncode }); diff --git a/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/JSON.js b/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/JSON.js index 95e15893d09..ce455ca75b4 100644 --- a/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/JSON.js +++ b/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/JSON.js @@ -88,7 +88,8 @@ pimcore.object.gridcolumn.operator.json = Class.create(pimcore.object.gridcolumn fieldLabel: t('label'), length: 255, width: 200, - value: this.node.data.configAttributes.label + value: this.node.data.configAttributes.label, + renderer: Ext.util.Format.htmlEncode }); var mode = this.node.data.configAttributes.mode; diff --git a/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/LFExpander.js b/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/LFExpander.js index a121e54b9e9..487f18b8ee0 100644 --- a/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/LFExpander.js +++ b/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/LFExpander.js @@ -86,7 +86,8 @@ pimcore.object.gridcolumn.operator.lfexpander = Class.create(pimcore.object.grid fieldLabel: t('label'), length: 255, width: 220, - value: this.node.data.configAttributes.label + value: this.node.data.configAttributes.label, + renderer: Ext.util.Format.htmlEncode }); var data = []; diff --git a/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/LocaleSwitcher.js b/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/LocaleSwitcher.js index 086d74b8bf0..37131a214eb 100644 --- a/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/LocaleSwitcher.js +++ b/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/LocaleSwitcher.js @@ -85,7 +85,8 @@ pimcore.object.gridcolumn.operator.localeswitcher = Class.create(pimcore.object. fieldLabel: t('label'), length: 255, width: 200, - value: this.node.data.configAttributes.label + value: this.node.data.configAttributes.label, + renderer: Ext.util.Format.htmlEncode }); var data = []; diff --git a/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/Merge.js b/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/Merge.js index 4a515b08fbb..e8191be4d98 100644 --- a/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/Merge.js +++ b/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/Merge.js @@ -80,7 +80,8 @@ pimcore.object.gridcolumn.operator.merge = Class.create(pimcore.object.gridcolum this.textField = new Ext.form.TextField({ fieldLabel: t('label'), labelWidth: 200, - value: this.node.data.configAttributes.label + value: this.node.data.configAttributes.label, + renderer: Ext.util.Format.htmlEncode }); this.flattenField = new Ext.form.Checkbox({ diff --git a/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/ObjectFieldGetter.js b/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/ObjectFieldGetter.js index dc3b61ee222..fc740cdc137 100644 --- a/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/ObjectFieldGetter.js +++ b/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/ObjectFieldGetter.js @@ -85,21 +85,24 @@ pimcore.object.gridcolumn.operator.objectfieldgetter = Class.create(pimcore.obje fieldLabel: t('label'), length: 255, width: 200, - value: this.node.data.configAttributes.label + value: this.node.data.configAttributes.label, + renderer: Ext.util.Format.htmlEncode }); this.attributeField = new Ext.form.TextField({ fieldLabel: t('attribute'), length: 255, width: 200, - value: this.node.data.configAttributes.attribute + value: this.node.data.configAttributes.attribute, + renderer: Ext.util.Format.htmlEncode }); this.forwardAttributeField = new Ext.form.TextField({ fieldLabel: t('forward_attribute'), length: 255, width: 200, - value: this.node.data.configAttributes.forwardAttribute + value: this.node.data.configAttributes.forwardAttribute, + renderer: Ext.util.Format.htmlEncode }); diff --git a/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/PHP.js b/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/PHP.js index 9c94edb0b93..d923a1a109a 100644 --- a/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/PHP.js +++ b/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/PHP.js @@ -88,7 +88,8 @@ pimcore.object.gridcolumn.operator.php = Class.create(pimcore.object.gridcolumn. fieldLabel: t('label'), length: 255, width: 200, - value: this.node.data.configAttributes.label + value: this.node.data.configAttributes.label, + renderer: Ext.util.Format.htmlEncode }); var mode = this.node.data.configAttributes.mode; diff --git a/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/PHPCode.js b/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/PHPCode.js index 4ecb6c2a093..bc83d3b0c22 100644 --- a/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/PHPCode.js +++ b/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/PHPCode.js @@ -84,13 +84,15 @@ pimcore.object.gridcolumn.operator.phpcode = Class.create(pimcore.object.gridcol fieldLabel: t('label'), length: 255, width: 400, - value: this.node.data.configAttributes.label + value: this.node.data.configAttributes.label, + renderer: Ext.util.Format.htmlEncode }); this.phpClassField = new Ext.form.TextField({ fieldLabel: t('php_class'), width: 400, - value: this.node.data.configAttributes.phpClass + value: this.node.data.configAttributes.phpClass, + renderer: Ext.util.Format.htmlEncode }); this.additionalDataField = new Ext.form.TextArea({ diff --git a/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/PropertyGetter.js b/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/PropertyGetter.js index f2fd703e2fe..4aa0ba7c900 100644 --- a/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/PropertyGetter.js +++ b/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/PropertyGetter.js @@ -86,14 +86,16 @@ pimcore.object.gridcolumn.operator.propertygetter = Class.create(pimcore.object. fieldLabel: t('label'), length: 255, width: 200, - value: this.node.data.configAttributes.label + value: this.node.data.configAttributes.label, + renderer: Ext.util.Format.htmlEncode }); this.propertyNameField = new Ext.form.TextField({ fieldLabel: t('property_name'), length: 255, width: 200, - value: this.node.data.configAttributes.propertyName + value: this.node.data.configAttributes.propertyName, + renderer: Ext.util.Format.htmlEncode }); this.configPanel = new Ext.Panel({ diff --git a/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/RequiredBy.js b/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/RequiredBy.js index 8b4386bfd97..9a20487e13f 100644 --- a/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/RequiredBy.js +++ b/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/RequiredBy.js @@ -86,7 +86,8 @@ pimcore.object.gridcolumn.operator.requiredby = Class.create(pimcore.object.grid fieldLabel: t('label'), length: 255, width: 200, - value: this.node.data.configAttributes.label + value: this.node.data.configAttributes.label, + renderer: Ext.util.Format.htmlEncode }); var data = []; diff --git a/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/StringContains.js b/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/StringContains.js index 97f4f9791d4..b16e13c6ae6 100644 --- a/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/StringContains.js +++ b/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/StringContains.js @@ -86,14 +86,16 @@ pimcore.object.gridcolumn.operator.stringcontains = Class.create(pimcore.object. fieldLabel: t('label'), length: 255, width: 200, - value: this.node.data.configAttributes.label + value: this.node.data.configAttributes.label, + renderer: Ext.util.Format.htmlEncode }); this.searchField = new Ext.form.TextField({ fieldLabel: t('search'), length: 255, width: 200, - value: this.node.data.configAttributes.search + value: this.node.data.configAttributes.search, + renderer: Ext.util.Format.htmlEncode }); diff --git a/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/StringReplace.js b/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/StringReplace.js index 78f536778a0..a3b2f3cbeb6 100644 --- a/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/StringReplace.js +++ b/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/StringReplace.js @@ -86,21 +86,24 @@ pimcore.object.gridcolumn.operator.stringreplace = Class.create(pimcore.object.g fieldLabel: t('label'), length: 255, width: 200, - value: this.node.data.configAttributes.label + value: this.node.data.configAttributes.label, + renderer: Ext.util.Format.htmlEncode }); this.searchField = new Ext.form.TextField({ fieldLabel: t('search'), length: 255, width: 200, - value: this.node.data.configAttributes.search + value: this.node.data.configAttributes.search, + renderer: Ext.util.Format.htmlEncode }); this.replaceField = new Ext.form.TextField({ fieldLabel: t('replace'), length: 255, width: 200, - value: this.node.data.configAttributes.replace + value: this.node.data.configAttributes.replace, + renderer: Ext.util.Format.htmlEncode }); diff --git a/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/Substring.js b/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/Substring.js index da6a45bf741..ec2e6e9d19e 100644 --- a/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/Substring.js +++ b/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/Substring.js @@ -85,7 +85,8 @@ pimcore.object.gridcolumn.operator.substring = Class.create(pimcore.object.gridc fieldLabel: t('label'), length: 255, width: 200, - value: this.node.data.configAttributes.label + value: this.node.data.configAttributes.label, + renderer: Ext.util.Format.htmlEncode }); this.startField = new Ext.form.NumberField({ diff --git a/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/Text.js b/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/Text.js index 2ce54dd14ff..d0c08fd2eec 100644 --- a/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/Text.js +++ b/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/Text.js @@ -79,7 +79,8 @@ pimcore.object.gridcolumn.operator.text = Class.create(pimcore.object.gridcolumn fieldLabel: t('text'), length: 255, width: 200, - value: this.node.data.configAttributes.textValue + value: this.node.data.configAttributes.textValue, + renderer: Ext.util.Format.htmlEncode }); this.configPanel = new Ext.Panel({ diff --git a/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/TranslateValue.js b/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/TranslateValue.js index 99d32ff62b0..41e967462bc 100644 --- a/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/TranslateValue.js +++ b/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/TranslateValue.js @@ -85,14 +85,16 @@ pimcore.object.gridcolumn.operator.translatevalue = Class.create(pimcore.object. fieldLabel: t('label'), length: 255, width: 200, - value: this.node.data.configAttributes.label + value: this.node.data.configAttributes.label, + renderer: Ext.util.Format.htmlEncode }); this.prefix = new Ext.form.TextField({ fieldLabel: t('prefix'), length: 255, width: 200, - value: this.node.data.configAttributes.prefix + value: this.node.data.configAttributes.prefix, + renderer: Ext.util.Format.htmlEncode }); diff --git a/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/Trimmer.js b/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/Trimmer.js index 373613c33fe..2a03be416b8 100644 --- a/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/Trimmer.js +++ b/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/Trimmer.js @@ -87,7 +87,8 @@ pimcore.object.gridcolumn.operator.trimmer = Class.create(pimcore.object.gridcol fieldLabel: t('label'), length: 255, width: 200, - value: this.node.data.configAttributes.label + value: this.node.data.configAttributes.label, + renderer: Ext.util.Format.htmlEncode }); var trim = this.node.data.configAttributes.trim; diff --git a/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/WorkflowState.js b/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/WorkflowState.js index 56cef7dfe76..7fbe4780b07 100644 --- a/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/WorkflowState.js +++ b/bundles/AdminBundle/Resources/public/js/pimcore/object/gridcolumn/operator/WorkflowState.js @@ -83,7 +83,8 @@ pimcore.object.gridcolumn.operator.workflowstate = Class.create(pimcore.object.g fieldLabel: t('label'), length: 255, width: 200, - value: this.node.data.configAttributes.label + value: this.node.data.configAttributes.label, + renderer: Ext.util.Format.htmlEncode }); diff --git a/bundles/AdminBundle/Resources/public/js/pimcore/object/quantityvalue/unitsettings.js b/bundles/AdminBundle/Resources/public/js/pimcore/object/quantityvalue/unitsettings.js index 8eafb56f270..774793bdbea 100644 --- a/bundles/AdminBundle/Resources/public/js/pimcore/object/quantityvalue/unitsettings.js +++ b/bundles/AdminBundle/Resources/public/js/pimcore/object/quantityvalue/unitsettings.js @@ -105,9 +105,9 @@ pimcore.object.quantityValue.unitsettings = Class.create({ var typesColumns = [ {flex: 1, dataIndex: 'id', text: t("id"), filter: 'string'}, - {flex: 1, dataIndex: 'abbreviation', text: t("abbreviation"), editor: new Ext.form.TextField({listeners: {change: pimcore.helpers.htmlEncodeTextField}}), filter: 'string'}, - {flex: 2, dataIndex: 'longname', text: t("longname"), editor: new Ext.form.TextField({listeners: {change: pimcore.helpers.htmlEncodeTextField}}), filter: 'string'}, - {flex: 1, dataIndex: 'group', text: t("group"), editor: new Ext.form.TextField({listeners: {change: pimcore.helpers.htmlEncodeTextField}}), filter: 'string', hidden: true}, + {flex: 1, dataIndex: 'abbreviation', text: t("abbreviation"), editor: new Ext.form.TextField(), filter: 'string'}, + {flex: 2, dataIndex: 'longname', text: t("longname"), editor: new Ext.form.TextField(), filter: 'string'}, + {flex: 1, dataIndex: 'group', text: t("group"), editor: new Ext.form.TextField(), filter: 'string', hidden: true}, {flex: 1, dataIndex: 'baseunit', text: t("baseunit"), editor: baseUnitEditor, renderer: function(value){ if(!value) { return '('+t('empty')+')'; @@ -121,8 +121,8 @@ pimcore.object.quantityValue.unitsettings = Class.create({ }}, {flex: 1, dataIndex: 'factor', text: t("conversionFactor"), editor: new Ext.form.NumberField({decimalPrecision: 10}), filter: 'numeric'}, {flex: 1, dataIndex: 'conversionOffset', text: t("conversionOffset"), editor: new Ext.form.NumberField({decimalPrecision: 10}), filter: 'numeric'}, - {flex: 1, dataIndex: 'reference', text: t("reference"), editor: new Ext.form.TextField({listeners: {change: pimcore.helpers.htmlEncodeTextField}}), hidden: true, filter: 'string'}, - {flex: 1, dataIndex: 'converter', text: t("converter_service"), editor: new Ext.form.TextField({listeners: {change: pimcore.helpers.htmlEncodeTextField}}), filter: 'string'} + {flex: 1, dataIndex: 'reference', text: t("reference"), editor: new Ext.form.TextField(), hidden: true, filter: 'string'}, + {flex: 1, dataIndex: 'converter', text: t("converter_service"), editor: new Ext.form.TextField(), filter: 'string'} ]; typesColumns.push({ @@ -196,7 +196,12 @@ pimcore.object.quantityValue.unitsettings = Class.create({ plugins: ['pimcore.gridfilters', this.rowEditing], columnLines: true, stripeRows: true, - columns : typesColumns, + columns: { + items: typesColumns, + defaults: { + renderer: Ext.util.Format.htmlEncode + }, + }, bbar: this.pagingtoolbar, selModel: Ext.create('Ext.selection.RowModel', {}), tbar: { diff --git a/bundles/AdminBundle/Resources/public/js/pimcore/settings/metadata/predefined.js b/bundles/AdminBundle/Resources/public/js/pimcore/settings/metadata/predefined.js index d9f2fa9d8fd..eb0cd6eb09f 100644 --- a/bundles/AdminBundle/Resources/public/js/pimcore/settings/metadata/predefined.js +++ b/bundles/AdminBundle/Resources/public/js/pimcore/settings/metadata/predefined.js @@ -138,13 +138,13 @@ pimcore.settings.metadata.predefined = Class.create({ sortable: true }, {text: t("name"), width: 200, sortable: true, dataIndex: 'name', - getEditor: function() { return new Ext.form.TextField({ listeners: {'change': pimcore.helpers.htmlEncodeTextField } }); } + getEditor: function() { return new Ext.form.TextField(); } }, {text: t("group"), width: 200, sortable: true, dataIndex: 'group', - getEditor: function() { return new Ext.form.TextField({}); } + getEditor: function() { return new Ext.form.TextField(); } }, {text: t("description"), sortable: true, dataIndex: 'description', - getEditor: function() { return new Ext.form.TextArea({}); }, + getEditor: function() { return new Ext.form.TextArea(); }, renderer: function (value, metaData, record, rowIndex, colIndex, store) { if (empty(value)) { return ""; diff --git a/bundles/AdminBundle/Resources/public/js/pimcore/settings/properties/predefined.js b/bundles/AdminBundle/Resources/public/js/pimcore/settings/properties/predefined.js index 2fa2cd8530c..e7bc0f14338 100644 --- a/bundles/AdminBundle/Resources/public/js/pimcore/settings/properties/predefined.js +++ b/bundles/AdminBundle/Resources/public/js/pimcore/settings/properties/predefined.js @@ -108,26 +108,63 @@ pimcore.settings.properties.predefined = Class.create({ var propertiesColumns = [ - {text: t("name"), flex: 100, sortable: true, dataIndex: 'name', editor: new Ext.form.TextField({listeners: {'change': pimcore.helpers.htmlEncodeTextField}})}, - {text: t("description"), sortable: true, dataIndex: 'description', editor: new Ext.form.TextArea({listeners: {'change': pimcore.helpers.htmlEncodeTextField}}), + { + text: t("name"), + flex: 100, + sortable: true, + dataIndex: 'name', + editor: new Ext.form.TextField() + }, + { + text: t("description"), + sortable: true, + dataIndex: 'description', + editor: new Ext.form.TextArea(), renderer: function (value, metaData, record, rowIndex, colIndex, store) { if(empty(value)) { return ""; } return nl2br(Ext.util.Format.htmlEncode(value)); - } + } }, - {text: t("key"), flex: 50, sortable: true, dataIndex: 'key', editor: new Ext.form.TextField({listeners: {'change': pimcore.helpers.htmlEncodeTextField}})}, - {text: t("type"), flex: 50, sortable: true, dataIndex: 'type', + { + text: t("key"), + flex: 50, + sortable: true, + dataIndex: 'key', + editor: new Ext.form.TextField() + }, + { + text: t("type"), + flex: 50, + sortable: true, + dataIndex: 'type', editor: new Ext.form.ComboBox({ triggerAction: 'all', editable: false, store: ["text","document","asset","object","bool","select"] - })}, - {text: t("value"), flex: 50, sortable: true, dataIndex: 'data', editor: new Ext.form.TextField({listeners: {'change': pimcore.helpers.htmlEncodeTextField}})}, - {text: t("configuration"), flex: 50, sortable: false, dataIndex: 'config', editor: new Ext.form.TextField({listeners: {'change': pimcore.helpers.htmlEncodeTextField}})}, - {text: t("content_type"), flex: 50, sortable: true, dataIndex: 'ctype', + }) + }, + { + text: t("value"), + flex: 50, + sortable: true, + dataIndex: 'data', + editor: new Ext.form.TextField() + }, + { + text: t("configuration"), + flex: 50, + sortable: false, + dataIndex: 'config', + editor: new Ext.form.TextField() + }, + { + text: t("content_type"), + flex: 50, + sortable: true, + dataIndex: 'ctype', editor: new Ext.ux.form.MultiSelect({ store: new Ext.data.ArrayStore({ fields: ['key', { @@ -176,7 +213,8 @@ pimcore.settings.properties.predefined = Class.create({ ); }.bind(this) }] - },{ + }, + { xtype: 'actioncolumn', menuText: t('translate'), width: 30, @@ -194,7 +232,11 @@ pimcore.settings.properties.predefined = Class.create({ }.bind(this) }] }, - {text: t("creationDate"), sortable: true, dataIndex: 'creationDate', editable: false, + { + text: t("creationDate"), + sortable: true, + dataIndex: 'creationDate', + editable: false, hidden: true, renderer: function(d) { if (d !== undefined) { @@ -205,7 +247,11 @@ pimcore.settings.properties.predefined = Class.create({ } } }, - {text: t("modificationDate"), sortable: true, dataIndex: 'modificationDate', editable: false, + { + text: t("modificationDate"), + sortable: true, + dataIndex: 'modificationDate', + editable: false, hidden: true, renderer: function(d) { if (d !== undefined) { @@ -216,7 +262,6 @@ pimcore.settings.properties.predefined = Class.create({ } } } - ]; this.rowEditing = Ext.create('Ext.grid.plugin.RowEditing', { diff --git a/bundles/AdminBundle/Resources/public/js/pimcore/settings/staticroutes.js b/bundles/AdminBundle/Resources/public/js/pimcore/settings/staticroutes.js index 8feda63cc64..26be549e974 100644 --- a/bundles/AdminBundle/Resources/public/js/pimcore/settings/staticroutes.js +++ b/bundles/AdminBundle/Resources/public/js/pimcore/settings/staticroutes.js @@ -96,11 +96,11 @@ pimcore.settings.staticroutes = Class.create({ var typesColumns = [ {text:t("name"), flex:50, sortable:true, dataIndex:'name', - editor:new Ext.form.TextField({listeners: {'change': pimcore.helpers.htmlEncodeTextField}})}, + editor:new Ext.form.TextField()}, {text:t("pattern"), flex:100, sortable:true, dataIndex:'pattern', - editor:new Ext.form.TextField({listeners: {'change': pimcore.helpers.htmlEncodeTextField}})}, + editor:new Ext.form.TextField()}, {text:t("reverse"), flex:100, sortable:true, dataIndex:'reverse', - editor:new Ext.form.TextField({listeners: {'change': pimcore.helpers.htmlEncodeTextField}})}, + editor:new Ext.form.TextField()}, {text:t("controller"), flex:200, sortable:false, dataIndex:'controller', editor:new Ext.form.ComboBox({ store:new Ext.data.JsonStore({ @@ -127,17 +127,14 @@ pimcore.settings.staticroutes = Class.create({ valueField:'name', listConfig: { maxWidth: 400 - }, - listeners: { - 'change': pimcore.helpers.htmlEncodeTextField } })}, {text:t("variables"), flex:50, sortable:false, dataIndex:'variables', - editor:new Ext.form.TextField({listeners: {'change': pimcore.helpers.htmlEncodeTextField}})}, + editor:new Ext.form.TextField()}, {text:t("defaults"), flex:50, sortable:false, dataIndex:'defaults', - editor:new Ext.form.TextField({listeners: {'change': pimcore.helpers.htmlEncodeTextField}})}, + editor:new Ext.form.TextField()}, {text:t("site_ids"), flex:100, sortable:true, dataIndex:"siteId", - editor:new Ext.form.TextField({listeners: {'change': pimcore.helpers.htmlEncodeTextField}}), + editor:new Ext.form.TextField(), tooltip: t("site_ids_tooltip") }, {text:t("priority"), flex:50, sortable:true, dataIndex:'priority', editor:new Ext.form.ComboBox({ @@ -146,7 +143,7 @@ pimcore.settings.staticroutes = Class.create({ triggerAction:"all" })}, {text:t("methods"), flex:50, sortable:false, dataIndex:'methods', - editor:new Ext.form.TextField({listeners: {'change': pimcore.helpers.htmlEncodeTextField}}), + editor:new Ext.form.TextField(), }, {text: t("creationDate"), sortable: true, dataIndex: 'creationDate', editable: false, hidden: true, diff --git a/bundles/AdminBundle/Resources/public/js/pimcore/settings/website.js b/bundles/AdminBundle/Resources/public/js/pimcore/settings/website.js index 516635e7e57..cbf8269919a 100644 --- a/bundles/AdminBundle/Resources/public/js/pimcore/settings/website.js +++ b/bundles/AdminBundle/Resources/public/js/pimcore/settings/website.js @@ -112,11 +112,7 @@ pimcore.settings.website = Class.create({ flex: 100, editable: true, sortable: true, - editor: new Ext.form.TextField({ - listeners: { - 'change': pimcore.helpers.htmlEncodeTextField - } - }) + editor: new Ext.form.TextField() }, { text: t('language'), @@ -135,14 +131,14 @@ pimcore.settings.website = Class.create({ dataIndex: 'data', flex: 300, editable: true, - editor: new Ext.form.TextField({ - listeners: { - 'change': pimcore.helpers.htmlEncodeTextField - } - }), + editor: new Ext.form.TextField(), renderer: this.getCellRenderer.bind(this), }, - {text: t("site"), flex: 100, sortable:true, dataIndex: "siteId", + { + text: t("site"), + flex: 100, + sortable:true, + dataIndex: "siteId", editor: new Ext.form.ComboBox({ store: pimcore.globalmanager.get("sites"), valueField: "id", @@ -204,7 +200,7 @@ pimcore.settings.website = Class.create({ icon:"/bundles/pimcoreadmin/img/flat-color-icons/delete.svg", handler:function (grid, rowIndex) { let data = grid.getStore().getAt(rowIndex); - pimcore.helpers.deleteConfirm(t('website_settings'), data.data.name, function () { + pimcore.helpers.deleteConfirm(t('website_settings'), Ext.util.Format.htmlEncode(data.data.name), function () { grid.getStore().removeAt(rowIndex); }.bind(this)); }.bind(this) diff --git a/bundles/EcommerceFrameworkBundle/PricingManager/Rule.php b/bundles/EcommerceFrameworkBundle/PricingManager/Rule.php index 5c44bfbc9b2..c5a15daa339 100644 --- a/bundles/EcommerceFrameworkBundle/PricingManager/Rule.php +++ b/bundles/EcommerceFrameworkBundle/PricingManager/Rule.php @@ -205,7 +205,7 @@ public function getName() */ public function setName($name, $locale = null) { - $this->name = SecurityHelper::convertHtmlSpecialChars($name); + $this->name = $name; return $this; } diff --git a/bundles/EcommerceFrameworkBundle/Resources/public/js/pricing/config/item.js b/bundles/EcommerceFrameworkBundle/Resources/public/js/pricing/config/item.js index 6693184f142..5e2efe65882 100644 --- a/bundles/EcommerceFrameworkBundle/Resources/public/js/pricing/config/item.js +++ b/bundles/EcommerceFrameworkBundle/Resources/public/js/pricing/config/item.js @@ -133,14 +133,16 @@ pimcore.bundle.EcommerceFramework.pricing.config.item = Class.create({ name: "label." + lang, fieldLabel: t("label"), width: 350, - value: data.label[ lang ] + value: data.label[ lang ], + renderer: Ext.util.Format.htmlEncode }, { xtype: "textarea", name: "description." + lang, fieldLabel: t("description"), width: 500, height: 100, - value: data.description[ lang ] + value: data.description[ lang ], + renderer: Ext.util.Format.htmlEncode }] }; diff --git a/lib/DataObject/GridColumnConfig/Operator/AbstractOperator.php b/lib/DataObject/GridColumnConfig/Operator/AbstractOperator.php index 783170c7c4c..0139885567d 100644 --- a/lib/DataObject/GridColumnConfig/Operator/AbstractOperator.php +++ b/lib/DataObject/GridColumnConfig/Operator/AbstractOperator.php @@ -42,7 +42,7 @@ abstract class AbstractOperator implements OperatorInterface */ public function __construct(\stdClass $config, array $context = []) { - $this->label = SecurityHelper::convertHtmlSpecialChars($config->label); + $this->label = $config->label; $this->childs = $config->childs; $this->context = $context; } @@ -92,7 +92,7 @@ public function getLabel() */ public function setLabel($label) { - $this->label = SecurityHelper::convertHtmlSpecialChars($label); + $this->label = $label; } /** diff --git a/lib/DataObject/GridColumnConfig/Operator/AnyGetter.php b/lib/DataObject/GridColumnConfig/Operator/AnyGetter.php index 6bd0e9ef663..eb14d44f728 100644 --- a/lib/DataObject/GridColumnConfig/Operator/AnyGetter.php +++ b/lib/DataObject/GridColumnConfig/Operator/AnyGetter.php @@ -65,8 +65,8 @@ public function __construct(\stdClass $config, $context = null) parent::__construct($config, $context); - $this->attribute = SecurityHelper::convertHtmlSpecialChars($config->attribute ?? ''); - $this->param1 = SecurityHelper::convertHtmlSpecialChars($config->param1 ?? ''); + $this->attribute = $config->attribute ?? ''; + $this->param1 = $config->param1 ?? ''; $this->isArrayType = $config->isArrayType ?? false; $this->forwardAttribute = $config->forwardAttribute ?? ''; @@ -183,7 +183,7 @@ public function getAttribute() */ public function setAttribute($attribute) { - $this->attribute = SecurityHelper::convertHtmlSpecialChars($attribute); + $this->attribute = $attribute; } /** @@ -199,7 +199,7 @@ public function getParam1() */ public function setParam1($param1) { - $this->param1 = SecurityHelper::convertHtmlSpecialChars($param1); + $this->param1 = $param1; } /** diff --git a/models/DataObject/QuantityValue/Unit.php b/models/DataObject/QuantityValue/Unit.php index d3a849992f5..227742018fb 100644 --- a/models/DataObject/QuantityValue/Unit.php +++ b/models/DataObject/QuantityValue/Unit.php @@ -20,7 +20,6 @@ use Pimcore\Event\Model\DataObject\QuantityValueUnitEvent; use Pimcore\Event\Traits\RecursionBlockingEventDispatchHelperTrait; use Pimcore\Model; -use Pimcore\Security\SecurityHelper; /** * @method \Pimcore\Model\DataObject\QuantityValue\Unit\Dao getDao() @@ -210,7 +209,7 @@ public function __toString() */ public function setAbbreviation($abbreviation) { - $this->abbreviation = SecurityHelper::convertHtmlSpecialChars($abbreviation); + $this->abbreviation = $abbreviation; return $this; } @@ -277,7 +276,7 @@ public function getFactor() */ public function setGroup($group) { - $this->group = SecurityHelper::convertHtmlSpecialChars($group); + $this->group = $group; return $this; } @@ -317,7 +316,7 @@ public function getId() */ public function setLongname($longname) { - $this->longname = SecurityHelper::convertHtmlSpecialChars($longname); + $this->longname = $longname; return $this; } @@ -345,7 +344,7 @@ public function getReference() */ public function setReference($reference) { - $this->reference = SecurityHelper::convertHtmlSpecialChars($reference); + $this->reference = $reference; return $this; } @@ -385,7 +384,7 @@ public function getConverter() */ public function setConverter($converter) { - $this->converter = SecurityHelper::convertHtmlSpecialChars((string)$converter); + $this->converter = (string)$converter; return $this; } diff --git a/models/Property/Predefined.php b/models/Property/Predefined.php index 28ed45229bd..99dd0d9405d 100644 --- a/models/Property/Predefined.php +++ b/models/Property/Predefined.php @@ -16,7 +16,6 @@ namespace Pimcore\Model\Property; use Pimcore\Model; -use Pimcore\Security\SecurityHelper; /** * @internal @@ -178,7 +177,7 @@ public function getData() */ public function setKey($key) { - $this->key = SecurityHelper::convertHtmlSpecialChars($key); + $this->key = $key; return $this; } @@ -190,7 +189,7 @@ public function setKey($key) */ public function setName($name) { - $this->name = SecurityHelper::convertHtmlSpecialChars($name); + $this->name = $name; return $this; } @@ -214,7 +213,7 @@ public function setType($type) */ public function setData($data) { - $this->data = SecurityHelper::convertHtmlSpecialChars($data); + $this->data = $data; return $this; } @@ -254,7 +253,7 @@ public function getConfig() */ public function setConfig($config) { - $this->config = SecurityHelper::convertHtmlSpecialChars($config); + $this->config = $config; return $this; } @@ -306,7 +305,7 @@ public function setInheritable($inheritable) */ public function setDescription($description) { - $this->description = SecurityHelper::convertHtmlSpecialChars($description); + $this->description = $description; return $this; } diff --git a/models/Staticroute.php b/models/Staticroute.php index 2e4dcc65526..96e79c75685 100644 --- a/models/Staticroute.php +++ b/models/Staticroute.php @@ -293,7 +293,7 @@ public function setId($id) */ public function setPattern($pattern) { - $this->pattern = SecurityHelper::convertHtmlSpecialChars($pattern); + $this->pattern = $pattern; return $this; } @@ -305,7 +305,7 @@ public function setPattern($pattern) */ public function setController($controller) { - $this->controller = SecurityHelper::convertHtmlSpecialChars($controller); + $this->controller = $controller; return $this; } @@ -317,7 +317,7 @@ public function setController($controller) */ public function setVariables($variables) { - $this->variables = SecurityHelper::convertHtmlSpecialChars($variables); + $this->variables = $variables; return $this; } @@ -329,7 +329,7 @@ public function setVariables($variables) */ public function setDefaults($defaults) { - $this->defaults = SecurityHelper::convertHtmlSpecialChars($defaults); + $this->defaults = $defaults; return $this; } @@ -361,7 +361,7 @@ public function getPriority() */ public function setName($name) { - $this->name = SecurityHelper::convertHtmlSpecialChars($name); + $this->name = $name; return $this; } @@ -381,7 +381,7 @@ public function getName() */ public function setReverse($reverse) { - $this->reverse = SecurityHelper::convertHtmlSpecialChars($reverse); + $this->reverse = $reverse; return $this; } @@ -613,7 +613,7 @@ public function setMethods($methods) if (is_string($methods)) { $methods = strlen($methods) ? explode(',', $methods) : []; foreach($methods as $key => $method) { - $methods[$key] = SecurityHelper::convertHtmlSpecialChars(trim($method)); + $methods[$key] = trim($method); } } diff --git a/models/WebsiteSetting.php b/models/WebsiteSetting.php index a7bace70059..bae728b45f9 100644 --- a/models/WebsiteSetting.php +++ b/models/WebsiteSetting.php @@ -18,7 +18,6 @@ use Pimcore\Model\Element\ElementInterface; use Pimcore\Model\Element\Service; use Pimcore\Model\Exception\NotFoundException; -use Pimcore\Security\SecurityHelper; /** * @method \Pimcore\Model\WebsiteSetting\Dao getDao() @@ -184,7 +183,7 @@ public function setId($id) */ public function setName($name) { - $this->name = SecurityHelper::convertHtmlSpecialChars($name); + $this->name = $name; return $this; } @@ -229,7 +228,7 @@ public function setData($data) $data = $data->getId(); } - $this->data = SecurityHelper::convertHtmlSpecialChars($data); + $this->data = $data; return $this; } From e29cf9c86f85579f8979287466a5c8da6bffe1fd Mon Sep 17 00:00:00 2001 From: brusch Date: Thu, 11 May 2023 09:26:31 +0000 Subject: [PATCH 18/66] Apply php-cs-fixer changes --- bundles/EcommerceFrameworkBundle/PricingManager/Rule.php | 1 - lib/DataObject/GridColumnConfig/Operator/AbstractOperator.php | 1 - lib/DataObject/GridColumnConfig/Operator/AnyGetter.php | 1 - models/Staticroute.php | 1 - 4 files changed, 4 deletions(-) diff --git a/bundles/EcommerceFrameworkBundle/PricingManager/Rule.php b/bundles/EcommerceFrameworkBundle/PricingManager/Rule.php index c5a15daa339..a77df2d2613 100644 --- a/bundles/EcommerceFrameworkBundle/PricingManager/Rule.php +++ b/bundles/EcommerceFrameworkBundle/PricingManager/Rule.php @@ -24,7 +24,6 @@ use Pimcore\Logger; use Pimcore\Model\AbstractModel; use Pimcore\Model\Exception\NotFoundException; -use Pimcore\Security\SecurityHelper; /** * @method Dao getDao() diff --git a/lib/DataObject/GridColumnConfig/Operator/AbstractOperator.php b/lib/DataObject/GridColumnConfig/Operator/AbstractOperator.php index 0139885567d..47e5545d27a 100644 --- a/lib/DataObject/GridColumnConfig/Operator/AbstractOperator.php +++ b/lib/DataObject/GridColumnConfig/Operator/AbstractOperator.php @@ -16,7 +16,6 @@ namespace Pimcore\DataObject\GridColumnConfig\Operator; use Pimcore\DataObject\GridColumnConfig\ConfigElementInterface; -use Pimcore\Security\SecurityHelper; use Pimcore\Tool; abstract class AbstractOperator implements OperatorInterface diff --git a/lib/DataObject/GridColumnConfig/Operator/AnyGetter.php b/lib/DataObject/GridColumnConfig/Operator/AnyGetter.php index eb14d44f728..ccf970ce46c 100644 --- a/lib/DataObject/GridColumnConfig/Operator/AnyGetter.php +++ b/lib/DataObject/GridColumnConfig/Operator/AnyGetter.php @@ -16,7 +16,6 @@ namespace Pimcore\DataObject\GridColumnConfig\Operator; use Pimcore\Model\AbstractModel; -use Pimcore\Security\SecurityHelper; use Pimcore\Tool\Admin; /** diff --git a/models/Staticroute.php b/models/Staticroute.php index 96e79c75685..a5ea0fd8dd1 100644 --- a/models/Staticroute.php +++ b/models/Staticroute.php @@ -17,7 +17,6 @@ use Pimcore\Event\FrontendEvents; use Pimcore\Model\Exception\NotFoundException; -use Pimcore\Security\SecurityHelper; use Symfony\Component\EventDispatcher\GenericEvent; /** From 642096e0e1888077e61e38f3e1914ff02f196fc9 Mon Sep 17 00:00:00 2001 From: Christian F Date: Thu, 11 May 2023 15:35:20 +0200 Subject: [PATCH 19/66] [Task] Removed `sanitizeHtmlAttributes` method from link editable (#15174) * removed `sanitizeHtmlAttributes` method from link editable * fixed bug in attributes field --- .../js/pimcore/document/editables/link.js | 2 +- .../Resources/public/js/pimcore/helpers.js | 30 ++++++++++------ lib/Security/SecurityHelper.php | 9 ----- models/Document/Editable/Link.php | 35 ++++++------------- 4 files changed, 32 insertions(+), 44 deletions(-) diff --git a/bundles/AdminBundle/Resources/public/js/pimcore/document/editables/link.js b/bundles/AdminBundle/Resources/public/js/pimcore/document/editables/link.js index 93eeba7679e..8362db1d039 100644 --- a/bundles/AdminBundle/Resources/public/js/pimcore/document/editables/link.js +++ b/bundles/AdminBundle/Resources/public/js/pimcore/document/editables/link.js @@ -108,7 +108,7 @@ pimcore.document.editables.link = Class.create(pimcore.document.editable, { displayHtml += this.config.textSuffix; } - return '' + displayHtml + ''; + return '' + displayHtml + ''; } return text; }, diff --git a/bundles/AdminBundle/Resources/public/js/pimcore/helpers.js b/bundles/AdminBundle/Resources/public/js/pimcore/helpers.js index 3c38c819a6f..896ee369e89 100644 --- a/bundles/AdminBundle/Resources/public/js/pimcore/helpers.js +++ b/bundles/AdminBundle/Resources/public/js/pimcore/helpers.js @@ -1814,7 +1814,8 @@ pimcore.helpers.editmode.openLinkEditPanel = function (data, callback) { linkTypeField.setValue("direct"); } } - } + }, + renderer: Ext.util.Format.htmlEncode }); @@ -1873,7 +1874,8 @@ pimcore.helpers.editmode.openLinkEditPanel = function (data, callback) { { fieldLabel: t('text'), name: 'text', - value: data.text + value: data.text, + renderer: Ext.util.Format.htmlEncode }, { xtype: "fieldcontainer", @@ -1922,17 +1924,20 @@ pimcore.helpers.editmode.openLinkEditPanel = function (data, callback) { { fieldLabel: t('parameters'), name: 'parameters', - value: data.parameters + value: data.parameters, + renderer: Ext.util.Format.htmlEncode }, { fieldLabel: t('anchor'), name: 'anchor', - value: data.anchor + value: data.anchor, + renderer: Ext.util.Format.htmlEncode }, { fieldLabel: t('title'), name: 'title', - value: data.title + value: data.title, + renderer: Ext.util.Format.htmlEncode } ] } @@ -1947,30 +1952,35 @@ pimcore.helpers.editmode.openLinkEditPanel = function (data, callback) { { fieldLabel: t('accesskey'), name: 'accesskey', - value: data.accesskey + value: data.accesskey, + renderer: Ext.util.Format.htmlEncode }, { fieldLabel: t('relation'), name: 'rel', width: 300, - value: data.rel + value: data.rel, + renderer: Ext.util.Format.htmlEncode }, { fieldLabel: ('tabindex'), name: 'tabindex', - value: data.tabindex + value: data.tabindex, + renderer: Ext.util.Format.htmlEncode }, { fieldLabel: t('class'), name: 'class', width: 300, - value: data["class"] + value: data["class"], + renderer: Ext.util.Format.htmlEncode }, { fieldLabel: t('attributes') + ' (key="value")', name: 'attributes', width: 300, - value: data["attributes"] + value: data["attributes"], + renderer: Ext.util.Format.htmlEncode } ] } diff --git a/lib/Security/SecurityHelper.php b/lib/Security/SecurityHelper.php index 354a4dcc6cd..25722ceb4b0 100644 --- a/lib/Security/SecurityHelper.php +++ b/lib/Security/SecurityHelper.php @@ -39,13 +39,4 @@ public static function convertHtmlSpecialCharsArrayKeys(array &$array, array $ke } } } - - public static function sanitizeHtmlAttributes(mixed $text): mixed - { - if(is_string($text)) { - return preg_replace('/[\/"\'\\\]/', '', $text); - } else { - return $text; - } - } } diff --git a/models/Document/Editable/Link.php b/models/Document/Editable/Link.php index 91cd4d7db60..744c8684f38 100644 --- a/models/Document/Editable/Link.php +++ b/models/Document/Editable/Link.php @@ -19,7 +19,6 @@ use Pimcore\Model; use Pimcore\Model\Asset; use Pimcore\Model\Document; -use Pimcore\Security\SecurityHelper; /** * @method \Pimcore\Model\Document\Editable\Dao getDao() @@ -155,9 +154,9 @@ public function frontend() strpos($key, 'aria-') === 0 || in_array($key, $allowedAttributes))) { if (!empty($this->data[$key]) && !empty($this->config[$key])) { - $attribs[] = $key.'="'. SecurityHelper::sanitizeHtmlAttributes($this->data[$key]) .' '. SecurityHelper::sanitizeHtmlAttributes($this->config[$key]) .'"'; + $attribs[] = $key.'="'. htmlspecialchars($this->data[$key]) .' '. htmlspecialchars($this->config[$key]) .'"'; } elseif (!empty($value)) { - $attribs[] = $key.'="'.SecurityHelper::sanitizeHtmlAttributes($value).'"'; + $attribs[] = $key.'="'.htmlspecialchars($value).'"'; } } } @@ -227,11 +226,11 @@ public function getHref() $url = $this->data['path'] ?? ''; if (strlen($this->data['parameters'] ?? '') > 0) { - $url .= (strpos($url, '?') !== false ? '&' : '?') . str_replace('?', '', $this->getParameters()); + $url .= (strpos($url, '?') !== false ? '&' : '?') . htmlspecialchars(str_replace('?', '', $this->getParameters())); } if (strlen($this->data['anchor'] ?? '') > 0) { - $anchor = str_replace('"', urlencode('"'), $this->getAnchor()); + $anchor = str_replace('"', urlencode('"'), htmlspecialchars($this->getAnchor())); $url .= '#' . str_replace('#', '', $anchor); } @@ -287,12 +286,8 @@ private function updatePathFromInternal($realPath = false, $editmode = false) } } - if($editmode) { - unset($this->data['attributes']); - } - // sanitize attributes - if (isset($this->data['attributes'])) { + if (!$editmode && isset($this->data['attributes'])) { $this->data['attributes'] = htmlspecialchars($this->data['attributes'], HTML_ENTITIES); } @@ -332,7 +327,7 @@ public function getTarget() */ public function getParameters() { - return SecurityHelper::sanitizeHtmlAttributes($this->data['parameters']) ?? ''; + return $this->data['parameters'] ?? ''; } /** @@ -340,7 +335,7 @@ public function getParameters() */ public function getAnchor() { - return SecurityHelper::sanitizeHtmlAttributes($this->data['anchor']) ?? ''; + return $this->data['anchor'] ?? ''; } /** @@ -356,7 +351,7 @@ public function getTitle() */ public function getRel() { - return SecurityHelper::sanitizeHtmlAttributes($this->data['rel']) ?? ''; + return $this->data['rel'] ?? ''; } /** @@ -364,7 +359,7 @@ public function getRel() */ public function getTabindex() { - return SecurityHelper::sanitizeHtmlAttributes($this->data['tabindex']) ?? ''; + return $this->data['tabindex'] ?? ''; } /** @@ -372,7 +367,7 @@ public function getTabindex() */ public function getAccesskey() { - return SecurityHelper::sanitizeHtmlAttributes($this->data['accesskey']) ?? ''; + return $this->data['accesskey'] ?? ''; } /** @@ -380,7 +375,7 @@ public function getAccesskey() */ public function getClass() { - return SecurityHelper::sanitizeHtmlAttributes($this->data['class']) ?? ''; + return $this->data['class'] ?? ''; } /** @@ -401,14 +396,6 @@ public function setDataFromResource($data) $this->data = []; } - //sanitize fields - $fieldsToExclude = ['path']; - foreach($this->data as $key => $value) { - if(!in_array($key, $fieldsToExclude)) { - $this->data[$key] = SecurityHelper::sanitizeHtmlAttributes($value); - } - } - return $this; } From e62019e5202ba1a5a766b6bc785b8b14a6a84e40 Mon Sep 17 00:00:00 2001 From: Christian F Date: Thu, 11 May 2023 16:11:14 +0200 Subject: [PATCH 20/66] [Task] Removed `sanitizeHtmlAttributes` method from link editable (#15174) * removed `sanitizeHtmlAttributes` method from link editable * fixed bug in attributes field * fixed encoding issue --- models/Document/Editable/Link.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/models/Document/Editable/Link.php b/models/Document/Editable/Link.php index 744c8684f38..070622f7e93 100644 --- a/models/Document/Editable/Link.php +++ b/models/Document/Editable/Link.php @@ -287,7 +287,7 @@ private function updatePathFromInternal($realPath = false, $editmode = false) } // sanitize attributes - if (!$editmode && isset($this->data['attributes'])) { + if ($this->getEditmode() === false && isset($this->data['attributes'])) { $this->data['attributes'] = htmlspecialchars($this->data['attributes'], HTML_ENTITIES); } From 34f8dc38a02d9b609900c580a4b4d908a7e7e243 Mon Sep 17 00:00:00 2001 From: Bernhard Rusch Date: Wed, 3 May 2023 09:29:26 +0200 Subject: [PATCH 21/66] [Admin] Check whether the user image is valid or not --- models/User.php | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/models/User.php b/models/User.php index b55c372b37f..cc2c6b40e04 100644 --- a/models/User.php +++ b/models/User.php @@ -570,14 +570,16 @@ public function getImage($width = null, $height = null) $targetFile = File::getLocalTempFilePath('png'); $image = \Pimcore\Image::getInstance(); - $image->load($localFile); - $image->cover($width, $height); - $image->save($targetFile, 'png'); - - $storage->write($this->getThumbnailImageStoragePath(), file_get_contents($targetFile)); + if($image->load($localFile)) { + $image->cover($width, $height); + $image->save($targetFile, 'png'); + $storage->write($this->getThumbnailImageStoragePath(), file_get_contents($targetFile)); + } } - return $storage->readStream($this->getThumbnailImageStoragePath()); + if ($storage->fileExists($this->getThumbnailImageStoragePath())) { + return $storage->readStream($this->getThumbnailImageStoragePath()); + } } return fopen($this->getFallbackImage(), 'rb'); From a3b54d9e620ee92b5b08876b63ba7e9160edbfc2 Mon Sep 17 00:00:00 2001 From: zoidbergx Date: Fri, 12 May 2023 14:57:50 +0200 Subject: [PATCH 22/66] Fix grid filters (#15074) * Apply php-cs-fixer changes * fix: remove system column "key" on filters --------- Co-authored-by: juckerf --- .../Resources/public/js/pimcore/object/helpers/grid.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bundles/AdminBundle/Resources/public/js/pimcore/object/helpers/grid.js b/bundles/AdminBundle/Resources/public/js/pimcore/object/helpers/grid.js index bd7731efcd9..a2c6db305c7 100644 --- a/bundles/AdminBundle/Resources/public/js/pimcore/object/helpers/grid.js +++ b/bundles/AdminBundle/Resources/public/js/pimcore/object/helpers/grid.js @@ -451,7 +451,7 @@ pimcore.object.helpers.grid = Class.create({ var fields = this.fields; for (var i = 0; i < fields.length; i++) { - if(fields[i].key != "id" && fields[i].key != "published" + if(fields[i].key != "id" && fields[i].key != "published" && fields[i].key != "key" && fields[i].key != "filename" && fields[i].key != "classname" && fields[i].key != "creationDate" && fields[i].key != "modificationDate") { @@ -498,7 +498,7 @@ pimcore.object.helpers.grid = Class.create({ } if(fields[i].key != "id" && fields[i].key != "published" && fields[i].key != "fullpath" - && fields[i].key != "filename" && fields[i].key != "classname" + && fields[i].key != "filename" && fields[i].key != "classname" && fields[i].key != "key" && fields[i].key != "creationDate" && fields[i].key != "modificationDate") { var fieldType = fields[i].type; From ac15ac6e1b879feed10879faad1a2788b217ab26 Mon Sep 17 00:00:00 2001 From: Blackbit Date: Fri, 12 May 2023 16:00:30 +0200 Subject: [PATCH 23/66] update modification date when saving folder (#14917) --- models/Element/AbstractElement.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/models/Element/AbstractElement.php b/models/Element/AbstractElement.php index c9dd1adff2b..2e371238056 100644 --- a/models/Element/AbstractElement.php +++ b/models/Element/AbstractElement.php @@ -222,9 +222,10 @@ public function getModificationDate() */ public function setModificationDate($modificationDate) { - $this->markFieldDirty('modificationDate'); - - $this->modificationDate = (int) $modificationDate; + if($this->modificationDate != (int)$modificationDate) { + $this->markFieldDirty('modificationDate'); + $this->modificationDate = (int)$modificationDate; + } return $this; } From 9b4b09711b104875ac991140958d295da0fe24fc Mon Sep 17 00:00:00 2001 From: "Felix Flor (TwoCream)" <131146705+felixflor-twocream@users.noreply.github.com> Date: Fri, 12 May 2023 16:13:52 +0200 Subject: [PATCH 24/66] Operator alias throws warning if it is null (#14999) --- lib/DataObject/GridColumnConfig/Operator/Alias.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/DataObject/GridColumnConfig/Operator/Alias.php b/lib/DataObject/GridColumnConfig/Operator/Alias.php index 1b91c2456d1..3df16c85eb0 100644 --- a/lib/DataObject/GridColumnConfig/Operator/Alias.php +++ b/lib/DataObject/GridColumnConfig/Operator/Alias.php @@ -39,7 +39,7 @@ public function getLabeledValue($element) $childResult = $c->getLabeledValue($element); $isArrayType = $childResult->isArrayType ?? null; - $childValues = $childResult->value; + $childValues = $childResult->value ?? null; if ($childValues && !$isArrayType) { $childValues = [$childValues]; } From 3ef908922d4cc0a061115d8b27ae59e825a8c244 Mon Sep 17 00:00:00 2001 From: MasterOfDeath Date: Mon, 15 May 2023 11:43:49 +0500 Subject: [PATCH 25/66] Fix: in grid in calculatedValue replace on integer (#14789) --- .../Resources/public/js/pimcore/object/tags/calculatedValue.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bundles/AdminBundle/Resources/public/js/pimcore/object/tags/calculatedValue.js b/bundles/AdminBundle/Resources/public/js/pimcore/object/tags/calculatedValue.js index 23717b5a182..b5f94177d90 100644 --- a/bundles/AdminBundle/Resources/public/js/pimcore/object/tags/calculatedValue.js +++ b/bundles/AdminBundle/Resources/public/js/pimcore/object/tags/calculatedValue.js @@ -99,7 +99,7 @@ pimcore.object.tags.calculatedValue = Class.create(pimcore.object.tags.abstract, } if (value && (this.fieldConfig === undefined || this.fieldConfig.elementType !== 'html')) { - value = value.replace(/\n/g,"
    "); + value = value.toString().replace(/\n/g,"
    "); value = strip_tags(value, '
    '); } return value; From 0b429eef13d744e1565282eae365409a7b68912b Mon Sep 17 00:00:00 2001 From: torqdev <67965755+torqdev@users.noreply.github.com> Date: Mon, 15 May 2023 05:13:43 -0300 Subject: [PATCH 26/66] Variant Sort By Index Fix (#15034) * fix dataobject reindex query * also use folder --------- Co-authored-by: Cameron Jenkins --- .../Controller/Admin/DataObject/DataObjectController.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/bundles/AdminBundle/Controller/Admin/DataObject/DataObjectController.php b/bundles/AdminBundle/Controller/Admin/DataObject/DataObjectController.php index 69022e6f32a..b549ac2e77f 100644 --- a/bundles/AdminBundle/Controller/Admin/DataObject/DataObjectController.php +++ b/bundles/AdminBundle/Controller/Admin/DataObject/DataObjectController.php @@ -1289,7 +1289,11 @@ protected function updateIndexesOfObjectSiblings(DataObject\AbstractObject $upda DataObject::OBJECT_TYPE_VARIANT, DataObject::OBJECT_TYPE_FOLDER, ] - ).'\') ORDER BY o_index LIMIT '. $updatedObject->getParent()->getChildAmount() .') + ).'\') ORDER BY o_index LIMIT '. $updatedObject->getParent()->getChildAmount([ + DataObject::OBJECT_TYPE_OBJECT, + DataObject::OBJECT_TYPE_VARIANT, + DataObject::OBJECT_TYPE_FOLDER + ]) .') SELECT @n := IF(@n = ? - 1,@n + 2,@n + 1) AS newIndex, o_id FROM cte, (SELECT @n := -1) variable From d27d37be947a6b73edafaee29c2e85359108ce34 Mon Sep 17 00:00:00 2001 From: lukmzig Date: Mon, 15 May 2023 08:15:44 +0000 Subject: [PATCH 27/66] Apply php-cs-fixer changes --- .../Controller/Admin/DataObject/DataObjectController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bundles/AdminBundle/Controller/Admin/DataObject/DataObjectController.php b/bundles/AdminBundle/Controller/Admin/DataObject/DataObjectController.php index b549ac2e77f..646e5c52a41 100644 --- a/bundles/AdminBundle/Controller/Admin/DataObject/DataObjectController.php +++ b/bundles/AdminBundle/Controller/Admin/DataObject/DataObjectController.php @@ -1292,7 +1292,7 @@ protected function updateIndexesOfObjectSiblings(DataObject\AbstractObject $upda ).'\') ORDER BY o_index LIMIT '. $updatedObject->getParent()->getChildAmount([ DataObject::OBJECT_TYPE_OBJECT, DataObject::OBJECT_TYPE_VARIANT, - DataObject::OBJECT_TYPE_FOLDER + DataObject::OBJECT_TYPE_FOLDER, ]) .') SELECT @n := IF(@n = ? - 1,@n + 2,@n + 1) AS newIndex, o_id FROM cte, From b44d56a6d418e390e0edfbee9df4e977058dc68c Mon Sep 17 00:00:00 2001 From: Christian F Date: Mon, 15 May 2023 10:35:12 +0200 Subject: [PATCH 28/66] fixed `priority` filter (#14925) --- .../Controller/Admin/LogController.php | 19 ++++--------------- 1 file changed, 4 insertions(+), 15 deletions(-) diff --git a/bundles/AdminBundle/Controller/Admin/LogController.php b/bundles/AdminBundle/Controller/Admin/LogController.php index f3c7dec578b..5dff214b32f 100644 --- a/bundles/AdminBundle/Controller/Admin/LogController.php +++ b/bundles/AdminBundle/Controller/Admin/LogController.php @@ -73,20 +73,9 @@ public function showAction(Request $request, Connection $db) } $priority = $request->get('priority'); - if ($priority !== '-1' && ($priority == '0' || $priority)) { - $levels = []; - - // add every level until the filtered one - foreach (['emergency', 'alert', 'critical', 'error', 'warning', 'notice', 'info', 'debug'] as $level) { - $levels[] = $level; - - if ($priority === $level) { - break; - } - } - - $qb->andWhere($qb->expr()->in('priority', ':priority')); - $qb->setParameter('priority', $levels, Connection::PARAM_STR_ARRAY); + if(!empty($priority)) { + $qb->andWhere($qb->expr()->eq('priority', ':priority')); + $qb->setParameter('priority', $priority); } if ($fromDate = $this->parseDateObject($request->get('fromDate'), $request->get('fromTime'))) { @@ -189,7 +178,7 @@ private function parseDateObject($date = null, $time = null) */ public function priorityJsonAction(Request $request) { - $priorities[] = ['key' => '-1', 'value' => '-']; + $priorities[] = ['key' => '', 'value' => '-']; foreach (ApplicationLoggerDb::getPriorities() as $key => $p) { $priorities[] = ['key' => $key, 'value' => $p]; } From 2d6fc95a17fffe975c062e377f87f0069b486e1a Mon Sep 17 00:00:00 2001 From: torqdev <67965755+torqdev@users.noreply.github.com> Date: Mon, 15 May 2023 06:25:45 -0300 Subject: [PATCH 29/66] batch edit to post (#15037) Co-authored-by: Cameron Jenkins --- .../Controller/Admin/DataObject/DataObjectHelperController.php | 2 +- .../public/js/pimcore/element/helpers/gridColumnConfig.js | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/bundles/AdminBundle/Controller/Admin/DataObject/DataObjectHelperController.php b/bundles/AdminBundle/Controller/Admin/DataObject/DataObjectHelperController.php index 7089b28d532..827c1e23675 100644 --- a/bundles/AdminBundle/Controller/Admin/DataObject/DataObjectHelperController.php +++ b/bundles/AdminBundle/Controller/Admin/DataObject/DataObjectHelperController.php @@ -1532,7 +1532,7 @@ protected function csvObjectData($object) } /** - * @Route("/get-batch-jobs", name="getbatchjobs", methods={"GET"}) + * @Route("/get-batch-jobs", name="getbatchjobs", methods={"POST"}) * * @param Request $request * diff --git a/bundles/AdminBundle/Resources/public/js/pimcore/element/helpers/gridColumnConfig.js b/bundles/AdminBundle/Resources/public/js/pimcore/element/helpers/gridColumnConfig.js index 3e51a38d34e..c73761df5c4 100644 --- a/bundles/AdminBundle/Resources/public/js/pimcore/element/helpers/gridColumnConfig.js +++ b/bundles/AdminBundle/Resources/public/js/pimcore/element/helpers/gridColumnConfig.js @@ -493,6 +493,7 @@ pimcore.element.helpers.gridColumnConfig = { Ext.Ajax.request({ url: this.batchPrepareUrl, params: params, + method: 'POST', success: function (columnIndex, response) { var rdata = Ext.decode(response.responseText); if (rdata.success && rdata.jobs) { From 92e45977b1d2cdbd614d6d2214e8a3d7a41df9ff Mon Sep 17 00:00:00 2001 From: Sebastian Blank Date: Mon, 15 May 2023 11:47:36 +0200 Subject: [PATCH 30/66] Fieldcollection/Objectbrick: Disable Add/Delete buttons when not writeable (#15106) --- .../Resources/public/js/pimcore/object/fieldcollection.js | 6 ++++-- .../Resources/public/js/pimcore/object/objectbrick.js | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/bundles/AdminBundle/Resources/public/js/pimcore/object/fieldcollection.js b/bundles/AdminBundle/Resources/public/js/pimcore/object/fieldcollection.js index 6a714356c46..5147519099b 100644 --- a/bundles/AdminBundle/Resources/public/js/pimcore/object/fieldcollection.js +++ b/bundles/AdminBundle/Resources/public/js/pimcore/object/fieldcollection.js @@ -90,7 +90,8 @@ pimcore.object.fieldcollection = Class.create({ { text: t("add"), iconCls: "pimcore_icon_fieldcollection pimcore_icon_overlay_add", - handler: this.addField.bind(this) + handler: this.addField.bind(this), + disabled: !pimcore.settings['class-definition-writeable'] } ] } @@ -178,7 +179,8 @@ pimcore.object.fieldcollection = Class.create({ menu.add(new Ext.menu.Item({ text: t('delete'), iconCls: "pimcore_icon_fieldcollection pimcore_icon_overlay_delete", - handler: this.deleteField.bind(this, tree, record) + handler: this.deleteField.bind(this, tree, record), + disabled: !pimcore.settings['class-definition-writeable'] })); menu.showAt(e.pageX, e.pageY); diff --git a/bundles/AdminBundle/Resources/public/js/pimcore/object/objectbrick.js b/bundles/AdminBundle/Resources/public/js/pimcore/object/objectbrick.js index 019b18b7054..6ab82aa06e2 100644 --- a/bundles/AdminBundle/Resources/public/js/pimcore/object/objectbrick.js +++ b/bundles/AdminBundle/Resources/public/js/pimcore/object/objectbrick.js @@ -85,7 +85,8 @@ pimcore.object.objectbrick = Class.create(pimcore.object.fieldcollection, { { text: t("add"), iconCls: "pimcore_icon_objectbricks pimcore_icon_overlay_add", - handler: this.addField.bind(this) + handler: this.addField.bind(this), + disabled: !pimcore.settings['class-definition-writeable'] } ] } @@ -150,7 +151,8 @@ pimcore.object.objectbrick = Class.create(pimcore.object.fieldcollection, { menu.add(new Ext.menu.Item({ text: t('delete'), iconCls: "pimcore_icon_objectbricks pimcore_icon_overlay_delete", - handler: this.deleteField.bind(this, tree, record) + handler: this.deleteField.bind(this, tree, record), + disabled: !pimcore.settings['class-definition-writeable'] })); menu.showAt(e.pageX, e.pageY); From c7d6d8dd3ba41b066d1c945d0ec64d372651dcc4 Mon Sep 17 00:00:00 2001 From: Andy Weichler <53085804+aweichler@users.noreply.github.com> Date: Mon, 15 May 2023 11:53:40 +0200 Subject: [PATCH 31/66] allow special characters (e.g. german umlauts) in group name of custom reports (#14936) --- .../Resources/public/js/pimcore/report/custom/item.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bundles/AdminBundle/Resources/public/js/pimcore/report/custom/item.js b/bundles/AdminBundle/Resources/public/js/pimcore/report/custom/item.js index d2d84138fab..0d1b893d5a4 100644 --- a/bundles/AdminBundle/Resources/public/js/pimcore/report/custom/item.js +++ b/bundles/AdminBundle/Resources/public/js/pimcore/report/custom/item.js @@ -902,7 +902,7 @@ pimcore.report.custom.item = Class.create({ let m = this.getValues(); let error = false; - ['group', 'groupIconClass', 'iconClass', 'reportClass'].forEach(function (name) { + ['groupIconClass', 'iconClass', 'reportClass'].forEach(function (name) { if(m[name].length && !m[name].match(/^[_a-zA-Z]+[_a-zA-Z0-9-.\s]*$/)) { error = name; } From f8113f7a73a9d547f2282fc7f2add88d2b2e2e43 Mon Sep 17 00:00:00 2001 From: zoidbergx Date: Mon, 15 May 2023 11:55:11 +0200 Subject: [PATCH 32/66] Fix objects tree sort method check (#15159) * Apply php-cs-fixer changes * fix: change sorting behavior to not change sort method --------- Co-authored-by: juckerf --- .../AdminBundle/Resources/public/js/pimcore/object/tree.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bundles/AdminBundle/Resources/public/js/pimcore/object/tree.js b/bundles/AdminBundle/Resources/public/js/pimcore/object/tree.js index d3307a32591..0878c52960b 100644 --- a/bundles/AdminBundle/Resources/public/js/pimcore/object/tree.js +++ b/bundles/AdminBundle/Resources/public/js/pimcore/object/tree.js @@ -782,7 +782,7 @@ pimcore.object.tree = Class.create({ let currentSortMethod = record.data.sortBy; - if (currentSortMethod !== "key" || user.admin || user.isAllowed("objects_sort_method")) { + if (currentSortMethod === "key" || user.admin || user.isAllowed("objects_sort_method")) { sortByItems.push({ text: t('by_key'), iconCls: "pimcore_icon_alphabetical_sorting_az", @@ -795,7 +795,7 @@ pimcore.object.tree = Class.create({ }); } - if (currentSortMethod !== "index" || user.admin || user.isAllowed("objects_sort_method")) { + if (currentSortMethod === "index" || user.admin || user.isAllowed("objects_sort_method")) { sortByItems.push({ text: t('by_index'), iconCls: "pimcore_icon_index_sorting", From 23c934e560a0b7dee732f583239df171727b9d04 Mon Sep 17 00:00:00 2001 From: Blackbit Date: Mon, 15 May 2023 12:55:17 +0200 Subject: [PATCH 33/66] objectbricks fields support for batch update (#15076) --- .../Admin/DataObject/DataObjectHelperController.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/bundles/AdminBundle/Controller/Admin/DataObject/DataObjectHelperController.php b/bundles/AdminBundle/Controller/Admin/DataObject/DataObjectHelperController.php index 827c1e23675..cad0d27b1dc 100644 --- a/bundles/AdminBundle/Controller/Admin/DataObject/DataObjectHelperController.php +++ b/bundles/AdminBundle/Controller/Admin/DataObject/DataObjectHelperController.php @@ -1641,6 +1641,12 @@ public function batchAction(Request $request) } elseif (count($parts) > 1) { // check for bricks $brickType = $parts[0]; + + if (strpos($brickType, '?') !== false) { + $brickDescriptor = substr($brickType, 1); + $brickDescriptor = json_decode($brickDescriptor, true); + $brickType = $brickDescriptor['containerKey']; + } $brickKey = $parts[1]; $brickField = DataObject\Service::getFieldForBrickType($object->getClass(), $brickType); From f223541ad144f198a73f8630afbc3725b029a6a0 Mon Sep 17 00:00:00 2001 From: Sebastian Blank Date: Mon, 15 May 2023 13:04:54 +0200 Subject: [PATCH 34/66] Fix: User::getById('admin') returns "system" user (#15086) * Fix: User::getById('admin') returns "system" user * FIx: Id 0 is valid for system user --- models/User/AbstractUser.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/models/User/AbstractUser.php b/models/User/AbstractUser.php index 4f7a40c4711..a7aaf63032f 100644 --- a/models/User/AbstractUser.php +++ b/models/User/AbstractUser.php @@ -55,6 +55,10 @@ class AbstractUser extends Model\AbstractModel */ public static function getById($id) { + if (!is_numeric($id) || $id < 0) { + return null; + } + $cacheKey = 'user_' . $id; try { From de3d8d188199ccf464731ed4983d18e51422b212 Mon Sep 17 00:00:00 2001 From: zoidbergx Date: Mon, 15 May 2023 13:48:37 +0200 Subject: [PATCH 35/66] Fix default mockup get param (#15096) * Apply php-cs-fixer changes * fix: do array access fail save for php versions > 8.0 --------- Co-authored-by: juckerf --- bundles/EcommerceFrameworkBundle/Model/DefaultMockup.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bundles/EcommerceFrameworkBundle/Model/DefaultMockup.php b/bundles/EcommerceFrameworkBundle/Model/DefaultMockup.php index 61e28ef4653..0f8218c1d1c 100644 --- a/bundles/EcommerceFrameworkBundle/Model/DefaultMockup.php +++ b/bundles/EcommerceFrameworkBundle/Model/DefaultMockup.php @@ -73,7 +73,7 @@ public function getParams() */ public function getParam($key) { - return $this->params[$key]; + return $this->params[$key] ?? null; } /** From e41725dca55e43e20403760aaf9e1324ae19ab6d Mon Sep 17 00:00:00 2001 From: APochmann <96241555+APochmann@users.noreply.github.com> Date: Tue, 2 May 2023 16:18:12 +0200 Subject: [PATCH 36/66] use configured values for getLayoutShow update getLayoutShow for structuredTable to use configured values instead of static default --- .../public/js/pimcore/object/tags/structuredTable.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bundles/AdminBundle/Resources/public/js/pimcore/object/tags/structuredTable.js b/bundles/AdminBundle/Resources/public/js/pimcore/object/tags/structuredTable.js index 5865fbaab89..70b7ab111e1 100644 --- a/bundles/AdminBundle/Resources/public/js/pimcore/object/tags/structuredTable.js +++ b/bundles/AdminBundle/Resources/public/js/pimcore/object/tags/structuredTable.js @@ -218,7 +218,7 @@ pimcore.object.tags.structuredTable = Class.create(pimcore.object.tags.abstract, } var columns = [ - {text: "", width: 80, sortable: false, dataIndex: '__row_label', editor: null, + {text: t(this.fieldConfig.labelFirstCell), width: this.fieldConfig.labelWidth, sortable: false, dataIndex: '__row_label', editor: null, renderer: function(value, metaData) { metaData.tdCls = 'x-grid3-hd-row'; return t(value); @@ -228,7 +228,7 @@ pimcore.object.tags.structuredTable = Class.create(pimcore.object.tags.abstract, for(var i = 0; i < this.fieldConfig.cols.length; i++) { - var columnConfig = {text: t(this.fieldConfig.cols[i].label), width: 120, sortable: false, + var columnConfig = {text: t(this.fieldConfig.cols[i].label), width: this.fieldConfig.cols[i].width, sortable: false, dataIndex: this.fieldConfig.cols[i].key, editor: null}; if(this.fieldConfig.cols[i].type == "bool") { columnConfig.renderer = function (value, metaData, record, rowIndex, colIndex, store) { From 007395d82d41c30da6b6677dc4f343b4511c3696 Mon Sep 17 00:00:00 2001 From: procnet0 Date: Mon, 15 May 2023 15:42:05 +0200 Subject: [PATCH 37/66] [Bug] Fix Classification Store inheritance (#14948) * correct Groups inheritance on ClassificationStore. getActiveGroups() return all group inherited. getGroups() return all GroupConfig of activeGroups. * Correct inherited tag for BackOffice display. Add param $withInheritance (default = false) to methods getItems() getActiveGroups() getGroups() getGroupCollectionMappings() Add some typing * Remove Typing * Remove Typing * Remove additional parameters on public function and use Model\DataObject::doGetInheritedValues() * fix conflict * Update models/DataObject/Classificationstore.php * Update models/DataObject/Classificationstore.php * Update models/DataObject/Classificationstore.php --------- Co-authored-by: Bernhard Rusch Co-authored-by: robertSt7 <104770750+robertSt7@users.noreply.github.com> --- models/DataObject/Classificationstore.php | 26 ++++++++++++++--------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/models/DataObject/Classificationstore.php b/models/DataObject/Classificationstore.php index c20b688d3f1..54d5ecf7f4b 100644 --- a/models/DataObject/Classificationstore.php +++ b/models/DataObject/Classificationstore.php @@ -111,6 +111,10 @@ public function setItems($items) */ public function getItems() { + $doGetInheritedValues = Model\DataObject::doGetInheritedValues(); + if(!$doGetInheritedValues) { + return $this->items; + } return $this->getAllDataFromField(fn ($classificationStore, $fieldsArray) => $fieldsArray + $classificationStore->items); } @@ -297,7 +301,11 @@ public function setFieldname($fieldname) */ public function getActiveGroups() { - return $this->activeGroups; + $doGetInheritedValues = Model\DataObject::doGetInheritedValues(); + if(!$doGetInheritedValues) { + return $this->activeGroups; + } + return $this->getAllDataFromField(fn ($classificationStore, $fieldsArray) => $classificationStore->activeGroups + $fieldsArray); } private function sanitizeActiveGroups($activeGroups) @@ -467,6 +475,10 @@ public static function doGetFallbackValues() */ public function getGroupCollectionMappings(): array { + $doGetInheritedValues = Model\DataObject::doGetInheritedValues(); + if(!$doGetInheritedValues) { + return $this->groupCollectionMapping; + } return $this->getAllDataFromField(fn ($classificationStore, $fieldsArray) => $fieldsArray + $classificationStore->groupCollectionMapping); } @@ -504,7 +516,7 @@ public function getGroupCollectionMapping($groupId) */ public function getGroups(): array { - return $this->getAllDataFromField(fn ($classificationStore, $fieldsArray) => array_merge(Classificationstore::getActiveGroupsWithConfig($classificationStore), $fieldsArray)); + return Classificationstore::getActiveGroupsWithConfig($this); } private function getAllDataFromField(callable $mergeFunction): array @@ -512,16 +524,10 @@ private function getAllDataFromField(callable $mergeFunction): array $fieldsArray = $mergeFunction($this, []); $object = $this->getObject(); while (!is_null($object) && ($parent = Service::hasInheritableParentObject($object)) !== null) { - $fieldDefintions = $parent->getClass()->getFieldDefinitions(); - foreach ($fieldDefintions as $key => $fd) { - if ($fd instanceof Model\DataObject\ClassDefinition\Data\Classificationstore) { - $getter = 'get' . ucfirst($key); - $fieldsArray = $mergeFunction($parent->$getter(), $fieldsArray); - } - } + $fieldsArray = $mergeFunction($parent->{"get" . ucfirst($this->getFieldname())}(), $fieldsArray); + $object = $parent; } - return $fieldsArray; } From b1aca322ad1462fbbdc75f606f6aea00e6bcaf0f Mon Sep 17 00:00:00 2001 From: robertSt7 Date: Mon, 15 May 2023 13:44:17 +0000 Subject: [PATCH 38/66] Apply php-cs-fixer changes --- models/DataObject/Classificationstore.php | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/models/DataObject/Classificationstore.php b/models/DataObject/Classificationstore.php index 54d5ecf7f4b..88662d2151f 100644 --- a/models/DataObject/Classificationstore.php +++ b/models/DataObject/Classificationstore.php @@ -115,6 +115,7 @@ public function getItems() if(!$doGetInheritedValues) { return $this->items; } + return $this->getAllDataFromField(fn ($classificationStore, $fieldsArray) => $fieldsArray + $classificationStore->items); } @@ -305,6 +306,7 @@ public function getActiveGroups() if(!$doGetInheritedValues) { return $this->activeGroups; } + return $this->getAllDataFromField(fn ($classificationStore, $fieldsArray) => $classificationStore->activeGroups + $fieldsArray); } @@ -479,6 +481,7 @@ public function getGroupCollectionMappings(): array if(!$doGetInheritedValues) { return $this->groupCollectionMapping; } + return $this->getAllDataFromField(fn ($classificationStore, $fieldsArray) => $fieldsArray + $classificationStore->groupCollectionMapping); } @@ -524,10 +527,11 @@ private function getAllDataFromField(callable $mergeFunction): array $fieldsArray = $mergeFunction($this, []); $object = $this->getObject(); while (!is_null($object) && ($parent = Service::hasInheritableParentObject($object)) !== null) { - $fieldsArray = $mergeFunction($parent->{"get" . ucfirst($this->getFieldname())}(), $fieldsArray); - + $fieldsArray = $mergeFunction($parent->{'get' . ucfirst($this->getFieldname())}(), $fieldsArray); + $object = $parent; } + return $fieldsArray; } From 346e14e73db1381f9c9d940aaecb02b0b234549d Mon Sep 17 00:00:00 2001 From: dvesh3 Date: Mon, 15 May 2023 12:28:23 +0200 Subject: [PATCH 39/66] [Documents] force inject metadata tags for static page renderer - resolves #14922 --- lib/Document/StaticPageGenerator.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/Document/StaticPageGenerator.php b/lib/Document/StaticPageGenerator.php index 3d905f1cd70..e07bb398057 100644 --- a/lib/Document/StaticPageGenerator.php +++ b/lib/Document/StaticPageGenerator.php @@ -17,6 +17,7 @@ namespace Pimcore\Document; +use Pimcore\Bundle\CoreBundle\EventListener\Frontend\DocumentMetaDataListener; use Pimcore\Document\Renderer\DocumentRenderer; use Pimcore\Http\Request\Resolver\StaticPageResolver; use Pimcore\Logger; @@ -86,6 +87,7 @@ public function generate($document, $params = []) $response = $this->documentRenderer->render($document, [ 'pimcore_static_page_generator' => true, StaticPageResolver::ATTRIBUTE_PIMCORE_STATIC_PAGE => true, + DocumentMetaDataListener::FORCE_INJECTION => true ]); } From 91d3a4fdd03bd177072e867fbe05b5b14e891ecf Mon Sep 17 00:00:00 2001 From: dvesh3 Date: Mon, 15 May 2023 15:14:50 +0000 Subject: [PATCH 40/66] Apply php-cs-fixer changes --- lib/Document/StaticPageGenerator.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Document/StaticPageGenerator.php b/lib/Document/StaticPageGenerator.php index e07bb398057..7c044364c07 100644 --- a/lib/Document/StaticPageGenerator.php +++ b/lib/Document/StaticPageGenerator.php @@ -87,7 +87,7 @@ public function generate($document, $params = []) $response = $this->documentRenderer->render($document, [ 'pimcore_static_page_generator' => true, StaticPageResolver::ATTRIBUTE_PIMCORE_STATIC_PAGE => true, - DocumentMetaDataListener::FORCE_INJECTION => true + DocumentMetaDataListener::FORCE_INJECTION => true, ]); } From cdb236e14c7546430b8fd4c88e28506f6b333ad1 Mon Sep 17 00:00:00 2001 From: Divesh Pahuja Date: Tue, 16 May 2023 07:26:50 +0200 Subject: [PATCH 41/66] [Admin][Documents] Fix (un)publishing documents from tree - resolves #15019 (#15194) --- .../public/js/pimcore/document/tree.js | 67 +++++++++++-------- 1 file changed, 38 insertions(+), 29 deletions(-) diff --git a/bundles/AdminBundle/Resources/public/js/pimcore/document/tree.js b/bundles/AdminBundle/Resources/public/js/pimcore/document/tree.js index f24f8d0ccbd..3a23568cb1f 100644 --- a/bundles/AdminBundle/Resources/public/js/pimcore/document/tree.js +++ b/bundles/AdminBundle/Resources/public/js/pimcore/document/tree.js @@ -1522,37 +1522,46 @@ pimcore.document.tree = Class.create({ var parameters = {}; parameters.id = id; - Ext.Ajax.request({ - url: '/admin/' + type + '/save?task=' + task, - method: "PUT", - params: parameters, - success: function (task, response) { - try { - var rdata = Ext.decode(response.responseText); - if (rdata && rdata.success) { - var options = { - elementType: "document", - id: record.data.id, - published: task != "unpublish" - }; - pimcore.elementservice.setElementPublishedState(options); - pimcore.elementservice.setElementToolbarButtons(options); - pimcore.elementservice.reloadVersions(options); - - pimcore.helpers.showNotification(t("success"), t("successful_" + task + "_document"), - "success"); - } - else { - pimcore.helpers.showNotification(t("error"), t("error_" + task + "_document"), - "error", t(rdata.message)); - } - } catch (e) { - pimcore.helpers.showNotification(t("error"), t("error_" + task + "_document"), "error"); - } + var doc = pimcore.globalmanager.get("document_" + id); - }.bind(this, task) - }); + if (doc) { + if (task == "publish") { + doc.publish(false); + } else { + doc.unpublish(false); + } + } else { + Ext.Ajax.request({ + url: '/admin/' + type + '/save?task=' + task, + method: "PUT", + params: parameters, + success: function (task, response) { + try { + var rdata = Ext.decode(response.responseText); + if (rdata && rdata.success) { + var options = { + elementType: "document", + id: record.data.id, + published: task != "unpublish" + }; + pimcore.elementservice.setElementPublishedState(options); + pimcore.elementservice.setElementToolbarButtons(options); + pimcore.elementservice.reloadVersions(options); + + pimcore.helpers.showNotification(t("success"), t("successful_" + task + "_document"), + "success"); + } + else { + pimcore.helpers.showNotification(t("error"), t("error_" + task + "_document"), + "error", t(rdata.message)); + } + } catch (e) { + pimcore.helpers.showNotification(t("error"), t("error_" + task + "_document"), "error"); + } + }.bind(this, task) + }); + } }, addDocumentCreate : function (tree, record, params) { From 419e8160ac85e4dd35a28c99c1a59278bba935bb Mon Sep 17 00:00:00 2001 From: zoidbergx Date: Tue, 16 May 2023 08:47:58 +0200 Subject: [PATCH 42/66] fix: fixed checking variable if is array and array key exists (#14832) * fix: fixed checking variable if is array and array key exists * chore: fixed check for array key --- .../ProductList/ElasticSearch/AbstractElasticSearch.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bundles/EcommerceFrameworkBundle/IndexService/ProductList/ElasticSearch/AbstractElasticSearch.php b/bundles/EcommerceFrameworkBundle/IndexService/ProductList/ElasticSearch/AbstractElasticSearch.php index 83c9b1421d7..c33114e026f 100644 --- a/bundles/EcommerceFrameworkBundle/IndexService/ProductList/ElasticSearch/AbstractElasticSearch.php +++ b/bundles/EcommerceFrameworkBundle/IndexService/ProductList/ElasticSearch/AbstractElasticSearch.php @@ -1268,7 +1268,7 @@ protected function convertBucketValues(array $bucket) $data['key_as_string'] = $bucket['key_as_string']; } elseif (is_array($reverseAggregationBucket) && array_key_exists('doc_count', $reverseAggregationBucket)) { // reverse aggregation $data['reverse_count'] = $reverseAggregationBucket['doc_count']; - } elseif (is_array($subAggregationBuckets['buckets'])) { // sub aggregations + } elseif (is_array($subAggregationBuckets) && isset($subAggregationBuckets['buckets'])) { // sub aggregations foreach ($subAggregationBuckets['buckets'] as $bucket) { $data[$subAggregationField][] = $this->convertBucketValues($bucket); } From 96aefafe5ce92a7cbe0ccf8a8f9f46936142ee13 Mon Sep 17 00:00:00 2001 From: Divesh Pahuja Date: Tue, 16 May 2023 10:08:52 +0200 Subject: [PATCH 43/66] Fix loading empty data object class - resolves #15027 (#15201) --- .../Admin/DataObject/DataObjectController.php | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/bundles/AdminBundle/Controller/Admin/DataObject/DataObjectController.php b/bundles/AdminBundle/Controller/Admin/DataObject/DataObjectController.php index 646e5c52a41..934d68ea1cb 100644 --- a/bundles/AdminBundle/Controller/Admin/DataObject/DataObjectController.php +++ b/bundles/AdminBundle/Controller/Admin/DataObject/DataObjectController.php @@ -569,10 +569,12 @@ static function (Task $task) { DataObject\Service::removeElementFromSession('object', $object->getId()); - $layoutArray = json_decode($this->encodeJson($data['layout']), true); - $this->classFieldDefinitions = json_decode($this->encodeJson($object->getClass()->getFieldDefinitions()), true); - $this->injectValuesForCustomLayout($layoutArray); - $data['layout'] = $layoutArray; + if ($data['layout'] ?? false) { + $layoutArray = json_decode($this->encodeJson($data['layout']), true); + $this->classFieldDefinitions = json_decode($this->encodeJson($object->getClass()->getFieldDefinitions()), true); + $this->injectValuesForCustomLayout($layoutArray); + $data['layout'] = $layoutArray; + } return $this->adminJson($data); } From 0a8187d1a8ba54df081f5af5963c7d9c629e1b85 Mon Sep 17 00:00:00 2001 From: Blackbit Date: Tue, 16 May 2023 10:32:28 +0200 Subject: [PATCH 44/66] [Image thumbnails] Return correct thumbnail dimensions when using high-res configuration (#14634) * return correct thumbnail dimensions when using high-res configuration * return correct thumbnail dimensions when using high-res configuration * return correct thumbnail dimensions when using high-res configuration * return correct thumbnail dimensions when using high-res configuration * refactor code --- .../Asset/Thumbnail/ImageThumbnailTrait.php | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/models/Asset/Thumbnail/ImageThumbnailTrait.php b/models/Asset/Thumbnail/ImageThumbnailTrait.php index 842edddbdcc..ce40cc1f622 100644 --- a/models/Asset/Thumbnail/ImageThumbnailTrait.php +++ b/models/Asset/Thumbnail/ImageThumbnailTrait.php @@ -245,16 +245,16 @@ public function getDimensions() $dimensions = $this->readDimensionsFromFile(); } - $this->width = $dimensions['width'] ?? null; - $this->height = $dimensions['height'] ?? null; - - // the following is only relevant if using high-res option (retina, ...) - $this->realHeight = $this->height; - $this->realWidth = $this->width; - - if ($config && $config->getHighResolution() && $config->getHighResolution() > 1) { - $this->realWidth = (int)floor($this->width * $config->getHighResolution()); - $this->realHeight = (int)floor($this->height * $config->getHighResolution()); + // realWidth / realHeight is only relevant if using high-res option (retina, ...) + $this->width = $this->realWidth = $dimensions['width'] ?? null; + $this->height = $this->realHeight = $dimensions['height'] ?? null; + if ($config && $config->getHighResolution() > 1) { + if ($this->width) { + $this->width = (int)floor($this->realWidth / $config->getHighResolution()); + } + if ($this->height) { + $this->height = (int)floor($this->realHeight / $config->getHighResolution()); + } } } From 58116750579a836b4322b174218453ae13c25bd1 Mon Sep 17 00:00:00 2001 From: lukmzig <30526586+lukmzig@users.noreply.github.com> Date: Tue, 16 May 2023 10:48:54 +0200 Subject: [PATCH 45/66] fix: check if items are set (#15195) --- .../public/js/pimcore/object/tags/fieldcollections.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/bundles/AdminBundle/Resources/public/js/pimcore/object/tags/fieldcollections.js b/bundles/AdminBundle/Resources/public/js/pimcore/object/tags/fieldcollections.js index 74e0785fb21..f8e08bb6057 100644 --- a/bundles/AdminBundle/Resources/public/js/pimcore/object/tags/fieldcollections.js +++ b/bundles/AdminBundle/Resources/public/js/pimcore/object/tags/fieldcollections.js @@ -99,9 +99,8 @@ pimcore.object.tags.fieldcollections = Class.create(pimcore.object.tags.abstract return this.component; }, - postSaveObject: function(e) { - if (e.detail.object.id === this.object.id) { + if (this.component.items && (e.detail.object.id === this.object.id)) { for (var itemIndex = 0; itemIndex < this.component.items.items.length; itemIndex++) { var item = this.component.items.items[itemIndex]; item["pimcore_oIndex"] = itemIndex; From c8f37b19c99cd82e4e558857d3e4d5476ea7228a Mon Sep 17 00:00:00 2001 From: JiaJia Ji Date: Tue, 16 May 2023 10:55:11 +0200 Subject: [PATCH 46/66] task: improve non-admin update user --- bundles/AdminBundle/Controller/Admin/UserController.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/bundles/AdminBundle/Controller/Admin/UserController.php b/bundles/AdminBundle/Controller/Admin/UserController.php index ee709030091..b1802b225c7 100644 --- a/bundles/AdminBundle/Controller/Admin/UserController.php +++ b/bundles/AdminBundle/Controller/Admin/UserController.php @@ -287,12 +287,13 @@ public function deleteAction(Request $request) public function updateAction(Request $request) { $user = User\UserRole::getById((int)$request->get('id')); + $currentUserIsAdmin = $this->getAdminUser()->isAdmin(); if (!$user) { throw $this->createNotFoundException(); } - if ($user instanceof User && $user->isAdmin() && !$this->getAdminUser()->isAdmin()) { + if ($user instanceof User && $user->isAdmin() && !$currentUserIsAdmin) { throw $this->createAccessDeniedHttpException('Only admin users are allowed to modify admin users'); } @@ -325,7 +326,7 @@ public function updateAction(Request $request) // only admins are allowed to create admin users // if the logged in user isn't an admin, set admin always to false - if ($user instanceof User && !$this->getAdminUser()->isAdmin()) { + if ($user instanceof User && !$currentUserIsAdmin) { $user->setAdmin(false); } From 44b9b3110dcbad808ce98b0092e5e4d84e533975 Mon Sep 17 00:00:00 2001 From: Sebastian Blank Date: Tue, 16 May 2023 13:31:24 +0200 Subject: [PATCH 47/66] fix: make two separate error log items a single item (#15179) --- bundles/AdminBundle/Controller/Admin/TranslationController.php | 3 +-- lib/Image/Adapter/Imagick.php | 3 +-- lib/Image/Chromium.php | 3 +-- models/Asset/Document/ImageThumbnail.php | 3 +-- models/Asset/Image/Thumbnail.php | 3 +-- models/Asset/Video.php | 3 +-- models/Asset/Video/ImageThumbnail.php | 3 +-- 7 files changed, 7 insertions(+), 14 deletions(-) diff --git a/bundles/AdminBundle/Controller/Admin/TranslationController.php b/bundles/AdminBundle/Controller/Admin/TranslationController.php index f92a618fe11..4b62a1885e0 100644 --- a/bundles/AdminBundle/Controller/Admin/TranslationController.php +++ b/bundles/AdminBundle/Controller/Admin/TranslationController.php @@ -1172,8 +1172,7 @@ public function wordExportAction(Request $request) fclose($f); } } catch (\Exception $e) { - Logger::error('Word Export: ' . $e->getMessage()); - Logger::error((string) $e); + Logger::error('Word Export: ' . $e); throw $e; } diff --git a/lib/Image/Adapter/Imagick.php b/lib/Image/Adapter/Imagick.php index bf48c3aed6f..515074888bf 100644 --- a/lib/Image/Adapter/Imagick.php +++ b/lib/Image/Adapter/Imagick.php @@ -155,8 +155,7 @@ public function load($imagePath, $options = []) //} } } catch (\Exception $e) { - Logger::error('Unable to load image: ' . $imagePath); - Logger::error($e->getMessage()); + Logger::error('Unable to load image ' . $imagePath . ': ' . $e); return false; } diff --git a/lib/Image/Chromium.php b/lib/Image/Chromium.php index 5a373f48afd..d9e959dfe50 100644 --- a/lib/Image/Chromium.php +++ b/lib/Image/Chromium.php @@ -98,8 +98,7 @@ public static function convert(string $url, string $outputFile, string $windowSi 'clip' => $page->getFullPageClip(), ])->saveToFile($outputFile); } catch (\Throwable $e) { - Logger::debug('Could not create image from url: ' . $url); - Logger::debug((string) $e); + Logger::debug('Could not create image from url ' . $url . ': ' . $e); return false; } finally { diff --git a/models/Asset/Document/ImageThumbnail.php b/models/Asset/Document/ImageThumbnail.php index db1d0ce4a3d..2c987be6901 100644 --- a/models/Asset/Document/ImageThumbnail.php +++ b/models/Asset/Document/ImageThumbnail.php @@ -102,8 +102,7 @@ public function generate($deferredAllowed = true) } } } catch (\Exception $e) { - Logger::error("Couldn't create image-thumbnail of document " . $this->asset->getRealFullPath()); - Logger::error($e->getMessage()); + Logger::error("Couldn't create image-thumbnail of document " . $this->asset->getRealFullPath() . ': ' . $e); } } diff --git a/models/Asset/Image/Thumbnail.php b/models/Asset/Image/Thumbnail.php index 8a73594aa7b..04952e5be73 100644 --- a/models/Asset/Image/Thumbnail.php +++ b/models/Asset/Image/Thumbnail.php @@ -142,8 +142,7 @@ public function generate($deferredAllowed = true) $deferred = $deferredAllowed && $this->deferred; $this->pathReference = Thumbnail\Processor::process($this->asset, $this->config, null, $deferred, $generated); } catch (\Exception $e) { - Logger::error("Couldn't create thumbnail of image " . $this->asset->getRealFullPath()); - Logger::error($e->getMessage()); + Logger::error("Couldn't create thumbnail of image " . $this->asset->getRealFullPath() . ': ' . $e); } } } diff --git a/models/Asset/Video.php b/models/Asset/Video.php index 70514451914..17fe3fc99c2 100644 --- a/models/Asset/Video.php +++ b/models/Asset/Video.php @@ -124,8 +124,7 @@ public function getThumbnail($thumbnailName, $onlyFormats = []) return $customSetting[$thumbnail->getName()]; } } catch (\Exception $e) { - Logger::error("Couldn't create thumbnail of video " . $this->getRealFullPath()); - Logger::error((string) $e); + Logger::error("Couldn't create thumbnail of video " . $this->getRealFullPath() . ': ' . $e); } } diff --git a/models/Asset/Video/ImageThumbnail.php b/models/Asset/Video/ImageThumbnail.php index 15ad4dd8ff3..47012d3c6a9 100644 --- a/models/Asset/Video/ImageThumbnail.php +++ b/models/Asset/Video/ImageThumbnail.php @@ -162,8 +162,7 @@ public function generate($deferredAllowed = true) $generated ); } catch (\Exception $e) { - Logger::error("Couldn't create image-thumbnail of video " . $this->asset->getRealFullPath()); - Logger::error($e->getMessage()); + Logger::error("Couldn't create image-thumbnail of video " . $this->asset->getRealFullPath() . ': ' . $e); } } } From d825cb1d3fdde781fc515e8aab1be4d80feb64ee Mon Sep 17 00:00:00 2001 From: Sebastian Blank Date: Wed, 17 May 2023 11:50:08 +0200 Subject: [PATCH 48/66] RgbaColor: column type shouldn't be UTF-8 (#14962) * RgbaColor: column type shouldn't be utf8 * Add migration --- .../Migrations/Version20230516161000.php | 77 +++++++++++++++++++ .../ClassDefinition/Data/RgbaColor.php | 9 ++- 2 files changed, 82 insertions(+), 4 deletions(-) create mode 100644 bundles/CoreBundle/Migrations/Version20230516161000.php diff --git a/bundles/CoreBundle/Migrations/Version20230516161000.php b/bundles/CoreBundle/Migrations/Version20230516161000.php new file mode 100644 index 00000000000..a1cf9fa096a --- /dev/null +++ b/bundles/CoreBundle/Migrations/Version20230516161000.php @@ -0,0 +1,77 @@ +getClasses() as $class) { + $this->write(sprintf('Saving class: %s', $class->getName())); + $class->save(); + } + + $list = new DataObject\Objectbrick\Definition\Listing(); + foreach ($list->load() as $brickDefinition) { + $this->write(sprintf('Saving object brick: %s', $brickDefinition->getKey())); + $brickDefinition->save(); + } + + $list = new DataObject\Fieldcollection\Definition\Listing(); + foreach ($list->load() as $fc) { + $this->write(sprintf('Saving field collection: %s', $fc->getKey())); + $fc->save(); + } + + $list = new DataObject\ClassDefinition\CustomLayout\Listing(); + foreach ($list->getLayoutDefinitions() as $layout) { + $this->write(sprintf('Saving custom layout: %s', $layout->getName())); + $layout->save(); + } + } catch (DataObject\Exception\DefinitionWriteException $e) { + $this->write( + 'Could not write class definition file. Please set PIMCORE_CLASS_DEFINITION_WRITABLE env.' . "\n" . + sprintf( + 'If you already have migrate the definitions you can skip this migration via "php bin/console doctrine:migrations:version --add %s"', + __CLASS__ + ) + ); + + throw $e; + } + } + + public function down(Schema $schema): void + { + $this->write(sprintf('Please restore your class definition files in %s and run bin/console pimcore:deployment:classes-rebuild manually.', PIMCORE_CLASS_DEFINITION_DIRECTORY)); + } +} diff --git a/models/DataObject/ClassDefinition/Data/RgbaColor.php b/models/DataObject/ClassDefinition/Data/RgbaColor.php index 5d83079384d..36d3c867f64 100644 --- a/models/DataObject/ClassDefinition/Data/RgbaColor.php +++ b/models/DataObject/ClassDefinition/Data/RgbaColor.php @@ -57,8 +57,8 @@ class RgbaColor extends Data implements * @var array */ public $queryColumnType = [ - 'rgb' => 'VARCHAR(6) NULL DEFAULT NULL', - 'a' => 'VARCHAR(2) NULL DEFAULT NULL', + 'rgb' => 'VARCHAR(6) CHARACTER SET latin1 COLLATE latin1_general_ci NULL DEFAULT NULL', + 'a' => 'VARCHAR(2) CHARACTER SET latin1 COLLATE latin1_general_ci NULL DEFAULT NULL', ]; /** @@ -68,8 +68,9 @@ class RgbaColor extends Data implements * * @var array */ - public $columnType = ['rgb' => 'VARCHAR(6) NULL DEFAULT NULL', - 'a' => 'VARCHAR(2) NULL DEFAULT NULL', + public $columnType = [ + 'rgb' => 'VARCHAR(6) CHARACTER SET latin1 COLLATE latin1_general_ci NULL DEFAULT NULL', + 'a' => 'VARCHAR(2) CHARACTER SET latin1 COLLATE latin1_general_ci NULL DEFAULT NULL', ]; /** From a9c49596a228166a836c0ee3c469416f45accca5 Mon Sep 17 00:00:00 2001 From: Niklas Date: Fri, 19 May 2023 09:32:00 +0200 Subject: [PATCH 49/66] [Bug] Remove unclickable area of WYSIWYG (#14637) * Remove unclickable area of WYSIWYG * Update admin.css using max() CSS function * add height to min-height. --------- Co-authored-by: Martin Eiber --- bundles/AdminBundle/Resources/public/css/admin.css | 1 + 1 file changed, 1 insertion(+) diff --git a/bundles/AdminBundle/Resources/public/css/admin.css b/bundles/AdminBundle/Resources/public/css/admin.css index eb805cfc2ee..c3aee52f0c3 100644 --- a/bundles/AdminBundle/Resources/public/css/admin.css +++ b/bundles/AdminBundle/Resources/public/css/admin.css @@ -1185,6 +1185,7 @@ span.warning { position:relative; padding: 10px; min-height: 80px; + height: 100%; font: normal 12px tahoma, arial, helvetica, sans-serif; background-color: #fff; } From 4b1ff1a250ac62cd630b378406061b400b46cd7b Mon Sep 17 00:00:00 2001 From: lukmzig <30526586+lukmzig@users.noreply.github.com> Date: Tue, 23 May 2023 08:45:30 +0200 Subject: [PATCH 50/66] [Bug]: Links in Blocks will not be cleaned up when Target Document is deleted (#15241) * fix: add parameter to clear the dead links * set internal values only for internal links * add test * use custom function to create test objects * fix function names and descriptions * fix function names and descriptions --- .../DataObject/ClassDefinition/Data/Block.php | 3 + .../DataObject/ClassDefinition/Data/Link.php | 30 +++++----- models/DataObject/Concrete.php | 4 ++ tests/Model/DataType/LinkTest.php | 57 +++++++++++++++++++ 4 files changed, 80 insertions(+), 14 deletions(-) diff --git a/models/DataObject/ClassDefinition/Data/Block.php b/models/DataObject/ClassDefinition/Data/Block.php index 276457fc63a..d6260ab17bf 100644 --- a/models/DataObject/ClassDefinition/Data/Block.php +++ b/models/DataObject/ClassDefinition/Data/Block.php @@ -1125,6 +1125,9 @@ public function checkValidity($data, $omitMandatoryCheck = false, $params = []) $fd->performMultipleAssignmentCheck($data); } + if ($fd instanceof Link) { + $params['resetInvalidFields'] = true; + } $fd->checkValidity($data, false, $params); } catch (Model\Element\ValidationException $ve) { $ve->addContext($this->getName() . '-' . $idx); diff --git a/models/DataObject/ClassDefinition/Data/Link.php b/models/DataObject/ClassDefinition/Data/Link.php index d8efc035a25..80821b36ef3 100644 --- a/models/DataObject/ClassDefinition/Data/Link.php +++ b/models/DataObject/ClassDefinition/Data/Link.php @@ -82,12 +82,8 @@ public function getDataForResource($data, $object = null, $params = []) } } - try { - $this->checkValidity($data, true, $params); - } catch (\Exception $e) { - $data->setInternalType(null); - $data->setInternal(null); - } + $params['resetInvalidFields'] = true; + $this->checkValidity($data, true, $params); return Serialize::serialize($data); } @@ -115,12 +111,8 @@ public function getDataFromResource($data, $object = null, $params = []) $link->_setOwnerLanguage($params['language'] ?? null); } - try { - $this->checkValidity($link, true, $params); - } catch (\Exception) { - $link->setInternalType(null); - $link->setInternal(null); - } + $params['resetInvalidFields'] = true; + $this->checkValidity($link, true, $params); return $link; } @@ -231,12 +223,22 @@ public function checkValidity($data, $omitMandatoryCheck = false, $params = []) if ($data->getInternalType() == 'document') { $doc = Document::getById($data->getInternal()); if (!$doc instanceof Document) { - throw new Element\ValidationException('invalid internal link, referenced document with id [' . $data->getInternal() . '] does not exist'); + if (isset($params['resetInvalidFields']) && $params['resetInvalidFields']) { + $data->setInternalType(null); + $data->setInternal(null); + } else { + throw new Element\ValidationException('invalid internal link, referenced document with id [' . $data->getInternal() . '] does not exist'); + } } } elseif ($data->getInternalType() == 'asset') { $asset = Asset::getById($data->getInternal()); if (!$asset instanceof Asset) { - throw new Element\ValidationException('invalid internal link, referenced asset with id [' . $data->getInternal() . '] does not exist'); + if (isset($params['resetInvalidFields']) && $params['resetInvalidFields']) { + $data->setInternalType(null); + $data->setInternal(null); + } else { + throw new Element\ValidationException('invalid internal link, referenced document with id [' . $data->getInternal() . '] does not exist'); + } } } } diff --git a/models/DataObject/Concrete.php b/models/DataObject/Concrete.php index e40e6999793..d3635d06784 100644 --- a/models/DataObject/Concrete.php +++ b/models/DataObject/Concrete.php @@ -23,6 +23,7 @@ use Pimcore\Model; use Pimcore\Model\DataObject; use Pimcore\Model\DataObject\ClassDefinition\Data\LazyLoadingSupportInterface; +use Pimcore\Model\DataObject\ClassDefinition\Data\Link; use Pimcore\Model\DataObject\ClassDefinition\Data\Relations\AbstractRelations; use Pimcore\Model\DataObject\Exception\InheritanceParentNotFoundException; use Pimcore\Model\Element\DirtyIndicatorInterface; @@ -139,6 +140,9 @@ protected function update($isUpdate = null, $params = []) //check throws Exception try { + if ($fd instanceof Link) { + $params['resetInvalidFields'] = true; + } $fd->checkValidity($value, $omitMandatoryCheck, $params); } catch (\Exception $e) { if ($this->getClass()->getAllowInherit() && $fd->supportsInheritance() && $fd->isEmpty($value)) { diff --git a/tests/Model/DataType/LinkTest.php b/tests/Model/DataType/LinkTest.php index 1320b874090..7be1be55440 100644 --- a/tests/Model/DataType/LinkTest.php +++ b/tests/Model/DataType/LinkTest.php @@ -15,6 +15,8 @@ namespace Pimcore\Tests\Model\DataType; +use Pimcore\Model\Asset; +use Pimcore\Model\DataObject\ClassDefinition\Data; use Pimcore\Model\DataObject\Data\Link; use Pimcore\Model\DataObject\Service; use Pimcore\Model\DataObject\unittestLink; @@ -29,6 +31,12 @@ */ class LinkTest extends ModelTestCase { + protected Asset $testAsset; + + protected Link $link; + + protected Data $linkDefinition; + public function setUp(): void { parent::setUp(); @@ -46,6 +54,25 @@ protected function setUpTestClasses() $this->tester->setupPimcoreClass_Link(); } + /** + * Prepares objects for internal link tests + * + * @throws \Exception + */ + protected function setupInternalLinkObjects() + { + $this->testAsset = TestHelper::createImageAsset(); + + $link = new Link(); + $link->setInternal($this->testAsset->getId()); + $link->setInternalType('asset'); + $this->link = $link; + + $linkObject = $this->createLinkObject(); + $linkObject->setTestlink($link); + $this->linkDefinition = $linkObject->getClass()->getFieldDefinition('testlink'); + } + /** * @return unittestLink * @@ -81,6 +108,36 @@ public function testSave() $this->assertEquals($link->getDirect(), $linkObjectReloaded->getLtestlink()->getDirect()); } + /** + * Verifies that checkValidity method throws correct exception if invalid data is provided + * + */ + public function testInternalCheckValidity() + { + $this->setupInternalLinkObjects(); + $this->testAsset->delete(); + + //Should return validation exception as asset was deleted + $this->expectException(ValidationException::class); + $this->linkDefinition->checkValidity($this->link); + } + + /** + * Verifies that checkValidity method sanitize the link data if invalid data is provided + * + */ + public function testInternalCheckValidityParam() + { + $this->setupInternalLinkObjects(); + $this->testAsset->delete(); + //Should not return validation exception as parameter is set + $this->linkDefinition->checkValidity($this->link, true, ['resetInvalidFields' => true]); + + //Should return sanitized link data + $this->assertTrue($this->link->getInternal() === null); + $this->assertTrue($this->link->getInternalType() === null); + } + /** * Verifies that Link data throws correct exceptions if invalid data is given * From 1e27e6441d1f9d494e5f36745b8a06e5b5f02e76 Mon Sep 17 00:00:00 2001 From: Blackbit Date: Wed, 24 May 2023 16:09:07 +0300 Subject: [PATCH 51/66] [System requirements] Add check for UTF-8 locale (#15062) * add check for UTF-8 locale (necessary for escapeshellarg() - without it, multibyte characters get stripped) * add check for UTF-8 locale (necessary for escapeshellarg() - without it, multibyte characters get stripped) --- .../Resources/views/Admin/Install/check.html.twig | 2 +- lib/Tool/Requirements.php | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/bundles/AdminBundle/Resources/views/Admin/Install/check.html.twig b/bundles/AdminBundle/Resources/views/Admin/Install/check.html.twig index 19a0ce78e40..84dc408f147 100644 --- a/bundles/AdminBundle/Resources/views/Admin/Install/check.html.twig +++ b/bundles/AdminBundle/Resources/views/Admin/Install/check.html.twig @@ -25,7 +25,7 @@ {% endif %} - + {% endmacro %} diff --git a/lib/Tool/Requirements.php b/lib/Tool/Requirements.php index 1e80ed21ede..c3a3385142e 100644 --- a/lib/Tool/Requirements.php +++ b/lib/Tool/Requirements.php @@ -609,6 +609,13 @@ public static function checkPhp() ]); } + $checks[] = new Check([ + 'name' => 'locales-utf8', + 'link' => 'https://packages.debian.org/en/stable/locales-all', + 'state' => setlocale(LC_ALL, ['en.utf8', 'en_US.utf8', 'en_GB.utf8']) === false ? Check::STATE_ERROR : Check::STATE_OK, + 'message' => "It is recommended to install UTF-8 locale, otherwise all CLI calls which use escapeshellarg() will strip multibyte characters", + ]); + // Imagick $checks[] = new Check([ 'name' => 'Imagick', From b3b6474bec21938727bfb9939b5270f37b38c403 Mon Sep 17 00:00:00 2001 From: fashxp Date: Wed, 24 May 2023 13:11:11 +0000 Subject: [PATCH 52/66] Apply php-cs-fixer changes --- lib/Tool/Requirements.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Tool/Requirements.php b/lib/Tool/Requirements.php index c3a3385142e..10eefcfe19c 100644 --- a/lib/Tool/Requirements.php +++ b/lib/Tool/Requirements.php @@ -613,7 +613,7 @@ public static function checkPhp() 'name' => 'locales-utf8', 'link' => 'https://packages.debian.org/en/stable/locales-all', 'state' => setlocale(LC_ALL, ['en.utf8', 'en_US.utf8', 'en_GB.utf8']) === false ? Check::STATE_ERROR : Check::STATE_OK, - 'message' => "It is recommended to install UTF-8 locale, otherwise all CLI calls which use escapeshellarg() will strip multibyte characters", + 'message' => 'It is recommended to install UTF-8 locale, otherwise all CLI calls which use escapeshellarg() will strip multibyte characters', ]); // Imagick From 4716b9795de4cfb0e927643a195efe624a4d943d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dalibor=20Karlovi=C4=87?= Date: Thu, 18 May 2023 15:32:48 +0200 Subject: [PATCH 53/66] fix: try to fetch metadata without checking if file exists This fixes two things: 1. race condition between exists() and metadata() 2. doesn't do a exists(), speeding up pimcore:thumb:image significantly --- models/Asset/Image/Thumbnail/Processor.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/models/Asset/Image/Thumbnail/Processor.php b/models/Asset/Image/Thumbnail/Processor.php index b80bccaa163..7088e957f8f 100644 --- a/models/Asset/Image/Thumbnail/Processor.php +++ b/models/Asset/Image/Thumbnail/Processor.php @@ -185,8 +185,10 @@ public static function process(Asset $asset, Config $config, $fileSystemPath = n if ($statusCacheEnabled && $deferred) { $modificationDate = $asset->getDao()->getCachedThumbnailModificationDate($config->getName(), $filename); } else { - if ($storage->fileExists($storagePath)) { + try { $modificationDate = $storage->lastModified($storagePath); + } catch (FilesystemException $e) { + // nothing to do } } From 3c13ad9c1ce7f6fff554978c3d14474db5afcdcc Mon Sep 17 00:00:00 2001 From: Christian F Date: Thu, 25 May 2023 14:35:40 +0200 Subject: [PATCH 54/66] [Task] Improved validation of url slug (#15145) * improved validation of url slug * improved url slug check * improved url slug check v2 * Update urlSlug.js removed TODO * Update urlSlug.js * Update UrlSlug.php * encoded slug urls, rewrite slug matcher * removed urlencode in database * Update UrlSlug.php * removed `filtter_var` * adjust docs, fixed url decode for `+` signs * thow exception on reserved chars * redefined reserved chars --- .../Resources/public/js/pimcore/object/tags/urlSlug.js | 8 +------- bundles/CoreBundle/Resources/translations/en.json | 1 - .../01_Object_Classes/01_Data_Types/65_Others.md | 5 ++++- lib/Routing/DynamicRouteProvider.php | 2 +- models/DataObject/ClassDefinition/Data/UrlSlug.php | 10 +++------- 5 files changed, 9 insertions(+), 17 deletions(-) diff --git a/bundles/AdminBundle/Resources/public/js/pimcore/object/tags/urlSlug.js b/bundles/AdminBundle/Resources/public/js/pimcore/object/tags/urlSlug.js index 78965ffdc22..b4449e2017b 100644 --- a/bundles/AdminBundle/Resources/public/js/pimcore/object/tags/urlSlug.js +++ b/bundles/AdminBundle/Resources/public/js/pimcore/object/tags/urlSlug.js @@ -145,22 +145,16 @@ pimcore.object.tags.urlSlug = Class.create(pimcore.object.tags.abstract, { value = value.substring(1); value = value.replace(/\/$/, ""); - var parts = value.split('/'); + const parts = value.split('/'); for (let i = 0; i < parts.length; i++) { let part = parts[i]; if (part.length == 0) { return false; } - - sanitizedPart = part.replace(/[#\?\*\:\\\\<\>\|"%&@=;]/g, '-'); - if (sanitizedPart != part) { - return t('url-slug-invalid-chars'); - } } } return true; - } }; if (this.fieldConfig.width) { diff --git a/bundles/CoreBundle/Resources/translations/en.json b/bundles/CoreBundle/Resources/translations/en.json index ed66b5d28bf..fe20cde2063 100644 --- a/bundles/CoreBundle/Resources/translations/en.json +++ b/bundles/CoreBundle/Resources/translations/en.json @@ -1002,5 +1002,4 @@ "address_not_found": "The entered address was not found", "possible_causes": "Possible causes", "postal_code_format_error": "Postal code format, e.g. use \"5020 Salzburg, Söllheimer Straße 16\" instead of \"A-5020 Salzburg, Söllheimer Straße 16\"", - "url-slug-invalid-chars": "Provided invalid character in URL slug" } diff --git a/doc/Development_Documentation/05_Objects/01_Object_Classes/01_Data_Types/65_Others.md b/doc/Development_Documentation/05_Objects/01_Object_Classes/01_Data_Types/65_Others.md index 446d73ab0b4..c01b879bdd6 100644 --- a/doc/Development_Documentation/05_Objects/01_Object_Classes/01_Data_Types/65_Others.md +++ b/doc/Development_Documentation/05_Objects/01_Object_Classes/01_Data_Types/65_Others.md @@ -130,7 +130,10 @@ For example, if the URL is `https://demo.pimcore.fun/slug`, then the slug simply This data-type can be used to manage custom URL slugs for data objects, you can add as many fields of this type to a class as you want. Pimcore then cares automatically about the routing and calls the configured controller/action if a slug matches. -Slugs are validated against [`FILTER_VALIDATE_URL`](https://www.php.net/manual/en/filter.filters.validate.php) and you could use the [Symfony String component's slugger](https://symfony.com/doc/current/components/string.html#slugger) to generate them +You could use the [Symfony String component's slugger](https://symfony.com/doc/current/components/string.html#slugger) to generate the slugs. + +> Note that slugs can't contain the following chars: `! #` since they are reserved characters. +> For more information check the [RFC 3986](https://www.rfc-editor.org/rfc/rfc3986#section-2.2). ### Example diff --git a/lib/Routing/DynamicRouteProvider.php b/lib/Routing/DynamicRouteProvider.php index 924e5ccfbc1..f5812893499 100644 --- a/lib/Routing/DynamicRouteProvider.php +++ b/lib/Routing/DynamicRouteProvider.php @@ -73,7 +73,7 @@ public function getRouteCollectionForRequest(Request $request): RouteCollection return $collection; } - $path = $originalPath = urldecode($request->getPathInfo()); + $path = $originalPath = rawurldecode($request->getPathInfo()); // site path handled by FrontendRoutingListener which runs before routing is started if (null !== $sitePath = $this->siteResolver->getSitePath($request)) { diff --git a/models/DataObject/ClassDefinition/Data/UrlSlug.php b/models/DataObject/ClassDefinition/Data/UrlSlug.php index 0fba3ec18c7..78abeda316d 100644 --- a/models/DataObject/ClassDefinition/Data/UrlSlug.php +++ b/models/DataObject/ClassDefinition/Data/UrlSlug.php @@ -177,15 +177,11 @@ public function checkValidity($data, $omitMandatoryCheck = false, $params = []) if (is_array($data)) { /** @var Model\DataObject\Data\UrlSlug $item */ foreach ($data as $item) { + $matches = []; $slug = htmlspecialchars($item->getSlug()); $foundSlug = true; if (strlen($slug) > 0) { - $slugToCompare = preg_replace('/[#\?\*\:\\\\<\>\|"%&@=;]/', '-', $item->getSlug()); - if ($item->getSlug() !== $slugToCompare) { - throw new Model\Element\ValidationException('Slug contains forbidden characters!'); - } - $document = Model\Document::getByPath($slug); if ($document) { throw new Model\Element\ValidationException('Slug must be unique. Found conflict with document path "' . $slug . '"'); @@ -195,8 +191,8 @@ public function checkValidity($data, $omitMandatoryCheck = false, $params = []) throw new Model\Element\ValidationException('Slug must be at least 2 characters long and start with slash'); } - if (strpos($slug, '//') !== false || !filter_var('https://example.com' . $slug, FILTER_VALIDATE_URL)) { - throw new Model\Element\ValidationException('Slug "' . $slug . '" is not valid'); + if(preg_match_all('([?#])', $item->getSlug(), $matches)) { + throw new Model\Element\ValidationException('Slug contains reserved characters! [' . implode(' ', array_unique($matches[0])) . ']'); } } } From 56209e2a36cd63e3543924f5b79972e911fe3e98 Mon Sep 17 00:00:00 2001 From: lukmzig Date: Thu, 25 May 2023 12:37:23 +0000 Subject: [PATCH 55/66] Apply php-cs-fixer changes --- .../VoucherService/TokenManager/Pattern.php | 4 ++-- lib/Cache/Core/CoreCacheHandler.php | 2 +- models/DataObject/Service.php | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/bundles/EcommerceFrameworkBundle/VoucherService/TokenManager/Pattern.php b/bundles/EcommerceFrameworkBundle/VoucherService/TokenManager/Pattern.php index 3ff71b10ca0..c4358c4575b 100644 --- a/bundles/EcommerceFrameworkBundle/VoucherService/TokenManager/Pattern.php +++ b/bundles/EcommerceFrameworkBundle/VoucherService/TokenManager/Pattern.php @@ -460,8 +460,8 @@ public function generateCodes() if ($this->tokenExists($checkTokens, $insertCheckTokens)) { $checkTokenCount--; unset($checkTokens[$token]); - // Check if the length of the checkTokens Array matches the defined step range - // so the the checkTokens get matched against the database. + // Check if the length of the checkTokens Array matches the defined step range + // so the the checkTokens get matched against the database. } elseif ($checkTokenCount == $tokenCheckStep) { // Check if any of the tokens in the temporary array checkTokens already exists, // if not so, merge the checkTokens array with the array of tokens to insert and diff --git a/lib/Cache/Core/CoreCacheHandler.php b/lib/Cache/Core/CoreCacheHandler.php index db742e12b4e..e8bd9bfd939 100644 --- a/lib/Cache/Core/CoreCacheHandler.php +++ b/lib/Cache/Core/CoreCacheHandler.php @@ -907,7 +907,7 @@ public function writeSaveQueue() $tags = $this->prepareCacheTags($queueItem->getKey(), $queueItem->getData(), $queueItem->getTags()); if (null === $tags) { $result = false; - // item shouldn't go to the cache (either because it's tags are ignored or were cleared within this process) -> see $this->prepareCacheTags(); + // item shouldn't go to the cache (either because it's tags are ignored or were cleared within this process) -> see $this->prepareCacheTags(); } else { $result = $this->storeCacheData($queueItem->getKey(), $queueItem->getData(), $tags, $queueItem->getLifetime(), $queueItem->isForce()); } diff --git a/models/DataObject/Service.php b/models/DataObject/Service.php index a13c36566c1..78d9f03ff81 100644 --- a/models/DataObject/Service.php +++ b/models/DataObject/Service.php @@ -2022,7 +2022,7 @@ protected static function getCsvFieldData($fallbackLanguage, $field, $object, $r ); } } - //key value store - ignore for now + //key value store - ignore for now } elseif (count($fieldParts) > 1) { // brick $brickType = $fieldParts[0]; From 8742a21540bb70a9f495bc436fb11693f863ebcc Mon Sep 17 00:00:00 2001 From: MasterOfDeath Date: Thu, 25 May 2023 19:36:33 +0500 Subject: [PATCH 56/66] [Bug]: Fix error stream is not local under Grid > Export as xlsx (#15227) * fix: check is stream not local in createXlsxExportFile * fix: check is stream not local in createXlsxExportFile * applying suggestions --------- Co-authored-by: JiaJia Ji --- .../AdminBundle/Helper/GridHelperService.php | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/bundles/AdminBundle/Helper/GridHelperService.php b/bundles/AdminBundle/Helper/GridHelperService.php index 2cca53cca5c..c5475715dbf 100644 --- a/bundles/AdminBundle/Helper/GridHelperService.php +++ b/bundles/AdminBundle/Helper/GridHelperService.php @@ -24,6 +24,7 @@ use PhpOffice\PhpSpreadsheet\Writer\Exception; use PhpOffice\PhpSpreadsheet\Writer\Xlsx; use Pimcore\Db; +use Pimcore\File; use Pimcore\Logger; use Pimcore\Model; use Pimcore\Model\DataObject; @@ -859,10 +860,22 @@ public function createXlsxExportFile(FilesystemOperator $storage, string $fileHa $csvReader->setSheetIndex(0); $csvStream= $storage->readStream($csvFile); - $tempMetaData = stream_get_meta_data($csvStream); - //TODO: use this method and storage->read() to avoid the extra temp file, is not available in the current version. See: https://github.com/PHPOffice/PhpSpreadsheet/pull/2792 - //$spreadsheet = $csvReader->loadSpreadsheetFromString($storage->read($csvFile)); - $spreadsheet = $csvReader->load($tempMetaData['uri']); + if (stream_is_local($csvStream)) { + $tempMetaData = stream_get_meta_data($csvStream); + $spreadsheet = $csvReader->load($tempMetaData['uri']); + } else { + $tmpFilePath = File::getLocalTempFilePath('xlsx', false); + $dest = fopen($tmpFilePath, 'wb', false, File::getContext()); + if (!$dest) { + throw new \Exception(sprintf('Unable to create temporary file in %s', $tmpFilePath)); + } + + stream_copy_to_stream($csvStream, $dest); + fclose($dest); + + $spreadsheet = $csvReader->load($tmpFilePath); + } + $writer = new Xlsx($spreadsheet); $xlsxFilename = PIMCORE_SYSTEM_TEMP_DIRECTORY. '/' .$fileHandle. '.xlsx'; $writer->save($xlsxFilename); From bf579b5954d1d772c2d5105d6c9db5156646819d Mon Sep 17 00:00:00 2001 From: kingjia90 Date: Thu, 25 May 2023 14:38:01 +0000 Subject: [PATCH 57/66] Apply php-cs-fixer changes --- bundles/AdminBundle/Helper/GridHelperService.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bundles/AdminBundle/Helper/GridHelperService.php b/bundles/AdminBundle/Helper/GridHelperService.php index c5475715dbf..e6ac9e6f745 100644 --- a/bundles/AdminBundle/Helper/GridHelperService.php +++ b/bundles/AdminBundle/Helper/GridHelperService.php @@ -869,7 +869,7 @@ public function createXlsxExportFile(FilesystemOperator $storage, string $fileHa if (!$dest) { throw new \Exception(sprintf('Unable to create temporary file in %s', $tmpFilePath)); } - + stream_copy_to_stream($csvStream, $dest); fclose($dest); From 3f9f1aea9ab3448815ba3bf455fa68d59f93a5c7 Mon Sep 17 00:00:00 2001 From: JiaJia Ji Date: Fri, 26 May 2023 11:50:43 +0200 Subject: [PATCH 58/66] [Docs]: Add a hint in web to print about the maintenance cronjob (#15269) * Update 15_Print_Documents.md * Update doc/Development_Documentation/03_Documents/02_Document_Types/15_Print_Documents.md Co-authored-by: Manon Cassier <127942915+mcassier31@users.noreply.github.com> --------- Co-authored-by: Manon Cassier <127942915+mcassier31@users.noreply.github.com> --- .../03_Documents/02_Document_Types/15_Print_Documents.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/Development_Documentation/03_Documents/02_Document_Types/15_Print_Documents.md b/doc/Development_Documentation/03_Documents/02_Document_Types/15_Print_Documents.md index 31d9c2679e6..63db1ad12e2 100644 --- a/doc/Development_Documentation/03_Documents/02_Document_Types/15_Print_Documents.md +++ b/doc/Development_Documentation/03_Documents/02_Document_Types/15_Print_Documents.md @@ -18,6 +18,8 @@ But of course you can setup your custom views to have separate trees for web doc Just use our completely redesigned [custom views](../../05_Objects/01_Object_Classes/05_Class_Settings/20_Custom_Views.md) and all [new perspectives features](../../18_Tools_and_Features/13_Perspectives.md). +Please note that [maintenance cron job](../../01_Getting_Started/00_Installation.md#5-maintenance-cron-job) is required to properly process all the PDF conversions. + For more detail-information on the settings see later. ## Web-To-Print Document Types From 8c7f2a2135cb28f584b763e5d0fa86b7c91cd5f5 Mon Sep 17 00:00:00 2001 From: Christian F Date: Tue, 30 May 2023 14:14:38 +0200 Subject: [PATCH 59/66] Update 65_Others.md --- .../05_Objects/01_Object_Classes/01_Data_Types/65_Others.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/Development_Documentation/05_Objects/01_Object_Classes/01_Data_Types/65_Others.md b/doc/Development_Documentation/05_Objects/01_Object_Classes/01_Data_Types/65_Others.md index c01b879bdd6..96d3b70e12a 100644 --- a/doc/Development_Documentation/05_Objects/01_Object_Classes/01_Data_Types/65_Others.md +++ b/doc/Development_Documentation/05_Objects/01_Object_Classes/01_Data_Types/65_Others.md @@ -132,7 +132,7 @@ Pimcore then cares automatically about the routing and calls the configured cont You could use the [Symfony String component's slugger](https://symfony.com/doc/current/components/string.html#slugger) to generate the slugs. -> Note that slugs can't contain the following chars: `! #` since they are reserved characters. +> Note that slugs can't contain the following chars: `? #` since they are reserved characters. > For more information check the [RFC 3986](https://www.rfc-editor.org/rfc/rfc3986#section-2.2). ### Example From d13955749c6879249651c3ca20d6b4f8e0ca78c8 Mon Sep 17 00:00:00 2001 From: APochmann <96241555+APochmann@users.noreply.github.com> Date: Wed, 31 May 2023 13:54:31 +0200 Subject: [PATCH 60/66] set purpose 'layout' in ..Layout.. functions (#15120) set the context parameter 'purpose' to 'layout' if not defined yet in the functions responsible to enrich the definition for Layout. This is required if functions are called from here which need to know if this is layout mode --- .../ClassDefinition/Data/AdvancedManyToManyObjectRelation.php | 4 ++++ .../ClassDefinition/Data/ManyToManyObjectRelation.php | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/models/DataObject/ClassDefinition/Data/AdvancedManyToManyObjectRelation.php b/models/DataObject/ClassDefinition/Data/AdvancedManyToManyObjectRelation.php index a57b89acad8..16e95012727 100644 --- a/models/DataObject/ClassDefinition/Data/AdvancedManyToManyObjectRelation.php +++ b/models/DataObject/ClassDefinition/Data/AdvancedManyToManyObjectRelation.php @@ -830,6 +830,10 @@ public function enrichLayoutDefinition(/* ?Concrete */ $object, /* array */ $con return $this; } + if (!isset($context['purpose'])) { + $context['purpose'] = 'layout'; + } + $this->visibleFieldDefinitions = []; $translator = \Pimcore::getContainer()->get('translator'); diff --git a/models/DataObject/ClassDefinition/Data/ManyToManyObjectRelation.php b/models/DataObject/ClassDefinition/Data/ManyToManyObjectRelation.php index 4c9756c1d54..9e95757c9dc 100644 --- a/models/DataObject/ClassDefinition/Data/ManyToManyObjectRelation.php +++ b/models/DataObject/ClassDefinition/Data/ManyToManyObjectRelation.php @@ -591,6 +591,10 @@ public function enrichLayoutDefinition(/* ?Concrete */ $object, /* array */ $con if (!$class) { return $this; } + + if (!isset($context['purpose'])) { + $context['purpose'] = 'layout'; + } $this->visibleFieldDefinitions = []; From b6fbe4ce0d0127b3df742eab09eae554119083c7 Mon Sep 17 00:00:00 2001 From: robertSt7 Date: Wed, 31 May 2023 11:55:56 +0000 Subject: [PATCH 61/66] Apply php-cs-fixer changes --- .../ClassDefinition/Data/ManyToManyObjectRelation.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/models/DataObject/ClassDefinition/Data/ManyToManyObjectRelation.php b/models/DataObject/ClassDefinition/Data/ManyToManyObjectRelation.php index 9e95757c9dc..e54b21ff89e 100644 --- a/models/DataObject/ClassDefinition/Data/ManyToManyObjectRelation.php +++ b/models/DataObject/ClassDefinition/Data/ManyToManyObjectRelation.php @@ -591,7 +591,7 @@ public function enrichLayoutDefinition(/* ?Concrete */ $object, /* array */ $con if (!$class) { return $this; } - + if (!isset($context['purpose'])) { $context['purpose'] = 'layout'; } From 0d76c9a7d85301d8bb8c9524fcf00f444fda53ad Mon Sep 17 00:00:00 2001 From: MasterOfDeath Date: Wed, 31 May 2023 18:46:13 +0500 Subject: [PATCH 62/66] Fix decimalPrecision for min and maxValue in class (#14850) * fix: decimalPrecision for min amd maxValue in class * fix: decimalPrecision for min amd maxValue in class apply dynamically * fix: decimalPrecision for min amd maxValue in class apply dynamically --- .../js/pimcore/object/classes/data/numeric.js | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/bundles/AdminBundle/Resources/public/js/pimcore/object/classes/data/numeric.js b/bundles/AdminBundle/Resources/public/js/pimcore/object/classes/data/numeric.js index 237a5e4dfe2..6fdbb1f9829 100644 --- a/bundles/AdminBundle/Resources/public/js/pimcore/object/classes/data/numeric.js +++ b/bundles/AdminBundle/Resources/public/js/pimcore/object/classes/data/numeric.js @@ -111,7 +111,21 @@ pimcore.object.classes.data.numeric = Class.create(pimcore.object.classes.data.d fieldLabel: t("decimal_precision"), name: "decimalPrecision", maxValue: 30, - value: datax.decimalPrecision + value: datax.decimalPrecision, + listeners: { + change: function (el, value) { + let minValueComponent = this.specificPanel.getComponent('minValue'); + let maxValueComponent = this.specificPanel.getComponent('maxValue'); + + if (minValueComponent) { + minValueComponent.decimalPrecision = value; + } + + if (maxValueComponent) { + maxValueComponent.decimalPrecision = value; + } + }.bind(this) + } }, { xtype: "panel", bodyStyle: "padding-top: 3px", @@ -136,11 +150,15 @@ pimcore.object.classes.data.numeric = Class.create(pimcore.object.classes.data.d xtype: "numberfield", fieldLabel: t("min_value"), name: "minValue", + itemId: "minValue", + decimalPrecision: datax.decimalPrecision || 2, value: datax.minValue }, { xtype: "numberfield", fieldLabel: t("max_value"), name: "maxValue", + itemId: "maxValue", + decimalPrecision: datax.decimalPrecision || 2, value: datax.maxValue } ]); From dc72035b28a0e59bc51a8588bd0ad7539bc91a6f Mon Sep 17 00:00:00 2001 From: Jacob Dreesen Date: Thu, 1 Jun 2023 17:17:51 +0200 Subject: [PATCH 63/66] [Docs]: Improve `05_Deployment_Tools.md` (#15266) --- .../21_Deployment/05_Deployment_Tools.md | 39 ++++++++++--------- 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/doc/Development_Documentation/21_Deployment/05_Deployment_Tools.md b/doc/Development_Documentation/21_Deployment/05_Deployment_Tools.md index 58702033086..b5d63a42c07 100644 --- a/doc/Development_Documentation/21_Deployment/05_Deployment_Tools.md +++ b/doc/Development_Documentation/21_Deployment/05_Deployment_Tools.md @@ -29,6 +29,9 @@ Regarding the class modification, there is also an optional env variable `PIMCOR - `1` To allow the modification, including the classes in `config/pimcore/classes` that normally are read-only. - when `not set` classes in `config/pimcore/classes` are read-only, but new classes are allowed and will be created in `var/classes`. +With the env variable `PIMCORE_CLASS_DEFINITION_DIRECTORY` you can specify the directory to search for your class definitions +if you do not want pimcore to search in `var/classes` or `config/pimcore/classes`. + > **Note**: Changes on Pimcore class definitions not only have influence to configuration files but also on the database. > If deploying changes between different deployment stages also database changes need to be deployed. This can be done > with the `pimcore:deployment:classes-rebuild` command. @@ -40,10 +43,10 @@ After every code update you should use the `pimcore:deployment:classes-rebuild` ./bin/console pimcore:deployment:classes-rebuild ``` -To create new classes from your configuration files in the database you can use the create-classes option. With the env variable `PIMCORE_CLASS_DEFINITION_DIRECTORY` you can specify the directory to search for your class definitions if you do not want pimcore to search in `var/classes` or `config/pimcore/classes`. +To create new classes from your configuration files in the database you can use the `create-classes` option. ```bash -./bin/console pimcore:deployment:classes-rebuild --create-classes +./bin/console pimcore:deployment:classes-rebuild --create-classes ``` As an alternative also class export to json-files and the class import commands can be used. @@ -67,22 +70,22 @@ To get a list of all available commands use `./bin/console list`. #### Potentially useful commands: -| Command | Description | -|------------------------------------------------------|-------------------------------------------------------------------------------------------------| -| pimcore:mysql-tools | Optimize and warm up mysql database | -| pimcore:search-backend-reindex | Re-indexes the backend search of Pimcore | -| pimcore:cache:clear | Clear Pimcore core caches | -| cache:clear | Clear Symfony caches | -| pimcore:cache:warming | Warm up caches | -| pimcore:classificationstore:delete-store | Delete Classification Store | -| pimcore:definition:import:class | Import Class definition from a JSON export | -| pimcore:definition:import:customlayout | Import Customlayout definition from a JSON export | -| pimcore:definition:import:fieldcollection | Import FieldCollection definition from a JSON export | -| pimcore:definition:import:objectbrick | Import ObjectBrick definition from a JSON export | -| pimcore:deployment:classes-rebuild | Rebuilds classes and db structure based on updated `var/classes/definition_*.php` files | -| pimcore:thumbnails:image | Generate image thumbnails, useful to pre-generate thumbnails in the background. Use `--processes` option for parallel processing. | -| pimcore:thumbnails:optimize-images | Optimize file size of all images in `web/var/tmp` | -| pimcore:thumbnails:video | Generate video thumbnails, useful to pre-generate thumbnails in the background. Use `--processes` option for parallel processing. | +| Command | Description | +|-------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------| +| pimcore:mysql-tools | Optimize and warm up mysql database | +| pimcore:search-backend-reindex | Re-indexes the backend search of Pimcore | +| pimcore:cache:clear | Clear Pimcore core caches | +| cache:clear | Clear Symfony caches | +| pimcore:cache:warming | Warm up caches | +| pimcore:classificationstore:delete-store | Delete Classification Store | +| pimcore:definition:import:class | Import Class definition from a JSON export | +| pimcore:definition:import:customlayout | Import Customlayout definition from a JSON export | +| pimcore:definition:import:fieldcollection | Import FieldCollection definition from a JSON export | +| pimcore:definition:import:objectbrick | Import ObjectBrick definition from a JSON export | +| pimcore:deployment:classes-rebuild | Rebuilds classes and db structure based on updated `var/classes/definition_*.php` files | +| pimcore:thumbnails:image | Generate image thumbnails, useful to pre-generate thumbnails in the background. Use `--processes` option for parallel processing. | +| pimcore:thumbnails:optimize-images | Optimize file size of all images in `web/var/tmp` | +| pimcore:thumbnails:video | Generate video thumbnails, useful to pre-generate thumbnails in the background. Use `--processes` option for parallel processing. | Find more about the Pimcore Console on the [dedicated page](../19_Development_Tools_and_Details/11_Console_CLI.md). From 6d0075322ea4247b9aca4f65d85fbd5578151906 Mon Sep 17 00:00:00 2001 From: dvesh3 Date: Fri, 2 Jun 2023 16:37:41 +0200 Subject: [PATCH 64/66] [Thumbnails] Fix generating image-thumbnail dimensions with fallback to image adapter - resolves #15231 --- .../Asset/Thumbnail/ImageThumbnailTrait.php | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/models/Asset/Thumbnail/ImageThumbnailTrait.php b/models/Asset/Thumbnail/ImageThumbnailTrait.php index ce40cc1f622..deab379752e 100644 --- a/models/Asset/Thumbnail/ImageThumbnailTrait.php +++ b/models/Asset/Thumbnail/ImageThumbnailTrait.php @@ -188,11 +188,24 @@ private function readDimensionsFromFile(): array try { $localFile = $this->getLocalFile(); if (null !== $localFile) { - if ($imageInfo = @getimagesize($localFile)) { + //try to get the dimensions with getimagesize because it is much faster than e.g. the Imagick-Adapter + if ($imageSize = @getimagesize($localFile)) { $dimensions = [ - 'width' => $imageInfo[0], - 'height' => $imageInfo[1], + 'width' => $imageSize[0], + 'height' => $imageSize[1], ]; + } else { + //fallback to Default Adapter + $image = \Pimcore\Image::getInstance(); + if ($image->load($localFile)) { + $dimensions = [ + 'width' => $image->getWidth(), + 'height' => $image->getHeight(), + ]; + } + } + + if (!empty($dimensions)) { if ($config = $this->getConfig()) { $this->getAsset()->getDao()->addToThumbnailCache( $config->getName(), From 6b1b9ebcd26a70c28c39a06097662e6a24017b02 Mon Sep 17 00:00:00 2001 From: Blackbit Date: Mon, 5 Jun 2023 16:54:20 +0300 Subject: [PATCH 65/66] delete old application_logs_archive tables, even if there is a gap in archive table names (#14934) --- lib/Maintenance/Tasks/LogArchiveTask.php | 52 ++++++++++++------------ 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/lib/Maintenance/Tasks/LogArchiveTask.php b/lib/Maintenance/Tasks/LogArchiveTask.php index 1db66edf59f..0fe8c0277f5 100644 --- a/lib/Maintenance/Tasks/LogArchiveTask.php +++ b/lib/Maintenance/Tasks/LogArchiveTask.php @@ -15,6 +15,7 @@ namespace Pimcore\Maintenance\Tasks; +use Carbon\Carbon; use DateInterval; use DateTimeImmutable; use Doctrine\DBAL\Connection; @@ -115,36 +116,35 @@ public function execute() $db->executeQuery('DELETE FROM '.ApplicationLoggerDb::TABLE_NAME.' WHERE `timestamp` < DATE_SUB(FROM_UNIXTIME('.$timestamp.'), INTERVAL '.$archive_threshold.' DAY);'); } - $deleteArchiveLogDate = (new DateTimeImmutable())->sub(new DateInterval('P'. ($this->config['applicationlog']['delete_archive_threshold'] ?? 6) .'M')); - do { - $applicationLogArchiveTable = 'application_logs_archive_' . $deleteArchiveLogDate->format('m_Y'); - $archiveTableExists = $db->fetchOne('SELECT 1 + $archiveTables = $db->fetchFirstColumn('SELECT table_name FROM information_schema.tables WHERE table_schema = ? - AND table_name = ?', - [ - $this->config['applicationlog']['archive_alternative_database'] ?: $db->getDatabase(), - $applicationLogArchiveTable, - ]); - - if ($archiveTableExists) { - $db->executeStatement('DROP TABLE IF EXISTS `' . ($this->config['applicationlog']['archive_alternative_database'] ?: $db->getDatabase()) . '`.' . $applicationLogArchiveTable); - - $folderName = $deleteArchiveLogDate->format('Y/m'); - - // TODO: change fileExists to directoryExists once bumped flysystem to 3.* - if ($storage->fileExists($folderName)) { - $storage->deleteDirectory($folderName); - } else { - // Fallback, if is not found and deleted in the flysystem, tries to delete from local - $folderRealPath = realpath(PIMCORE_LOG_FILEOBJECT_DIRECTORY . DIRECTORY_SEPARATOR . $folderName); - if (str_starts_with(realpath($folderRealPath), PIMCORE_LOG_FILEOBJECT_DIRECTORY)) { - @unlink($folderRealPath); + AND table_name LIKE ?', + [ + $this->config['applicationlog']['archive_alternative_database'] ?: $db->getDatabase(), + ApplicationLoggerDb::TABLE_ARCHIVE_PREFIX.'_%' + ] + ); + foreach($archiveTables as $archiveTable) { + if(preg_match('/^'.ApplicationLoggerDb::TABLE_ARCHIVE_PREFIX.'_(\d{2})_(\d{4})$/', $archiveTable, $matches)) { + $deleteArchiveLogDate = Carbon::createFromFormat('m/Y', $matches[1].'/'.$matches[2]); + if($deleteArchiveLogDate->add(new DateInterval('P'.($this->config['applicationlog']['delete_archive_threshold'] ?? 6).'M')) < new DateTimeImmutable()) { + $db->executeStatement('DROP TABLE IF EXISTS `'.($this->config['applicationlog']['archive_alternative_database'] ?: $db->getDatabase()).'`.'.$archiveTable); + + $folderName = $deleteArchiveLogDate->format('Y/m'); + + // TODO: change fileExists to directoryExists once bumped flysystem to 3.* + if ($storage->fileExists($folderName)) { + $storage->deleteDirectory($folderName); + } else { + // Fallback, if is not found and deleted in the flysystem, tries to delete from local + $folderRealPath = realpath(PIMCORE_LOG_FILEOBJECT_DIRECTORY.DIRECTORY_SEPARATOR.$folderName); + if (str_starts_with(realpath($folderRealPath), PIMCORE_LOG_FILEOBJECT_DIRECTORY)) { + @unlink($folderRealPath); + } } } } - - $deleteArchiveLogDate = $deleteArchiveLogDate->sub(new DateInterval('P1M')); - } while ($archiveTableExists); + } } } From 025f03e07834c05ebac596c6b6f1ba6a057801f8 Mon Sep 17 00:00:00 2001 From: mcop1 Date: Mon, 5 Jun 2023 13:56:06 +0000 Subject: [PATCH 66/66] Apply php-cs-fixer changes --- lib/Maintenance/Tasks/LogArchiveTask.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Maintenance/Tasks/LogArchiveTask.php b/lib/Maintenance/Tasks/LogArchiveTask.php index 0fe8c0277f5..df8a7da37a6 100644 --- a/lib/Maintenance/Tasks/LogArchiveTask.php +++ b/lib/Maintenance/Tasks/LogArchiveTask.php @@ -122,7 +122,7 @@ public function execute() AND table_name LIKE ?', [ $this->config['applicationlog']['archive_alternative_database'] ?: $db->getDatabase(), - ApplicationLoggerDb::TABLE_ARCHIVE_PREFIX.'_%' + ApplicationLoggerDb::TABLE_ARCHIVE_PREFIX.'_%', ] ); foreach($archiveTables as $archiveTable) {