vendor/pimcore/advanced-object-search/src/Controller/AdminController.php line 552

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 Commercial License (PCL)
  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 PCL
  13.  */
  14. namespace AdvancedObjectSearchBundle\Controller;
  15. use AdvancedObjectSearchBundle\Event\AdvancedObjectSearchEvents;
  16. use AdvancedObjectSearchBundle\Event\FilterListingEvent;
  17. use AdvancedObjectSearchBundle\Model\SavedSearch;
  18. use AdvancedObjectSearchBundle\Service;
  19. use Pimcore\Bundle\AdminBundle\Helper\QueryParams;
  20. use Pimcore\Model\DataObject;
  21. use Pimcore\Tool;
  22. use Symfony\Component\EventDispatcher\EventDispatcherInterface;
  23. use Symfony\Component\HttpFoundation\Request;
  24. use Symfony\Component\HttpFoundation\Session\Attribute\AttributeBagInterface;
  25. use Symfony\Component\Routing\Annotation\Route;
  26. /**
  27.  * Class AdminController
  28.  *
  29.  * @Route("/admin")
  30.  */
  31. class AdminController extends \Pimcore\Bundle\AdminBundle\Controller\AdminController
  32. {
  33.     /**
  34.      * @param Request $request
  35.      * @Route("/get-fields")
  36.      */
  37.     public function getFieldsAction(Request $requestService $service)
  38.     {
  39.         $type strip_tags($request->get('type'));
  40.         $allowInheritance false;
  41.         switch ($type) {
  42.             case 'class':
  43.                 $classId strip_tags($request->get('class_id'));
  44.                 $definition DataObject\ClassDefinition::getById($classId);
  45.                 $allowInheritance $definition->getAllowInherit();
  46.                 break;
  47.             case 'fieldcollection':
  48.                 $key strip_tags($request->get('key'));
  49.                 $definition DataObject\Fieldcollection\Definition::getByKey($key);
  50.                 $allowInheritance false;
  51.                 break;
  52.             case 'objectbrick':
  53.                 $key strip_tags($request->get('key'));
  54.                 $definition DataObject\Objectbrick\Definition::getByKey($key);
  55.                 $classId strip_tags($request->get('class_id'));
  56.                 $classDefinition DataObject\ClassDefinition::getById($classId);
  57.                 $allowInheritance $classDefinition->getAllowInherit();
  58.                 break;
  59.             default:
  60.                 throw new \Exception("Invalid type '$type''");
  61.         }
  62.         $fieldSelectionInformationEntries $service->getFieldSelectionInformationForClassDefinition($definition$allowInheritance);
  63.         $fields = [];
  64.         foreach ($fieldSelectionInformationEntries as $entry) {
  65.             $fields[] = $entry->toArray();
  66.         }
  67.         return $this->adminJson(['data' => $fields]);
  68.     }
  69.     /**
  70.      * @param Request $request
  71.      * @Route("/grid-proxy")
  72.      */
  73.     public function gridProxyAction(Request $requestService $serviceEventDispatcherInterface $eventDispatcher)
  74.     {
  75.         $requestedLanguage $request->get('language');
  76.         if ($requestedLanguage) {
  77.             if ($requestedLanguage != 'default') {
  78.                 $request->setLocale($requestedLanguage);
  79.             }
  80.         } else {
  81.             $requestedLanguage $request->getLocale();
  82.         }
  83.         if ($request->get('data')) {
  84.             return $this->forward('PimcoreAdminBundle:Admin/DataObject/DataObject:gridProxy', [], $request->query->all());
  85.         } else {
  86.             // get list of objects
  87.             $class DataObject\ClassDefinition::getById($request->get('classId'));
  88.             $className $class->getName();
  89.             $fields = [];
  90.             if ($request->get('fields')) {
  91.                 $fields $request->get('fields');
  92.             }
  93.             $start 0;
  94.             $limit 20;
  95.             if ($request->get('limit')) {
  96.                 $limit $request->get('limit');
  97.             }
  98.             if ($request->get('start')) {
  99.                 $start $request->get('start');
  100.             }
  101.             $listClass '\\Pimcore\\Model\\DataObject\\' ucfirst($className) . '\\Listing';
  102.             //get ID list from ES Service
  103.             $data json_decode($request->get('filter'), true);
  104.             $results $service->doFilter($data['classId'], $data['conditions']['filters'], $data['conditions']['fulltextSearchTerm'], $start$limit);
  105.             $total $service->extractTotalCountFromResult($results);
  106.             $ids $service->extractIdsFromResult($results);
  107.             /**
  108.              * @var $list \Pimcore\Model\DataObject\Listing
  109.              */
  110.             $list = new $listClass();
  111.             $list->setObjectTypes(['object''folder''variant']);
  112.             $conditionFilters = [];
  113.             if (!$this->getAdminUser()->isAdmin()) {
  114.                 $userIds $this->getAdminUser()->getRoles();
  115.                 $userIds[] = $this->getAdminUser()->getId();
  116.                 $conditionFilters[] .= ' (
  117.                                                     (select list from users_workspaces_object where userId in (' implode(','$userIds) . ') and LOCATE(CONCAT(o_path,o_key),cpath)=1  ORDER BY LENGTH(cpath) DESC LIMIT 1)=1
  118.                                                     OR
  119.                                                     (select list from users_workspaces_object where userId in (' implode(','$userIds) . ') and LOCATE(cpath,CONCAT(o_path,o_key))=1  ORDER BY LENGTH(cpath) DESC LIMIT 1)=1
  120.                                                  )';
  121.             }
  122.             if (!empty($ids)) {
  123.                 $conditionFilters[] = 'o_id IN (' implode(','$ids) . ')';
  124.                 //$list->setCondition("o_id IN (" . implode(",", $ids) . ")");
  125.                 $list->setOrderKey(' FIELD(o_id, ' implode(','$ids) . ')'false);
  126.             } else {
  127.                 $conditionFilters[] = '1=2';
  128.                 //$list->setCondition("1=2");
  129.             }
  130.             $list->setCondition(implode(' AND '$conditionFilters));
  131.             $eventDispatcher->dispatch(new FilterListingEvent($list), AdvancedObjectSearchEvents::LISTING_FILER);
  132.             $list->load();
  133.             $objects = [];
  134.             foreach ($list->getObjects() as $object) {
  135.                 $o DataObject\Service::gridObjectData($object$fields$requestedLanguage);
  136.                 $objects[] = $o;
  137.             }
  138.             return $this->adminJson(['data' => $objects'success' => true'total' => $total]);
  139.         }
  140.     }
  141.     /**
  142.      * @param Request $request
  143.      * @Route("/get-batch-jobs")
  144.      */
  145.     public function getBatchJobsAction(Request $requestService $service)
  146.     {
  147.         if ($request->get('language')) {
  148.             $request->setLocale($request->get('language'));
  149.         }
  150.         $class DataObject\ClassDefinition::getById($request->get('classId'));
  151.         //get ID list from ES Service
  152.         $data json_decode($request->get('filter'), true);
  153.         $results $service->doFilter($data['classId'], $data['conditions']['filters'] ?? [], $data['conditions']['fulltextSearchTerm'] ?? [], null9999);
  154.         $ids $service->extractIdsFromResult($results);
  155.         $className $class->getName();
  156.         $listClass '\\Pimcore\\Model\\DataObject\\' ucfirst($className) . '\\Listing';
  157.         $list = new $listClass();
  158.         $list->setObjectTypes(['object''folder''variant']);
  159.         $list->setCondition('o_id IN (' implode(','$ids) . ')');
  160.         $list->setOrderKey(' FIELD(o_id, ' implode(','$ids) . ')'false);
  161.         if ($request->get('objecttype')) {
  162.             $list->setObjectTypes([$request->get('objecttype')]);
  163.         }
  164.         $jobs $list->loadIdList();
  165.         return $this->adminJson(['success' => true'jobs' => $jobs]);
  166.     }
  167.     protected function getCsvFile($fileHandle)
  168.     {
  169.         return PIMCORE_SYSTEM_TEMP_DIRECTORY '/' $fileHandle '.csv';
  170.     }
  171.     /**
  172.      * @param Request $request
  173.      * @Route("/get-export-jobs")
  174.      */
  175.     public function getExportJobsAction(Request $requestService $service)
  176.     {
  177.         if ($request->get('language')) {
  178.             $request->setLocale($request->get('language'));
  179.         }
  180.         $data json_decode($request->get('filter'), true);
  181.         if (empty($ids $request->get('ids'false))) {
  182.             $results $service->doFilter(
  183.                 $data['classId'],
  184.                 $data['conditions']['filters'],
  185.                 $data['conditions']['fulltextSearchTerm'],
  186.                 0,
  187.                 9999 // elastic search cannot export more results than 9999 in one request
  188.             );
  189.             //get ID list from ES Service
  190.             $ids $service->extractIdsFromResult($results);
  191.         }
  192.         $jobs array_chunk($ids20);
  193.         $fileHandle uniqid('export-');
  194.         file_put_contents($this->getCsvFile($fileHandle), '');
  195.         return $this->adminJson(['success' => true'jobs' => $jobs'fileHandle' => $fileHandle]);
  196.     }
  197.     /**
  198.      * @param Request $request
  199.      * @Route("/save")
  200.      */
  201.     public function saveAction(Request $request)
  202.     {
  203.         $data $request->get('data');
  204.         $data json_decode($data);
  205.         $id = (intval($request->get('id')));
  206.         if ($id) {
  207.             $savedSearch SavedSearch::getById($id);
  208.         } else {
  209.             $savedSearch = new SavedSearch();
  210.             $savedSearch->setOwner($this->getAdminUser());
  211.         }
  212.         $savedSearch->setName($data->settings->name);
  213.         $savedSearch->setDescription($data->settings->description);
  214.         $savedSearch->setCategory($data->settings->category);
  215.         $savedSearch->setSharedUserIds(array_merge($data->settings->shared_users$data->settings->shared_roles));
  216.         $savedSearch->setShareGlobally($data->settings->share_globally && $this->getAdminUser()->isAdmin());
  217.         $config = ['classId' => $data->classId'gridConfig' => $data->gridConfig'conditions' => $data->conditions];
  218.         $savedSearch->setConfig(json_encode($config));
  219.         $savedSearch->save();
  220.         return $this->adminJson(['success' => true'id' => $savedSearch->getId()]);
  221.     }
  222.     /**
  223.      * @param Request $request
  224.      * @Route("/delete")
  225.      */
  226.     public function deleteAction(Request $request)
  227.     {
  228.         $id intval($request->get('id'));
  229.         $savedSearch SavedSearch::getById($id);
  230.         if ($savedSearch) {
  231.             $savedSearch->delete();
  232.             return $this->adminJson(['success' => true'id' => $savedSearch->getId()]);
  233.         } else {
  234.             return $this->adminJson(['success' => false'message' => "Saved Search with $id not found."]);
  235.         }
  236.     }
  237.     /**
  238.      * @param Request $request
  239.      * @Route("/find")
  240.      */
  241.     public function findAction(Request $request)
  242.     {
  243.         $user $this->getAdminUser();
  244.         $query $request->get('query');
  245.         if ($query == '*') {
  246.             $query '';
  247.         }
  248.         $query str_replace('%''*'$query);
  249.         $offset intval($request->get('start'));
  250.         $limit intval($request->get('limit'));
  251.         $offset $offset $offset 0;
  252.         $limit $limit $limit 50;
  253.         $searcherList = new SavedSearch\Listing();
  254.         $conditionParts = [];
  255.         $conditionParams = [];
  256.         //filter for current user
  257.         $userIds = [$user->getId()];
  258.         $userIds array_merge($userIds$user->getRoles());
  259.         $userIds implode('|'$userIds);
  260.         $conditionParts[] = '(shareGlobally = 1 OR ownerId = ? OR sharedUserIds REGEXP ?)';
  261.         $conditionParams[] = $user->getId();
  262.         $conditionParams[] = ',(' $userIds '),';
  263.         //filter for query
  264.         if (!empty($query)) {
  265.             $conditionParts[] = '(name LIKE ? OR description LIKE ? OR category LIKE ?)';
  266.             $conditionParams[] = '%' $query '%';
  267.             $conditionParams[] = '%' $query '%';
  268.             $conditionParams[] = '%' $query '%';
  269.         }
  270.         if (count($conditionParts) > 0) {
  271.             $condition implode(' AND '$conditionParts);
  272.             $searcherList->setCondition($condition$conditionParams);
  273.         }
  274.         $searcherList->setOffset($offset);
  275.         $searcherList->setLimit($limit);
  276.         $sortingSettings QueryParams::extractSortingSettings(array_merge($request->request->all(), $request->query->all()));
  277.         if ($sortingSettings['orderKey']) {
  278.             $searcherList->setOrderKey($sortingSettings['orderKey']);
  279.         }
  280.         if ($sortingSettings['order']) {
  281.             $searcherList->setOrder($sortingSettings['order']);
  282.         }
  283.         $results = []; //$searcherList->load();
  284.         foreach ($searcherList->load() as $result) {
  285.             $results[] = [
  286.                 'id' => $result->getId(),
  287.                 'name' => $result->getName(),
  288.                 'description' => $result->getDescription(),
  289.                 'category' => $result->getCategory(),
  290.                 'owner' => $result->getOwner() ? $result->getOwner()->getUsername() . ' (' $result->getOwner()->getFirstname() . ' ' $result->getOwner()->getLastName() . ')' '',
  291.                 'ownerId' => $result->getOwnerId()
  292.             ];
  293.         }
  294.         // only get the real total-count when the limit parameter is given otherwise use the default limit
  295.         if ($request->get('limit')) {
  296.             $totalMatches $searcherList->getTotalCount();
  297.         } else {
  298.             $totalMatches count($results);
  299.         }
  300.         return $this->adminJson(['data' => $results'success' => true'total' => $totalMatches]);
  301.     }
  302.     /**
  303.      * @param Request $request
  304.      * @Route("/load-search")
  305.      */
  306.     public function loadSearchAction(Request $request)
  307.     {
  308.         $id intval($request->get('id'));
  309.         $savedSearch SavedSearch::getById($id);
  310.         if ($savedSearch) {
  311.             $config json_decode($savedSearch->getConfig(), true);
  312.             $classDefinition DataObject\ClassDefinition::getById($config['classId']);
  313.             if (!empty($config['gridConfig']['columns'])) {
  314.                 $helperColumns = [];
  315.                 foreach ($config['gridConfig']['columns'] as &$column) {
  316.                     if (!($column['isOperator'] ?? false)) {
  317.                         $fieldDefinition $classDefinition->getFieldDefinition($column['key']);
  318.                         if ($fieldDefinition) {
  319.                             $width = isset($column['layout']['width']) ? $column['layout']['width'] : null;
  320.                             $column['layout'] = json_decode(json_encode($fieldDefinition), true);
  321.                             if ($width) {
  322.                                 $column['layout']['width'] = $width;
  323.                             }
  324.                         }
  325.                     }
  326.                     if (!DataObject\Service::isHelperGridColumnConfig($column['key'])) {
  327.                         continue;
  328.                     }
  329.                     // columnconfig has to be a stdclass
  330.                     $helperColumns[$column['key']] = json_decode(json_encode($column));
  331.                 }
  332.                 // store the saved search columns in the session, otherwise they won't work
  333.                 Tool\Session::useSession(function (AttributeBagInterface $session) use ($helperColumns) {
  334.                     $existingColumns $session->get('helpercolumns', []);
  335.                     $helperColumns array_merge($existingColumns$helperColumns);
  336.                     $session->set('helpercolumns'$helperColumns);
  337.                 }, 'pimcore_gridconfig');
  338.             }
  339.             return $this->adminJson([
  340.                 'id' => $savedSearch->getId(),
  341.                 'classId' => $config['classId'],
  342.                 'settings' => [
  343.                     'name' => $savedSearch->getName(),
  344.                     'description' => $savedSearch->getDescription(),
  345.                     'category' => $savedSearch->getCategory(),
  346.                     'sharedUserIds' => $savedSearch->getSharedUserIds(),
  347.                     'shareGlobally' => $savedSearch->getShareGlobally(),
  348.                     'isOwner' => $savedSearch->getOwnerId() == $this->getAdminUser()->getId(),
  349.                     'hasShortCut' => $savedSearch->isInShortCutsForUser($this->getAdminUser())
  350.                 ],
  351.                 'conditions' => $config['conditions'],
  352.                 'gridConfig' => $config['gridConfig']
  353.             ]);
  354.         } else {
  355.             return $this->adminJson(['success' => false'message' => "Saved Search with $id not found."]);
  356.         }
  357.     }
  358.     /**
  359.      * @param Request $request
  360.      * @Route("/load-short-cuts")
  361.      */
  362.     public function loadShortCutsAction(Request $request)
  363.     {
  364.         $list = new SavedSearch\Listing();
  365.         $list->setCondition(
  366.             '(shareGlobally = ? OR ownerId = ? OR sharedUserIds LIKE ?) AND shortCutUserIds LIKE ?',
  367.             [
  368.                 true,
  369.                 $this->getAdminUser()->getId(),
  370.                 '%,' $this->getAdminUser()->getId() . ',%',
  371.                 '%,' $this->getAdminUser()->getId() . ',%'
  372.             ]
  373.         );
  374.         $list->load();
  375.         $entries = [];
  376.         foreach ($list->getSavedSearches() as $entry) {
  377.             $entries[] = [
  378.                 'id' => $entry->getId(),
  379.                 'name' => $entry->getName()
  380.             ];
  381.         }
  382.         return $this->adminJson(['entries' => $entries]);
  383.     }
  384.     /**
  385.      * @param Request $request
  386.      * @Route("/toggle-short-cut")
  387.      */
  388.     public function toggleShortCutAction(Request $request)
  389.     {
  390.         $id intval($request->get('id'));
  391.         $savedSearch SavedSearch::getById($id);
  392.         if ($savedSearch) {
  393.             $user $this->getAdminUser();
  394.             if ($savedSearch->isInShortCutsForUser($user)) {
  395.                 $savedSearch->removeShortCutForUser($user);
  396.             } else {
  397.                 $savedSearch->addShortCutForUser($user);
  398.             }
  399.             $savedSearch->save();
  400.             return $this->adminJson(['success' => 'true''hasShortCut' => $savedSearch->isInShortCutsForUser($user)]);
  401.         } else {
  402.             return $this->adminJson(['success' => 'false']);
  403.         }
  404.     }
  405.     /**
  406.      * @param Request $request
  407.      * @Route("/get-users")
  408.      */
  409.     public function getUsersAction(Request $request)
  410.     {
  411.         $users = [];
  412.         // condition for users with groups having DAM permission
  413.         $condition = [];
  414.         $rolesList = new \Pimcore\Model\User\Role\Listing();
  415.         $rolesList->addConditionParam("CONCAT(',', permissions, ',') LIKE ?"'%,bundle_advancedsearch_search,%');
  416.         $rolesList->load();
  417.         $roles $rolesList->getRoles();
  418.         foreach ($roles as $role) {
  419.             $condition[] = "CONCAT(',', roles, ',') LIKE '%," $role->getId() . ",%'";
  420.         }
  421.         // get available user
  422.         $list = new \Pimcore\Model\User\Listing();
  423.         $condition[] = 'admin = 1';
  424.         $list->addConditionParam("((CONCAT(',', permissions, ',') LIKE ? ) OR " implode(' OR '$condition) . ')''%,bundle_advancedsearch_search,%');
  425.         $list->addConditionParam('id != ?'$this->getAdminUser()->getId());
  426.         $list->load();
  427.         $userList $list->getUsers();
  428.         foreach ($userList as $user) {
  429.             $users[] = [
  430.                 'id' => $user->getId(),
  431.                 'label' => $user->getName()
  432.             ];
  433.         }
  434.         return $this->adminJson(['success' => true'total' => count($users), 'data' => $users]);
  435.     }
  436.     /**
  437.      * @param Request $request
  438.      * @Route("/get-roles")
  439.      */
  440.     public function getRolesAction()
  441.     {
  442.         $roles = [];
  443.         $rolesList = new \Pimcore\Model\User\Role\Listing();
  444.         $rolesList->setCondition('type = "role"');
  445.         $rolesList->addConditionParam("CONCAT(',', permissions, ',') LIKE ?"'%,bundle_advancedsearch_search,%');
  446.         $rolesList->load();
  447.         foreach ($rolesList->getRoles() as $role) {
  448.             $roles[] = [
  449.                 'id' => $role->getId(),
  450.                 'label' => $role->getName()
  451.             ];
  452.         }
  453.         return $this->adminJson(['success' => true'total' => count($roles), 'data' => $roles]);
  454.     }
  455.     /**
  456.      * @param Request $request
  457.      * @Route("/check-index-status")
  458.      */
  459.     public function checkIndexStatusAction(Request $requestService $service)
  460.     {
  461.         return $this->adminJson(['indexUptodate' => $service->updateQueueEmpty()]);
  462.     }
  463. }