vendor/pimcore/pimcore/bundles/AdminBundle/Controller/Reports/CustomReportController.php line 248

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\Reports;
  15. use Pimcore\Model\Tool\CustomReport;
  16. use Symfony\Component\Filesystem\Exception\FileNotFoundException;
  17. use Symfony\Component\HttpFoundation\BinaryFileResponse;
  18. use Symfony\Component\HttpFoundation\JsonResponse;
  19. use Symfony\Component\HttpFoundation\Request;
  20. use Symfony\Component\HttpFoundation\ResponseHeaderBag;
  21. use Symfony\Component\Routing\Annotation\Route;
  22. /**
  23.  * @Route("/custom-report")
  24.  */
  25. class CustomReportController extends ReportsControllerBase
  26. {
  27.     /**
  28.      * @Route("/tree", name="pimcore_admin_reports_customreport_tree", methods={"GET", "POST"})
  29.      *
  30.      * @param Request $request
  31.      *
  32.      * @return JsonResponse
  33.      */
  34.     public function treeAction(Request $request)
  35.     {
  36.         $this->checkPermission('reports_config');
  37.         $reports CustomReport\Config::getReportsList();
  38.         return $this->adminJson($reports);
  39.     }
  40.     /**
  41.      * @Route("/portlet-report-list", name="pimcore_admin_reports_customreport_portletreportlist", methods={"GET", "POST"})
  42.      *
  43.      * @param Request $request
  44.      *
  45.      * @return JsonResponse
  46.      */
  47.     public function portletReportListAction(Request $request)
  48.     {
  49.         $this->checkPermission('reports');
  50.         $reports CustomReport\Config::getReportsList($this->getAdminUser());
  51.         return $this->adminJson(['data' => $reports]);
  52.     }
  53.     /**
  54.      * @Route("/add", name="pimcore_admin_reports_customreport_add", methods={"POST"})
  55.      *
  56.      * @param Request $request
  57.      *
  58.      * @return JsonResponse
  59.      */
  60.     public function addAction(Request $request)
  61.     {
  62.         $this->checkPermission('reports_config');
  63.         $success false;
  64.         $report CustomReport\Config::getByName($request->get('name'));
  65.         if (!$report) {
  66.             $report = new CustomReport\Config();
  67.             $report->setName($request->get('name'));
  68.             $report->save();
  69.             $success true;
  70.         }
  71.         return $this->adminJson(['success' => $success'id' => $report->getName()]);
  72.     }
  73.     /**
  74.      * @Route("/delete", name="pimcore_admin_reports_customreport_delete", methods={"DELETE"})
  75.      *
  76.      * @param Request $request
  77.      *
  78.      * @return JsonResponse
  79.      */
  80.     public function deleteAction(Request $request)
  81.     {
  82.         $this->checkPermission('reports_config');
  83.         $report CustomReport\Config::getByName($request->get('name'));
  84.         $report->delete();
  85.         return $this->adminJson(['success' => true]);
  86.     }
  87.     /**
  88.      * @Route("/clone", name="pimcore_admin_reports_customreport_clone", methods={"POST"})
  89.      *
  90.      * @param Request $request
  91.      *
  92.      * @return JsonResponse
  93.      */
  94.     public function cloneAction(Request $request)
  95.     {
  96.         $this->checkPermission('reports_config');
  97.         $newName $request->get('newName');
  98.         $report CustomReport\Config::getByName($newName);
  99.         if ($report) {
  100.             throw new \Exception('report already exists');
  101.         }
  102.         $report CustomReport\Config::getByName($request->get('name'));
  103.         $reportData $this->encodeJson($report);
  104.         $reportData $this->decodeJson($reportData);
  105.         unset($reportData['name']);
  106.         $reportData['name'] = $newName;
  107.         foreach ($reportData as $key => $value) {
  108.             $setter 'set' ucfirst($key);
  109.             if (method_exists($report$setter)) {
  110.                 $report->$setter($value);
  111.             }
  112.         }
  113.         $report->save();
  114.         return $this->adminJson(['success' => true]);
  115.     }
  116.     /**
  117.      * @Route("/get", name="pimcore_admin_reports_customreport_get", methods={"GET"})
  118.      *
  119.      * @param Request $request
  120.      *
  121.      * @return JsonResponse
  122.      */
  123.     public function getAction(Request $request)
  124.     {
  125.         $this->checkPermissionsHasOneOf(['reports_config''reports']);
  126.         $report CustomReport\Config::getByName($request->get('name'));
  127.         return $this->adminJson($report);
  128.     }
  129.     /**
  130.      * @Route("/update", name="pimcore_admin_reports_customreport_update", methods={"PUT"})
  131.      *
  132.      * @param Request $request
  133.      *
  134.      * @return JsonResponse
  135.      */
  136.     public function updateAction(Request $request)
  137.     {
  138.         $this->checkPermission('reports_config');
  139.         $report CustomReport\Config::getByName($request->get('name'));
  140.         $data $this->decodeJson($request->get('configuration'));
  141.         if (!is_array($data['yAxis'])) {
  142.             $data['yAxis'] = strlen($data['yAxis']) ? [$data['yAxis']] : [];
  143.         }
  144.         foreach ($data as $key => $value) {
  145.             $setter 'set' ucfirst($key);
  146.             if (method_exists($report$setter)) {
  147.                 $report->$setter($value);
  148.             }
  149.         }
  150.         $report->save();
  151.         return $this->adminJson(['success' => true]);
  152.     }
  153.     /**
  154.      * @Route("/column-config", name="pimcore_admin_reports_customreport_columnconfig", methods={"POST"})
  155.      *
  156.      * @param Request $request
  157.      *
  158.      * @return JsonResponse
  159.      */
  160.     public function columnConfigAction(Request $request)
  161.     {
  162.         $this->checkPermission('reports_config');
  163.         $report CustomReport\Config::getByName($request->get('name'));
  164.         $columnConfiguration $report->getColumnConfiguration();
  165.         if (!is_array($columnConfiguration)) {
  166.             $columnConfiguration = [];
  167.         }
  168.         $configuration json_decode($request->get('configuration'));
  169.         $configuration $configuration[0];
  170.         $success false;
  171.         $columns null;
  172.         $errorMessage null;
  173.         $result = [];
  174.         try {
  175.             $adapter CustomReport\Config::getAdapter($configuration);
  176.             $columns $adapter->getColumns($configuration);
  177.             if (!is_array($columns)) {
  178.                 $columns = [];
  179.             }
  180.             foreach ($columnConfiguration as $item) {
  181.                 $name $item['name'];
  182.                 if (in_array($name$columns)) {
  183.                     $result[] = $name;
  184.                     array_splice($columnsarray_search($name$columns), 1);
  185.                 }
  186.             }
  187.             foreach ($columns as $remainingColumn) {
  188.                 $result[] = $remainingColumn;
  189.             }
  190.             $success true;
  191.         } catch (\Exception $e) {
  192.             $errorMessage $e->getMessage();
  193.         }
  194.         return $this->adminJson([
  195.             'success' => $success,
  196.             'columns' => $result,
  197.             'errorMessage' => $errorMessage,
  198.         ]);
  199.     }
  200.     /**
  201.      * @Route("/get-report-config", name="pimcore_admin_reports_customreport_getreportconfig", methods={"GET"})
  202.      *
  203.      * @param Request $request
  204.      *
  205.      * @return JsonResponse
  206.      */
  207.     public function getReportConfigAction(Request $request)
  208.     {
  209.         $this->checkPermission('reports');
  210.         $reports = [];
  211.         $list = new CustomReport\Config\Listing();
  212.         $items $list->getDao()->loadForGivenUser($this->getAdminUser());
  213.         /** @var CustomReport\Config $report */
  214.         foreach ($items as $report) {
  215.             $reports[] = [
  216.                 'name' => $report->getName(),
  217.                 'niceName' => $report->getNiceName(),
  218.                 'iconClass' => $report->getIconClass(),
  219.                 'group' => $report->getGroup(),
  220.                 'groupIconClass' => $report->getGroupIconClass(),
  221.                 'menuShortcut' => $report->getMenuShortcut(),
  222.                 'reportClass' => $report->getReportClass(),
  223.             ];
  224.         }
  225.         return $this->adminJson([
  226.             'success' => true,
  227.             'reports' => $reports,
  228.         ]);
  229.     }
  230.     /**
  231.      * @Route("/data", name="pimcore_admin_reports_customreport_data", methods={"GET", "POST"})
  232.      *
  233.      * @param Request $request
  234.      *
  235.      * @return JsonResponse
  236.      */
  237.     public function dataAction(Request $request)
  238.     {
  239.         $this->checkPermission('reports');
  240.         $offset $request->get('start'0);
  241.         $limit $request->get('limit'40);
  242.         $sortingSettings = \Pimcore\Bundle\AdminBundle\Helper\QueryParams::extractSortingSettings(array_merge($request->request->all(), $request->query->all()));
  243.         $sort null;
  244.         $dir null;
  245.         if ($sortingSettings['orderKey']) {
  246.             $sort $sortingSettings['orderKey'];
  247.             $dir $sortingSettings['order'];
  248.         }
  249.         $filters = ($request->get('filter') ? json_decode($request->get('filter'), true) : null);
  250.         $drillDownFilters $request->get('drillDownFilters'null);
  251.         $config CustomReport\Config::getByName($request->get('name'));
  252.         $configuration $config->getDataSourceConfig();
  253.         $adapter CustomReport\Config::getAdapter($configuration$config);
  254.         $result $adapter->getData($filters$sort$dir$offset$limitnull$drillDownFilters);
  255.         return $this->adminJson([
  256.             'success' => true,
  257.             'data' => $result['data'],
  258.             'total' => $result['total'],
  259.         ]);
  260.     }
  261.     /**
  262.      * @Route("/drill-down-options", name="pimcore_admin_reports_customreport_drilldownoptions", methods={"GET", "POST"})
  263.      *
  264.      * @param Request $request
  265.      *
  266.      * @return JsonResponse
  267.      */
  268.     public function drillDownOptionsAction(Request $request)
  269.     {
  270.         $this->checkPermission('reports');
  271.         $field $request->get('field');
  272.         $filters = ($request->get('filter') ? json_decode($request->get('filter'), true) : null);
  273.         $drillDownFilters $request->get('drillDownFilters'null);
  274.         $config CustomReport\Config::getByName($request->get('name'));
  275.         $configuration $config->getDataSourceConfig();
  276.         $adapter CustomReport\Config::getAdapter($configuration$config);
  277.         $result $adapter->getAvailableOptions($filters$field$drillDownFilters);
  278.         return $this->adminJson([
  279.             'success' => true,
  280.             'data' => $result['data'],
  281.         ]);
  282.     }
  283.     /**
  284.      * @Route("/chart", name="pimcore_admin_reports_customreport_chart", methods={"GET", "POST"})
  285.      *
  286.      * @param Request $request
  287.      *
  288.      * @return JsonResponse
  289.      */
  290.     public function chartAction(Request $request)
  291.     {
  292.         $this->checkPermission('reports');
  293.         $sort $request->get('sort');
  294.         $dir $request->get('dir');
  295.         $filters = ($request->get('filter') ? json_decode($request->get('filter'), true) : null);
  296.         $drillDownFilters $request->get('drillDownFilters'null);
  297.         $config CustomReport\Config::getByName($request->get('name'));
  298.         $configuration $config->getDataSourceConfig();
  299.         $adapter CustomReport\Config::getAdapter($configuration$config);
  300.         $result $adapter->getData($filters$sort$dirnullnullnull$drillDownFilters);
  301.         return $this->adminJson([
  302.             'success' => true,
  303.             'data' => $result['data'],
  304.             'total' => $result['total'],
  305.         ]);
  306.     }
  307.     /**
  308.      * @Route("/create-csv", name="pimcore_admin_reports_customreport_createcsv", methods={"GET"})
  309.      *
  310.      * @param Request $request
  311.      *
  312.      * @return JsonResponse
  313.      */
  314.     public function createCsvAction(Request $request)
  315.     {
  316.         $this->checkPermission('reports');
  317.         set_time_limit(300);
  318.         $sort $request->get('sort');
  319.         $dir $request->get('dir');
  320.         $filters = ($request->get('filter') ? json_decode($request->get('filter'), true) : null);
  321.         $drillDownFilters $request->get('drillDownFilters'null);
  322.         $includeHeaders $request->get('headers'false);
  323.         $config CustomReport\Config::getByName($request->get('name'));
  324.         $columns $config->getColumnConfiguration();
  325.         $fields = [];
  326.         foreach ($columns as $column) {
  327.             if ($column['export']) {
  328.                 $fields[] = $column['name'];
  329.             }
  330.         }
  331.         $configuration $config->getDataSourceConfig();
  332.         //if many rows returned as an array than use the first row. Fixes: #782
  333.         $configuration is_array($configuration)
  334.             ? $configuration[0]
  335.             : $configuration;
  336.         $adapter CustomReport\Config::getAdapter($configuration$config);
  337.         $offset $request->get('offset'0);
  338.         $limit 5000;
  339.         $tempData = [];
  340.         $result $adapter->getData($filters$sort$dir$offset $limit$limit$fields$drillDownFilters);
  341.         ++$offset;
  342.         if (!($exportFile $request->get('exportFile'))) {
  343.             $exportFile PIMCORE_SYSTEM_TEMP_DIRECTORY '/report-export-' uniqid() . '.csv';
  344.             @unlink($exportFile);
  345.         }
  346.         $fp fopen($exportFile'a');
  347.         if ($includeHeaders) {
  348.             fputcsv($fp$fields';');
  349.         }
  350.         foreach ($result['data'] as $row) {
  351.             fputcsv($fparray_values($row), ';');
  352.         }
  353.         fclose($fp);
  354.         $progress $result['total'] ? ($offset $limit) / $result['total'] : 1;
  355.         $progress $progress $progress;
  356.         return new JsonResponse([
  357.             'exportFile' => $exportFile,
  358.             'offset' => $offset,
  359.             'progress' => $progress,
  360.             'finished' => empty($result['data']) || sizeof($result['data']) < $limit,
  361.         ]);
  362.     }
  363.     /**
  364.      * @Route("/download-csv", name="pimcore_admin_reports_customreport_downloadcsv", methods={"GET"})
  365.      *
  366.      * @param Request $request
  367.      *
  368.      * @return BinaryFileResponse
  369.      */
  370.     public function downloadCsvAction(Request $request)
  371.     {
  372.         $this->checkPermission('reports');
  373.         if ($exportFile $request->get('exportFile')) {
  374.             $response = new BinaryFileResponse($exportFile);
  375.             $response->headers->set('Content-Type''text/csv; charset=UTF-8');
  376.             $response->setContentDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT'export.csv');
  377.             $response->deleteFileAfterSend(true);
  378.             return $response;
  379.         }
  380.         throw new FileNotFoundException("File \"$exportFile\" not found!");
  381.     }
  382. }