Skip to content

Commit

Permalink
[Improvement]: Move grid data related functions from pimcore/pimcore …
Browse files Browse the repository at this point in the history
…v11.3 (#457)
  • Loading branch information
kingjia90 committed Jun 18, 2024
1 parent e87b3c7 commit 776fc43
Show file tree
Hide file tree
Showing 10 changed files with 581 additions and 9 deletions.
2 changes: 1 addition & 1 deletion composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
"php": "~8.1.0 || ~8.2.0 || ~8.3.0",
"cbschuld/browser.php": "^1.9.6",
"phpoffice/phpspreadsheet": "^1.24 || ^2.1",
"pimcore/pimcore": "^11.2.0",
"pimcore/pimcore": "^11.3.0",
"symfony/webpack-encore-bundle": "^1.13.2"
},
"require-dev": {
Expand Down
3 changes: 2 additions & 1 deletion src/Controller/Admin/Asset/AssetController.php
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
use Pimcore\Bundle\AdminBundle\Event\ElementAdminStyleEvent;
use Pimcore\Bundle\AdminBundle\Helper\GridHelperService;
use Pimcore\Bundle\AdminBundle\Security\CsrfProtectionHandler;
use Pimcore\Bundle\AdminBundle\Service\GridData;
use Pimcore\Config;
use Pimcore\Controller\KernelControllerEventInterface;
use Pimcore\Controller\Traits\ElementEditLockHelperTrait;
Expand Down Expand Up @@ -2350,7 +2351,7 @@ public function gridProxyAction(Request $request, EventDispatcherInterface $even
foreach ($list->getAssets() as $index => $asset) {
// Like for treeGetChildrenByIdAction, so we respect isAllowed method which can be extended (object DI) for custom permissions, so relying only users_workspaces_asset is insufficient and could lead security breach
if ($asset->isAllowed('list')) {
$a = Asset\Service::gridAssetData($asset, $allParams['fields'], $allParams['language'] ?? '');
$a = GridData\Asset::getData($asset, $allParams['fields'], $allParams['language'] ?? '');
$assets[] = $a;
}
}
Expand Down
7 changes: 4 additions & 3 deletions src/Controller/Admin/DataObject/DataObjectActionsTrait.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@

use Pimcore\Bundle\AdminBundle\Event\AdminEvents;
use Pimcore\Bundle\AdminBundle\Helper\GridHelperService;
use Pimcore\Bundle\AdminBundle\Service\GridData;
use Pimcore\Localization\LocaleServiceInterface;
use Pimcore\Logger;
use Pimcore\Model\DataObject;
Expand Down Expand Up @@ -92,7 +93,7 @@ protected function gridProxy(

return [
'success' => true,
'data' => DataObject\Service::gridObjectData($object, $allParams['fields'], $requestedLanguage),
'data' => GridData\DataObject::getData($object, $allParams['fields'], $requestedLanguage),
];
} catch (\Exception $e) {
return [
Expand Down Expand Up @@ -122,13 +123,13 @@ protected function gridProxy(
$objects = [];
foreach ($list->getObjects() as $object) {
if ($csvMode) {
$o = DataObject\Service::getCsvDataForObject($object, $requestedLanguage, $request->get('fields'), DataObject\Service::getHelperDefinitions(), $localeService, 'title', false, $allParams['context']);
$o = DataObject\Service::getCsvDataForObject($object, $requestedLanguage, $request->get('fields'), GridData\DataObject::getHelperDefinitions(), $localeService, 'title', false, $allParams['context']);
// Like for treeGetChildrenByIdAction, so we respect isAllowed method which can be extended (object DI) for custom permissions, so relying only users_workspaces_object is insufficient and could lead security breach
if ($object->isAllowed('list')) {
$objects[] = $o;
}
} else {
$o = DataObject\Service::gridObjectData($object, $allParams['fields'] ?? null, $requestedLanguage,
$o = GridData\DataObject::getData($object, $allParams['fields'] ?? null, $requestedLanguage,
['csvMode' => $csvMode]);
if ($o['permissions']['list']) {
$objects[] = $o;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
use Pimcore\Bundle\AdminBundle\Model\GridConfig;
use Pimcore\Bundle\AdminBundle\Model\GridConfigFavourite;
use Pimcore\Bundle\AdminBundle\Model\GridConfigShare;
use Pimcore\Bundle\AdminBundle\Service\GridData;
use Pimcore\Config;
use Pimcore\Db;
use Pimcore\File;
Expand Down Expand Up @@ -66,7 +67,7 @@ public function loadObjectDataAction(Request $request): JsonResponse
if ($object) {
$result['success'] = true;
$fields = $request->get('fields');
$result['fields'] = DataObject\Service::gridObjectData($object, $fields);
$result['fields'] = GridData\DataObject::getData($object, $fields);
} else {
$result['success'] = false;
}
Expand Down
3 changes: 2 additions & 1 deletion src/GDPR/DataProvider/Assets.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@

use Doctrine\DBAL\Exception;
use Pimcore\Bundle\AdminBundle\Helper\QueryParams;
use Pimcore\Bundle\AdminBundle\Service\GridData;
use Pimcore\Model\Asset;
use Pimcore\Model\Element;
use Symfony\Component\HttpFoundation\Response;
Expand Down Expand Up @@ -160,7 +161,7 @@ public function searchData(int $id, string $firstname, string $lastname, string
$element = Element\Service::getElementById('asset', $hit['id']);

if ($element instanceof Asset) {
$data = Asset\Service::gridAssetData($element);
$data = GridData\Asset::getData($element);
$data['permissions'] = $element->getUserPermissions();
$elements[] = $data;
}
Expand Down
4 changes: 2 additions & 2 deletions src/GDPR/DataProvider/DataObjects.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@
namespace Pimcore\Bundle\AdminBundle\GDPR\DataProvider;

use Pimcore\Bundle\AdminBundle\Helper\QueryParams;
use Pimcore\Bundle\AdminBundle\Service\GridData;
use Pimcore\Model\Asset;
use Pimcore\Model\DataObject;
use Pimcore\Model\DataObject\AbstractObject;
use Pimcore\Model\DataObject\Concrete;
use Pimcore\Model\DataObject\Data\ElementMetadata;
Expand Down Expand Up @@ -150,7 +150,7 @@ public function searchData(int $id, string $firstname, string $lastname, string
foreach ($query->fetchAllAssociative() as $hit) {
$element = Element\Service::getElementById($hit['type'], $hit['id']);
if ($element instanceof Concrete) {
$data = DataObject\Service::gridObjectData($element);
$data = GridData\DataObject::getData($element);
$data['__gdprIsDeletable'] = $this->config['classes'][$element->getClassName()]['allowDelete'] ?? false;
$elements[] = $data;
}
Expand Down
118 changes: 118 additions & 0 deletions src/Service/GridData/Asset.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
<?php
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\AdminBundle\Service\GridData;

use Pimcore\Model;
use Pimcore\Model\Asset\MetaData\ClassDefinition\Data\Data;
use Pimcore\Model\Element\Service;
use Pimcore\Model\Exception\UnsupportedException;

/**
*
* @internal
*/
class Asset extends Element
{
public static function getData(Model\Asset $asset, array $fields = null, string $requestedLanguage = null, array $params = []): array
{
$data = self::gridElementData($asset);
$loader = null;

if (!empty($fields)) {
$data = [
'id' => $asset->getId(),
'id~system' => $asset->getId(),
'type~system' => $asset->getType(),
'fullpath~system' => $asset->getRealFullPath(),
'filename~system' => $asset->getKey(),
'creationDate~system' => $asset->getCreationDate(),
'modificationDate~system' => $asset->getModificationDate(),
'idPath~system' => Service::getIdPath($asset),
];

$requestedLanguage = str_replace('default', '', $requestedLanguage);

foreach ($fields as $field) {
$fieldDef = explode('~', $field);
if (isset($fieldDef[1]) && $fieldDef[1] === 'system') {
if ($fieldDef[0] === 'preview') {
$data[$field] = self::getPreviewThumbnail($asset, ['treepreview' => true, 'width' => 108, 'height' => 70, 'frame' => true]);
} elseif ($fieldDef[0] === 'size') {
$size = $asset->getFileSize();
$data[$field] = formatBytes($size);
}
} else {
if (isset($fieldDef[1])) {
$language = ($fieldDef[1] === 'none' ? '' : $fieldDef[1]);
$rawMetaData = $asset->getMetadata($fieldDef[0], $language, true, true);
} else {
$rawMetaData = $asset->getMetadata($field, $requestedLanguage, true, true);
}

$metaData = $rawMetaData['data'] ?? null;

if ($rawMetaData) {
$type = $rawMetaData['type'];
if (!$loader) {
$loader = \Pimcore::getContainer()->get('pimcore.implementation_loader.asset.metadata.data');
}

$metaData = $rawMetaData['data'] ?? null;

try {
/** @var Data $instance */
$instance = $loader->build($type);
$metaData = $instance->getDataForListfolderGrid($rawMetaData['data'] ?? null, $rawMetaData);
} catch (UnsupportedException $e) {
}
}

$data[$field] = $metaData;
}
}
}

return $data;
}

public static function getPreviewThumbnail(Model\Asset $asset, array $params = [], bool $onlyMethod = false): ?string
{
$thumbnailMethod = '';
$thumbnailUrl = null;

if ($asset instanceof Model\Asset\Image) {
$thumbnailMethod = 'getThumbnail';
} elseif ($asset instanceof Model\Asset\Video && \Pimcore\Video::isAvailable()) {
$thumbnailMethod = 'getImageThumbnail';
} elseif ($asset instanceof Model\Asset\Document && \Pimcore\Document::isAvailable()) {
$thumbnailMethod = 'getImageThumbnail';
}

if ($onlyMethod) {
return $thumbnailMethod;
}

if (!empty($thumbnailMethod)) {
$thumbnailUrl = '/admin/asset/get-' . $asset->getType() . '-thumbnail?id=' . $asset->getId();
if (count($params) > 0) {
$thumbnailUrl .= '&' . http_build_query($params);
}
}

return $thumbnailUrl;
}
}
Loading

0 comments on commit 776fc43

Please sign in to comment.