src/Controller/PressController.php line 406

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Service\CanonicalRedirectHelper;
  4. use App\Twig\LayoutExtension;
  5. use App\Twig\LinkGenerator;
  6. use App\Twig\PressExtension;
  7. use App\Twig\RegionExtension;
  8. use Carbon\Carbon;
  9. use Elements\Bundle\CmsToolsBundle\Templating\Helper\CutStringRespectingWhitespace;
  10. use Knp\Component\Pager\PaginatorInterface;
  11. use Pimcore\Controller\KernelControllerEventInterface;
  12. use Pimcore\File;
  13. use Pimcore\Mail;
  14. use Pimcore\Model\Asset;
  15. use Pimcore\Model\DataObject\Community;
  16. use Pimcore\Model\DataObject\Contact;
  17. use Pimcore\Model\DataObject\MediaAlbum;
  18. use Pimcore\Model\DataObject\Data\BlockElement;
  19. use Pimcore\Model\DataObject\Data\Consent;
  20. use Pimcore\Model\DataObject\MediaAsset;
  21. use Pimcore\Model\DataObject\MediaCategory;
  22. use Pimcore\Model\DataObject\MediaKeyword;
  23. use Pimcore\Model\DataObject\MediaUser;
  24. use Pimcore\Model\DataObject\MediaVideo;
  25. use Pimcore\Model\DataObject\PressArticle;
  26. use Pimcore\Model\DataObject\PressCategory;
  27. use Pimcore\Model\DataObject\PressDossier;
  28. use Pimcore\Model\DataObject\Region;
  29. use Pimcore\Model\DataObject\Service;
  30. use Pimcore\Model\DataObject\SiteConfig;
  31. use Pimcore\Model\Document;
  32. use Pimcore\Model\Document\Email;
  33. use Pimcore\Model\WebsiteSetting;
  34. use Pimcore\Tool;
  35. use Pimcore\Translation\Translator;
  36. use Symfony\Component\HttpFoundation\JsonResponse;
  37. use Symfony\Component\HttpFoundation\RedirectResponse;
  38. use Symfony\Component\HttpFoundation\Request;
  39. use Symfony\Component\HttpKernel\Event\ControllerEvent;
  40. use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
  41. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  42. use Symfony\Component\Routing\Annotation\Route;
  43. use Symfony\Bundle\SecurityBundle\Tests\Functional\Bundle\AclBundle\Entity\Car;
  44. // sorry for the high complexity here :(
  45. class PressController extends AbstractController implements KernelControllerEventInterface
  46. {
  47.     private $activePressArticlesWishlistIds;
  48.     private $activePressDossiersWishlistIds;
  49.     private $activePressPicturesWishlistIds;
  50.     private $activePressAlbumWishlistIds;
  51.     private $activePressAlbumItemsWishlistIds;
  52.     private $activePressMediaAssetsWishlistIds;
  53.     private Translator $translator;
  54.     protected array $loginCacheExcludeURLs = [
  55.         '/press/login''/press/logout''/press/article/remove-from-wishlist''/press/dossiers/remove-from-wishlist''/press/image/remove-from-wishlist',
  56.         '/press/dossiers/add-to-wishlist''/press/image/add-to-wishlist''/press/article/add-to-wishlist',
  57.         '/press/album/add-to-wishlist''/press/album/remove-from-wishlist','/press/album/item/add-to-wishlist''/press/album/item/remove-from-wishlist',
  58.         'press/media-asset/add-to-wishlist''press/media-asset/remove-from-wishlist'
  59.     ];
  60.     protected array $watchlistExcludeURl = ['/press/wishlist'];
  61.     public function onKernelControllerEventControllerEvent $event )
  62.     {
  63.         $request $event->getRequest();
  64.         if( $request && $request->getSession() ){
  65.             $this->activePressArticlesWishlistIds array_valuesarray_map'intval'$request->getSession()->get'pressArticleWishlistIds', [] ) ) );
  66.             $this->activePressDossiersWishlistIds array_valuesarray_map'intval'$request->getSession()->get'pressDossierWishlistIds', [] ) ) );
  67.             $this->activePressPicturesWishlistIds array_valuesarray_map'intval'$request->getSession()->get'pressImageWishlistIds', [] ) ) );
  68.             $this->activePressAlbumWishlistIds array_valuesarray_map'intval'$request->getSession()->get'pressAlbumWishlistIds', [] ) ) );
  69.             $this->activePressAlbumItemsWishlistIds array_valuesarray_map'intval'$request->getSession()->get'pressAlbumItemsWishlistIds', [] ) ) );
  70.             $this->activePressMediaAssetsWishlistIds array_valuesarray_map'intval'$request->getSession()->get'pressMediaAssetsWishlistIds', [] ) ) );
  71.             $watchlistExcludeURl array_merge($this->loginCacheExcludeURLs$this->getWatchlistURLs(), $this->watchlistExcludeURl);
  72.             $anchor '';
  73.             if($request->get('anchor')) {
  74.                 $anchor '#' $request->get('anchor');
  75.             }
  76.             $this->addLastVisitedToSession($request'pressLogin'$this->loginCacheExcludeURLs,'lastVisited'$anchor);
  77.             $this->addLastVisitedToSession($request'watchlist'$watchlistExcludeURl,'lastVisited'$anchor);
  78.         }else{
  79.             $this->activePressArticlesWishlistIds = [];
  80.             $this->activePressDossiersWishlistIds = [];
  81.             $this->activePressPicturesWishlistIds = [];
  82.             $this->activePressAlbumWishlistIds = [];
  83.             $this->activePressAlbumItemsWishlistIds = [];
  84.             $this->activePressMediaAssetsWishlistIds = [];
  85.         }
  86.     }
  87.     public function __constructTranslator $translator, protected LayoutExtension $layoutExtension, protected PressExtension $pressExtension, protected RegionExtension $regionExtension)
  88.     {
  89.         $this->translator $translator;
  90.     }
  91.     public function portalActionRequest $request )
  92.     {
  93.         return $this->render'/Press/portal.html.twig' );
  94.     }
  95.     /**
  96.      * @param Request $request
  97.      * @param \Pimcore\DataObject\Consent\Service $consentService
  98.      * @param Translator $translator
  99.      * @return RedirectResponse|\Symfony\Component\HttpFoundation\Response
  100.      * @throws \Exception
  101.      */
  102.     public function pressRegistrationAction(
  103.         Request                             $request,
  104.         \Pimcore\DataObject\Consent\Service $consentService,
  105.         Translator                          $translator
  106.     )
  107.     {
  108.         $user $this->layoutExtension->getMediaUser($request);
  109.         $region $this->document->getProperty('region');
  110.         $isRegisteredForRegion $user && $this->pressExtension->isRegisteredForRegion($region$user);
  111.         if(!$isRegisteredForRegion && $request->getMethod() === Request::METHOD_POST){
  112.             $reducedForm false;
  113.             if(!$user) {
  114.                 $requiredParams = [
  115.                     'company' => $request->get'company' ),
  116.                     'salutation' => $request->get'salutation' ),
  117.                     'firstname' => $request->get'firstname' ),
  118.                     'lastname' => $request->get'lastname' ),
  119.                     'street' => $request->get'street' ),
  120.                     'zip' => $request->get'zip' ),
  121.                     'city' => $request->get'city' ),
  122.                     'country' => $request->get'country' ),
  123.                     'phone' => $request->get'phone' ),
  124.                     'usage' => $request->get'usage' ),
  125.                     'email' => $request->get'email' ),
  126.                     'password' => $request->get'password' ),
  127.                 ];
  128.                 $optionalParams = [
  129.                     'title' => $request->get'title''' ),
  130.                     'message' => $request->get'message''' ),
  131.                     'gdpr' => $request->get('gdpr-text')
  132.                 ];
  133.             } else {
  134.                 $reducedForm true;
  135.                 $requiredParams = [
  136.                     'usage' => $request->get'usage' ),
  137.                 ];
  138.                 $optionalParams = [
  139.                     'message' => $request->get'message''' ),
  140.                 ];
  141.             }
  142.             $errors = [];
  143.             foreach( $requiredParams as $key => $param ){
  144.                 if( empty( $param ) ){
  145.                     $errors$key ] = 'required';
  146.                 }
  147.             }
  148.             foreach( $optionalParams as $key => $param ){
  149.                 if( empty( $param ) ){
  150.                     unset( $optionalParams$key ] );
  151.                 }
  152.             }
  153.             if(!$reducedForm) {
  154.                 if( !$requiredParams'email' ] || !filter_var$requiredParams'email' ], FILTER_VALIDATE_EMAIL ) ){
  155.                     $errors'email' ] = 'no valid email';
  156.                 }
  157.                 if( MediaUser::getByEmail$requiredParams'email' ] )->setUnpublishedtrue )->getCount() > ){
  158.                     $errors'email' ] = 'email already registered, log in and try again';
  159.                 }
  160.             } //else email from user already validated
  161.             $confirmPage $this->getDocumentEditable'relation''confirmationpage' )->getElement();
  162.             if( !$confirmPage $errors'systemerror' ] = 'no confirm page';
  163.             $usermail $this->getDocumentEditable'relation''usermail' )->getElement();
  164.             if( !$usermail $errors'systemerror' ] = 'no user mail';
  165.             if( empty( $errors ) ){
  166.                 $successpage $this->getDocumentEditable'relation''successpage' )->getElement();
  167.                 try{
  168.                     $email $user && $user->getEmail() ? $user->getEmail() :$requiredParams'email' ];
  169.                     $token md5'mediaUser' $email time() );
  170.                     $isNewUser false;
  171.                     if(!$reducedForm) {
  172.                         $userArray $this->createNewUser($requiredParams$optionalParams$token);
  173.                         $user $userArray[0];
  174.                         $isNewUser $userArray[1];
  175.                     }
  176.                     $this->addRegistrationParamsToUser($user$region$requiredParams$optionalParams$consentService$translator$request);
  177.                     unset( $requiredParams'password' ] );
  178.                     $tokenArray $reducedForm ? [] :  [ 'confirmLink' => Tool::getHostUrl() . $confirmPage->getFullpath() . '?token=' urlencode$token ) ];
  179.                     $params array_merge(
  180.                         $tokenArray,
  181.                         $requiredParams,
  182.                         $optionalParams
  183.                     );
  184.                     $params'items' ] = array_keys$params );
  185.                     if($isNewUser) { //only send User Mail if new User
  186.                         $mail = new Mail();
  187.                         $mail->setDocument$usermail );
  188.                         $mail->setParams$params );
  189.                         $mail->addTo$email );
  190.                         $mail->send();
  191.                         $success true;
  192.                     } else {
  193.                         $success $this->sendConfiremedRegistrationMail($user);
  194.                     }
  195.                     if( $successpage ){
  196.                         return $this->redirect$successpage->getFullPath() );
  197.                     }
  198.                 }catch( \Exception $exception ){
  199.                     $success false;
  200.                     $errors[] = 'an error occurred';
  201.                     if( \Pimcore::inDebugMode() ){
  202.                         p_r$exception->getMessage() );
  203.                         die();
  204.                     }
  205.                 }
  206.             }else{
  207.                 $success false;
  208.             }
  209.         }
  210.         return $this->render'Press/pressRegistration.html.twig', [
  211.             'errors' => $errors ?? [],
  212.             'success' => $success ?? null,
  213.             'user' => $user,
  214.             'reducedForm' => !$isRegisteredForRegion && $user,
  215.             'isRegisteredForRegion' => $isRegisteredForRegion,
  216.         ] );
  217.     }
  218.     /**
  219.      * @param Request $request
  220.      * @return \Symfony\Component\HttpFoundation\Response
  221.      * @throws \Exception
  222.      */
  223.     public function confirmRegistrationActionRequest $request )
  224.     {
  225.         $token $request->get'token''' );
  226.         if( $token ){
  227.             $userList = new MediaUser\Listing();
  228.             $userList->addConditionParam'token = :token', [ 'token' => $token ] );
  229.             $userList->setUnpublishedtrue );
  230.             $userList->setLimit);
  231.             $users $userList->getObjects();
  232.             $user count$users ) ? $users] : null;
  233.             if( $user ){
  234.                 $success $this->sendConfiremedRegistrationMail($user);
  235.             }elseif( !$this->editmode ){
  236.                 throw new NotFoundHttpException'no (valid) token' );
  237.             }
  238.         }elseif( !$this->editmode ){
  239.             throw new NotFoundHttpException'no (valid) token' );
  240.         }
  241.         return $this->render'Press/confirmRegistration.html.twig', [
  242.             'success' => $success ?? false
  243.         ] );
  244.     }
  245.     /**
  246.      * @param Request $request
  247.      * @param PaginatorInterface $paginator
  248.      * @return JsonResponse|\Symfony\Component\HttpFoundation\Response
  249.      */
  250.     public function overviewActionRequest $requestPaginatorInterface $paginator )
  251.     {
  252.         $selectedCat $request->get'category'false );
  253.         if( $selectedCat === 'all' ){
  254.             $selectedCat false;
  255.         }
  256.         $keyword $request->get'keyword''' );
  257.         $tab $request->get'tab''' );
  258.         $now Carbon::now()->startOfDay();
  259.         $pressCategoriesListing = new PressCategory\Listing();
  260.         $pressCategoriesListing->addConditionParam('name != "" AND name IS NOT NULL');
  261.         $pressCategoriesListing->setOrderKey'name' );
  262.         $pressCategoriesListing->setOrder'ASC' );
  263.         $categoriesDropdownItems $this->getPressCategoriesDropdownItems$pressCategoriesListing$selectedCat );
  264.         $region $this->document->getProperty('region');
  265.         $regionIds = [$region->getId()];
  266.         $regionArticlesCondition '(region__id IN (:regionAndCommunities)' . ($region->getIsMainRegion() ? ' OR region__id IS NULL OR region__id = "" OR showInSTT = 1' '') . ')';
  267.         $regionArticlesConditionParams = ['regionAndCommunities' =>  $regionIds];
  268.         $allPressArticles = new PressArticle\Listing();
  269.         $allPressArticles->addConditionParam($regionArticlesCondition$regionArticlesConditionParams);
  270.         $allPressArticles->addConditionParam'title != "" AND title IS NOT NULL' );
  271.         $allPressArticles->addConditionParam'isArchive = 1' );
  272.         $allPressArticles->addConditionParam'(fromDate IS NULL OR fromDate <= ' Carbon::now()->unix() . ')' );
  273.         if( $selectedCat && ( empty( $tab ) || $tab == 'az' ) ){
  274.             $allPressArticles->addConditionParam'categories LIKE "%,' $selectedCat ',%"' );
  275.         }
  276.         if( $keyword && ( empty( $tab ) || $tab == 'az' ) ){
  277.             $allPressArticles->addConditionParam'title LIKE :q OR shortDescription LIKE :q', [ 'q' => '%' $keyword '%' ] );
  278.         }
  279.         $allPressArticles->setOrderKey'sort''pressDate' );
  280.         $allPressArticles->setOrder'DESC' );
  281.         $allPaginator $paginator->paginate$allPressArticles$request->get'pageAZ'), 12 );
  282.         $allPaginator->setPageRange);
  283.         $latestPressArticles = new PressArticle\Listing();
  284.         $latestPressArticles->addConditionParam$regionArticlesCondition$regionArticlesConditionParams );
  285.         $latestPressArticles->addConditionParam'title != "" AND title IS NOT NULL' );
  286.         $latestPressArticles->addConditionParam'((toDate IS NULL AND pressDate > ' Carbon::now()->unix() . ') OR toDate > ' Carbon::now()->unix() . ')' );
  287.         $latestPressArticles->addConditionParam'(fromDate IS NULL OR fromDate <= ' Carbon::now()->unix() . ')' );
  288.         $latestPressArticles->addConditionParam'isArticle = 1' );
  289.         if( $selectedCat && $tab == 'latest' ){
  290.             $latestPressArticles->addConditionParam'categories LIKE "%,' $selectedCat ',%"' );
  291.         }
  292.         if( $keyword && $tab == 'latest' ){
  293.             $latestPressArticles->addConditionParam'title LIKE :q OR shortDescription LIKE :q', [ 'q' => '%' $keyword '%' ] );
  294.         }
  295.         $latestPressArticles->setOrderKey( [ 'pressDate' ] );
  296.         $latestPressArticles->setOrder'DESC' );
  297.         $latestPaginator $paginator->paginate$latestPressArticles$request->get'pageLatest'), 12 );
  298.         $latestPaginator->setPageRange);
  299.         $companyPressArticles = new PressArticle\Listing();
  300.         $companyPressArticles->addConditionParam$regionArticlesCondition$regionArticlesConditionParams );
  301.         $companyPressArticles->addConditionParam'title != "" AND title IS NOT NULL' );
  302.         $companyPressArticles->addConditionParam'((toDate IS NULL AND pressDate > ' Carbon::now()->unix() . ') OR toDate > ' Carbon::now()->unix() . ')' );
  303.         $companyPressArticles->addConditionParam'(fromDate IS NULL OR fromDate <= ' Carbon::now()->unix() . ')' );
  304.         $companyPressArticles->addConditionParam'isFact = 1' );
  305.         if( $selectedCat && $tab == 'numbersCompany' ){
  306.             $companyPressArticles->addConditionParam'categories LIKE "%,' $selectedCat ',%"' );
  307.         }
  308.         if( $keyword && $tab == 'numbersCompany' ){
  309.             $companyPressArticles->addConditionParam'title LIKE :q OR shortDescription LIKE :q', [ 'q' => '%' $keyword '%' ] );
  310.         }
  311.         $companyPressArticles->setOrderKey( [ 'sort''pressDate' ] );
  312.         $companyPressArticles->setOrder( [ 'ASC''DESC' ] );
  313.         $companyPaginator $paginator->paginate$companyPressArticles$request->get'pageCompany'), 12 );
  314.         $companyPaginator->setPageRange);
  315.         $dossierList = new PressDossier\Listing();
  316.         $dossierRegionCondition = [];
  317.         foreach ($regionIds as $key => $id) {
  318.             $dossierRegionCondition[] = 'region LIKE "%,' $id .  ',%"';
  319.         }
  320.         if($region->getIsMainRegion()) {
  321.             $dossierRegionCondition[] = 'region is null or region = ""';
  322.         }
  323.         if(!empty($dossierRegionCondition)) {
  324.             $dossierList->addConditionParam(implode(' OR '$dossierRegionCondition));
  325.         }
  326.         $dossierList->addConditionParam'title != "" AND title IS NOT NULL' );
  327.         $dossierList->setOrderKey'title' );
  328.         $dossierList->setOrder'ASC' );
  329.         if( $request->isXmlHttpRequest() ){
  330.             $pag $allPaginator;
  331.             $pageName 'pageAZ';
  332.             if( $tab == 'latest' ){
  333.                 $pag $latestPaginator;
  334.                 $pageName 'pageLatest';
  335.             }elseif( $tab == 'numbersCompany' ){
  336.                 $pag $companyPaginator;
  337.                 $pageName 'pageCompany';
  338.             }
  339.             return $this->json( [
  340.                 "success" => true,
  341.                 "html" => $this->renderView'Press/Includes/pressOverviewList.html.twig', [
  342.                     'paginator' => $pag,
  343.                     'activePressArticlesWishlistIds' => $this->activePressArticlesWishlistIds,
  344.                     'pageName' => $pageName,
  345.                     'ajaxPaging' => true
  346.                 ] )
  347.             ] );
  348.         }
  349.         $returnArray array_merge([
  350.             'allPaginator' => $allPaginator,
  351.             'latestPaginator' => $latestPaginator,
  352.             'companyPaginator' => $companyPaginator,
  353.             'categoriesDropdownItems' => $categoriesDropdownItems,
  354.             'dossierList' => $dossierList,
  355.         ], $this->getWishlists());
  356.         return $this->render'Press/overview.html.twig'$returnArray );
  357.     }
  358.     /**
  359.      * @param Request $request
  360.      * @param CanonicalRedirectHelper $redirectHelper
  361.      * @return RedirectResponse|\Symfony\Component\HttpFoundation\Response|NotFoundHttpException
  362.      */
  363.     public function articleDetailActionRequest $requestCanonicalRedirectHelper $redirectHelper )
  364.     {
  365.         $article PressArticle::getById$request->get'id'null ) );
  366.         if( !$article ){
  367.             throw new NotFoundHttpException'article not found' );
  368.         }
  369.         if( CanonicalRedirectHelper::ENABLE_CANONICAL_REDIRECT && $redirect $redirectHelper->canonicalRedirect$article ) ){
  370.             return $redirect;
  371.         }
  372.         $returnArray array_merge([
  373.             'article' => $article,
  374.         ], $this->getWishlists());
  375.         return $this->render'Press/articleDetail.html.twig'$returnArray );
  376.     }
  377.     /**
  378.      * @param Request $request
  379.      * @param Translator $translator
  380.      * @param LinkGenerator $linkGenerator
  381.      * @param CutStringRespectingWhitespace $cutStringRespectingWhitespace
  382.      * @param CanonicalRedirectHelper $redirectHelper
  383.      * @return RedirectResponse|\Symfony\Component\HttpFoundation\Response|NotFoundHttpException
  384.      */
  385.     public function dossierDetailActionRequest $requestTranslator $translatorLinkGenerator $linkGeneratorCutStringRespectingWhitespace $cutStringRespectingWhitespaceCanonicalRedirectHelper $redirectHelper )
  386.     {
  387.         $dossier PressDossier::getById$request->get'id' ) );
  388.         if( !$dossier ){
  389.             throw new NotFoundHttpException'category not found' );
  390.         }
  391.         if( CanonicalRedirectHelper::ENABLE_CANONICAL_REDIRECT && $redirect $redirectHelper->canonicalRedirect$dossier ) ){
  392.             return $redirect;
  393.         }
  394.         $dossierArticlesFlatrate = [];
  395.         $articleDocuments = [];
  396.         foreach( $dossier->getArticles() as $article ){
  397.             $dossierArticlesFlatrate[] = [
  398.                 'id' => $article->getId(),
  399.                 'isSmallTeaser' => true,
  400.                 'badgeText' => null,
  401.                 'title' => $article->getTitle(),
  402.                 'date' => $article->getPressDate()->format'd.m.Y | h:m' ) . ' ' $translator->trans'press.Uhr' ),
  403.                 'wysiwyg' => $cutStringRespectingWhitespace->__invoke$article->getShortDescription(), 200 ),
  404.                 'link' => $linkGenerator->generate$article ),
  405.                 'linktext' => $translator->trans"press.Weiterlesen" ),
  406.                 'isBadgeWhite' => true,
  407.                 'hasWishlist' => true,
  408.                 'wishlistActive' => array_key_exists$article->getId(), $this->activePressArticlesWishlistIds ),
  409.                 'wishlistId' => "press-articles",
  410.                 'image' => $article->getTeaserImage(),
  411.             ];
  412.             foreach( $article->getDocuments() as $doc ){
  413.                 $articleDocuments$doc->getId() ] = $doc;
  414.             }
  415.         }
  416.         $returnArray array_merge([
  417.             'dossier' => $dossier,
  418.             'dossierArticlesFlatrate' => $dossierArticlesFlatrate,
  419.             'articleDocuments' => $articleDocuments,
  420.         ], $this->getWishlists());
  421.         return $this->render'Press/dossierDetail.html.twig'$returnArray );
  422.     }
  423.     /**
  424.      * @param Request $request
  425.      * @param PaginatorInterface $paginator
  426.      * @return JsonResponse|\Symfony\Component\HttpFoundation\Response
  427.      */
  428.     public function pictureOverviewActionRequest $requestPaginatorInterface $paginator )
  429.     {
  430.         $pictureListing $this->getPressImageListing($request);
  431.         $mediaCategoriesListing $this->getMediaCategories($request);
  432.         $activeCategories $this->getActiveCategories($pictureListing);
  433.         $paginator $this->getPaginatorForPressImages($request$paginator$pictureListing);
  434.         if( $request->isXmlHttpRequest() ){
  435.             return new JsonResponse( [
  436.                 'success' => true,
  437.                 "html" => $this->renderView'Press/Includes/pressPictureList.html.twig', [
  438.                     "paginator" => $paginator,
  439.                     'activePressPicturesWishlistIds' => $this->activePressPicturesWishlistIds
  440.                 ] ),
  441.             ] );
  442.         }
  443.         $returnArray array_merge([
  444.             'pressCategories' => $this->getCategoriesDropdownItems$mediaCategoriesListing$request->get'category''' ), $activeCategories ),
  445.             'seasonSelect' => $this->getSeasonSelect$this->getDocumentEditable'relations''seasons' )->getData(), $request->get'season' ) ),
  446. //            'mediaImages' => $mediaImages,
  447.             'paginator' => $paginator,
  448.         ], $this->getWishlists());
  449.         return $this->render'Press/pictureOverview.html.twig'$returnArray );
  450.     }
  451.     /**
  452.      * @param Request $request
  453.      * @return \Symfony\Component\HttpFoundation\BinaryFileResponse|array
  454.      */
  455.     public function pressPictureDetailActionRequest $request )
  456.     {
  457.         $asset Asset::getById$request->get'id' ) );
  458.         if( !$asset || !$asset->getMetadata'General.mediaArchive' ) || $asset->getMetadata'General.mediaArchive' ) != ){
  459.             throw new NotFoundHttpException'Media Image not found' );
  460.         }
  461.         $returnArray array_merge([
  462.             'asset' => $asset,
  463.         ], $this->getWishlists());
  464.         return $this->render("/Press/pressPictureDetail.html.twig"$returnArray);
  465.     }
  466.     /**
  467.      * @param Request $request
  468.      * @param PaginatorInterface $paginator
  469.      * @return JsonResponse|\Symfony\Component\HttpFoundation\Response
  470.      */
  471.     public function videoOverviewActionRequest $requestPaginatorInterface $paginator )
  472.     {
  473.         $mediaCategoriesListing $this->getMediaCategories($request);
  474.         $count 1;
  475.         $region $this->document->getProperty('region');
  476.         $videoListing = new  MediaVideo\Listing();
  477.         $category MediaCategory::getById$request->get'category' ) );
  478.         $keyword $request->get'keyword''' );
  479.         $keywordObject MediaKeyword::getByWord$keyword$request->getLocale(), );
  480.         if( $keyword || $category ){
  481.             $count++;
  482.         }
  483.         if($region instanceof Region) {
  484.             $regionAndCommunityId $this->regionExtension->getAllCommunityIdsByRegion($regiontruetrue$request->get('clearCache'false));
  485.             $videoListing->addConditionParam('regions LIKE "%,' implode(',%" OR regions LIKE "%,'$regionAndCommunityId) . ',%"' . ($region->getIsMainRegion() ? ' OR regions is null OR regions = ""'''));
  486.         }
  487.         //2 sub conditions => 1 for assets 1 for yt videos
  488.         $videoListing->addConditionParam"
  489.         (
  490.             video2 NOT LIKE '%:\"asset\";%' " /* youtube condition */
  491.             $category "and categories LIKE '%," $category->getId() . ",%' " "" ) .
  492.             ( $keyword "and (title like :keyword or description like :keyword " . ( $keywordObject "or keywords LIKE '%," $keywordObject->getId() . ",%'" "" ) . ") " "" )
  493.             . ")
  494.         OR
  495.         (
  496.             video2 LIKE '%:\"asset\";%' " /* asset condition, check metadata */
  497.             " and left(substr(video2, Locate(';i:', video2)+3), locate(';', substr(video2, Locate(';i:', video2)+3))-1) IN (" /* do some string magic to get asset id from video objects with video asset instead of youtube, vimeo,... */ "
  498.                 Select distinct cid
  499.                 from assets_metadata am
  500.                 where (name = 'General.mediaArchive' and data = 1  " .
  501.                 ( $keyword "  and cid IN (Select distinct cid
  502.                                         FROM  assets_metadata am
  503.                                         WHERE (
  504.                                             (name = 'General.mediaArchive' and data = 1 ) " .
  505.                     "or (am.name = 'General.title' and am.data like '%" $keyword "%')" .
  506.                     "or (am.name = 'General.description' and am.data like '%" $keyword "%')" .
  507.                     ( !empty( $keywordObject ) ? " or (am.name = 'General.keywords' and am.data like '%\"object\"," $keywordObject->getId() . "]%')" '' ) .
  508.                     ")
  509.                                        Group By cid
  510.                                        having count(cid) >= 2
  511.                        ) " "" ) .
  512.                 ")" .
  513.                 ( $category " or (am.name = 'General.categories' and am.data like '%\"object\"," $category->getId() . "]%')" "" )
  514.                 . "
  515.                 Group By cid
  516.                 having count(cid) = " $count "
  517.             ) " )
  518.             . ")", [ 'keyword' => "%" . ( $keyword ?? '' ) . "%" ] );
  519.         $paginator $paginator->paginate$videoListing$request->get'page'), 16 );
  520.         $paginator->setPageRange);
  521.         if( $request->isXmlHttpRequest() && $request->get'ajax' ) ){
  522.             return new JsonResponse( [
  523.                 'success' => true,
  524.                 'html' => $this->renderView'Press/Includes/pressVideoList.html.twig', [ 'paginator' => $paginator ] )
  525.             ] );
  526.         }
  527.         $returnArray array_merge([
  528.             'paginator' => $paginator,
  529.             'pressCategories' => $this->getCategoriesDropdownItems$mediaCategoriesListing$request->get'category''' ) ),
  530.         ], $this->getWishlists());
  531.         return $this->render'Press/videoOverview.html.twig'$returnArray );
  532.     }
  533.     /**
  534.      * @param Request $request
  535.      * @param PaginatorInterface $paginator
  536.      * @return JsonResponse|\Symfony\Component\HttpFoundation\Response
  537.      */
  538.     public function audioOverviewActionRequest $requestPaginatorInterface $paginator )
  539.     {
  540.         $mediaCategoriesListing $this->getMediaCategories($request);
  541.         $categoryId $request->get'category' );
  542.         $keyword $request->get'keyword''' );
  543.         $keywordObject MediaKeyword::getByWord$keyword$request->getLocale(), );
  544.         $audioListing = new Asset\Listing();
  545.         $audioListing->addConditionParam"type = 'audio'" );
  546.         $count 1;
  547.         if( $keyword || $categoryId ){
  548.             $count++;
  549.         }
  550.         $audioListing->addConditionParam"id IN (
  551.             Select distinct cid
  552.             from assets_metadata am
  553.             where (name = 'General.mediaArchive' and data = 1 ) " .
  554.             ( $keyword "  and cid IN (Select distinct cid
  555.                                                 FROM  assets_metadata am
  556.                                                 WHERE (
  557.                                                     (name = 'General.mediaArchive' and data = 1 ) " .
  558.                 "or (am.name = 'General.title' and am.data like '%" $keyword "%')" .
  559.                 "or (am.name = 'General.description' and am.data like '%" $keyword "%')" .
  560.                 ( !empty( $keywordObject ) ? " or (am.name = 'General.keywords' and am.data like '%\"object\"," $keywordObject->getId() . "]%')" '' ) .
  561.                 ")
  562.                        Group By cid
  563.                        having count(cid) >= 2
  564.                        ) " "" ) .
  565.             ( $categoryId "or (am.name = 'General.categories' and am.data like '%\"object\"," . (int)$categoryId "]%')" '' ) .
  566.             "
  567.             Group By cid
  568.             having count(cid) = " $count "
  569.             )" );
  570.         $paginator $paginator->paginate$audioListing$request->get'page'), 16 );
  571.         if( $request->isXmlHttpRequest() && $request->get'ajax' ) ){
  572.             return new JsonResponse( [
  573.                 'success' => true,
  574.                 'html' => $this->renderView'Press/Includes/pressAudioList.html.twig', [ 'paginator' => $paginator ] )
  575.             ] );
  576.         }
  577.         $returnArray array_merge([
  578.             'paginator' => $paginator,
  579.             'pressCategories' => $this->getCategoriesDropdownItems$mediaCategoriesListing$categoryId ),
  580.         ], $this->getWishlists());
  581.         return $this->render'Press/audioOverview.html.twig'$returnArray );
  582.     }
  583.     /**
  584.      * @param Request $request
  585.      * @return array
  586.      */
  587.     public function videoDetailActionRequest $requestCanonicalRedirectHelper $redirectHelperLayoutExtension $layoutExtension )
  588.     {
  589.         $video MediaVideo::getById$request->get'id' ) );
  590.         if( !$video or !$video->isPublished() ){
  591.             throw new NotFoundHttpException'Media Video not found' );
  592.         }
  593.         if( CanonicalRedirectHelper::ENABLE_CANONICAL_REDIRECT && $redirect $redirectHelper->canonicalRedirect$video ) ){
  594.             return $redirect;
  595.         }
  596.         $isYoutube true;
  597.         if( $video->getVideo2() && $video->getVideo2()->getType() == 'asset' ){
  598.             $assetVideo $video->getVideo2()->getData();
  599.             $isYoutube false;
  600.             $number $assetVideo->getMetadata'General.number' );
  601.             $title $assetVideo->getMetadata'General.title'$request->getLocale() );
  602.             $copyright $assetVideo->getMetadata'General.copyright' );
  603.         }else{
  604.             $number $video->getNumber();
  605.             $title $video->getTitle();
  606.             $copyright $video->getCopyright();
  607.         }
  608.         $returnArray = [
  609.             'assetVideoObject' => $video->getVideo2(),
  610.             'videoObject' => $video,
  611.             'isYoutube' => $isYoutube,
  612.             'number' => $number,
  613.             'title' => $title,
  614.             'copyright' => $copyright,
  615.             'videoAsset' => $assetVideo ?? null//the assets is needed for the usage guidelines, sorry for the confusion with the names.
  616.         ];
  617.         return $this->render'Press/videoDetail.html.twig'$returnArray );
  618.     }
  619.     /**
  620.      * @param Request $request
  621.      * @param PaginatorInterface $paginator
  622.      * @return JsonResponse|\Symfony\Component\HttpFoundation\Response
  623.      */
  624.     public function mediaAssetOverviewActionRequest $requestPaginatorInterface $paginator )
  625.     {
  626.         $mediaCategoriesListing $this->getMediaCategories($request);
  627.         $count 1;
  628.         $region $this->document->getProperty('region');
  629.         $mediaAssetListing = new MediaAsset\Listing();
  630.         $mediaAssetListing->addConditionParam('asset__id is not null and asset__id != "" and asset__id IN (
  631.             Select distinct cid
  632.             from assets_metadata am
  633.             where (name = "General.mediaArchive" and data = 1 )
  634.         )');
  635.         $category MediaCategory::getById$request->get'category' ) );
  636.         $keyword $request->get'keyword''' );
  637.         $keywordObject MediaKeyword::getByWord$keyword$request->getLocale(), );
  638.         if( $keyword || $category ){
  639.             $count++;
  640.         }
  641.         if($region instanceof Region) {
  642.             $regionAndCommunityId $this->regionExtension->getAllCommunityIdsByRegion($regiontruetrue$request->get('clearCache'false));
  643.             $mediaAssetListing->addConditionParam('regions LIKE "%,' implode(',%" OR regions LIKE "%,'$regionAndCommunityId) . ',%"' . ($region->getIsMainRegion() ? ' OR regions is null OR regions = ""'''));
  644.         }
  645.         if($category) {
  646.             //todo add check for asset metadata
  647.             $mediaAssetListing->addConditionParam('categories LIKE :category OR (
  648.                    asset__id IN (
  649.                         Select distinct cid
  650.                         from assets_metadata am2
  651.                         where am2.name = "General.categories" and am2.data like :categoryMetadata)
  652.                 )',
  653.                 ['category' => '%,' $category->getId() . ',%''categoryMetadata' => "%\"object\"," $category->getId() . "]%"] );
  654.         }
  655.         if($keyword) {
  656.             //todo add check for asset metadata
  657.             $keywordQuery 'title LIKE :keyword';
  658.             $keywordQueryParams = ['keyword' => '%' $keyword '%'];
  659.             if($keywordObject) {
  660.                 $keywordQuery .= ' OR keywords LIKE :keywordObject';
  661.                 $keywordQueryParams['keywordObject'] = '%,' $keywordObject?->getId() . ',%';
  662.                 $keywordQueryParams['keywordObjectMetadata'] = "%\"object\"," $keywordObject?->getId() . "]%";
  663.             }
  664.             //add metadata check:
  665.             $keywordQuery .= ' OR (
  666.                    asset__id IN (
  667.                         Select distinct cid
  668.                         from assets_metadata am3
  669.                         where (am3.name = "General.title" and am3.data like :keyword) or
  670.                                 (am3.name = "General.description" and am3.data like :keyword) ' .
  671.                                 ($keywordObject 'or (am3.name = "General.keywords" and am3.data like :keywordObjectMetadata)' '') .
  672.                 ') )';
  673.             $mediaAssetListing->addConditionParam($keywordQuery$keywordQueryParams );
  674.         }
  675.         $mediaAssetListing->setOrderKey(['ISNULL(sorting)''sorting'], false);
  676.         $mediaAssetListing->setOrder(['ASC''ASC']);
  677.         $paginator $paginator->paginate$mediaAssetListing$request->get'page'), 16 );
  678.         $paginator->setPageRange);
  679.         $returnArray array_merge([
  680.             'paginator' => $paginator,
  681.             'pressCategories' => $this->getCategoriesDropdownItems$mediaCategoriesListing$request->get'category''' ) ),
  682.         ], $this->getWishlists());
  683.         if( $request->isXmlHttpRequest()) {
  684.             return new JsonResponse( [
  685.                 'success' => true,
  686.                 'html' => $this->renderView'Press/Includes/pressPictureList.html.twig'$returnArray )
  687.             ] );
  688.         }
  689.         return $this->render'Press/mediaAssetOverview.html.twig'$returnArray );
  690.     }
  691.     public function mediaAlbumDetailAction(Request $request) {
  692.         $mediaAlbum MediaAlbum::getById($request->get('id'));
  693.         if(!$mediaAlbum) {
  694.             throw new NotFoundHttpException('Media Album not found');
  695.         }
  696.         $assetTemplates = [];
  697.         $this->getMediaAlbumAssets($mediaAlbum->getAlbumItems(), $assetTemplates, !(bool)$mediaAlbum->getShowAssetTitle());
  698.         //overview is a content area
  699.         $returnArray array_merge([
  700.             'mediaAlbum' => $mediaAlbum,
  701.             'assetTemplates' => $assetTemplates,
  702.         ], $this->getWishlists());
  703.         return $this->render'Press/mediaAlbumDetail.html.twig'$returnArray );
  704.     }
  705.     public function mediaAssetDetailAction(Request $request) {
  706.         $mediaAsset MediaAsset::getById($request->get('id'));
  707.         if(!$mediaAsset) {
  708.             throw new NotFoundHttpException('Media Asset not found');
  709.         }
  710.         $assetTemplates = [];
  711.         $posterImage $mediaAsset?->getPosterImage();
  712.         $returnArray array_merge([
  713.             'mediaAsset' => $mediaAsset,
  714.             'title' => $mediaAsset->getTitle() ?: $posterImage?->getMetadata('General.title'),
  715.             'description' => $mediaAsset->getDescription() ?: $posterImage?->getMetadata('General.description'),
  716.             'number' => $mediaAsset->getNumber() ?: $posterImage?->getMetadata('General.number'),
  717.             'imageTexts' => [
  718.                 'copyright' => $mediaAsset?->getCopyright()?->getText() ?: $mediaAsset?->getRights() ?: $posterImage?->getMetadata('General.copyright'),
  719.                 'author'  => $mediaAsset?->getAuthor()?->getName(),
  720.                 'usage' => $mediaAsset?->getRights() ?: $posterImage?->getMetadata('General.usage'),
  721.             ],
  722.             'asset' => $mediaAsset->getAsset(),
  723.         ], $this->getWishlists());
  724.         return $this->render'Press/mediaAssetDetail.html.twig'$returnArray );
  725.     }
  726.     /**
  727.      * @Route("/{_locale}/press/wishlist", name="press-wishlist")
  728.      * @param Request $request
  729.      * @return array
  730.      */
  731.     public function wishlistActionRequest $request )
  732.     {
  733.         if( $request->get'removeAllPressArticlesFromWishlist' ) !== null ){
  734.             $request->getSession()->set'pressArticleWishlistIds', [] );
  735.             $this->activePressArticlesWishlistIds = [];
  736.         }
  737.         if( $request->get'removeAllPressImagesFromWishlist' ) !== null ){
  738.             $request->getSession()->set'pressImageWishlistIds', [] );
  739.         }
  740.         if( $request->get'removeAllPressDossiersFromWishlist' ) !== null ){
  741.             $request->getSession()->set'pressDossierWishlistIds', [] );
  742.             $this->activePressDossiersWishlistIds = [];
  743.         }
  744.         if( $request->get'removeAllPressAlbumsFromWishlist' ) !== null ){
  745.             $request->getSession()->set'pressAlbumWishlistIds', [] );
  746.             $this->activePressDossiersWishlistIds = [];
  747.         }
  748.         if( $request->get'removeAllPressAlbumItemsFromWishlist' ) !== null ){
  749.             $request->getSession()->set'pressAlbumItemsWishlistIds', [] );
  750.             $this->activePressDossiersWishlistIds = [];
  751.         }
  752.         if( $request->get'removeAllPressMediaAssetsWishlistIds' ) !== null ){
  753.             $request->getSession()->set'pressMediaAssetsWishlistIds', [] );
  754.             $this->activePressMediaAssetsWishlistIds = [];
  755.         }
  756.         $mainRegion $this->regionExtension->getMainRegion();
  757.         $regions = []; //save all regions for user guidlines tabing
  758.         //themensammlungen == dossiers
  759.         $pressDossiers = [];
  760.         $pressDossierIds $request->getSession()?->get'pressDossierWishlistIds', [] );
  761.         if( !empty( $pressDossierIds ) ){
  762.             foreach( $pressDossierIds as $id ){
  763.                 if( $pressDossier PressDossier::getById$id ) ){
  764.                     $pressDossiers[] = $pressDossier;
  765.                     $this->addRegionsToArray(!empty($pressDossier->getRegion()) ? $pressDossier->getRegion() : [$mainRegion], $regions);
  766.                 }
  767.             }
  768.         }
  769.         //Pressarticles
  770.         $pressArticleIds $request->getSession()?->get'pressArticleWishlistIds', [] );
  771.         $pressArticles = [];
  772.         if( !empty( $pressArticleIds ) ){
  773.             foreach( $pressArticleIds as $id ){
  774.                 if( $pressArticle PressArticle::getById$id ) ){
  775.                     $pressArticles[] = $pressArticle;
  776.                     $this->addRegionsToArray(!empty($pressArticle->getRegion()) ? [$pressArticle->getRegion()]:  [$mainRegion], $regions);
  777.                 }
  778.             }
  779.         }
  780.         $pressImagesIds $request->getSession()?->get'pressImageWishlistIds', [] );
  781.         $pressImages = [];
  782.         if( !empty( $pressImagesIds ) ){
  783.             foreach( $pressImagesIds as $id ){
  784.                 if( ( $image Asset::getById$id ) ) && $image->getMetadata'General.mediaArchive' ) && $image->getMetadata'General.mediaArchive' ) == ){
  785.                     $pressImages[] = $image;
  786.                     $this->addRegionsToArray(!empty($image->getMetadata('General.regions')) ? $image->getMetadata('General.regions') : [$mainRegion], $regions);
  787.                 }
  788.             }
  789.         }
  790.         $pressAlbumIds $request->getSession()?->get'pressAlbumWishlistIds', [] );
  791.         $mediaAlbums = [];
  792.         if( !empty( $pressAlbumIds ) ){
  793.             foreach( $pressAlbumIds as $id ){
  794.                 if($mediaAlbum MediaAlbum::getById($id)){
  795.                     $mediaAlbums[] = $mediaAlbum;
  796.                 }
  797.             }
  798.         }
  799.         $pressAlbumItemsIds $request->getSession()?->get'pressAlbumItemsWishlistIds', [] );
  800.         $mediaAlbumItems = [];
  801.         if( !empty( $pressAlbumItemsIds ) ){
  802.             foreach( $pressAlbumItemsIds as $id ){
  803.                 if($mediaAlbumItem Asset::getById($id)){
  804.                     $mediaAlbumItems[] = $mediaAlbumItem;
  805.                 }
  806.             }
  807.         }
  808.         $mediaAlbumItemsAssets = [];
  809.         $this->getMediaAlbumAssets($mediaAlbumItems$mediaAlbumItemsAssetsfalse);
  810.         $pressMediaAssetIds $request->getSession()?->get('pressMediaAssetsWishlistIds', []);
  811.         $mediaAssets = [];
  812.         if(!empty($pressMediaAssetIds)) {
  813.             foreach ($pressMediaAssetIds as $id) {
  814.                 if($mediaAssetItem MediaAsset::getById($id)) {
  815.                     $mediaAssets[] = $mediaAssetItem;
  816.                 }
  817.             }
  818.         }
  819.         if(empty($regions)) {
  820.             $regions[] = $mainRegion;
  821.         }
  822.         ksort($regions); //sort by id
  823.         $returnArray array_merge([
  824.             'pressArticles' => $pressArticles,
  825.             'pressDossiers' => $pressDossiers,
  826.             'pressImages' => $pressImages,
  827.             'mediaAlbums' => $mediaAlbums,
  828.             'mediaAlbumItems' => $mediaAlbumItemsAssets,
  829.             'mediaAssets' => $mediaAssets,
  830.             'regions' => $regions,
  831.         ], $this->getWishlists());
  832.         return $this->render'Press/wishlist.html.twig'$returnArray );
  833.     }
  834.     /**
  835.      * @param Request $request
  836.      * @Route("/{_locale}/press/password-forgotten", name="press-pw-forgotten")
  837.      */
  838.     public function passwordForgottenAction(Request $request) {
  839.         $errors = [];
  840.         $success null;
  841.         $step 1;
  842.         $user null;
  843.         $tokenInvalid null;
  844.         if($request->get('token')) {
  845.             $step 2;
  846.             $user MediaUser::getByResetPWToken($request->get('token'), 1);
  847.             if(!$user) {
  848.                 $tokenInvalid true;
  849.             }
  850.         }
  851.         $config WebsiteSetting::getByName('DefaultSiteConfig')->getData();
  852.         if($request->isMethod(Request::METHOD_POST)) {
  853.             if($request->get('email') && $request->get('resetMail')) { //send mail to reset pw
  854.                 $user MediaUser::getByEmail($request->get('email'), 1);
  855.                 $usermailWS WebsiteSetting::getByName('resetPasswordEmail'null$request->getLocale());
  856.                 $usermail null;
  857.                 if($usermailWS) {
  858.                     $usermail $usermailWS->getData();
  859.                 }
  860.                 if($user) {
  861.                     if($user->getConfirmed()) {
  862.                         $token md5('mediaUser-resetPW' $user->getEmail() . time());
  863.                         $user->setResetPWTokenCreateTime(Carbon::now());
  864.                         $user->setResetPWToken($token);
  865.                         try {
  866.                             $user->save();
  867.                             if($usermail) {
  868.                                 $params = [
  869.                                     'link' => 'www.steiermark.com'  .  $this->generateUrl('press-pw-forgotten', ['token' => $token]),
  870.                                 ];
  871.                                 $mail = new Mail();
  872.                                 $mail->setDocument($usermail);
  873.                                 $mail->setParams($params);
  874.                                 $mail->addTo($user->getEmail());
  875.                                 $mail->send();
  876.                             }
  877.                             $success 'mail sent';
  878.                         } catch (\Exception $e) {
  879.                             $errors[] = 'generating token failed';
  880.                         }
  881.                     } else {
  882.                         $errors[] = 'user not confirmed';
  883.                     }
  884.                 } else {
  885.                     $errors[] = 'user does not exist';
  886.                 }
  887.             } elseif($request->get('pw') && $request->get('pw2') && $request->get('resetPw') && $request->get('token') && $user) {
  888.                 if($request->get('pw') === $request->get('pw2')) {
  889.                     $user->setResetPWTokenCreateTime(null);
  890.                     $user->setResetPWToken(null);
  891.                     $user->setPassword($request->get('pw'));
  892.                     try {
  893.                         $user->save();
  894.                         $step 3;
  895.                     } catch (\Exception $e) {
  896.                         $errors[] = 'saving user failed';
  897.                     }
  898.                 } else {
  899.                     $errors[] = 'passwords not equal';
  900.                 }
  901.             }
  902.         }
  903.         return $this->renderTemplate('Press/passwordForgotten.html.twig', ['step' => $step'errors' => $errors'success' => $success'tokenInvalid' => $tokenInvalid'config' => $config]);
  904.     }
  905.     /**
  906.      * @Route("/{_locale}/press/dossiers/add-to-wishlist", name="pressdossiers-wishlist-add")
  907.      */
  908.     public function addDossierFromWishlistRequest $request )
  909.     {
  910.         $id $request->get'id' );
  911.         $sessionIds $request->getSession()->get'pressDossierWishlistIds', [] );
  912.         $sessionIds[] = $id;
  913.         $request->getSession()->set'pressDossierWishlistIds'$sessionIds );
  914.         $returnArr'ids' ] = $sessionIds;
  915.         $url $this->generateUrl'press-wishlist' );
  916.         return new JsonResponse( [
  917.             "success" => true,
  918.             "activeIds" => array_valuesarray_map'intval'$sessionIds ) ),
  919.             "__alertNotification" => [
  920.                 "type" => "notification-default",
  921.                 "content" => $this->renderView'Press/Includes/wishlist/pressarticle-add-notification.html.twig'array_merge$request->request->all(), [
  922.                     'url' => $this->getWishlistUrl($request),
  923.                     'tkText' => 'Pressedossier',
  924.                 ] ) )
  925.             ]
  926.         ] );
  927.     }
  928.     /**
  929.      * @Route("/{_locale}/press/dossiers/remove-from-wishlist", name="pressdossiers-wishlist-remove")
  930.      */
  931.     public function removeDossierFromWishlistRequest $request )
  932.     {
  933.         $id $request->get'id' );
  934.         $sessionIds $request->getSession()->get'pressDossierWishlistIds', [] );
  935.         if( ( $key array_search$id$sessionIds ) ) !== false ){
  936.             unset( $sessionIds$key ] );
  937.         }
  938.         $request->getSession()->set'pressDossierWishlistIds'$sessionIds );
  939.         $returnArr'ids' ] = $sessionIds;
  940.         $url $this->generateUrl'press-wishlist' );
  941.         return new JsonResponse( [
  942.             "success" => true,
  943.             "activeIds" => array_valuesarray_map'intval'$sessionIds ) ),
  944.             "__alertNotification" => [
  945.                 "type" => "notification-default",
  946.                 "content" => $this->renderView'Press/Includes/wishlist/pressarticle-remove-notification.html.twig'array_merge$request->request->all(), [
  947.                     'url' => $this->getWishlistUrl($request),
  948.                     'tkText' => 'Pressdossier'
  949.                 ] ) )
  950.             ]
  951.         ] );
  952.     }
  953.     /**
  954.      * @Route("/{_locale}/press/image/add-to-wishlist", name="pressimage-wishlist-add")
  955.      */
  956.     public function addPressImageToWishlistRequest $request )
  957.     {
  958.         $id $request->get'id' );
  959.         $sessionIds $request->getSession()->get'pressImageWishlistIds', [] );
  960.         $sessionIds[] = $id;
  961.         $request->getSession()->set'pressImageWishlistIds'$sessionIds );
  962.         $returnArr'ids' ] = $sessionIds;
  963.         return new JsonResponse( [
  964.             "success" => true,
  965.             "activeIds" => array_valuesarray_map'intval'$sessionIds ) ),
  966.             "__alertNotification" => [
  967.                 "type" => "notification-default",
  968.                 "content" => $this->renderView'Press/Includes/wishlist/pressarticle-add-notification.html.twig'array_merge$request->request->all(), [
  969.                     'url' => $this->getWishlistUrl($request),
  970.                     'tkText' => 'Presseimage',
  971.                 ] ) )
  972.             ]
  973.         ] );
  974.     }
  975.     /**
  976.      * @Route("/{_locale}/press/album/add-to-wishlist", name="pressalbum-wishlist-add")
  977.      */
  978.     public function addPressAlbumToWishlistRequest $request )
  979.     {
  980.         $id $request->get'id' );
  981.         $sessionIds $request->getSession()->get'pressAlbumWishlistIds', [] );
  982.         $sessionIds[] = $id;
  983.         $request->getSession()->set'pressAlbumWishlistIds'$sessionIds );
  984.         $returnArr'ids' ] = $sessionIds;
  985.         $url $this->generateUrl'press-wishlist' );
  986.         return new JsonResponse( [
  987.             "success" => true,
  988.             "activeIds" => array_valuesarray_map'intval'$sessionIds ) ),
  989.             "__alertNotification" => [
  990.                 "type" => "notification-default",
  991.                 "content" => $this->renderView'Press/Includes/wishlist/pressarticle-add-notification.html.twig'array_merge$request->request->all(), [
  992.                     'url' => $this->getWishlistUrl($request),
  993.                     'tkText' => 'media-album',
  994.                 ] ) )
  995.             ]
  996.         ] );
  997.     }
  998.     /**
  999.      * @Route("/{_locale}/press/album/remove-from-wishlist", name="pressalbum-wishlist-remove")
  1000.      */
  1001.     public function removePressAlbumFromWishlistRequest $request )
  1002.     {
  1003.         $id $request->get'id' );
  1004.         $sessionIds $request->getSession()->get'pressAlbumWishlistIds', [] );
  1005.         if( ( $key array_search$id$sessionIds ) ) !== false ){
  1006.             unset( $sessionIds$key ] );
  1007.         }
  1008.         $request->getSession()->set'pressAlbumWishlistIds'$sessionIds );
  1009.         $returnArr'ids' ] = $sessionIds;
  1010.         $url $this->generateUrl'press-wishlist' );
  1011.         return new JsonResponse( [
  1012.             "success" => true,
  1013.             "activeIds" => array_valuesarray_map'intval'$sessionIds ) ),
  1014.             "__alertNotification" => [
  1015.                 "type" => "notification-default",
  1016.                 "content" => $this->renderView'Press/Includes/wishlist/pressarticle-remove-notification.html.twig'array_merge$request->request->all(), [
  1017.                     'url' => $this->getWishlistUrl($request),
  1018.                     'tkText' => 'media-album'
  1019.                 ] ) )
  1020.             ]
  1021.         ] );
  1022.     }
  1023.     /**
  1024.      * @Route("/{_locale}/press/album/item/add-to-wishlist", name="pressalbum-item-wishlist-add")
  1025.      */
  1026.     public function addPressAlbumItemToWishlistRequest $request )
  1027.     {
  1028.         $id $request->get'id' );
  1029.         $sessionIds $request->getSession()->get'pressAlbumItemsWishlistIds', [] );
  1030.         $sessionIds[] = $id;
  1031.         $request->getSession()->set'pressAlbumItemsWishlistIds'$sessionIds );
  1032.         $returnArr'ids' ] = $sessionIds;
  1033.         $url $this->generateUrl'press-wishlist' );
  1034.         return new JsonResponse( [
  1035.             "success" => true,
  1036.             "activeIds" => array_valuesarray_map'intval'$sessionIds ) ),
  1037.             "__alertNotification" => [
  1038.                 "type" => "notification-default",
  1039.                 "content" => $this->renderView'Press/Includes/wishlist/pressarticle-add-notification.html.twig'array_merge$request->request->all(), [
  1040.                     'url' => $this->getWishlistUrl($request),
  1041.                     'tkText' => 'media-album-item',
  1042.                 ] ) )
  1043.             ]
  1044.         ] );
  1045.     }
  1046.     /**
  1047.      * @Route("/{_locale}/press/album/item/remove-from-wishlist", name="pressalbum-item-wishlist-remove")
  1048.      */
  1049.     public function removePressAlbumItemFromWishlistRequest $request )
  1050.     {
  1051.         $id $request->get'id' );
  1052.         $sessionIds $request->getSession()->get'pressAlbumItemsWishlistIds', [] );
  1053.         if( ( $key array_search$id$sessionIds ) ) !== false ){
  1054.             unset( $sessionIds$key ] );
  1055.         }
  1056.         $request->getSession()->set'pressAlbumItemsWishlistIds'$sessionIds );
  1057.         $returnArr'ids' ] = $sessionIds;
  1058.         $url $this->generateUrl'press-wishlist' );
  1059.         return new JsonResponse( [
  1060.             "success" => true,
  1061.             "activeIds" => array_valuesarray_map'intval'$sessionIds ) ),
  1062.             "__alertNotification" => [
  1063.                 "type" => "notification-default",
  1064.                 "content" => $this->renderView'Press/Includes/wishlist/pressarticle-remove-notification.html.twig'array_merge$request->request->all(), [
  1065.                     'url' => $this->getWishlistUrl($request),
  1066.                     'tkText' => 'media-album-item'
  1067.                 ] ) )
  1068.             ]
  1069.         ] );
  1070.     }
  1071.     /**
  1072.      * @Route("/{_locale}/press/image/remove-from-wishlist", name="pressimage-wishlist-remove")
  1073.      */
  1074.     public function removePressImageFromWishlistRequest $request )
  1075.     {
  1076.         $id $request->get'id' );
  1077.         $sessionIds $request->getSession()->get'pressImageWishlistIds', [] );
  1078.         if( ( $key array_search$id$sessionIds ) ) !== false ){
  1079.             unset( $sessionIds$key ] );
  1080.         }
  1081.         $request->getSession()->set'pressImageWishlistIds'$sessionIds );
  1082.         $returnArr'ids' ] = $sessionIds;
  1083.         $url $this->generateUrl'press-wishlist' );
  1084.         return new JsonResponse( [
  1085.             "success" => true,
  1086.             "activeIds" => array_valuesarray_map'intval'$sessionIds ) ),
  1087.             "__alertNotification" => [
  1088.                 "type" => "notification-default",
  1089.                 "content" => $this->renderView'Press/Includes/wishlist/pressarticle-remove-notification.html.twig'array_merge$request->request->all(), [
  1090.                     'url' => $this->getWishlistUrl($request),
  1091.                     'tkText' => 'Pressimage'
  1092.                 ] ) )
  1093.             ]
  1094.         ] );
  1095.     }
  1096.     /**
  1097.      * @Route("/{_locale}/press/article/add-to-wishlist", name="pressarticle-wishlist-add")
  1098.      */
  1099.     public function addToWishlistRequest $request )
  1100.     {
  1101.         $id $request->get'id' );
  1102.         $sessionIds $request->getSession()->get'pressArticleWishlistIds', [] );
  1103.         $sessionIds[] = $id;
  1104.         $request->getSession()->set'pressArticleWishlistIds'$sessionIds );
  1105.         $returnArr'ids' ] = $sessionIds;
  1106.         $url $this->generateUrl'press-wishlist' );
  1107.         return new JsonResponse( [
  1108.             "success" => true,
  1109.             "activeIds" => array_valuesarray_map'intval'$sessionIds ) ),
  1110.             "__alertNotification" => [
  1111.                 "type" => "notification-default",
  1112.                 "content" => $this->renderView'Press/Includes/wishlist/pressarticle-add-notification.html.twig'array_merge$request->request->all(), [
  1113.                     'url' => $this->getWishlistUrl($request)
  1114.                 ] ) )
  1115.             ]
  1116.         ] );
  1117.     }
  1118.     /**
  1119.      * @Route("/{_locale}/press/article/remove-from-wishlist", name="pressarticle-wishlist-remove")
  1120.      */
  1121.     public function removeFromWishlistRequest $request )
  1122.     {
  1123.         $id $request->get'id' );
  1124.         $sessionIds $request->getSession()->get'pressArticleWishlistIds', [] );
  1125.         if( ( $key array_search$id$sessionIds ) ) !== false ){
  1126.             unset( $sessionIds$key ] );
  1127.         }
  1128.         $request->getSession()->set'pressArticleWishlistIds'$sessionIds );
  1129.         $returnArr'ids' ] = $sessionIds;
  1130.         $url $this->generateUrl'press-wishlist' );
  1131.         return new JsonResponse( [
  1132.             "success" => true,
  1133.             "activeIds" => array_valuesarray_map'intval'$sessionIds ) ),
  1134.             "__alertNotification" => [
  1135.                 "type" => "notification-default",
  1136.                 "content" => $this->renderView'Press/Includes/wishlist/pressarticle-remove-notification.html.twig'array_merge$request->request->all(), [
  1137.                     'url' => $this->getWishlistUrl($request),
  1138.                 ] ) )
  1139.             ]
  1140.         ] );
  1141.     }
  1142.     /**
  1143.      * @Route("/{_locale}/press/media-asset/add-to-wishlist", name="press-media-asset-item-wishlist-add")
  1144.      */
  1145.     public function addPressMediaAssetToWishlistRequest $request //todo
  1146.     {
  1147.         $id $request->get'id' );
  1148.         $sessionIds $request->getSession()->get'pressMediaAssetsWishlistIds', [] );
  1149.         $sessionIds[] = $id;
  1150.         $request->getSession()->set'pressMediaAssetsWishlistIds'$sessionIds );
  1151.         $returnArr'ids' ] = $sessionIds;
  1152.         $url $this->generateUrl'press-wishlist' );
  1153.         return new JsonResponse( [
  1154.             "success" => true,
  1155.             "activeIds" => array_valuesarray_map'intval'$sessionIds ) ),
  1156.             "__alertNotification" => [
  1157.                 "type" => "notification-default",
  1158.                 "content" => $this->renderView'Press/Includes/wishlist/pressarticle-add-notification.html.twig'array_merge$request->request->all(), [
  1159.                     'url' => $this->getWishlistUrl($request),
  1160.                     'tkText' => 'media-asset',
  1161.                 ] ) )
  1162.             ]
  1163.         ] );
  1164.     }
  1165.     /**
  1166.      * @Route("/{_locale}/press/media-asset/remove-from-wishlist", name="press-media-asset-item-wishlist-remove")
  1167.      */
  1168.     public function removePressMediaAssetFromWishlistRequest $request //todo
  1169.     {
  1170.         $id $request->get'id' );
  1171.         $sessionIds $request->getSession()->get'pressMediaAssetsWishlistIds', [] );
  1172.         if( ( $key array_search$id$sessionIds ) ) !== false ){
  1173.             unset( $sessionIds$key ] );
  1174.         }
  1175.         $request->getSession()->set'pressMediaAssetsWishlistIds'$sessionIds );
  1176.         $returnArr'ids' ] = $sessionIds;
  1177.         $url $this->generateUrl'press-wishlist' );
  1178.         return new JsonResponse( [
  1179.             "success" => true,
  1180.             "activeIds" => array_valuesarray_map'intval'$sessionIds ) ),
  1181.             "__alertNotification" => [
  1182.                 "type" => "notification-default",
  1183.                 "content" => $this->renderView'Press/Includes/wishlist/pressarticle-remove-notification.html.twig'array_merge$request->request->all(), [
  1184.                     'url' => $this->getWishlistUrl($request),
  1185.                     'tkText' => 'media-asset'
  1186.                 ] ) )
  1187.             ]
  1188.         ] );
  1189.     }
  1190.     /**
  1191.      * @param Request $request
  1192.      * @Route("/{_locale}/press-picture-list", name="press-picture-list")
  1193.      */
  1194.     public function getPressPictureListRequest $requestPaginatorInterface $paginator )
  1195.     {
  1196.         $paginator $this->getPaginatorForPressImages$request$paginator );
  1197.         return new JsonResponse( [
  1198.             'success' => true,
  1199.             "html" => $this->renderView'Press/Includes/pressPictureList.html.twig', [
  1200.                 "paginator" => $paginator,
  1201.                 'activePressPicturesWishlistIds' => $this->activePressPicturesWishlistIds
  1202.             ] ),
  1203.         ] );
  1204.     }
  1205.     private function getPaginatorForPressImagesRequest $requestPaginatorInterface $paginatorAsset\Listing $articlesList null )
  1206.     {
  1207.         if($articlesList === null) {
  1208.             $articlesList $this->getPressImageListing($request);
  1209.         }
  1210.         $perPage $this->getDocumentEditable'numeric''imagesPerPage' ) ? $this->getDocumentEditable'numeric''imagesPerPage' )->getData() : 16;
  1211.         if( $perPage ){
  1212.             $perPage 16;
  1213.         }
  1214.         return $paginator->paginate$articlesList$request->get'page'), $perPage );
  1215.     }
  1216.     private function getPressImageListing(Request $request): Asset\Listing
  1217.     {
  1218.         $prefilterRegionId $this->getDocumentEditable'relation''prefilter-region' )->getData() ? $this->getDocumentEditable'relation''prefilter-region' )->getData()[ 'id' ] : null;
  1219.         $isMainRegion false;
  1220.         if(empty($prefilterRegionId)) {
  1221.             $region $this->document->getProperty('region');
  1222.             if($region) {
  1223.                 $prefilterRegionId $region->getId();
  1224.                 $isMainRegion $region->getIsMainRegion();
  1225.             }
  1226.         }
  1227.         $keyword $request->get'keyword''' );
  1228.         $category $request->get'category''' );
  1229.         if(!empty($category) && count($category) < && empty($category[0])) { //check if no empty query param is set
  1230.             $category = [];
  1231.         }
  1232.         $season $request->get'season''' );
  1233.         if(!empty($season) && count($season) < && empty($season[0])) { //check if no empty query param is set
  1234.             $season = [];
  1235.         }
  1236.         $orientation $request->get'orientation', [] );
  1237.         $isPortrait false;
  1238.         $isLandscape false;
  1239.         foreach( $orientation as $mode ){
  1240.             if( $mode === 'portrait' ){
  1241.                 $isPortrait true;
  1242.             }elseif( $mode === 'landscape' ){
  1243.                 $isLandscape true;
  1244.             }
  1245.         }
  1246.         return $this->getMediaArchiveImages$request->getLocale(), $category$season$keyword$isLandscape$isPortrait$prefilterRegionId,$isMainRegion );
  1247.     }
  1248.     private function getMediaArchiveImages($locale 'de'$categoryId ''$seasonId = [], $keyword ''bool $isLandscape falsebool $isPortrait falseint $preFilterRegionId null$isMainRegion false) : Asset\Listing {
  1249.         $count 1//count how many conditions have to be true, always has to be in media archive
  1250.         if( !empty( $categoryId ) || !empty( $seasonId ) ) $count++;
  1251.         $keywords = !empty($keyword) ? explode(' '$keyword) : [];
  1252.         $keywordObjects = [];
  1253.         foreach ($keywords as $kw) {
  1254.             $kwObject MediaKeyword::getByWord($kw$locale1);
  1255.             if($kwObject) {
  1256.                 $keywordObjects[] = $kwObject;
  1257.             }
  1258.         }
  1259.         $orientation '';
  1260.         if( ( $isPortrait || $isLandscape ) && !( $isPortrait && $isLandscape ) ){
  1261.             if( $isPortrait ){
  1262.                 $orientation 'Portrait';
  1263.             }else{
  1264.                 $orientation 'Landscape';
  1265.             }
  1266.             $count++;
  1267.         }
  1268.         $mediaArchiveAssetListing = new Asset\Listing();
  1269.         $mediaArchiveAssetListing->addConditionParam"assets.type = 'image'" );
  1270.         $mediaArchiveAssetListing->onCreateQueryBuilder(
  1271.             function( \Doctrine\DBAL\Query\QueryBuilder $queryBuilder ) use ( $mediaArchiveAssetListing ){
  1272.                 $queryBuilder->join'assets''assets_metadata''metadata''metadata.cid = assets.id' );
  1273.                 //$queryBuilder->join(  ['metadata' => 'assets_metadata'], 'cid = id' );
  1274.             }
  1275.         );/*
  1276.         $mediaArchiveAssetListing->onCreateQuery(function (\Pimcore\Db\ZendCompatibility\QueryBuilder $query) {
  1277.             $query->joinLeft(
  1278.                 ['metadata' => 'assets_metadata'],
  1279.                 'cid = id'
  1280.             );
  1281.         });*/
  1282.         if( $preFilterRegionId ){
  1283.             $mediaArchiveAssetListing->addConditionParam"id IN (
  1284.             Select distinct cid
  1285.             from assets_metadata amr
  1286.             where (amr.name = 'General.regions' and amr.data LIKE '%[\"object\",$preFilterRegionId]%')" .
  1287.                  ($isMainRegion ' OR (amr.name = "General.regions" and amr.data = "[]" OR NOT EXISTS(Select * from assets_metadata am_ne where am_ne.name = "General.regions" and am_ne.cid = amr.cid))' '') .
  1288.             ")" );
  1289.         }
  1290.         $mediaArchiveAssetListing->addConditionParam"id IN (
  1291.         Select distinct cid
  1292.             from assets_metadata am
  1293.             where
  1294.                   (" .
  1295.             $this->filterBySeasonAndCategories($categoryId$seasonId)
  1296.             . //is not first condition
  1297.             (!empty($orientation) ? " (am.name = 'General.is" $orientation "' and am.data = 1) " "") .
  1298.             ( $orientation " or " "") . //is orientation was set
  1299.             "(name = 'General.mediaArchive' and data = 1 ) " .
  1300.             $this->addKeywordAndAuthorCondition($keywords$keywordObjects' OR ') .
  1301.             ")
  1302.                 Group By cid
  1303.                 having count(cid) = " $count "
  1304.             )");
  1305.         $mediaArchiveAssetListing->addConditionParam('metadata.name = "General.number" ');
  1306.         $mediaArchiveAssetListing->setOrderKey('cast(data as unsigned) DESC'false); //number is stored as string in db
  1307.         return $mediaArchiveAssetListing;
  1308.     }
  1309.     /**
  1310.      * @param Request $request
  1311.      * @Route("/{_locale}/press/login", name="press-login")
  1312.      */
  1313.     public function pressLoginRequest $request )
  1314.     {
  1315.         $successpage WebsiteSetting::getByName'pressLoginSuccesspage' )->getData();
  1316.         $errorpage WebsiteSetting::getByName'pressLoginErrorpage' )->getData();
  1317.         if( ( $email $request->get'email' ) ) && ( $password $request->get'password' ) ) ){
  1318.             $user MediaUser::getByEmail$email);
  1319.             if( $user && password_verify$password$user->getPassword() ) ){
  1320.                 $pressSession $request->getSession()->getBag"pressLogin" );
  1321.                 $pressSession->set'userid'$user->getId() );
  1322.                 if( $pressSession->get'lastVisited' ) ){
  1323.                     $successpage $pressSession->get'lastVisited' );
  1324.                     $pressSession->set'lastVisited''' );
  1325.                 }
  1326.                 return new RedirectResponse$successpage );
  1327.             }
  1328.         }
  1329.         return new RedirectResponse$errorpage ?: $successpage );
  1330.     }
  1331.     /**
  1332.      * @param Request $request
  1333.      * @Route("/{_locale}/press/logout", name="press-logout")
  1334.      */
  1335.     public function logoutRequest $request )
  1336.     {
  1337.         $pressSession $request->getSession()->getBag"pressLogin" );
  1338.         $pressSession->set'userid'null );
  1339.         $successpage WebsiteSetting::getByName'pressLogoutSuccesspage' )->getData();
  1340.         if( $pressSession->get'lastVisited' ) ){
  1341.             $successpage $pressSession->get'lastVisited' );
  1342.             $pressSession->set'lastVisited''' );
  1343.         }
  1344.         return new RedirectResponse$successpage );
  1345.     }
  1346.     private function getCategoriesDropdownItemsMediaCategory\Listing $pressCategoriesListing$selectedCat false, array $activeCategories = [] )
  1347.     {
  1348.         if(!empty($selectedCat) && !is_array($selectedCat)) {
  1349.             $selectedCat = [$selectedCat];
  1350.         }
  1351.         $categoryItems = [ [
  1352.             "label" => "",
  1353.             "value" => "",
  1354.             "name" => "",
  1355.             "id" => "",
  1356.             "disabled" => false,
  1357.             "selected" => !$selectedCat,
  1358.             "checked" => !$selectedCat,
  1359.             "class" => "sr-only"
  1360.         ] ];
  1361.         foreach( $pressCategoriesListing as $cat ){
  1362.             $hasParent false;
  1363.             if(empty($activeCategories) || in_array($cat->getId(), $activeCategoriestrue)) {
  1364.                 $categoryItems[] = [
  1365.                     "label" => $cat->getName(),
  1366.                     "value" => $cat->getId(),
  1367.                     "id" => $cat->getId(),
  1368.                     "name" => 'category[]',
  1369.                     "selected" => $selectedCat && in_array($cat->getId(), $selectedCat),
  1370.                     "checked" => $selectedCat && in_array($cat->getId(), $selectedCat),
  1371.                     "class" => "",
  1372.                     'is-child' => false
  1373.                 ];
  1374.                 $hasParent true;
  1375.             }
  1376.             if($cat->getChildren()) { //get all children in Pimcore object tree
  1377.                 $subCategoryList = new \Pimcore\Model\DataObject\MediaCategory\Listing();
  1378.                 $subCategoryList->addConditionParam('o_id IN ('implode(','array_map(function($child) {
  1379.                         return $child->getId();
  1380.                     }, $cat->getChildren() )) . ')');
  1381.                 $subCategoryList->setOrderKey('sorting');
  1382.                 $subCategoryList->setOrder('ASC');
  1383.                 foreach($subCategoryList as $child) {
  1384.                     if(empty($activeCategories) || in_array($child->getId(), $activeCategoriestrue)) {
  1385.                         $categoryItems[] = [
  1386.                             "label" => $child->getName(),
  1387.                             "value" => $child->getId(),
  1388.                             "id" => $child->getId(),
  1389.                             "name" => 'category[]',
  1390.                             "selected" => $selectedCat && in_array($child->getId(), $selectedCat),
  1391.                             "checked" => $selectedCat && in_array($child->getId(), $selectedCat),
  1392.                             "class" => "",
  1393.                             'is-child' => $hasParent
  1394.                         ];
  1395.                     }
  1396.                 }
  1397.             }
  1398.         }
  1399.         return $categoryItems;
  1400.     }
  1401.     private function getSeasonSelect( array $seasons$seasonId null )
  1402.     {
  1403.         $seasonItems = [ [
  1404.             "label" => "",
  1405.             "value" => "",
  1406.             "disabled" => true,
  1407.             "selected" => !$seasonId,
  1408.             "class" => "sr-only"
  1409.         ] ];
  1410.         foreach( $seasons as $season ){
  1411.             if( $season instanceof MediaCategory ){
  1412.                 $seasonItems[] = [
  1413.                     "label" => $season->getName(),
  1414.                     "value" => $season->getId(),
  1415.                     "id" => $season->getId(),
  1416.                     "name" => 'season[]',
  1417.                     "selected" => $seasonId && $seasonId == $season->getId(),
  1418.                     "checked" => $seasonId && in_array($season->getId(), $seasonId),
  1419.                     "class" => "",
  1420.                 ];
  1421.             }
  1422.         }
  1423.         return $seasonItems;
  1424.     }
  1425.     private function getPressCategoriesDropdownItemsPressCategory\Listing $pressCategoriesListing$selectedCat )
  1426.     {
  1427.         $categoryItems = [ [
  1428.             "label" => '',
  1429.             "value" => "",
  1430.             "disabled" => true,
  1431.             "selected" => !$selectedCat,
  1432.             "class" => "sr-only"
  1433.         ], [
  1434.             "label" => $this->translator->trans"press.no-category" ),
  1435.             "value" => "all",
  1436.             "disabled" => false,
  1437.             "selected" => !$selectedCat,
  1438.             "class" => "sr-only"
  1439.         ] ];
  1440.         foreach( $pressCategoriesListing as $cat ){
  1441.             $categoryItems[] = [
  1442.                 "label" => $cat->getName(),
  1443.                 "value" => $cat->getId(),
  1444.                 "selected" => $selectedCat && $selectedCat == $cat->getId(),
  1445.                 "class" => "",
  1446.             ];
  1447.         }
  1448.         return $categoryItems;
  1449.     }
  1450.     private function getMediaCategories(Request $request$onlyParents true): MediaCategory\Listing
  1451.     {
  1452.         $mediaCategoriesListing = new MediaCategory\Listing();
  1453.         $mediaCategoriesListing->addConditionParam('name != "" AND name IS NOT NULL');
  1454.         $mediaCategoriesListing->addConditionParam('hidden is NULL OR hidden = 0');
  1455.         if ($onlyParents){
  1456.             //get all parent classes
  1457.             $categoryClassId 'MediaCategory';
  1458.             $mediaCategoriesListing->addConditionParam('EXISTS(SELECT NULL FROM objects sub WHERE sub.o_id = object_localized_'.$categoryClassId.'_'.$request->getLocale().'.o_parentId AND sub.o_type = "folder")');
  1459.         }
  1460.         $mediaCategoriesListing->setOrderKey( [ 'sorting''name' ] );
  1461.         $mediaCategoriesListing->setOrder'ASC' );
  1462.         return $mediaCategoriesListing;
  1463.     }
  1464.     /**
  1465.      * @param string[] $keywords
  1466.      * @param MediaKeyword[] $keywordObjects
  1467.      */
  1468.     private function addKeywordAndAuthorCondition(array $keywords, array $keywordObjects$keywordConcat ' AND ') : string
  1469.     {
  1470.         $returnString '';
  1471.         if(!empty($keywords)) {
  1472.             $returnString "and ( cid IN (
  1473.                 Select distinct cid
  1474.                 FROM  assets_metadata am
  1475.                 WHERE (";
  1476.             $first true;
  1477.             foreach($keywords as $keyword) {
  1478.                 $returnString .=  ($first ' (': ($keywordConcat ' (')) . "(name = 'General.mediaArchive' and data = 1 ) " .
  1479.                     "or (am.name = 'General.title' and am.data like '%" htmlspecialchars($keyword) . "%')" .
  1480.                     "or (am.name = 'General.description' and am.data like '%" htmlspecialchars($keyword) . "%')" .
  1481.                     "or (am.name = 'General.number' and am.data like '" htmlspecialchars($keyword) . "%')"//first number hast to match e.g. 15 => gets all numbers that start with 15 like 15632, 151, 15, but not 215, 1315
  1482.                 $first false;
  1483.                 $contactListing = new Contact\Listing();
  1484.                 $contactListing->addConditionParam('name LIKE :authorKw or contactName LIKE :authorKw', ['authorKw' => "%" $keyword "%"]);
  1485.                 if($contactListing->getCount()) {
  1486.                     $contactIds array_map(function($contact) {
  1487.                         return $contact->getId();
  1488.                     },$contactListing->getObjects());
  1489.                     $returnString .= "or (am.name = 'General.author' and am.data IN (" implode(','$contactIds) . "))";
  1490.                 }
  1491.                 $returnString .= ') ';
  1492.             }
  1493.             if(!empty($keywordObjects)) {
  1494.                 $returnString .= " or (am.name = 'General.keywords' ";
  1495.                 foreach($keywordObjects as $keywordObject) {
  1496.                     $returnString .= "AND am.data like '%\"object\"," $keywordObject->getId() . "]%'";
  1497.                 }
  1498.                 $returnString .= ')';
  1499.             }
  1500.             $returnString .= ")
  1501.                Group By cid
  1502.                having count(cid) >= " count($keywords)+"
  1503.            )
  1504.            )";
  1505.         }
  1506.         return $returnString;
  1507.     }
  1508.     private function filterBySeasonAndCategories($categoryIds$seasonIds) : string
  1509.     {
  1510.         $returnString '';
  1511.         if(!empty($categoryIds)) {
  1512.             if(!empty($seasonIds)) {
  1513.                 $returnString .= '(';
  1514.             }
  1515.             $returnString .= '(';
  1516.             $first true;
  1517.             foreach ($categoryIds as $categoryId) {
  1518.                 if(!$first) {
  1519.                     $returnString .= ' OR ';
  1520.                 } else {
  1521.                     $first false;
  1522.                 }
  1523.                 $returnString .= " (am.name = 'General.categories' and am.data like '%\"object\"," . (int)$categoryId "]%') ";
  1524.             }
  1525.             $returnString .= ')';
  1526.         }
  1527.         if(!empty($seasonIds)) {
  1528.             $returnString .= (!empty($categoryIds) ? " AND " "") . '(';
  1529.             $first true;
  1530.             foreach ($seasonIds as $seasonId) {
  1531.                 if(!$first) {
  1532.                     $returnString .= ' OR ';
  1533.                 } else {
  1534.                     $first false;
  1535.                 }
  1536.                 $returnString .= " (am.name = 'General.categories' and am.data like '%\"object\"," . (int)$seasonId "]%') ";
  1537.             }
  1538.             $returnString .= ')' . (!empty($categoryIds) ? " ) " "");
  1539.         }
  1540.         if ($returnString !== '') {
  1541.             $returnString '(' $returnString ')';
  1542.         }
  1543.         if(!empty($categoryId) || !empty($seasonIds)) {
  1544.             $returnString .= ' OR ';
  1545.         }
  1546.         return $returnString;
  1547.     }
  1548.     private function isExcludedURL(string $currentPath, array $excludeURLs) : bool
  1549.     {
  1550.         foreach ($excludeURLs as $excludeURL) {
  1551.             if(str_contains($currentPath$excludeURL)) {
  1552.                 return true;
  1553.             }
  1554.         }
  1555.         return false;
  1556.     }
  1557.     private function getWatchlistURLs()
  1558.     {
  1559.         $cacheKey 'watchlistURLs';
  1560.         $data \Pimcore\Cache::load($cacheKey);
  1561.         if (!empty($data)) {
  1562.             return $data;
  1563.         }
  1564.         $data = [];
  1565.         $configList = new SiteConfig\Listing();
  1566.         $languages Tool::getValidLanguages();
  1567.         foreach ($configList as $config) {
  1568.             foreach ($languages as $language) {
  1569.                 if($config->getPressWatchlist($language)) {
  1570.                     $data[$config->getPressWatchlist($language)->getId()] = $config->getPressWatchlist($language)->getFullPath();
  1571.                 }
  1572.             }
  1573.         }
  1574.         $cacheTime 86400//== 1 day in seconds
  1575.         \Pimcore\Cache::save($data$cacheKey, [], $cacheTime0true);
  1576.         return $data;
  1577.     }
  1578.     private function addLastVisitedToSession(Request $requeststring $sessionBagName, array $excludeUrlstring $flashname 'lastVisited'string $anchor '')
  1579.     {
  1580.         if( $request->getPathInfo() &&
  1581.             !$this->isExcludedURL($request->getPathInfo(), $excludeUrl)
  1582.         ){
  1583.             $pressLoginSession $request->getSession()->getBag$sessionBagName );
  1584.             $pressLoginSession->set($flashname$request->getRequestUri() . $anchor );
  1585.         }
  1586.     }
  1587.     private function getMediaAlbumAssets(array $albumItems, array &$assetsbool $hideTitle true) {
  1588.         foreach ($albumItems as $item) {
  1589.             if($item instanceof Asset\Image) {
  1590.                 $assets[] = [
  1591.                     'template' => 'Includes/Teaser/media-album-item-teaser.html.twig',
  1592.                     'params' => [
  1593.                         'image' => $item,
  1594.                         "wishlistActive" => in_array($item->getId(), $this->activePressPicturesWishlistIdstrue),
  1595.                         "isVideo" => false,
  1596.                         "video" => null,
  1597.                         "hideTitle" => $hideTitle,
  1598.                     ],
  1599.                     'id' => $item->getId(),
  1600.                 ];
  1601.             } elseif($item instanceof Asset\Video) {
  1602.                 $assets[] = [
  1603.                     'template' => 'Includes/Teaser/media-album-item-teaser.html.twig',
  1604.                     'params' => [
  1605.                         'image' => null,
  1606.                         "wishlistActive" => in_array($item->getId(), $this->activePressPicturesWishlistIdstrue),
  1607.                         "isVideo" => true,
  1608.                         "video" => $item,
  1609.                         "hideTitle" => $hideTitle,
  1610.                     ],
  1611.                     'id' => $item->getId(),
  1612.                 ];
  1613.             } elseif($item instanceof Asset\Folder) {
  1614.                 $this->getMediaAlbumAssets($item->getChildren(), $assets$hideTitle);
  1615.             }
  1616.         }
  1617.     }
  1618.     private function createNewUser(array $requiredParams, array $optionalParams$token)
  1619.     {
  1620.         $isNewUser false;
  1621.         $user MediaUser::getByEmail($requiredParams'email' ], 1);
  1622.         if(!$user) {
  1623.             $user = new MediaUser();
  1624.             $user->setParentService::createFolderByPath'Press/User/Registered' ) );
  1625.             $user->setKeyFile::getValidFilename$requiredParams'email' ] ) );
  1626.             $user->setToken$token );
  1627.             $user->setTokenTimeCarbon::now() );
  1628.             $isNewUser true;
  1629.             $user->setPublishedfalse );
  1630.         }
  1631.         $user->setEmail$requiredParams'email' ] );
  1632.         $user->setPassword$requiredParams'password' ] );
  1633.         $user->setTitle( isset( $optionalParams'title' ] ) ? $optionalParams'title' ] : '' );
  1634.         $user->setFirstname$requiredParams'firstname' ] );
  1635.         $user->setLastname$requiredParams'lastname' ] );
  1636.         $user->setStreet$requiredParams'street' ] );
  1637.         $user->setZip$requiredParams'zip' ] );
  1638.         $user->setCity$requiredParams'city' ] );
  1639.         $user->setPhone$requiredParams'phone' ] );
  1640.         $user->setCompany$requiredParams'company' ] );
  1641.         $user->save();
  1642.         return [$user$isNewUser];
  1643.     }
  1644.     private function addRegistrationParamsToUser(MediaUser $userRegion $region, array $requiredParams, array $optionalParams\Pimcore\DataObject\Consent\Service $consentServiceTranslator $translatorRequest $request)
  1645.     {
  1646.         if($region->getIsMainRegion()) {
  1647.             $user->setUsage$requiredParams'usage' ] );
  1648.             $user->setMessage($optionalParams['message'] ?? '');
  1649.             $user->setSendRegistrationCompletedMailtrue );
  1650.             $consentService->giveConsent$user'consent'$translator->trans'press-registration.Ich stimme den <a href="#">Datenschutzbestimmungen</a> zu.' ), [ 'ip' => $request->getClientIp() ] );
  1651.         } else {
  1652.            $blockElements $user->getFurtherRegionsBlock();
  1653.            $consentNote $consentService->insertConsentNote($user'consentFurtherRegion-' $region->getName() , $translator->trans'press-registration.Ich stimme den <a href="#">Datenschutzbestimmungen</a> zu.', [ 'ip' => $request->getClientIp() ]));
  1654.            $newBlockElement = [
  1655.                'region' => new BlockElement('region''relation'$region),
  1656.                'consentFurtherRegion' => new BlockElement('consentFurtherRegion''consent', new Consent(true$consentNote->getId() )),
  1657.                'confirmedFurtherRegion' => new BlockElement('confirmedFurtherRegion''checkbox'false),
  1658.                'sendRegistrationCompletedMailFurtherRegion' => new BlockElement('sendRegistrationCompletedMailFurtherRegion''checkbox'true),
  1659.                'usageFurtherRegion' => new BlockElement('usageFurtherRegion''textarea'$requiredParams'usage' ]),
  1660.                'messageFurtherRegion' => new BlockElement('messageFurtherRegion''textarea'$optionalParams['message'] ?? ''),
  1661.            ];
  1662.            $blockElements[] = $newBlockElement;
  1663.            $user->setFurtherRegionsBlock($blockElements);
  1664.         }
  1665.         $user->save();
  1666.     }
  1667.     private function sendConfiremedRegistrationMail(MediaUser $user) : bool
  1668.     {
  1669.         $success false;
  1670. //        $user->setPublished( false );
  1671.         $user->setToken'' );
  1672.         $user->save();
  1673.         $mailDoc Document::getById$this->getDocumentEditable'relation''notificationmail' )->getData()[ 'id' ] );
  1674.         if( $mailDoc instanceof Email ){
  1675.             $notification = new \Pimcore\Mail();
  1676.             $params = [
  1677.                 'title' => $user->getTitle(),
  1678.                 'firstname' => $user->getFirstname(),
  1679.                 'lastname' => $user->getLastname(),
  1680.                 'street' => $user->getStreet(),
  1681.                 'zip' => $user->getZip(),
  1682.                 'city' => $user->getCity(),
  1683.                 'phone' => $user->getPhone(),
  1684.                 'company' => $user->getCompany(),
  1685.                 'usage' => $user->getUsage(),
  1686.                 'message' => $user->getMessage(),
  1687.                 'email' => $user->getEmail(),
  1688.             ];
  1689.             $params'deeplink' ] = Tool::getHostUrl() . '/admin/login/deeplink?object_' $user->getId() . '_object';
  1690.             $params'items' ] = array_keys$params );
  1691.             $notification->setDocument$mailDoc );
  1692.             $notification->setParams$params );
  1693. //                    $notification->setFrom($user->getEmail());
  1694.             $notification->send();
  1695.             $success true;
  1696.         }
  1697.         return $success;
  1698.     }
  1699.     /**
  1700.      * @param Region[] $getMetadata
  1701.      * @param array $regionCollection
  1702.      */
  1703.     private function addRegionsToArray(array $newRegions, array &$regionCollection)
  1704.     {
  1705.         foreach ($newRegions as $region) {
  1706.             $regionCollection[$region->getId()] = $region;
  1707.         }
  1708.     }
  1709.     private function getActiveCategories(Asset\Listing $assetListing) {
  1710.         $activeCategoryIds = [];
  1711.         foreach ($assetListing as $asset) {
  1712.             foreach($asset->getMetadata('General.categories') ?? [] as $category) {
  1713.                 $activeCategoryIds[$category->getId()] = $category->getId();
  1714.             }
  1715.         }
  1716.         return $activeCategoryIds;
  1717.     }
  1718.     private function getWishlistUrl(Request $request)
  1719.     {
  1720.         $url '';
  1721.         $document Document::getById($request->get('documentId'));
  1722.         $config $document->getProperty('siteConfig');
  1723.         if($config instanceof SiteConfig) {
  1724.             $url $config->getPressWatchlist($request->getLocale())?->getFullPath();
  1725.         }
  1726.         if(empty($url)) {
  1727.             $url $this->generateUrl'press-wishlist' );
  1728.         }
  1729.         return $url;
  1730.     }
  1731.     private function getWishlists()
  1732.     {
  1733.         return [
  1734.             'activePressArticlesWishlistIds' => $this->activePressArticlesWishlistIds,
  1735.             'activePressDossiersWishlistIds' => $this->activePressDossiersWishlistIds,
  1736.             'activePressPicturesWishlistIds' => $this->activePressPicturesWishlistIds,
  1737.             'activePressAlbumWishlistIds' => $this->activePressAlbumWishlistIds,
  1738.             'activePressAlbumItemsWishlistIds' => $this->activePressAlbumItemsWishlistIds,
  1739.             'activePressMediaAssetsWishlistIds' => $this->activePressMediaAssetsWishlistIds,
  1740.         ];
  1741.     }
  1742. }