vendor/pimcore/pimcore/bundles/AdminBundle/Controller/Admin/ElementController.php line 588

Open in your IDE?
  1. <?php
  2. /**
  3.  * Pimcore
  4.  *
  5.  * This source file is available under two different licenses:
  6.  * - GNU General Public License version 3 (GPLv3)
  7.  * - Pimcore Enterprise License (PEL)
  8.  * Full copyright and license information is available in
  9.  * LICENSE.md which is distributed with this source code.
  10.  *
  11.  * @copyright  Copyright (c) Pimcore GmbH (http://www.pimcore.org)
  12.  * @license    http://www.pimcore.org/license     GPLv3 and PEL
  13.  */
  14. namespace Pimcore\Bundle\AdminBundle\Controller\Admin;
  15. use Pimcore\Bundle\AdminBundle\Controller\AdminController;
  16. use Pimcore\Bundle\AdminBundle\DependencyInjection\PimcoreAdminExtension;
  17. use Pimcore\Db;
  18. use Pimcore\Event\AdminEvents;
  19. use Pimcore\Event\Model\ResolveElementEvent;
  20. use Pimcore\Logger;
  21. use Pimcore\Model;
  22. use Pimcore\Model\Asset;
  23. use Pimcore\Model\DataObject;
  24. use Pimcore\Model\Document;
  25. use Pimcore\Model\Element;
  26. use Pimcore\Model\Version;
  27. use Symfony\Component\HttpFoundation\JsonResponse;
  28. use Symfony\Component\HttpFoundation\Request;
  29. use Symfony\Component\HttpFoundation\Response;
  30. use Symfony\Component\Routing\Annotation\Route;
  31. class ElementController extends AdminController
  32. {
  33.     /**
  34.      * @Route("/element/lock-element", name="pimcore_admin_element_lockelement", methods={"PUT"})
  35.      *
  36.      * @param Request $request
  37.      *
  38.      * @return Response
  39.      */
  40.     public function lockElementAction(Request $request)
  41.     {
  42.         Element\Editlock::lock($request->get('id'), $request->get('type'));
  43.         return $this->adminJson(['success' => true]);
  44.     }
  45.     /**
  46.      * @Route("/element/unlock-element", name="pimcore_admin_element_unlockelement", methods={"PUT"})
  47.      *
  48.      * @param Request $request
  49.      *
  50.      * @return Response
  51.      */
  52.     public function unlockElementAction(Request $request)
  53.     {
  54.         Element\Editlock::unlock($request->get('id'), $request->get('type'));
  55.         return $this->adminJson(['success' => true]);
  56.     }
  57.     /**
  58.      * Returns the element data denoted by the given type and ID or path.
  59.      *
  60.      * @Route("/element/get-subtype", name="pimcore_admin_element_getsubtype", methods={"GET"})
  61.      *
  62.      * @param Request $request
  63.      *
  64.      * @return JsonResponse
  65.      */
  66.     public function getSubtypeAction(Request $request)
  67.     {
  68.         $idOrPath trim($request->get('id'));
  69.         $type $request->get('type');
  70.         $event = new ResolveElementEvent($type$idOrPath);
  71.         \Pimcore::getEventDispatcher()->dispatch(AdminEvents::RESOLVE_ELEMENT$event);
  72.         $idOrPath $event->getId();
  73.         $type $event->getType();
  74.         if (is_numeric($idOrPath)) {
  75.             $el Element\Service::getElementById($type, (int) $idOrPath);
  76.         } else {
  77.             if ($type == 'document') {
  78.                 $el Document\Service::getByUrl($idOrPath);
  79.             } else {
  80.                 $el Element\Service::getElementByPath($type$idOrPath);
  81.             }
  82.         }
  83.         if ($el) {
  84.             $subtype null;
  85.             if ($el instanceof Asset || $el instanceof Document) {
  86.                 $subtype $el->getType();
  87.             } elseif ($el instanceof DataObject\Concrete) {
  88.                 $subtype $el->getClassName();
  89.             } elseif ($el instanceof DataObject\Folder) {
  90.                 $subtype 'folder';
  91.             }
  92.             return $this->adminJson([
  93.                 'subtype' => $subtype,
  94.                 'id' => $el->getId(),
  95.                 'type' => $type,
  96.                 'success' => true
  97.             ]);
  98.         } else {
  99.             return $this->adminJson([
  100.                 'success' => false
  101.             ]);
  102.         }
  103.     }
  104.     /**
  105.      * @param string $parameterName
  106.      *
  107.      * @return \Pimcore\Bundle\AdminBundle\HttpFoundation\JsonResponse
  108.      */
  109.     protected function processNoteTypesFromParameters(string $parameterName)
  110.     {
  111.         $config $this->getParameter($parameterName);
  112.         $result = [];
  113.         foreach ($config as $configEntry) {
  114.             $result[] = [
  115.                 'name' => $configEntry
  116.             ];
  117.         }
  118.         return $this->adminJson(['noteTypes' => $result]);
  119.     }
  120.     /**
  121.      * @Route("/element/note-types", name="pimcore_admin_element_notetypes", methods={"GET"})
  122.      *
  123.      * @param Request $request
  124.      *
  125.      * @return JsonResponse
  126.      */
  127.     public function noteTypes(Request $request)
  128.     {
  129.         switch ($request->get('ctype')) {
  130.             case 'document':
  131.                 return $this->processNoteTypesFromParameters(PimcoreAdminExtension::PARAM_DOCUMENTS_NOTES_EVENTS_TYPES);
  132.             case 'asset':
  133.                 return $this->processNoteTypesFromParameters(PimcoreAdminExtension::PARAM_ASSETS_NOTES_EVENTS_TYPES);
  134.             case 'object':
  135.                 return $this->processNoteTypesFromParameters(PimcoreAdminExtension::PARAM_DATAOBJECTS_NOTES_EVENTS_TYPES);
  136.             default:
  137.                 return $this->adminJson(['noteTypes' => []]);
  138.         }
  139.     }
  140.     /**
  141.      * @Route("/element/note-list", name="pimcore_admin_element_notelist", methods={"POST"})
  142.      *
  143.      * @param Request $request
  144.      *
  145.      * @return JsonResponse
  146.      */
  147.     public function noteListAction(Request $request)
  148.     {
  149.         $this->checkPermission('notes_events');
  150.         $list = new Element\Note\Listing();
  151.         $list->setLimit($request->get('limit'));
  152.         $list->setOffset($request->get('start'));
  153.         $sortingSettings = \Pimcore\Bundle\AdminBundle\Helper\QueryParams::extractSortingSettings(array_merge($request->request->all(), $request->query->all()));
  154.         if ($sortingSettings['orderKey'] && $sortingSettings['order']) {
  155.             $list->setOrderKey($sortingSettings['orderKey']);
  156.             $list->setOrder($sortingSettings['order']);
  157.         } else {
  158.             $list->setOrderKey(['date''id']);
  159.             $list->setOrder(['DESC''DESC']);
  160.         }
  161.         $conditions = [];
  162.         $filterText $request->get('filterText');
  163.         if ($filterText) {
  164.             $conditions[] = '('
  165.                 '`title` LIKE ' $list->quote('%'$filterText .'%')
  166.                 . ' OR `description` LIKE ' $list->quote('%'.$filterText.'%')
  167.                 . ' OR `type` LIKE ' $list->quote('%'.$filterText.'%')
  168.                 . ' OR `user` IN (SELECT `id` FROM `users` WHERE `name` LIKE ' $list->quote('%'.$filterText.'%') . ')'
  169.                 " OR DATE_FORMAT(FROM_UNIXTIME(`date`), '%Y-%m-%d') LIKE " $list->quote('%'.$filterText.'%')
  170.                 . ')';
  171.         }
  172.         $filterJson $request->get('filter');
  173.         if ($filterJson) {
  174.             $db Db::get();
  175.             $filters $this->decodeJson($filterJson);
  176.             $propertyKey 'property';
  177.             $comparisonKey 'operator';
  178.             foreach ($filters as $filter) {
  179.                 $operator '=';
  180.                 if ($filter['type'] == 'string') {
  181.                     $operator 'LIKE';
  182.                 } elseif ($filter['type'] == 'numeric') {
  183.                     if ($filter[$comparisonKey] == 'lt') {
  184.                         $operator '<';
  185.                     } elseif ($filter[$comparisonKey] == 'gt') {
  186.                         $operator '>';
  187.                     } elseif ($filter[$comparisonKey] == 'eq') {
  188.                         $operator '=';
  189.                     }
  190.                 } elseif ($filter['type'] == 'date') {
  191.                     if ($filter[$comparisonKey] == 'lt') {
  192.                         $operator '<';
  193.                     } elseif ($filter[$comparisonKey] == 'gt') {
  194.                         $operator '>';
  195.                     } elseif ($filter[$comparisonKey] == 'eq') {
  196.                         $operator '=';
  197.                     }
  198.                     $filter['value'] = strtotime($filter['value']);
  199.                 } elseif ($filter[$comparisonKey] == 'list') {
  200.                     $operator '=';
  201.                 } elseif ($filter[$comparisonKey] == 'boolean') {
  202.                     $operator '=';
  203.                     $filter['value'] = (int) $filter['value'];
  204.                 }
  205.                 // system field
  206.                 $value $filter['value'];
  207.                 if ($operator == 'LIKE') {
  208.                     $value '%' $value '%';
  209.                 }
  210.                 if ($filter[$propertyKey] == 'user') {
  211.                     $conditions[] = '`user` IN (SELECT `id` FROM `users` WHERE `name` LIKE ' $list->quote('%'.$filter['value'].'%') . ')';
  212.                 } else {
  213.                     if ($filter['type'] == 'date' && $filter[$comparisonKey] == 'eq') {
  214.                         $maxTime $filter['value'] + (86400 1); //specifies the top point of the range used in the condition
  215.                         $dateCondition '`' $filter[$propertyKey] . '` ' ' BETWEEN ' $db->quote($filter['value']) . ' AND ' $db->quote($maxTime);
  216.                         $conditions[] = $dateCondition;
  217.                     } else {
  218.                         $field '`'.$filter[$propertyKey].'` ';
  219.                         $conditions[] = $field.$operator.' '.$db->quote($value);
  220.                     }
  221.                 }
  222.             }
  223.         }
  224.         if ($request->get('cid') && $request->get('ctype')) {
  225.             $conditions[] = '(cid = ' $list->quote($request->get('cid')) . ' AND ctype = ' $list->quote($request->get('ctype')) . ')';
  226.         }
  227.         if (!empty($conditions)) {
  228.             $condition implode(' AND '$conditions);
  229.             $list->setCondition($condition);
  230.         }
  231.         $list->load();
  232.         $notes = [];
  233.         foreach ($list->getNotes() as $note) {
  234.             $e Element\Service::getNoteData($note);
  235.             $notes[] = $e;
  236.         }
  237.         return $this->adminJson([
  238.             'data' => $notes,
  239.             'success' => true,
  240.             'total' => $list->getTotalCount()
  241.         ]);
  242.     }
  243.     /**
  244.      * @Route("/element/note-add", name="pimcore_admin_element_noteadd", methods={"POST"})
  245.      *
  246.      * @param Request $request
  247.      *
  248.      * @return JsonResponse
  249.      */
  250.     public function noteAddAction(Request $request)
  251.     {
  252.         $this->checkPermission('notes_events');
  253.         $note = new Element\Note();
  254.         $note->setCid((int) $request->get('cid'));
  255.         $note->setCtype($request->get('ctype'));
  256.         $note->setDate(time());
  257.         $note->setTitle($request->get('title'));
  258.         $note->setDescription($request->get('description'));
  259.         $note->setType($request->get('type'));
  260.         $note->save();
  261.         return $this->adminJson([
  262.             'success' => true
  263.         ]);
  264.     }
  265.     /**
  266.      * @Route("/element/find-usages", name="pimcore_admin_element_findusages", methods={"GET"})
  267.      *
  268.      * @param Request $request
  269.      *
  270.      * @return JsonResponse
  271.      */
  272.     public function findUsagesAction(Request $request)
  273.     {
  274.         $element null;
  275.         if ($request->get('id')) {
  276.             $element Element\Service::getElementById($request->get('type'), $request->get('id'));
  277.         } elseif ($request->get('path')) {
  278.             $element Element\Service::getElementByPath($request->get('type'), $request->get('path'));
  279.         }
  280.         $results = [];
  281.         $success false;
  282.         $hasHidden false;
  283.         $total 0;
  284.         $limit intval($request->get('limit'50));
  285.         $offset intval($request->get('start'0));
  286.         if ($element instanceof Element\AbstractElement) {
  287.             $total $element->getDependencies()->getRequiredByTotalCount();
  288.             if ($request->get('sort')) {
  289.                 $sort json_decode($request->get('sort'))[0];
  290.                 $orderBy $sort->property;
  291.                 $orderDirection $sort->direction;
  292.             } else {
  293.                 $orderBy null;
  294.                 $orderDirection null;
  295.             }
  296.             $queryOffset $offset;
  297.             $queryLimit $limit;
  298.             while (count($results) < min($limit$total) && $queryOffset $total) {
  299.                 $elements $element->getDependencies()
  300.                     ->getRequiredByWithPath($queryOffset$queryLimit$orderBy$orderDirection);
  301.                 foreach ($elements as $el) {
  302.                     $item Element\Service::getElementById($el['type'], $el['id']);
  303.                     if ($item instanceof Element\ElementInterface) {
  304.                         if ($item->isAllowed('list')) {
  305.                             $results[] = $el;
  306.                         } else {
  307.                             $hasHidden true;
  308.                         }
  309.                     }
  310.                 }
  311.                 $queryOffset += count($elements);
  312.                 $queryLimit $limit count($results);
  313.             }
  314.             $success true;
  315.         }
  316.         return $this->adminJson([
  317.             'data' => $results,
  318.             'total' => $total,
  319.             'hasHidden' => $hasHidden,
  320.             'success' => $success
  321.         ]);
  322.     }
  323.     /**
  324.      * @Route("/element/get-replace-assignments-batch-jobs", name="pimcore_admin_element_getreplaceassignmentsbatchjobs", methods={"GET"})
  325.      *
  326.      * @param Request $request
  327.      *
  328.      * @return \Pimcore\Bundle\AdminBundle\HttpFoundation\JsonResponse
  329.      */
  330.     public function getReplaceAssignmentsBatchJobsAction(Request $request)
  331.     {
  332.         $element null;
  333.         if ($request->get('id')) {
  334.             $element Element\Service::getElementById($request->get('type'), $request->get('id'));
  335.         } elseif ($request->get('path')) {
  336.             $element Element\Service::getElementByPath($request->get('type'), $request->get('path'));
  337.         }
  338.         if ($element instanceof Element\AbstractElement) {
  339.             return $this->adminJson([
  340.                 'success' => true,
  341.                 'jobs' => $element->getDependencies()->getRequiredBy()
  342.             ]);
  343.         } else {
  344.             return $this->adminJson(['success' => false], Response::HTTP_NOT_FOUND);
  345.         }
  346.     }
  347.     /**
  348.      * @Route("/element/replace-assignments", name="pimcore_admin_element_replaceassignments", methods={"POST"})
  349.      *
  350.      * @param Request $request
  351.      *
  352.      * @return JsonResponse
  353.      */
  354.     public function replaceAssignmentsAction(Request $request)
  355.     {
  356.         $success false;
  357.         $message '';
  358.         $element Element\Service::getElementById($request->get('type'), $request->get('id'));
  359.         $sourceEl Element\Service::getElementById($request->get('sourceType'), $request->get('sourceId'));
  360.         $targetEl Element\Service::getElementById($request->get('targetType'), $request->get('targetId'));
  361.         if ($element && $sourceEl && $targetEl
  362.             && $request->get('sourceType') == $request->get('targetType')
  363.             && $sourceEl->getType() == $targetEl->getType()
  364.             && $element->isAllowed('save')
  365.         ) {
  366.             $rewriteConfig = [
  367.                 $request->get('sourceType') => [
  368.                     $sourceEl->getId() => $targetEl->getId()
  369.                 ]
  370.             ];
  371.             if ($element instanceof Document) {
  372.                 $element Document\Service::rewriteIds($element$rewriteConfig);
  373.             } elseif ($element instanceof DataObject\AbstractObject) {
  374.                 $element DataObject\Service::rewriteIds($element$rewriteConfig);
  375.             } elseif ($element instanceof Asset) {
  376.                 $element Asset\Service::rewriteIds($element$rewriteConfig);
  377.             }
  378.             $element->setUserModification($this->getAdminUser()->getId());
  379.             $element->save();
  380.             $success true;
  381.         } else {
  382.             $message 'source-type and target-type do not match';
  383.         }
  384.         return $this->adminJson([
  385.             'success' => $success,
  386.             'message' => $message
  387.         ]);
  388.     }
  389.     /**
  390.      * @Route("/element/unlock-propagate", name="pimcore_admin_element_unlockpropagate", methods={"PUT"})
  391.      *
  392.      * @param Request $request
  393.      *
  394.      * @return JsonResponse
  395.      */
  396.     public function unlockPropagateAction(Request $request)
  397.     {
  398.         $success false;
  399.         $element Element\Service::getElementById($request->get('type'), $request->get('id'));
  400.         if ($element) {
  401.             $element->unlockPropagate();
  402.             $success true;
  403.         }
  404.         return $this->adminJson([
  405.             'success' => $success
  406.         ]);
  407.     }
  408.     /**
  409.      * @Route("/element/type-path", name="pimcore_admin_element_typepath", methods={"GET"})
  410.      *
  411.      * @param Request $request
  412.      *
  413.      * @return JsonResponse
  414.      */
  415.     public function typePathAction(Request $request)
  416.     {
  417.         $id $request->get('id');
  418.         $type $request->get('type');
  419.         $data = [];
  420.         if ($type == 'asset') {
  421.             $element Asset::getById($id);
  422.         } elseif ($type == 'document') {
  423.             $element Document::getById($id);
  424.             $data['index'] = $element->getIndex();
  425.         } else {
  426.             $element DataObject::getById($id);
  427.             $data['index'] = $element->getIndex();
  428.         }
  429.         $typePath Element\Service::getTypePath($element);
  430.         $data['success'] = true;
  431.         $data['idPath'] = Element\Service::getIdPath($element);
  432.         $data['typePath'] = $typePath;
  433.         $data['fullpath'] = $element->getRealFullPath();
  434.         if ($type !== 'asset') {
  435.             $sortIndexPath Element\Service::getSortIndexPath($element);
  436.             $data['sortIndexPath'] = $sortIndexPath;
  437.         }
  438.         return $this->adminJson($data);
  439.     }
  440.     /**
  441.      * @Route("/element/version-update", name="pimcore_admin_element_versionupdate", methods={"PUT"})
  442.      *
  443.      * @param Request $request
  444.      *
  445.      * @return JsonResponse
  446.      */
  447.     public function versionUpdateAction(Request $request)
  448.     {
  449.         $data $this->decodeJson($request->get('data'));
  450.         $version Version::getById($data['id']);
  451.         $version->setPublic($data['public']);
  452.         $version->setNote($data['note']);
  453.         $version->save();
  454.         return $this->adminJson(['success' => true]);
  455.     }
  456.     /**
  457.      * @Route("/element/get-nice-path", name="pimcore_admin_element_getnicepath", methods={"POST"})
  458.      *
  459.      * @param Request $request
  460.      *
  461.      * @return JsonResponse
  462.      *
  463.      * @throws \Exception
  464.      */
  465.     public function getNicePathAction(Request $request)
  466.     {
  467.         $source $this->decodeJson($request->get('source'));
  468.         if ($source['type'] != 'object') {
  469.             throw new \Exception('currently only objects as source elements are supported');
  470.         }
  471.         $result = [];
  472.         $id $source['id'];
  473.         $source DataObject\Concrete::getById($id);
  474.         if ($request->get('context')) {
  475.             $context $this->decodeJson($request->get('context'));
  476.         } else {
  477.             $context = [];
  478.         }
  479.         $ownerType $context['containerType'];
  480.         $fieldname $context['fieldname'];
  481.         $fd $this->getNicePathFormatterFieldDefinition($source$context);
  482.         $targets $this->decodeJson($request->get('targets'));
  483.         $result $this->convertResultWithPathFormatter($source$context$result$targets);
  484.         if ($request->get('loadEditModeData') == 'true') {
  485.             $idProperty $request->get('idProperty''id');
  486.             $methodName 'get' ucfirst($fieldname);
  487.             if ($ownerType == 'object' && method_exists($source$methodName)) {
  488.                 $data $source->$methodName();
  489.                 $editModeData $fd->getDataForEditmode($data$source);
  490.                 if (is_array($editModeData)) {
  491.                     foreach ($editModeData as $relationObjectAttribute) {
  492.                         $relationObjectAttribute['$$nicepath'] =
  493.                             isset($relationObjectAttribute[$idProperty]) && isset($result[$relationObjectAttribute[$idProperty]]) ? $result[$relationObjectAttribute[$idProperty]] : null;
  494.                         $result[$relationObjectAttribute[$idProperty]] = $relationObjectAttribute;
  495.                     }
  496.                 } else {
  497.                     $editModeData['$$nicepath'] = $result[$editModeData[$idProperty]];
  498.                     $result[$editModeData[$idProperty]] = $editModeData;
  499.                 }
  500.             } else {
  501.                 Logger::error('Loading edit mode data is not supported for ownertype: ' $ownerType);
  502.             }
  503.         }
  504.         return $this->adminJson(['success' => true'data' => $result]);
  505.     }
  506.     /**
  507.      * @Route("/element/get-versions", name="pimcore_admin_element_getversions", methods={"GET"})
  508.      *
  509.      * @param Request $request
  510.      *
  511.      * @return JsonResponse
  512.      *
  513.      * @throws \Exception
  514.      */
  515.     public function getVersionsAction(Request $request)
  516.     {
  517.         $id intval($request->get('id'));
  518.         $type $request->get('elementType');
  519.         $allowedTypes = ['asset''document''object'];
  520.         if ($id && in_array($type$allowedTypes)) {
  521.             $element Model\Element\Service::getElementById($type$id);
  522.             if ($element) {
  523.                 if ($element->isAllowed('versions')) {
  524.                     $schedule $element->getScheduledTasks();
  525.                     $schedules = [];
  526.                     foreach ($schedule as $task) {
  527.                         if ($task->getActive()) {
  528.                             $schedules[$task->getVersion()] = $task->getDate();
  529.                         }
  530.                     }
  531.                     $versions $element->getVersions();
  532.                     $versions Model\Element\Service::getSafeVersionInfo($versions);
  533.                     $versions array_reverse($versions); //reverse array to sort by ID DESC
  534.                     foreach ($versions as &$version) {
  535.                         $version['scheduled'] = null;
  536.                         if (array_key_exists($version['id'], $schedules)) {
  537.                             $version['scheduled'] = $schedules[$version['id']];
  538.                         }
  539.                     }
  540.                     return $this->adminJson(['versions' => $versions]);
  541.                 } else {
  542.                     throw $this->createAccessDeniedException('Permission denied, ' $type ' id [' $id ']');
  543.                 }
  544.             } else {
  545.                 throw $this->createNotFoundException($type ' with id [' $id "] doesn't exist");
  546.             }
  547.         }
  548.         throw $this->createNotFoundException('Element type not found');
  549.     }
  550.     /**
  551.      * @Route("/element/delete-version", name="pimcore_admin_element_deleteversion", methods={"DELETE"})
  552.      *
  553.      * @param Request $request
  554.      *
  555.      * @return JsonResponse
  556.      */
  557.     public function deleteVersionAction(Request $request)
  558.     {
  559.         $version Model\Version::getById($request->get('id'));
  560.         $version->delete();
  561.         return $this->adminJson(['success' => true]);
  562.     }
  563.     /**
  564.      * @Route("/element/delete-all-versions", name="pimcore_admin_element_deleteallversion", methods={"DELETE"})
  565.      *
  566.      * @param Request $request
  567.      *
  568.      * @return JsonResponse
  569.      */
  570.     public function deleteAllVersionAction(Request $request)
  571.     {
  572.         $elementId $request->get('id');
  573.         $elementModificationdate $request->get('date');
  574.         $versions = new Model\Version\Listing();
  575.         $versions->setCondition('cid = ' $versions->quote($elementId) . ' AND date <> ' $versions->quote($elementModificationdate));
  576.         foreach ($versions->load() as $vkey => $version) {
  577.             $version->delete();
  578.         }
  579.         return $this->adminJson(['success' => true]);
  580.     }
  581.     /**
  582.      * @Route("/element/get-requires-dependencies", name="pimcore_admin_element_getrequiresdependencies", methods={"GET"})
  583.      *
  584.      * @param Request $request
  585.      *
  586.      * @return JsonResponse
  587.      */
  588.     public function getRequiresDependenciesAction(Request $request)
  589.     {
  590.         $id $request->get('id');
  591.         $type $request->get('elementType');
  592.         $allowedTypes = ['asset''document''object'];
  593.         $offset $request->get('start');
  594.         $limit $request->get('limit');
  595.         if ($id && in_array($type$allowedTypes)) {
  596.             $element Model\Element\Service::getElementById($type$id);
  597.             $dependencies $element->getDependencies();
  598.             if ($element instanceof Model\Element\ElementInterface) {
  599.                 $dependenciesResult Model\Element\Service::getRequiresDependenciesForFrontend($dependencies$offset$limit);
  600.                 $dependenciesResult['start'] = $offset;
  601.                 $dependenciesResult['limit'] = $limit;
  602.                 $dependenciesResult['total'] = $dependencies->getRequiresTotalCount();
  603.                 return $this->adminJson($dependenciesResult);
  604.             }
  605.         }
  606.         return $this->adminJson(false);
  607.     }
  608.     /**
  609.      * @Route("/element/get-required-by-dependencies", name="pimcore_admin_element_getrequiredbydependencies", methods={"GET"})
  610.      *
  611.      * @param Request $request
  612.      *
  613.      * @return JsonResponse
  614.      */
  615.     public function getRequiredByDependenciesAction(Request $request)
  616.     {
  617.         $id $request->get('id');
  618.         $type $request->get('elementType');
  619.         $allowedTypes = ['asset''document''object'];
  620.         $offset $request->get('start');
  621.         $limit $request->get('limit');
  622.         if ($id && in_array($type$allowedTypes)) {
  623.             $element Model\Element\Service::getElementById($type$id);
  624.             $dependencies $element->getDependencies();
  625.             if ($element instanceof Model\Element\ElementInterface) {
  626.                 $dependenciesResult Model\Element\Service::getRequiredByDependenciesForFrontend($dependencies$offset$limit);
  627.                 $dependenciesResult['start'] = $offset;
  628.                 $dependenciesResult['limit'] = $limit;
  629.                 $dependenciesResult['total'] = $dependencies->getRequiredByTotalCount();
  630.                 return $this->adminJson($dependenciesResult);
  631.             }
  632.         }
  633.         return $this->adminJson(false);
  634.     }
  635.     /**
  636.      * @Route("/element/get-predefined-properties", name="pimcore_admin_element_getpredefinedproperties", methods={"GET"})
  637.      *
  638.      * @param Request $request
  639.      *
  640.      * @return JsonResponse
  641.      */
  642.     public function getPredefinedPropertiesAction(Request $request)
  643.     {
  644.         $properties = [];
  645.         $type $request->get('elementType');
  646.         $allowedTypes = ['asset''document''object'];
  647.         if (in_array($type$allowedTypes)) {
  648.             $list = new Model\Property\Predefined\Listing();
  649.             $list->setFilter(function ($row) use ($type) {
  650.                 if (is_array($row['ctype'])) {
  651.                     $row['ctype'] = implode(','$row['ctype']);
  652.                 }
  653.                 if (strpos($row['ctype'], $type) !== false) {
  654.                     return true;
  655.                 }
  656.                 return false;
  657.             });
  658.             $list->load();
  659.             foreach ($list->getProperties() as $type) {
  660.                 $properties[] = $type;
  661.             }
  662.         }
  663.         return $this->adminJson(['properties' => $properties]);
  664.     }
  665.     /**
  666.      * @Route("/element/analyze-permissions", name="pimcore_admin_element_analyzepermissions", methods={"POST"})
  667.      *
  668.      * @param Request $request
  669.      *
  670.      * @return Response
  671.      */
  672.     public function analyzePermissionsAction(Request $request)
  673.     {
  674.         $userId $request->get('userId');
  675.         if ($userId) {
  676.             $user Model\User::getById($userId);
  677.             $userList = [$user];
  678.         } else {
  679.             $userList = new Model\User\Listing();
  680.             $userList->setCondition('type = ?', ['user']);
  681.             $userList $userList->load();
  682.         }
  683.         $elementType $request->get('elementType');
  684.         $elementId $request->get('elementId');
  685.         $element Element\Service::getElementById($elementType$elementId);
  686.         $result Element\PermissionChecker::check($element$userList);
  687.         return $this->adminJson(
  688.             [
  689.                 'data' => $result,
  690.                 'success' => true
  691.             ]
  692.         );
  693.     }
  694.     /**
  695.      * @param DataObject\Concrete $source
  696.      * @param array $context
  697.      *
  698.      * @return bool|DataObject\ClassDefinition\Data|null
  699.      *
  700.      * @throws \Exception
  701.      */
  702.     protected function getNicePathFormatterFieldDefinition($source$context)
  703.     {
  704.         $ownerType $context['containerType'];
  705.         $fieldname $context['fieldname'];
  706.         $fd null;
  707.         if ($ownerType == 'object') {
  708.             $subContainerType = isset($context['subContainerType']) ? $context['subContainerType'] : null;
  709.             if ($subContainerType) {
  710.                 $subContainerKey $context['subContainerKey'];
  711.                 $subContainer $source->getClass()->getFieldDefinition($subContainerKey);
  712.                 if (method_exists($subContainer'getFieldDefinition')) {
  713.                     $fd $subContainer->getFieldDefinition($fieldname);
  714.                 }
  715.             } else {
  716.                 $fd $source->getClass()->getFieldDefinition($fieldname);
  717.             }
  718.         } elseif ($ownerType == 'localizedfield') {
  719.             $localizedfields $source->getClass()->getFieldDefinition('localizedfields');
  720.             if ($localizedfields instanceof DataObject\ClassDefinition\Data\Localizedfields) {
  721.                 $fd $localizedfields->getFieldDefinition($fieldname);
  722.             }
  723.         } elseif ($ownerType == 'objectbrick') {
  724.             $fdBrick DataObject\Objectbrick\Definition::getByKey($context['containerKey']);
  725.             $fd $fdBrick->getFieldDefinition($fieldname);
  726.         } elseif ($ownerType == 'fieldcollection') {
  727.             $containerKey $context['containerKey'];
  728.             $fdCollection DataObject\Fieldcollection\Definition::getByKey($containerKey);
  729.             if ($context['subContainerType'] == 'localizedfield') {
  730.                 /** @var DataObject\ClassDefinition\Data\Localizedfields $fdLocalizedFields */
  731.                 $fdLocalizedFields $fdCollection->getFieldDefinition('localizedfields');
  732.                 $fd $fdLocalizedFields->getFieldDefinition($fieldname);
  733.             } else {
  734.                 $fd $fdCollection->getFieldDefinition($fieldname);
  735.             }
  736.         }
  737.         return $fd;
  738.     }
  739.     /**
  740.      * @param DataObject\Concrete $source
  741.      * @param array $context
  742.      * @param array $result
  743.      * @param array $targets
  744.      *
  745.      * @return array
  746.      *
  747.      * @throws \Exception
  748.      */
  749.     protected function convertResultWithPathFormatter(DataObject\Concrete $source$context$result$targets): array
  750.     {
  751.         $fd $this->getNicePathFormatterFieldDefinition($source$context);
  752.         if ($fd instanceof DataObject\ClassDefinition\PathFormatterAwareInterface) {
  753.             $formatter $fd->getPathFormatterClass();
  754.             if (null !== $formatter) {
  755.                 $pathFormatter DataObject\ClassDefinition\Helper\PathFormatterResolver::resolvePathFormatter(
  756.                     $fd->getPathFormatterClass()
  757.                 );
  758.                 if ($pathFormatter instanceof DataObject\ClassDefinition\PathFormatterInterface) {
  759.                     $result $pathFormatter->formatPath($result$source$targets, [
  760.                         'fd' => $fd,
  761.                         'context' => $context
  762.                     ]);
  763.                 } elseif (method_exists($formatter'formatPath')) {
  764.                     @trigger_error(
  765.                         sprintf(
  766.                             'Static PathFormatters are deprecated since Pimcore 5.5 and will be removed in 6.0. Please use %s instead',
  767.                             DataObject\ClassDefinition\PathFormatterInterface::class
  768.                         ),
  769.                         E_USER_DEPRECATED
  770.                     );
  771.                     $result call_user_func(
  772.                         $formatter '::formatPath',
  773.                         $result,
  774.                         $source,
  775.                         $targets,
  776.                         [
  777.                             'fd' => $fd,
  778.                             'context' => $context
  779.                         ]
  780.                     );
  781.                 }
  782.             }
  783.         }
  784.         return $result;
  785.     }
  786. }