src/Controller/PressController.php line 508

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.         $paginator $paginator->paginate$mediaAssetListing$request->get'page'), 16 );
  676.         $paginator->setPageRange);
  677.         $returnArray array_merge([
  678.             'paginator' => $paginator,
  679.             'pressCategories' => $this->getCategoriesDropdownItems$mediaCategoriesListing$request->get'category''' ) ),
  680.         ], $this->getWishlists());
  681.         if( $request->isXmlHttpRequest()) {
  682.             return new JsonResponse( [
  683.                 'success' => true,
  684.                 'html' => $this->renderView'Press/Includes/pressPictureList.html.twig'$returnArray )
  685.             ] );
  686.         }
  687.         return $this->render'Press/mediaAssetOverview.html.twig'$returnArray );
  688.     }
  689.     public function mediaAlbumDetailAction(Request $request) {
  690.         $mediaAlbum MediaAlbum::getById($request->get('id'));
  691.         if(!$mediaAlbum) {
  692.             throw new NotFoundHttpException('Media Album not found');
  693.         }
  694.         $assetTemplates = [];
  695.         $this->getMediaAlbumAssets($mediaAlbum->getAlbumItems(), $assetTemplates, !(bool)$mediaAlbum->getShowAssetTitle());
  696.         //overview is a content area
  697.         $returnArray array_merge([
  698.             'mediaAlbum' => $mediaAlbum,
  699.             'assetTemplates' => $assetTemplates,
  700.         ], $this->getWishlists());
  701.         return $this->render'Press/mediaAlbumDetail.html.twig'$returnArray );
  702.     }
  703.     public function mediaAssetDetailAction(Request $request) {
  704.         $mediaAsset MediaAsset::getById($request->get('id'));
  705.         if(!$mediaAsset) {
  706.             throw new NotFoundHttpException('Media Asset not found');
  707.         }
  708.         $assetTemplates = [];
  709.         $posterImage $mediaAsset?->getPosterImage();
  710.         $returnArray array_merge([
  711.             'mediaAsset' => $mediaAsset,
  712.             'title' => $mediaAsset->getTitle() ?: $posterImage?->getMetadata('General.title'),
  713.             'description' => $mediaAsset->getDescription() ?: $posterImage?->getMetadata('General.description'),
  714.             'number' => $mediaAsset->getNumber() ?: $posterImage?->getMetadata('General.number'),
  715.             'imageTexts' => [
  716.                 'copyright' => $mediaAsset?->getCopyright()?->getText() ?: $mediaAsset?->getRights() ?: $posterImage?->getMetadata('General.copyright'),
  717.                 'author'  => $mediaAsset?->getAuthor()?->getName(),
  718.                 'usage' => $mediaAsset?->getRights() ?: $posterImage?->getMetadata('General.usage'),
  719.             ],
  720.             'asset' => $mediaAsset->getAsset(),
  721.         ], $this->getWishlists());
  722.         return $this->render'Press/mediaAssetDetail.html.twig'$returnArray );
  723.     }
  724.     /**
  725.      * @Route("/{_locale}/press/wishlist", name="press-wishlist")
  726.      * @param Request $request
  727.      * @return array
  728.      */
  729.     public function wishlistActionRequest $request )
  730.     {
  731.         if( $request->get'removeAllPressArticlesFromWishlist' ) !== null ){
  732.             $request->getSession()->set'pressArticleWishlistIds', [] );
  733.             $this->activePressArticlesWishlistIds = [];
  734.         }
  735.         if( $request->get'removeAllPressImagesFromWishlist' ) !== null ){
  736.             $request->getSession()->set'pressImageWishlistIds', [] );
  737.         }
  738.         if( $request->get'removeAllPressDossiersFromWishlist' ) !== null ){
  739.             $request->getSession()->set'pressDossierWishlistIds', [] );
  740.             $this->activePressDossiersWishlistIds = [];
  741.         }
  742.         if( $request->get'removeAllPressAlbumsFromWishlist' ) !== null ){
  743.             $request->getSession()->set'pressAlbumWishlistIds', [] );
  744.             $this->activePressDossiersWishlistIds = [];
  745.         }
  746.         if( $request->get'removeAllPressAlbumItemsFromWishlist' ) !== null ){
  747.             $request->getSession()->set'pressAlbumItemsWishlistIds', [] );
  748.             $this->activePressDossiersWishlistIds = [];
  749.         }
  750.         if( $request->get'removeAllPressMediaAssetsWishlistIds' ) !== null ){
  751.             $request->getSession()->set'pressMediaAssetsWishlistIds', [] );
  752.             $this->activePressMediaAssetsWishlistIds = [];
  753.         }
  754.         $mainRegion $this->regionExtension->getMainRegion();
  755.         $regions = []; //save all regions for user guidlines tabing
  756.         //themensammlungen == dossiers
  757.         $pressDossiers = [];
  758.         $pressDossierIds $request->getSession()?->get'pressDossierWishlistIds', [] );
  759.         if( !empty( $pressDossierIds ) ){
  760.             foreach( $pressDossierIds as $id ){
  761.                 if( $pressDossier PressDossier::getById$id ) ){
  762.                     $pressDossiers[] = $pressDossier;
  763.                     $this->addRegionsToArray(!empty($pressDossier->getRegion()) ? $pressDossier->getRegion() : [$mainRegion], $regions);
  764.                 }
  765.             }
  766.         }
  767.         //Pressarticles
  768.         $pressArticleIds $request->getSession()?->get'pressArticleWishlistIds', [] );
  769.         $pressArticles = [];
  770.         if( !empty( $pressArticleIds ) ){
  771.             foreach( $pressArticleIds as $id ){
  772.                 if( $pressArticle PressArticle::getById$id ) ){
  773.                     $pressArticles[] = $pressArticle;
  774.                     $this->addRegionsToArray(!empty($pressArticle->getRegion()) ? [$pressArticle->getRegion()]:  [$mainRegion], $regions);
  775.                 }
  776.             }
  777.         }
  778.         $pressImagesIds $request->getSession()?->get'pressImageWishlistIds', [] );
  779.         $pressImages = [];
  780.         if( !empty( $pressImagesIds ) ){
  781.             foreach( $pressImagesIds as $id ){
  782.                 if( ( $image Asset::getById$id ) ) && $image->getMetadata'General.mediaArchive' ) && $image->getMetadata'General.mediaArchive' ) == ){
  783.                     $pressImages[] = $image;
  784.                     $this->addRegionsToArray(!empty($image->getMetadata('General.regions')) ? $image->getMetadata('General.regions') : [$mainRegion], $regions);
  785.                 }
  786.             }
  787.         }
  788.         $pressAlbumIds $request->getSession()?->get'pressAlbumWishlistIds', [] );
  789.         $mediaAlbums = [];
  790.         if( !empty( $pressAlbumIds ) ){
  791.             foreach( $pressAlbumIds as $id ){
  792.                 if($mediaAlbum MediaAlbum::getById($id)){
  793.                     $mediaAlbums[] = $mediaAlbum;
  794.                 }
  795.             }
  796.         }
  797.         $pressAlbumItemsIds $request->getSession()?->get'pressAlbumItemsWishlistIds', [] );
  798.         $mediaAlbumItems = [];
  799.         if( !empty( $pressAlbumItemsIds ) ){
  800.             foreach( $pressAlbumItemsIds as $id ){
  801.                 if($mediaAlbumItem Asset::getById($id)){
  802.                     $mediaAlbumItems[] = $mediaAlbumItem;
  803.                 }
  804.             }
  805.         }
  806.         $mediaAlbumItemsAssets = [];
  807.         $this->getMediaAlbumAssets($mediaAlbumItems$mediaAlbumItemsAssetsfalse);
  808.         $pressMediaAssetIds $request->getSession()?->get('pressMediaAssetsWishlistIds', []);
  809.         $mediaAssets = [];
  810.         if(!empty($pressMediaAssetIds)) {
  811.             foreach ($pressMediaAssetIds as $id) {
  812.                 if($mediaAssetItem MediaAsset::getById($id)) {
  813.                     $mediaAssets[] = $mediaAssetItem;
  814.                 }
  815.             }
  816.         }
  817.         if(empty($regions)) {
  818.             $regions[] = $mainRegion;
  819.         }
  820.         ksort($regions); //sort by id
  821.         $returnArray array_merge([
  822.             'pressArticles' => $pressArticles,
  823.             'pressDossiers' => $pressDossiers,
  824.             'pressImages' => $pressImages,
  825.             'mediaAlbums' => $mediaAlbums,
  826.             'mediaAlbumItems' => $mediaAlbumItemsAssets,
  827.             'mediaAssets' => $mediaAssets,
  828.             'regions' => $regions,
  829.         ], $this->getWishlists());
  830.         return $this->render'Press/wishlist.html.twig'$returnArray );
  831.     }
  832.     /**
  833.      * @param Request $request
  834.      * @Route("/{_locale}/press/password-forgotten", name="press-pw-forgotten")
  835.      */
  836.     public function passwordForgottenAction(Request $request) {
  837.         $errors = [];
  838.         $success null;
  839.         $step 1;
  840.         $user null;
  841.         $tokenInvalid null;
  842.         if($request->get('token')) {
  843.             $step 2;
  844.             $user MediaUser::getByResetPWToken($request->get('token'), 1);
  845.             if(!$user) {
  846.                 $tokenInvalid true;
  847.             }
  848.         }
  849.         $config WebsiteSetting::getByName('DefaultSiteConfig')->getData();
  850.         if($request->isMethod(Request::METHOD_POST)) {
  851.             if($request->get('email') && $request->get('resetMail')) { //send mail to reset pw
  852.                 $user MediaUser::getByEmail($request->get('email'), 1);
  853.                 $usermailWS WebsiteSetting::getByName('resetPasswordEmail'null$request->getLocale());
  854.                 $usermail null;
  855.                 if($usermailWS) {
  856.                     $usermail $usermailWS->getData();
  857.                 }
  858.                 if($user) {
  859.                     if($user->getConfirmed()) {
  860.                         $token md5('mediaUser-resetPW' $user->getEmail() . time());
  861.                         $user->setResetPWTokenCreateTime(Carbon::now());
  862.                         $user->setResetPWToken($token);
  863.                         try {
  864.                             $user->save();
  865.                             if($usermail) {
  866.                                 $params = [
  867.                                     'link' => 'www.steiermark.com'  .  $this->generateUrl('press-pw-forgotten', ['token' => $token]),
  868.                                 ];
  869.                                 $mail = new Mail();
  870.                                 $mail->setDocument($usermail);
  871.                                 $mail->setParams($params);
  872.                                 $mail->addTo($user->getEmail());
  873.                                 $mail->send();
  874.                             }
  875.                             $success 'mail sent';
  876.                         } catch (\Exception $e) {
  877.                             $errors[] = 'generating token failed';
  878.                         }
  879.                     } else {
  880.                         $errors[] = 'user not confirmed';
  881.                     }
  882.                 } else {
  883.                     $errors[] = 'user does not exist';
  884.                 }
  885.             } elseif($request->get('pw') && $request->get('pw2') && $request->get('resetPw') && $request->get('token') && $user) {
  886.                 if($request->get('pw') === $request->get('pw2')) {
  887.                     $user->setResetPWTokenCreateTime(null);
  888.                     $user->setResetPWToken(null);
  889.                     $user->setPassword($request->get('pw'));
  890.                     try {
  891.                         $user->save();
  892.                         $step 3;
  893.                     } catch (\Exception $e) {
  894.                         $errors[] = 'saving user failed';
  895.                     }
  896.                 } else {
  897.                     $errors[] = 'passwords not equal';
  898.                 }
  899.             }
  900.         }
  901.         return $this->renderTemplate('Press/passwordForgotten.html.twig', ['step' => $step'errors' => $errors'success' => $success'tokenInvalid' => $tokenInvalid'config' => $config]);
  902.     }
  903.     /**
  904.      * @Route("/{_locale}/press/dossiers/add-to-wishlist", name="pressdossiers-wishlist-add")
  905.      */
  906.     public function addDossierFromWishlistRequest $request )
  907.     {
  908.         $id $request->get'id' );
  909.         $sessionIds $request->getSession()->get'pressDossierWishlistIds', [] );
  910.         $sessionIds[] = $id;
  911.         $request->getSession()->set'pressDossierWishlistIds'$sessionIds );
  912.         $returnArr'ids' ] = $sessionIds;
  913.         $url $this->generateUrl'press-wishlist' );
  914.         return new JsonResponse( [
  915.             "success" => true,
  916.             "activeIds" => array_valuesarray_map'intval'$sessionIds ) ),
  917.             "__alertNotification" => [
  918.                 "type" => "notification-default",
  919.                 "content" => $this->renderView'Press/Includes/wishlist/pressarticle-add-notification.html.twig'array_merge$request->request->all(), [
  920.                     'url' => $this->getWishlistUrl($request),
  921.                     'tkText' => 'Pressedossier',
  922.                 ] ) )
  923.             ]
  924.         ] );
  925.     }
  926.     /**
  927.      * @Route("/{_locale}/press/dossiers/remove-from-wishlist", name="pressdossiers-wishlist-remove")
  928.      */
  929.     public function removeDossierFromWishlistRequest $request )
  930.     {
  931.         $id $request->get'id' );
  932.         $sessionIds $request->getSession()->get'pressDossierWishlistIds', [] );
  933.         if( ( $key array_search$id$sessionIds ) ) !== false ){
  934.             unset( $sessionIds$key ] );
  935.         }
  936.         $request->getSession()->set'pressDossierWishlistIds'$sessionIds );
  937.         $returnArr'ids' ] = $sessionIds;
  938.         $url $this->generateUrl'press-wishlist' );
  939.         return new JsonResponse( [
  940.             "success" => true,
  941.             "activeIds" => array_valuesarray_map'intval'$sessionIds ) ),
  942.             "__alertNotification" => [
  943.                 "type" => "notification-default",
  944.                 "content" => $this->renderView'Press/Includes/wishlist/pressarticle-remove-notification.html.twig'array_merge$request->request->all(), [
  945.                     'url' => $this->getWishlistUrl($request),
  946.                     'tkText' => 'Pressdossier'
  947.                 ] ) )
  948.             ]
  949.         ] );
  950.     }
  951.     /**
  952.      * @Route("/{_locale}/press/image/add-to-wishlist", name="pressimage-wishlist-add")
  953.      */
  954.     public function addPressImageToWishlistRequest $request )
  955.     {
  956.         $id $request->get'id' );
  957.         $sessionIds $request->getSession()->get'pressImageWishlistIds', [] );
  958.         $sessionIds[] = $id;
  959.         $request->getSession()->set'pressImageWishlistIds'$sessionIds );
  960.         $returnArr'ids' ] = $sessionIds;
  961.         return new JsonResponse( [
  962.             "success" => true,
  963.             "activeIds" => array_valuesarray_map'intval'$sessionIds ) ),
  964.             "__alertNotification" => [
  965.                 "type" => "notification-default",
  966.                 "content" => $this->renderView'Press/Includes/wishlist/pressarticle-add-notification.html.twig'array_merge$request->request->all(), [
  967.                     'url' => $this->getWishlistUrl($request),
  968.                     'tkText' => 'Presseimage',
  969.                 ] ) )
  970.             ]
  971.         ] );
  972.     }
  973.     /**
  974.      * @Route("/{_locale}/press/album/add-to-wishlist", name="pressalbum-wishlist-add")
  975.      */
  976.     public function addPressAlbumToWishlistRequest $request )
  977.     {
  978.         $id $request->get'id' );
  979.         $sessionIds $request->getSession()->get'pressAlbumWishlistIds', [] );
  980.         $sessionIds[] = $id;
  981.         $request->getSession()->set'pressAlbumWishlistIds'$sessionIds );
  982.         $returnArr'ids' ] = $sessionIds;
  983.         $url $this->generateUrl'press-wishlist' );
  984.         return new JsonResponse( [
  985.             "success" => true,
  986.             "activeIds" => array_valuesarray_map'intval'$sessionIds ) ),
  987.             "__alertNotification" => [
  988.                 "type" => "notification-default",
  989.                 "content" => $this->renderView'Press/Includes/wishlist/pressarticle-add-notification.html.twig'array_merge$request->request->all(), [
  990.                     'url' => $this->getWishlistUrl($request),
  991.                     'tkText' => 'media-album',
  992.                 ] ) )
  993.             ]
  994.         ] );
  995.     }
  996.     /**
  997.      * @Route("/{_locale}/press/album/remove-from-wishlist", name="pressalbum-wishlist-remove")
  998.      */
  999.     public function removePressAlbumFromWishlistRequest $request )
  1000.     {
  1001.         $id $request->get'id' );
  1002.         $sessionIds $request->getSession()->get'pressAlbumWishlistIds', [] );
  1003.         if( ( $key array_search$id$sessionIds ) ) !== false ){
  1004.             unset( $sessionIds$key ] );
  1005.         }
  1006.         $request->getSession()->set'pressAlbumWishlistIds'$sessionIds );
  1007.         $returnArr'ids' ] = $sessionIds;
  1008.         $url $this->generateUrl'press-wishlist' );
  1009.         return new JsonResponse( [
  1010.             "success" => true,
  1011.             "activeIds" => array_valuesarray_map'intval'$sessionIds ) ),
  1012.             "__alertNotification" => [
  1013.                 "type" => "notification-default",
  1014.                 "content" => $this->renderView'Press/Includes/wishlist/pressarticle-remove-notification.html.twig'array_merge$request->request->all(), [
  1015.                     'url' => $this->getWishlistUrl($request),
  1016.                     'tkText' => 'media-album'
  1017.                 ] ) )
  1018.             ]
  1019.         ] );
  1020.     }
  1021.     /**
  1022.      * @Route("/{_locale}/press/album/item/add-to-wishlist", name="pressalbum-item-wishlist-add")
  1023.      */
  1024.     public function addPressAlbumItemToWishlistRequest $request )
  1025.     {
  1026.         $id $request->get'id' );
  1027.         $sessionIds $request->getSession()->get'pressAlbumItemsWishlistIds', [] );
  1028.         $sessionIds[] = $id;
  1029.         $request->getSession()->set'pressAlbumItemsWishlistIds'$sessionIds );
  1030.         $returnArr'ids' ] = $sessionIds;
  1031.         $url $this->generateUrl'press-wishlist' );
  1032.         return new JsonResponse( [
  1033.             "success" => true,
  1034.             "activeIds" => array_valuesarray_map'intval'$sessionIds ) ),
  1035.             "__alertNotification" => [
  1036.                 "type" => "notification-default",
  1037.                 "content" => $this->renderView'Press/Includes/wishlist/pressarticle-add-notification.html.twig'array_merge$request->request->all(), [
  1038.                     'url' => $this->getWishlistUrl($request),
  1039.                     'tkText' => 'media-album-item',
  1040.                 ] ) )
  1041.             ]
  1042.         ] );
  1043.     }
  1044.     /**
  1045.      * @Route("/{_locale}/press/album/item/remove-from-wishlist", name="pressalbum-item-wishlist-remove")
  1046.      */
  1047.     public function removePressAlbumItemFromWishlistRequest $request )
  1048.     {
  1049.         $id $request->get'id' );
  1050.         $sessionIds $request->getSession()->get'pressAlbumItemsWishlistIds', [] );
  1051.         if( ( $key array_search$id$sessionIds ) ) !== false ){
  1052.             unset( $sessionIds$key ] );
  1053.         }
  1054.         $request->getSession()->set'pressAlbumItemsWishlistIds'$sessionIds );
  1055.         $returnArr'ids' ] = $sessionIds;
  1056.         $url $this->generateUrl'press-wishlist' );
  1057.         return new JsonResponse( [
  1058.             "success" => true,
  1059.             "activeIds" => array_valuesarray_map'intval'$sessionIds ) ),
  1060.             "__alertNotification" => [
  1061.                 "type" => "notification-default",
  1062.                 "content" => $this->renderView'Press/Includes/wishlist/pressarticle-remove-notification.html.twig'array_merge$request->request->all(), [
  1063.                     'url' => $this->getWishlistUrl($request),
  1064.                     'tkText' => 'media-album-item'
  1065.                 ] ) )
  1066.             ]
  1067.         ] );
  1068.     }
  1069.     /**
  1070.      * @Route("/{_locale}/press/image/remove-from-wishlist", name="pressimage-wishlist-remove")
  1071.      */
  1072.     public function removePressImageFromWishlistRequest $request )
  1073.     {
  1074.         $id $request->get'id' );
  1075.         $sessionIds $request->getSession()->get'pressImageWishlistIds', [] );
  1076.         if( ( $key array_search$id$sessionIds ) ) !== false ){
  1077.             unset( $sessionIds$key ] );
  1078.         }
  1079.         $request->getSession()->set'pressImageWishlistIds'$sessionIds );
  1080.         $returnArr'ids' ] = $sessionIds;
  1081.         $url $this->generateUrl'press-wishlist' );
  1082.         return new JsonResponse( [
  1083.             "success" => true,
  1084.             "activeIds" => array_valuesarray_map'intval'$sessionIds ) ),
  1085.             "__alertNotification" => [
  1086.                 "type" => "notification-default",
  1087.                 "content" => $this->renderView'Press/Includes/wishlist/pressarticle-remove-notification.html.twig'array_merge$request->request->all(), [
  1088.                     'url' => $this->getWishlistUrl($request),
  1089.                     'tkText' => 'Pressimage'
  1090.                 ] ) )
  1091.             ]
  1092.         ] );
  1093.     }
  1094.     /**
  1095.      * @Route("/{_locale}/press/article/add-to-wishlist", name="pressarticle-wishlist-add")
  1096.      */
  1097.     public function addToWishlistRequest $request )
  1098.     {
  1099.         $id $request->get'id' );
  1100.         $sessionIds $request->getSession()->get'pressArticleWishlistIds', [] );
  1101.         $sessionIds[] = $id;
  1102.         $request->getSession()->set'pressArticleWishlistIds'$sessionIds );
  1103.         $returnArr'ids' ] = $sessionIds;
  1104.         $url $this->generateUrl'press-wishlist' );
  1105.         return new JsonResponse( [
  1106.             "success" => true,
  1107.             "activeIds" => array_valuesarray_map'intval'$sessionIds ) ),
  1108.             "__alertNotification" => [
  1109.                 "type" => "notification-default",
  1110.                 "content" => $this->renderView'Press/Includes/wishlist/pressarticle-add-notification.html.twig'array_merge$request->request->all(), [
  1111.                     'url' => $this->getWishlistUrl($request)
  1112.                 ] ) )
  1113.             ]
  1114.         ] );
  1115.     }
  1116.     /**
  1117.      * @Route("/{_locale}/press/article/remove-from-wishlist", name="pressarticle-wishlist-remove")
  1118.      */
  1119.     public function removeFromWishlistRequest $request )
  1120.     {
  1121.         $id $request->get'id' );
  1122.         $sessionIds $request->getSession()->get'pressArticleWishlistIds', [] );
  1123.         if( ( $key array_search$id$sessionIds ) ) !== false ){
  1124.             unset( $sessionIds$key ] );
  1125.         }
  1126.         $request->getSession()->set'pressArticleWishlistIds'$sessionIds );
  1127.         $returnArr'ids' ] = $sessionIds;
  1128.         $url $this->generateUrl'press-wishlist' );
  1129.         return new JsonResponse( [
  1130.             "success" => true,
  1131.             "activeIds" => array_valuesarray_map'intval'$sessionIds ) ),
  1132.             "__alertNotification" => [
  1133.                 "type" => "notification-default",
  1134.                 "content" => $this->renderView'Press/Includes/wishlist/pressarticle-remove-notification.html.twig'array_merge$request->request->all(), [
  1135.                     'url' => $this->getWishlistUrl($request),
  1136.                 ] ) )
  1137.             ]
  1138.         ] );
  1139.     }
  1140.     /**
  1141.      * @Route("/{_locale}/press/media-asset/add-to-wishlist", name="press-media-asset-item-wishlist-add")
  1142.      */
  1143.     public function addPressMediaAssetToWishlistRequest $request //todo
  1144.     {
  1145.         $id $request->get'id' );
  1146.         $sessionIds $request->getSession()->get'pressMediaAssetsWishlistIds', [] );
  1147.         $sessionIds[] = $id;
  1148.         $request->getSession()->set'pressMediaAssetsWishlistIds'$sessionIds );
  1149.         $returnArr'ids' ] = $sessionIds;
  1150.         $url $this->generateUrl'press-wishlist' );
  1151.         return new JsonResponse( [
  1152.             "success" => true,
  1153.             "activeIds" => array_valuesarray_map'intval'$sessionIds ) ),
  1154.             "__alertNotification" => [
  1155.                 "type" => "notification-default",
  1156.                 "content" => $this->renderView'Press/Includes/wishlist/pressarticle-add-notification.html.twig'array_merge$request->request->all(), [
  1157.                     'url' => $this->getWishlistUrl($request),
  1158.                     'tkText' => 'media-asset',
  1159.                 ] ) )
  1160.             ]
  1161.         ] );
  1162.     }
  1163.     /**
  1164.      * @Route("/{_locale}/press/media-asset/remove-from-wishlist", name="press-media-asset-item-wishlist-remove")
  1165.      */
  1166.     public function removePressMediaAssetFromWishlistRequest $request //todo
  1167.     {
  1168.         $id $request->get'id' );
  1169.         $sessionIds $request->getSession()->get'pressMediaAssetsWishlistIds', [] );
  1170.         if( ( $key array_search$id$sessionIds ) ) !== false ){
  1171.             unset( $sessionIds$key ] );
  1172.         }
  1173.         $request->getSession()->set'pressMediaAssetsWishlistIds'$sessionIds );
  1174.         $returnArr'ids' ] = $sessionIds;
  1175.         $url $this->generateUrl'press-wishlist' );
  1176.         return new JsonResponse( [
  1177.             "success" => true,
  1178.             "activeIds" => array_valuesarray_map'intval'$sessionIds ) ),
  1179.             "__alertNotification" => [
  1180.                 "type" => "notification-default",
  1181.                 "content" => $this->renderView'Press/Includes/wishlist/pressarticle-remove-notification.html.twig'array_merge$request->request->all(), [
  1182.                     'url' => $this->getWishlistUrl($request),
  1183.                     'tkText' => 'media-asset'
  1184.                 ] ) )
  1185.             ]
  1186.         ] );
  1187.     }
  1188.     /**
  1189.      * @param Request $request
  1190.      * @Route("/{_locale}/press-picture-list", name="press-picture-list")
  1191.      */
  1192.     public function getPressPictureListRequest $requestPaginatorInterface $paginator )
  1193.     {
  1194.         $paginator $this->getPaginatorForPressImages$request$paginator );
  1195.         return new JsonResponse( [
  1196.             'success' => true,
  1197.             "html" => $this->renderView'Press/Includes/pressPictureList.html.twig', [
  1198.                 "paginator" => $paginator,
  1199.                 'activePressPicturesWishlistIds' => $this->activePressPicturesWishlistIds
  1200.             ] ),
  1201.         ] );
  1202.     }
  1203.     private function getPaginatorForPressImagesRequest $requestPaginatorInterface $paginatorAsset\Listing $articlesList null )
  1204.     {
  1205.         if($articlesList === null) {
  1206.             $articlesList $this->getPressImageListing($request);
  1207.         }
  1208.         $perPage $this->getDocumentEditable'numeric''imagesPerPage' ) ? $this->getDocumentEditable'numeric''imagesPerPage' )->getData() : 16;
  1209.         if( $perPage ){
  1210.             $perPage 16;
  1211.         }
  1212.         return $paginator->paginate$articlesList$request->get'page'), $perPage );
  1213.     }
  1214.     private function getPressImageListing(Request $request): Asset\Listing
  1215.     {
  1216.         $prefilterRegionId $this->getDocumentEditable'relation''prefilter-region' )->getData() ? $this->getDocumentEditable'relation''prefilter-region' )->getData()[ 'id' ] : null;
  1217.         $isMainRegion false;
  1218.         if(empty($prefilterRegionId)) {
  1219.             $region $this->document->getProperty('region');
  1220.             if($region) {
  1221.                 $prefilterRegionId $region->getId();
  1222.                 $isMainRegion $region->getIsMainRegion();
  1223.             }
  1224.         }
  1225.         $keyword $request->get'keyword''' );
  1226.         $category $request->get'category''' );
  1227.         if(!empty($category) && count($category) < && empty($category[0])) { //check if no empty query param is set
  1228.             $category = [];
  1229.         }
  1230.         $season $request->get'season''' );
  1231.         if(!empty($season) && count($season) < && empty($season[0])) { //check if no empty query param is set
  1232.             $season = [];
  1233.         }
  1234.         $orientation $request->get'orientation', [] );
  1235.         $isPortrait false;
  1236.         $isLandscape false;
  1237.         foreach( $orientation as $mode ){
  1238.             if( $mode === 'portrait' ){
  1239.                 $isPortrait true;
  1240.             }elseif( $mode === 'landscape' ){
  1241.                 $isLandscape true;
  1242.             }
  1243.         }
  1244.         return $this->getMediaArchiveImages$request->getLocale(), $category$season$keyword$isLandscape$isPortrait$prefilterRegionId,$isMainRegion );
  1245.     }
  1246.     private function getMediaArchiveImages($locale 'de'$categoryId ''$seasonId = [], $keyword ''bool $isLandscape falsebool $isPortrait falseint $preFilterRegionId null$isMainRegion false) : Asset\Listing {
  1247.         $count 1//count how many conditions have to be true, always has to be in media archive
  1248.         if( !empty( $categoryId ) || !empty( $seasonId ) ) $count++;
  1249.         $keywords = !empty($keyword) ? explode(' '$keyword) : [];
  1250.         $keywordObjects = [];
  1251.         foreach ($keywords as $kw) {
  1252.             $kwObject MediaKeyword::getByWord($kw$locale1);
  1253.             if($kwObject) {
  1254.                 $keywordObjects[] = $kwObject;
  1255.             }
  1256.         }
  1257.         $orientation '';
  1258.         if( ( $isPortrait || $isLandscape ) && !( $isPortrait && $isLandscape ) ){
  1259.             if( $isPortrait ){
  1260.                 $orientation 'Portrait';
  1261.             }else{
  1262.                 $orientation 'Landscape';
  1263.             }
  1264.             $count++;
  1265.         }
  1266.         $mediaArchiveAssetListing = new Asset\Listing();
  1267.         $mediaArchiveAssetListing->addConditionParam"assets.type = 'image'" );
  1268.         $mediaArchiveAssetListing->onCreateQueryBuilder(
  1269.             function( \Doctrine\DBAL\Query\QueryBuilder $queryBuilder ) use ( $mediaArchiveAssetListing ){
  1270.                 $queryBuilder->join'assets''assets_metadata''metadata''metadata.cid = assets.id' );
  1271.                 //$queryBuilder->join(  ['metadata' => 'assets_metadata'], 'cid = id' );
  1272.             }
  1273.         );/*
  1274.         $mediaArchiveAssetListing->onCreateQuery(function (\Pimcore\Db\ZendCompatibility\QueryBuilder $query) {
  1275.             $query->joinLeft(
  1276.                 ['metadata' => 'assets_metadata'],
  1277.                 'cid = id'
  1278.             );
  1279.         });*/
  1280.         if( $preFilterRegionId ){
  1281.             $mediaArchiveAssetListing->addConditionParam"id IN (
  1282.             Select distinct cid
  1283.             from assets_metadata amr
  1284.             where (amr.name = 'General.regions' and amr.data LIKE '%[\"object\",$preFilterRegionId]%')" .
  1285.                  ($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))' '') .
  1286.             ")" );
  1287.         }
  1288.         $mediaArchiveAssetListing->addConditionParam"id IN (
  1289.         Select distinct cid
  1290.             from assets_metadata am
  1291.             where
  1292.                   (" .
  1293.             $this->filterBySeasonAndCategories($categoryId$seasonId)
  1294.             . //is not first condition
  1295.             (!empty($orientation) ? " (am.name = 'General.is" $orientation "' and am.data = 1) " "") .
  1296.             ( $orientation " or " "") . //is orientation was set
  1297.             "(name = 'General.mediaArchive' and data = 1 ) " .
  1298.             $this->addKeywordAndAuthorCondition($keywords$keywordObjects' OR ') .
  1299.             ")
  1300.                 Group By cid
  1301.                 having count(cid) = " $count "
  1302.             )");
  1303.         $mediaArchiveAssetListing->addConditionParam('metadata.name = "General.number" ');
  1304.         $mediaArchiveAssetListing->setOrderKey('cast(data as unsigned) DESC'false); //number is stored as string in db
  1305.         return $mediaArchiveAssetListing;
  1306.     }
  1307.     /**
  1308.      * @param Request $request
  1309.      * @Route("/{_locale}/press/login", name="press-login")
  1310.      */
  1311.     public function pressLoginRequest $request )
  1312.     {
  1313.         $successpage WebsiteSetting::getByName'pressLoginSuccesspage' )->getData();
  1314.         $errorpage WebsiteSetting::getByName'pressLoginErrorpage' )->getData();
  1315.         if( ( $email $request->get'email' ) ) && ( $password $request->get'password' ) ) ){
  1316.             $user MediaUser::getByEmail$email);
  1317.             if( $user && password_verify$password$user->getPassword() ) ){
  1318.                 $pressSession $request->getSession()->getBag"pressLogin" );
  1319.                 $pressSession->set'userid'$user->getId() );
  1320.                 if( $pressSession->get'lastVisited' ) ){
  1321.                     $successpage $pressSession->get'lastVisited' );
  1322.                     $pressSession->set'lastVisited''' );
  1323.                 }
  1324.                 return new RedirectResponse$successpage );
  1325.             }
  1326.         }
  1327.         return new RedirectResponse$errorpage ?: $successpage );
  1328.     }
  1329.     /**
  1330.      * @param Request $request
  1331.      * @Route("/{_locale}/press/logout", name="press-logout")
  1332.      */
  1333.     public function logoutRequest $request )
  1334.     {
  1335.         $pressSession $request->getSession()->getBag"pressLogin" );
  1336.         $pressSession->set'userid'null );
  1337.         $successpage WebsiteSetting::getByName'pressLogoutSuccesspage' )->getData();
  1338.         if( $pressSession->get'lastVisited' ) ){
  1339.             $successpage $pressSession->get'lastVisited' );
  1340.             $pressSession->set'lastVisited''' );
  1341.         }
  1342.         return new RedirectResponse$successpage );
  1343.     }
  1344.     private function getCategoriesDropdownItemsMediaCategory\Listing $pressCategoriesListing$selectedCat false, array $activeCategories = [] )
  1345.     {
  1346.         if(!empty($selectedCat) && !is_array($selectedCat)) {
  1347.             $selectedCat = [$selectedCat];
  1348.         }
  1349.         $categoryItems = [ [
  1350.             "label" => "",
  1351.             "value" => "",
  1352.             "name" => "",
  1353.             "id" => "",
  1354.             "disabled" => false,
  1355.             "selected" => !$selectedCat,
  1356.             "checked" => !$selectedCat,
  1357.             "class" => "sr-only"
  1358.         ] ];
  1359.         foreach( $pressCategoriesListing as $cat ){
  1360.             $hasParent false;
  1361.             if(empty($activeCategories) || in_array($cat->getId(), $activeCategoriestrue)) {
  1362.                 $categoryItems[] = [
  1363.                     "label" => $cat->getName(),
  1364.                     "value" => $cat->getId(),
  1365.                     "id" => $cat->getId(),
  1366.                     "name" => 'category[]',
  1367.                     "selected" => $selectedCat && in_array($cat->getId(), $selectedCat),
  1368.                     "checked" => $selectedCat && in_array($cat->getId(), $selectedCat),
  1369.                     "class" => "",
  1370.                     'is-child' => false
  1371.                 ];
  1372.                 $hasParent true;
  1373.             }
  1374.             if($cat->getChildren()) { //get all children in Pimcore object tree
  1375.                 $subCategoryList = new \Pimcore\Model\DataObject\MediaCategory\Listing();
  1376.                 $subCategoryList->addConditionParam('o_id IN ('implode(','array_map(function($child) {
  1377.                         return $child->getId();
  1378.                     }, $cat->getChildren() )) . ')');
  1379.                 $subCategoryList->setOrderKey('sorting');
  1380.                 $subCategoryList->setOrder('ASC');
  1381.                 foreach($subCategoryList as $child) {
  1382.                     if(empty($activeCategories) || in_array($child->getId(), $activeCategoriestrue)) {
  1383.                         $categoryItems[] = [
  1384.                             "label" => $child->getName(),
  1385.                             "value" => $child->getId(),
  1386.                             "id" => $child->getId(),
  1387.                             "name" => 'category[]',
  1388.                             "selected" => $selectedCat && in_array($child->getId(), $selectedCat),
  1389.                             "checked" => $selectedCat && in_array($child->getId(), $selectedCat),
  1390.                             "class" => "",
  1391.                             'is-child' => $hasParent
  1392.                         ];
  1393.                     }
  1394.                 }
  1395.             }
  1396.         }
  1397.         return $categoryItems;
  1398.     }
  1399.     private function getSeasonSelect( array $seasons$seasonId null )
  1400.     {
  1401.         $seasonItems = [ [
  1402.             "label" => "",
  1403.             "value" => "",
  1404.             "disabled" => true,
  1405.             "selected" => !$seasonId,
  1406.             "class" => "sr-only"
  1407.         ] ];
  1408.         foreach( $seasons as $season ){
  1409.             if( $season instanceof MediaCategory ){
  1410.                 $seasonItems[] = [
  1411.                     "label" => $season->getName(),
  1412.                     "value" => $season->getId(),
  1413.                     "id" => $season->getId(),
  1414.                     "name" => 'season[]',
  1415.                     "selected" => $seasonId && $seasonId == $season->getId(),
  1416.                     "checked" => $seasonId && in_array($season->getId(), $seasonId),
  1417.                     "class" => "",
  1418.                 ];
  1419.             }
  1420.         }
  1421.         return $seasonItems;
  1422.     }
  1423.     private function getPressCategoriesDropdownItemsPressCategory\Listing $pressCategoriesListing$selectedCat )
  1424.     {
  1425.         $categoryItems = [ [
  1426.             "label" => '',
  1427.             "value" => "",
  1428.             "disabled" => true,
  1429.             "selected" => !$selectedCat,
  1430.             "class" => "sr-only"
  1431.         ], [
  1432.             "label" => $this->translator->trans"press.no-category" ),
  1433.             "value" => "all",
  1434.             "disabled" => false,
  1435.             "selected" => !$selectedCat,
  1436.             "class" => "sr-only"
  1437.         ] ];
  1438.         foreach( $pressCategoriesListing as $cat ){
  1439.             $categoryItems[] = [
  1440.                 "label" => $cat->getName(),
  1441.                 "value" => $cat->getId(),
  1442.                 "selected" => $selectedCat && $selectedCat == $cat->getId(),
  1443.                 "class" => "",
  1444.             ];
  1445.         }
  1446.         return $categoryItems;
  1447.     }
  1448.     private function getMediaCategories(Request $request$onlyParents true): MediaCategory\Listing
  1449.     {
  1450.         $mediaCategoriesListing = new MediaCategory\Listing();
  1451.         $mediaCategoriesListing->addConditionParam('name != "" AND name IS NOT NULL');
  1452.         $mediaCategoriesListing->addConditionParam('hidden is NULL OR hidden = 0');
  1453.         if ($onlyParents){
  1454.             //get all parent classes
  1455.             $categoryClassId 'MediaCategory';
  1456.             $mediaCategoriesListing->addConditionParam('EXISTS(SELECT NULL FROM objects sub WHERE sub.o_id = object_localized_'.$categoryClassId.'_'.$request->getLocale().'.o_parentId AND sub.o_type = "folder")');
  1457.         }
  1458.         $mediaCategoriesListing->setOrderKey( [ 'sorting''name' ] );
  1459.         $mediaCategoriesListing->setOrder'ASC' );
  1460.         return $mediaCategoriesListing;
  1461.     }
  1462.     /**
  1463.      * @param string[] $keywords
  1464.      * @param MediaKeyword[] $keywordObjects
  1465.      */
  1466.     private function addKeywordAndAuthorCondition(array $keywords, array $keywordObjects$keywordConcat ' AND ') : string
  1467.     {
  1468.         $returnString '';
  1469.         if(!empty($keywords)) {
  1470.             $returnString "and ( cid IN (
  1471.                 Select distinct cid
  1472.                 FROM  assets_metadata am
  1473.                 WHERE (";
  1474.             $first true;
  1475.             foreach($keywords as $keyword) {
  1476.                 $returnString .=  ($first ' (': ($keywordConcat ' (')) . "(name = 'General.mediaArchive' and data = 1 ) " .
  1477.                     "or (am.name = 'General.title' and am.data like '%" htmlspecialchars($keyword) . "%')" .
  1478.                     "or (am.name = 'General.description' and am.data like '%" htmlspecialchars($keyword) . "%')" .
  1479.                     "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
  1480.                 $first false;
  1481.                 $contactListing = new Contact\Listing();
  1482.                 $contactListing->addConditionParam('name LIKE :authorKw or contactName LIKE :authorKw', ['authorKw' => "%" $keyword "%"]);
  1483.                 if($contactListing->getCount()) {
  1484.                     $contactIds array_map(function($contact) {
  1485.                         return $contact->getId();
  1486.                     },$contactListing->getObjects());
  1487.                     $returnString .= "or (am.name = 'General.author' and am.data IN (" implode(','$contactIds) . "))";
  1488.                 }
  1489.                 $returnString .= ') ';
  1490.             }
  1491.             if(!empty($keywordObjects)) {
  1492.                 $returnString .= " or (am.name = 'General.keywords' ";
  1493.                 foreach($keywordObjects as $keywordObject) {
  1494.                     $returnString .= "AND am.data like '%\"object\"," $keywordObject->getId() . "]%'";
  1495.                 }
  1496.                 $returnString .= ')';
  1497.             }
  1498.             $returnString .= ")
  1499.                Group By cid
  1500.                having count(cid) >= " count($keywords)+"
  1501.            )
  1502.            )";
  1503.         }
  1504.         return $returnString;
  1505.     }
  1506.     private function filterBySeasonAndCategories($categoryIds$seasonIds) : string
  1507.     {
  1508.         $returnString '';
  1509.         if(!empty($categoryIds)) {
  1510.             if(!empty($seasonIds)) {
  1511.                 $returnString .= '(';
  1512.             }
  1513.             $returnString .= '(';
  1514.             $first true;
  1515.             foreach ($categoryIds as $categoryId) {
  1516.                 if(!$first) {
  1517.                     $returnString .= ' OR ';
  1518.                 } else {
  1519.                     $first false;
  1520.                 }
  1521.                 $returnString .= " (am.name = 'General.categories' and am.data like '%\"object\"," . (int)$categoryId "]%') ";
  1522.             }
  1523.             $returnString .= ')';
  1524.         }
  1525.         if(!empty($seasonIds)) {
  1526.             $returnString .= (!empty($categoryIds) ? " AND " "") . '(';
  1527.             $first true;
  1528.             foreach ($seasonIds as $seasonId) {
  1529.                 if(!$first) {
  1530.                     $returnString .= ' OR ';
  1531.                 } else {
  1532.                     $first false;
  1533.                 }
  1534.                 $returnString .= " (am.name = 'General.categories' and am.data like '%\"object\"," . (int)$seasonId "]%') ";
  1535.             }
  1536.             $returnString .= ')' . (!empty($categoryIds) ? " ) " "");
  1537.         }
  1538.         if ($returnString !== '') {
  1539.             $returnString '(' $returnString ')';
  1540.         }
  1541.         if(!empty($categoryId) || !empty($seasonIds)) {
  1542.             $returnString .= ' OR ';
  1543.         }
  1544.         return $returnString;
  1545.     }
  1546.     private function isExcludedURL(string $currentPath, array $excludeURLs) : bool
  1547.     {
  1548.         foreach ($excludeURLs as $excludeURL) {
  1549.             if(str_contains($currentPath$excludeURL)) {
  1550.                 return true;
  1551.             }
  1552.         }
  1553.         return false;
  1554.     }
  1555.     private function getWatchlistURLs()
  1556.     {
  1557.         $cacheKey 'watchlistURLs';
  1558.         $data \Pimcore\Cache::load($cacheKey);
  1559.         if (!empty($data)) {
  1560.             return $data;
  1561.         }
  1562.         $data = [];
  1563.         $configList = new SiteConfig\Listing();
  1564.         $languages Tool::getValidLanguages();
  1565.         foreach ($configList as $config) {
  1566.             foreach ($languages as $language) {
  1567.                 if($config->getPressWatchlist($language)) {
  1568.                     $data[$config->getPressWatchlist($language)->getId()] = $config->getPressWatchlist($language)->getFullPath();
  1569.                 }
  1570.             }
  1571.         }
  1572.         $cacheTime 86400//== 1 day in seconds
  1573.         \Pimcore\Cache::save($data$cacheKey, [], $cacheTime0true);
  1574.         return $data;
  1575.     }
  1576.     private function addLastVisitedToSession(Request $requeststring $sessionBagName, array $excludeUrlstring $flashname 'lastVisited'string $anchor '')
  1577.     {
  1578.         if( $request->getPathInfo() &&
  1579.             !$this->isExcludedURL($request->getPathInfo(), $excludeUrl)
  1580.         ){
  1581.             $pressLoginSession $request->getSession()->getBag$sessionBagName );
  1582.             $pressLoginSession->set($flashname$request->getRequestUri() . $anchor );
  1583.         }
  1584.     }
  1585.     private function getMediaAlbumAssets(array $albumItems, array &$assetsbool $hideTitle true) {
  1586.         foreach ($albumItems as $item) {
  1587.             if($item instanceof Asset\Image) {
  1588.                 $assets[] = [
  1589.                     'template' => 'Includes/Teaser/media-album-item-teaser.html.twig',
  1590.                     'params' => [
  1591.                         'image' => $item,
  1592.                         "wishlistActive" => in_array($item->getId(), $this->activePressPicturesWishlistIdstrue),
  1593.                         "isVideo" => false,
  1594.                         "video" => null,
  1595.                         "hideTitle" => $hideTitle,
  1596.                     ],
  1597.                     'id' => $item->getId(),
  1598.                 ];
  1599.             } elseif($item instanceof Asset\Video) {
  1600.                 $assets[] = [
  1601.                     'template' => 'Includes/Teaser/media-album-item-teaser.html.twig',
  1602.                     'params' => [
  1603.                         'image' => null,
  1604.                         "wishlistActive" => in_array($item->getId(), $this->activePressPicturesWishlistIdstrue),
  1605.                         "isVideo" => true,
  1606.                         "video" => $item,
  1607.                         "hideTitle" => $hideTitle,
  1608.                     ],
  1609.                     'id' => $item->getId(),
  1610.                 ];
  1611.             } elseif($item instanceof Asset\Folder) {
  1612.                 $this->getMediaAlbumAssets($item->getChildren(), $assets$hideTitle);
  1613.             }
  1614.         }
  1615.     }
  1616.     private function createNewUser(array $requiredParams, array $optionalParams$token)
  1617.     {
  1618.         $isNewUser false;
  1619.         $user MediaUser::getByEmail($requiredParams'email' ], 1);
  1620.         if(!$user) {
  1621.             $user = new MediaUser();
  1622.             $user->setParentService::createFolderByPath'Press/User/Registered' ) );
  1623.             $user->setKeyFile::getValidFilename$requiredParams'email' ] ) );
  1624.             $user->setToken$token );
  1625.             $user->setTokenTimeCarbon::now() );
  1626.             $isNewUser true;
  1627.             $user->setPublishedfalse );
  1628.         }
  1629.         $user->setEmail$requiredParams'email' ] );
  1630.         $user->setPassword$requiredParams'password' ] );
  1631.         $user->setTitle( isset( $optionalParams'title' ] ) ? $optionalParams'title' ] : '' );
  1632.         $user->setFirstname$requiredParams'firstname' ] );
  1633.         $user->setLastname$requiredParams'lastname' ] );
  1634.         $user->setStreet$requiredParams'street' ] );
  1635.         $user->setZip$requiredParams'zip' ] );
  1636.         $user->setCity$requiredParams'city' ] );
  1637.         $user->setPhone$requiredParams'phone' ] );
  1638.         $user->setCompany$requiredParams'company' ] );
  1639.         $user->save();
  1640.         return [$user$isNewUser];
  1641.     }
  1642.     private function addRegistrationParamsToUser(MediaUser $userRegion $region, array $requiredParams, array $optionalParams\Pimcore\DataObject\Consent\Service $consentServiceTranslator $translatorRequest $request)
  1643.     {
  1644.         if($region->getIsMainRegion()) {
  1645.             $user->setUsage$requiredParams'usage' ] );
  1646.             $user->setMessage($optionalParams['message'] ?? '');
  1647.             $user->setSendRegistrationCompletedMailtrue );
  1648.             $consentService->giveConsent$user'consent'$translator->trans'press-registration.Ich stimme den <a href="#">Datenschutzbestimmungen</a> zu.' ), [ 'ip' => $request->getClientIp() ] );
  1649.         } else {
  1650.            $blockElements $user->getFurtherRegionsBlock();
  1651.            $consentNote $consentService->insertConsentNote($user'consentFurtherRegion-' $region->getName() , $translator->trans'press-registration.Ich stimme den <a href="#">Datenschutzbestimmungen</a> zu.', [ 'ip' => $request->getClientIp() ]));
  1652.            $newBlockElement = [
  1653.                'region' => new BlockElement('region''relation'$region),
  1654.                'consentFurtherRegion' => new BlockElement('consentFurtherRegion''consent', new Consent(true$consentNote->getId() )),
  1655.                'confirmedFurtherRegion' => new BlockElement('confirmedFurtherRegion''checkbox'false),
  1656.                'sendRegistrationCompletedMailFurtherRegion' => new BlockElement('sendRegistrationCompletedMailFurtherRegion''checkbox'true),
  1657.                'usageFurtherRegion' => new BlockElement('usageFurtherRegion''textarea'$requiredParams'usage' ]),
  1658.                'messageFurtherRegion' => new BlockElement('messageFurtherRegion''textarea'$optionalParams['message'] ?? ''),
  1659.            ];
  1660.            $blockElements[] = $newBlockElement;
  1661.            $user->setFurtherRegionsBlock($blockElements);
  1662.         }
  1663.         $user->save();
  1664.     }
  1665.     private function sendConfiremedRegistrationMail(MediaUser $user) : bool
  1666.     {
  1667.         $success false;
  1668. //        $user->setPublished( false );
  1669.         $user->setToken'' );
  1670.         $user->save();
  1671.         $mailDoc Document::getById$this->getDocumentEditable'relation''notificationmail' )->getData()[ 'id' ] );
  1672.         if( $mailDoc instanceof Email ){
  1673.             $notification = new \Pimcore\Mail();
  1674.             $params = [
  1675.                 'title' => $user->getTitle(),
  1676.                 'firstname' => $user->getFirstname(),
  1677.                 'lastname' => $user->getLastname(),
  1678.                 'street' => $user->getStreet(),
  1679.                 'zip' => $user->getZip(),
  1680.                 'city' => $user->getCity(),
  1681.                 'phone' => $user->getPhone(),
  1682.                 'company' => $user->getCompany(),
  1683.                 'usage' => $user->getUsage(),
  1684.                 'message' => $user->getMessage(),
  1685.                 'email' => $user->getEmail(),
  1686.             ];
  1687.             $params'deeplink' ] = Tool::getHostUrl() . '/admin/login/deeplink?object_' $user->getId() . '_object';
  1688.             $params'items' ] = array_keys$params );
  1689.             $notification->setDocument$mailDoc );
  1690.             $notification->setParams$params );
  1691. //                    $notification->setFrom($user->getEmail());
  1692.             $notification->send();
  1693.             $success true;
  1694.         }
  1695.         return $success;
  1696.     }
  1697.     /**
  1698.      * @param Region[] $getMetadata
  1699.      * @param array $regionCollection
  1700.      */
  1701.     private function addRegionsToArray(array $newRegions, array &$regionCollection)
  1702.     {
  1703.         foreach ($newRegions as $region) {
  1704.             $regionCollection[$region->getId()] = $region;
  1705.         }
  1706.     }
  1707.     private function getActiveCategories(Asset\Listing $assetListing) {
  1708.         $activeCategoryIds = [];
  1709.         foreach ($assetListing as $asset) {
  1710.             foreach($asset->getMetadata('General.categories') ?? [] as $category) {
  1711.                 $activeCategoryIds[$category->getId()] = $category->getId();
  1712.             }
  1713.         }
  1714.         return $activeCategoryIds;
  1715.     }
  1716.     private function getWishlistUrl(Request $request)
  1717.     {
  1718.         $url '';
  1719.         $document Document::getById($request->get('documentId'));
  1720.         $config $document->getProperty('siteConfig');
  1721.         if($config instanceof SiteConfig) {
  1722.             $url $config->getPressWatchlist($request->getLocale())?->getFullPath();
  1723.         }
  1724.         if(empty($url)) {
  1725.             $url $this->generateUrl'press-wishlist' );
  1726.         }
  1727.         return $url;
  1728.     }
  1729.     private function getWishlists()
  1730.     {
  1731.         return [
  1732.             'activePressArticlesWishlistIds' => $this->activePressArticlesWishlistIds,
  1733.             'activePressDossiersWishlistIds' => $this->activePressDossiersWishlistIds,
  1734.             'activePressPicturesWishlistIds' => $this->activePressPicturesWishlistIds,
  1735.             'activePressAlbumWishlistIds' => $this->activePressAlbumWishlistIds,
  1736.             'activePressAlbumItemsWishlistIds' => $this->activePressAlbumItemsWishlistIds,
  1737.             'activePressMediaAssetsWishlistIds' => $this->activePressMediaAssetsWishlistIds,
  1738.         ];
  1739.     }
  1740. }