vendor/pimcore/pimcore/bundles/AdminBundle/Controller/Admin/Document/PageController.php line 256

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\Document;
  15. use Pimcore\Controller\Traits\ElementEditLockHelperTrait;
  16. use Pimcore\Logger;
  17. use Pimcore\Model\Document;
  18. use Pimcore\Model\Document\Targeting\TargetingDocumentInterface;
  19. use Pimcore\Model\Element;
  20. use Symfony\Component\HttpFoundation\BinaryFileResponse;
  21. use Symfony\Component\HttpFoundation\JsonResponse;
  22. use Symfony\Component\HttpFoundation\Request;
  23. use Symfony\Component\Routing\Annotation\Route;
  24. /**
  25.  * @Route("/page")
  26.  */
  27. class PageController extends DocumentControllerBase
  28. {
  29.     use ElementEditLockHelperTrait;
  30.     /**
  31.      * @Route("/save-to-session", name="pimcore_admin_document_page_savetosession", methods={"POST"})
  32.      *
  33.      * {@inheritDoc}
  34.      */
  35.     public function saveToSessionAction(Request $request)
  36.     {
  37.         return parent::saveToSessionAction($request);
  38.     }
  39.     /**
  40.      * @Route("/remove-from-session", name="pimcore_admin_document_page_removefromsession", methods={"DELETE"})
  41.      *
  42.      * {@inheritDoc}
  43.      */
  44.     public function removeFromSessionAction(Request $request)
  45.     {
  46.         return parent::removeFromSessionAction($request);
  47.     }
  48.     /**
  49.      * @Route("/change-master-document", name="pimcore_admin_document_page_changemasterdocument", methods={"PUT"})
  50.      *
  51.      * {@inheritDoc}
  52.      */
  53.     public function changeMasterDocumentAction(Request $request)
  54.     {
  55.         return parent::changeMasterDocumentAction($request);
  56.     }
  57.     /**
  58.      * @Route("/get-data-by-id", name="pimcore_admin_document_page_getdatabyid", methods={"GET"})
  59.      *
  60.      * @param Request $request
  61.      *
  62.      * @return JsonResponse
  63.      */
  64.     public function getDataByIdAction(Request $request)
  65.     {
  66.         $page Document\Page::getById($request->get('id'));
  67.         if (!$page) {
  68.             throw $this->createNotFoundException('Page not found');
  69.         }
  70.         // check for lock
  71.         if ($page->isAllowed('save') || $page->isAllowed('publish') || $page->isAllowed('unpublish') || $page->isAllowed('delete')) {
  72.             if (Element\Editlock::isLocked($request->get('id'), 'document')) {
  73.                 return $this->getEditLockResponse($request->get('id'), 'document');
  74.             }
  75.             Element\Editlock::lock($request->get('id'), 'document');
  76.         }
  77.         $page = clone $page;
  78.         $isLatestVersion true;
  79.         $page $this->getLatestVersion($page$isLatestVersion);
  80.         $pageVersions Element\Service::getSafeVersionInfo($page->getVersions());
  81.         $page->setVersions(array_splice($pageVersions, -11));
  82.         $page->getScheduledTasks();
  83.         $page->setLocked($page->isLocked());
  84.         $page->setParent(null);
  85.         // unset useless data
  86.         $page->setEditables(null);
  87.         $page->setChildren(null);
  88.         $data $page->getObjectVars();
  89.         $this->addTranslationsData($page$data);
  90.         $this->minimizeProperties($page$data);
  91.         if ($page->getContentMasterDocument()) {
  92.             $data['contentMasterDocumentPath'] = $page->getContentMasterDocument()->getRealFullPath();
  93.         }
  94.         $data['url'] = $page->getUrl();
  95.         $data['documentFromVersion'] = !$isLatestVersion;
  96.         $this->preSendDataActions($data$page);
  97.         if ($page->isAllowed('view')) {
  98.             return $this->adminJson($data);
  99.         }
  100.         throw $this->createAccessDeniedHttpException();
  101.     }
  102.     /**
  103.      * @Route("/save", name="pimcore_admin_document_page_save", methods={"PUT", "POST"})
  104.      *
  105.      * @param Request $request
  106.      *
  107.      * @return JsonResponse
  108.      *
  109.      * @throws \Exception
  110.      */
  111.     public function saveAction(Request $request)
  112.     {
  113.         $page Document\Page::getById($request->get('id'));
  114.         if (!$page) {
  115.             throw $this->createNotFoundException('Page not found');
  116.         }
  117.         /** @var Document\Page|null $pageSession */
  118.         $pageSession $this->getFromSession($page);
  119.         if ($pageSession) {
  120.             $page $pageSession;
  121.         } else {
  122.             /** @var Document\Page $page */
  123.             $page $this->getLatestVersion($page);
  124.         }
  125.         $page->setUserModification($this->getAdminUser()->getId());
  126.         if ($request->get('task') == 'unpublish') {
  127.             $page->setPublished(false);
  128.         }
  129.         if ($request->get('task') == 'publish') {
  130.             $page->setPublished(true);
  131.         }
  132.         if ($request->get('missingRequiredEditable') !== null) {
  133.             $page->setMissingRequiredEditable(($request->get('missingRequiredEditable') == 'true') ? true false);
  134.         }
  135.         $settings = [];
  136.         if ($request->get('settings')) {
  137.             $settings $this->decodeJson($request->get('settings'));
  138.         }
  139.         // check if settings exist, before saving meta data
  140.         if ($request->get('settings') && is_array($settings)) {
  141.             $metaData = [];
  142.             for ($i 1$i 30$i++) {
  143.                 if (array_key_exists('metadata_' $i$settings)) {
  144.                     $metaData[] = $settings['metadata_' $i];
  145.                 }
  146.             }
  147.             $page->setMetaData($metaData);
  148.         }
  149.         // only save when publish or unpublish
  150.         if (($request->get('task') == 'publish' && $page->isAllowed('publish')) || ($request->get('task') == 'unpublish' && $page->isAllowed('unpublish'))) {
  151.             $this->setValuesToDocument($request$page);
  152.             $page->save();
  153.             $this->saveToSession($page);
  154.             $treeData $this->getTreeNodeConfig($page);
  155.             return $this->adminJson([
  156.                 'success' => true,
  157.                 'treeData' => $treeData,
  158.                 'data' => [
  159.                     'versionDate' => $page->getModificationDate(),
  160.                     'versionCount' => $page->getVersionCount(),
  161.                 ],
  162.             ]);
  163.         } elseif ($page->isAllowed('save')) {
  164.             $this->setValuesToDocument($request$page);
  165.             $page->saveVersion();
  166.             $this->saveToSession($page);
  167.             $treeData $this->getTreeNodeConfig($page);
  168.             return $this->adminJson(['success' => true'treeData' => $treeData]);
  169.         } else {
  170.             throw $this->createAccessDeniedHttpException();
  171.         }
  172.     }
  173.     /**
  174.      * @Route("/get-list", name="pimcore_admin_document_page_getlist", methods={"GET"})
  175.      *
  176.      * @param Request $request
  177.      *
  178.      * @return JsonResponse
  179.      */
  180.     public function getListAction(Request $request)
  181.     {
  182.         $list = new Document\Listing();
  183.         $list->setCondition('type = ?', ['page']);
  184.         $data $list->loadIdPathList();
  185.         return $this->adminJson([
  186.             'success' => true,
  187.             'data' => $data,
  188.         ]);
  189.     }
  190.     /**
  191.      * @Route("/generate-screenshot", name="pimcore_admin_document_page_generatescreenshot", methods={"POST"})
  192.      *
  193.      * @param Request $request
  194.      *
  195.      * @return JsonResponse
  196.      */
  197.     public function generateScreenshotAction(Request $request)
  198.     {
  199.         $success false;
  200.         if ($request->get('id')) {
  201.             try {
  202.                 $success Document\Service::generatePagePreview($request->get('id'), $request);
  203.             } catch (\Exception $e) {
  204.                 Logger::err($e);
  205.             }
  206.         }
  207.         return $this->adminJson(['success' => $success]);
  208.     }
  209.     /**
  210.      * @Route("/display-preview-image", name="pimcore_admin_page_display_preview_image", methods={"GET"})
  211.      *
  212.      * @param Request $request
  213.      *
  214.      * @return BinaryFileResponse
  215.      */
  216.     public function displayPreviewImageAction(Request $request)
  217.     {
  218.         $document Document\Page::getById($request->get('id'));
  219.         if ($document instanceof Document\Page) {
  220.             return new BinaryFileResponse($document->getPreviewImageFilesystemPath((bool) $request->get('hdpi')), 200, ['Content-Type' => 'image/jpg']);
  221.         }
  222.         throw $this->createNotFoundException('Page not found');
  223.     }
  224.     /**
  225.      * @Route("/check-pretty-url", name="pimcore_admin_document_page_checkprettyurl", methods={"POST"})
  226.      *
  227.      * @param Request $request
  228.      *
  229.      * @return JsonResponse
  230.      */
  231.     public function checkPrettyUrlAction(Request $request)
  232.     {
  233.         $docId $request->get('id');
  234.         $path = (string) trim($request->get('path'));
  235.         $success true;
  236.         if ($path === '') {
  237.             return $this->adminJson([
  238.                 'success' => $success,
  239.             ]);
  240.         }
  241.         $message = [];
  242.         $path rtrim($path'/');
  243.         // must start with /
  244.         if ($path !== '' && strpos($path'/') !== 0) {
  245.             $success false;
  246.             $message[] = 'URL must start with /.';
  247.         }
  248.         if (strlen($path) < 2) {
  249.             $success false;
  250.             $message[] = 'URL must be at least 2 characters long.';
  251.         }
  252.         if (!Element\Service::isValidPath($path'document')) {
  253.             $success false;
  254.             $message[] = 'URL is invalid.';
  255.         }
  256.         $list = new Document\Listing();
  257.         $list->setCondition('(CONCAT(path, `key`) = ? OR id IN (SELECT id from documents_page WHERE prettyUrl = ?))
  258.             AND id != ?', [
  259.             $path$path$docId,
  260.         ]);
  261.         if ($list->getTotalCount() > 0) {
  262.             $success false;
  263.             $message[] = 'URL path already exists.';
  264.         }
  265.         return $this->adminJson([
  266.             'success' => $success,
  267.             'message' => implode('<br>'$message),
  268.         ]);
  269.     }
  270.     /**
  271.      * @Route("/clear-editable-data", name="pimcore_admin_document_page_cleareditabledata", methods={"PUT"})
  272.      *
  273.      * @param Request $request
  274.      *
  275.      * @return JsonResponse
  276.      */
  277.     public function clearEditableDataAction(Request $request)
  278.     {
  279.         $targetGroupId $request->get('targetGroup');
  280.         $docId $request->get('id');
  281.         $doc Document\PageSnippet::getById($docId);
  282.         if (!$doc) {
  283.             throw $this->createNotFoundException('Document not found');
  284.         }
  285.         foreach ($doc->getEditables() as $editable) {
  286.             if ($targetGroupId && $doc instanceof TargetingDocumentInterface) {
  287.                 // remove target group specific elements
  288.                 if (preg_match('/^' preg_quote($doc->getTargetGroupEditablePrefix($targetGroupId), '/') . '/'$editable->getName())) {
  289.                     $doc->removeEditable($editable->getName());
  290.                 }
  291.             } else {
  292.                 // remove all but target group data
  293.                 if (!preg_match('/^' preg_quote(TargetingDocumentInterface::TARGET_GROUP_ELEMENT_PREFIX'/') . '/'$editable->getName())) {
  294.                     $doc->removeEditable($editable->getName());
  295.                 }
  296.             }
  297.         }
  298.         $this->saveToSession($doctrue);
  299.         return $this->adminJson([
  300.             'success' => true,
  301.         ]);
  302.     }
  303.     /**
  304.      * @param Request $request
  305.      * @param Document $page
  306.      */
  307.     protected function setValuesToDocument(Request $requestDocument $page)
  308.     {
  309.         $this->addSettingsToDocument($request$page);
  310.         $this->addDataToDocument($request$page);
  311.         $this->addPropertiesToDocument($request$page);
  312.         $this->applySchedulerDataToElement($request$page);
  313.     }
  314. }