src/Controller/MuoServiceDocumentController.php line 30

Open in your IDE?
  1. <?php
  2. /**
  3.  *  MuoServiceDocumentController extends BaseController extends FrontendController 
  4.  * 
  5. */
  6. namespace App\Controller;
  7. use Pimcore\Controller\FrontendController;
  8. use Pimcore\Model\Document;
  9. use Pimcore\Model\Asset;
  10. use Pimcore\Tool\DeviceDetector;
  11. use Pimcore\Translation\Translator;
  12. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
  13. use Symfony\Component\HttpFoundation\Request;
  14. use Symfony\Component\HttpFoundation\Response;
  15. use Symfony\Component\HttpFoundation\JsonResponse;
  16. use Pimcore\Controller\Configuration\ResponseHeader;
  17. use Symfony\Component\Routing\Annotation\Route;
  18. use App\Captcha\Captcha;
  19. use Carbon\Carbon;
  20. class MuoServiceDocumentController extends BaseController
  21. {
  22.     /**
  23.      *  homepage action
  24.     */
  25.     public function homepageAction(
  26.         Request $request, 
  27.         Translator $translator
  28.     ) {
  29.         $siteConfig = $this->document->getProperty('_siteConfig');
  30.         
  31.         if ($siteConfig->getUseNewsblog()) {
  32.             $news = new \Pimcore\Model\DataObject\Newsblog\Listing();
  33.             $news ->setCondition("o_path LIKE '" . $siteConfig->getSiteNewsblogPath() . "%'");
  34.             $news ->setOrderKey("date");
  35.             $news ->setOrder("desc");
  36.             $news ->setLimit(3);
  37.             
  38.             if ($siteConfig->getWidgetShowLatestNews()) {
  39.                 foreach ($news as $article) {
  40.                     $latestNews = $article;
  41.                     break;
  42.                 }
  43.             }
  44.         }        
  45.         
  46.         if ($siteConfig->getUseCalendar()) {
  47.             $calendar = new \Pimcore\Model\DataObject\CalendarDate\Listing();
  48.             $calendar ->setCondition("o_path LIKE '" . $siteConfig->getSiteCalendarPath() . "%' && date >= '" . time() . "'");
  49.             $calendar ->setOrderKey("date");
  50.             $calendar ->setOrder("asc");
  51.             $calendar ->setLimit(2);
  52.         }
  53.         
  54.         $videoclips = new \Pimcore\Model\DataObject\Videoclip\Listing();
  55.         $videoclips ->setOrderKey("videoclipDate");
  56.         $videoclips ->setOrder("desc");
  57.         $videoclips ->setLimit(2);
  58.         
  59.         if ($siteConfig->getWidgetShowLatestMedia()) {
  60.             foreach ($videoclips as $clip) {
  61.                 $latestClip = $clip;
  62.                 break;
  63.             }
  64.         }
  65.          
  66.         return $this->render('muoservice/homepage.html.twig', [
  67.             'languages'     => $this->languages,
  68.             'locale'        => $request->getLocale(),
  69.             'siteConfig'    => $siteConfig,
  70.             'newsblog'      => ((isset($news)) ? $news : null),
  71.             'latestNews'    => ((isset($latestNews)) ? $latestNews : null),
  72.             'calendar'      => ((isset($calendar)) ? $calendar : null),
  73.             'videoclips'    => ((isset($videoclips)) ? $videoclips : null),
  74.             'latestClip'    => ((isset($latestClip)) ? $latestClip : null),
  75.             'initWidgets'   => 2
  76.         ]);
  77.     }
  78.     
  79.     
  80.     /**
  81.      *  document action
  82.     */
  83.     public function documentAction(
  84.         Request $request, 
  85.         Translator $translator
  86.     ) {
  87.         $siteConfig = $this->document->getProperty('_siteConfig');
  88.         $calendar = new \Pimcore\Model\DataObject\CalendarDate\Listing();
  89.         $calendar ->setCondition("o_path LIKE '" . $siteConfig->getSiteCalendarPath() . "%' && date >= '" . time() . "'");
  90.         $calendar ->setOrderKey("date");
  91.         $calendar ->setOrder("asc");
  92.         $calendar ->setLimit(2);
  93.         $videoclips = new \Pimcore\Model\DataObject\Videoclip\Listing();
  94.         $videoclips ->setOrderKey("videoclipDate");
  95.         $videoclips ->setOrder("desc");
  96.         $videoclips ->setLimit(2);
  97.         
  98.         // pre-generate Captcha for editables select form
  99.         $captcha = new Captcha('de');
  100.         
  101.         return $this->render('muoservice/document.html.twig', [
  102.             'languages'   => $this->languages,
  103.             'locale'      => $request->getLocale(),
  104.             'siteConfig'  => $siteConfig,
  105.             'captcha'     => $captcha->getCaptcha(),
  106.             'calendar'    => $calendar,
  107.             'videoclips'  => $videoclips
  108.         ]);
  109.     }
  110.     
  111.     
  112.     /**
  113.      *  newsblog action
  114.     */
  115.     public function newsblogAction(
  116.         Request $request//, 
  117.         //Translator $translator
  118.     ) {
  119.         $siteConfig = $this->document->getProperty('_siteConfig');
  120.         
  121.         if ( $request->get('nid') )
  122.         {
  123.             $newsArticle = \Pimcore\Model\DataObject\Newsblog::getById( $request->get('nid') );
  124.             if ( !$newsArticle->getPublished() )
  125.                 $newsArticle = null;
  126.             if ( $newsArticle )
  127.             {
  128.                 $newsArticle ->setHits( $newsArticle->getHits()+1 );
  129.                 $newsArticle ->save();
  130.             }     
  131.         }
  132.         
  133.         $news = new \Pimcore\Model\DataObject\Newsblog\Listing();
  134.         $news ->setCondition("o_path LIKE '" . $siteConfig->getSiteNewsblogPath() . "%' && o_id <> '" . $request->get('nid') . "'");
  135.         $news ->setOrderKey("date");
  136.         $news ->setOrder("desc");
  137.         $news ->setLimit( LISTINGS_DEFAULT_LIMIT );
  138.         
  139.         return $this->render('muoservice/newsblog.html.twig', [
  140.             'languages'   => $this->languages,
  141.             'locale'      => $request->getLocale(),
  142.             'siteConfig'  => $siteConfig,
  143.             'newsblog'    => $news,
  144.             'newsArticle' => ( (isset($newsArticle) && $newsArticle instanceof \Pimcore\Model\DataObject\Newsblog ) ? $newsArticle : '' )
  145.         ]);
  146.     }
  147.     
  148.     
  149.     /**
  150.      *  newsblogAjax action
  151.     */
  152.     #[Route('/ajax/newsblog/load')]
  153.     public function newsblogAjaxAction(
  154.         Request $request
  155.     ) {
  156.         $siteConfig = $this->document->getProperty('_siteConfig');
  157.         if ( $request->get('offset') > 0 )
  158.         {
  159.             $response = new class {};
  160.             $response ->html = '';
  161.             $response ->offset = $request->get('offset') + AJAX_LISTINGS_DEFAULT_LIMIT;
  162.         
  163.             $news = new \Pimcore\Model\DataObject\Newsblog\Listing();
  164.             $news ->setCondition("o_path LIKE '" . $siteConfig->getSiteNewsblogPath() . "%'");
  165.             $news ->setOrderKey("date");
  166.             $news ->setOrder("desc");
  167.             $news ->setOffset($request->get('offset'));
  168.             $news ->setLimit( LISTINGS_DEFAULT_LIMIT );
  169.             foreach ( $news as $i => $article )
  170.             {
  171.                 $response ->html .= '<div class="col-12 col-md-12 col-xl-4">
  172.                                       <div class="newsblog-teaser">';                                      
  173.                 if ($siteConfig->getNewsblogShowPreviewImage() == 1)
  174.                 {
  175.                     $response ->html .= '<div class="teaser-image">';
  176.                     if ( $article->getCover() )
  177.                     {
  178.                         $response->html .= '<a href="/news/article/' . $article->getId() . '/' . urlencode($article->getHeadline()) . '">
  179.                                               <img src="' . $article->getCover()->getThumbnail('newblogTeaserPreview') . '" alt="Beitrag ' . i . ' Titelbild" title="' . $article->getHeadline() . ' Titelbild" />
  180.                                             </a>';
  181.                     }
  182.                     $response ->html .= '</div>';
  183.                 }                  
  184.                 $response ->html .= '<h3 class="teaser-headline">
  185.                                           <span class="headline">' . ((strlen($article->getHeadline())>NEWSBLOG_HEADER_LENGTH) ? substr($article->getHeadline(), 0, NEWSBLOG_HEADER_LENGTH) . ' ...' : $article->getHeadline()) . '</span>
  186.                                         </h3>
  187.                                         <div class="teaser-text">
  188.                                           ' . ((strlen($article->getTeaser())>NEWSBLOG_TEASER_LENGTH) ? (substr(strip_tags($article->getTeaser()), 0, NEWSBLOG_TEASER_LENGTH)) . ' ...' : strip_tags($article->getTeaser())) . '
  189.                                         </div>
  190.                                         <div class="teaser-options">
  191.                                           <a class="btn btn-outline" href="/news/article/' . $article->getId() . '/' . urlencode($article->getHeadline()) .'">Weiterlesen <span class="lsf">right</span></a>
  192.                                         </div>
  193.                                       </div>
  194.                                     </div>';
  195.             }        
  196.         }  
  197.         return new Response( json_encode($response) );     
  198.     }
  199.     
  200.     
  201.     /**
  202.      *  mediathek action
  203.     */
  204.     public function mediathekAction(
  205.         Request $request
  206.     ) {
  207.         $siteConfig = $this->document->getProperty('_siteConfig');
  208.         
  209.         if ( $request->get('mid') )
  210.         {
  211.             $videoClip = \Pimcore\Model\DataObject\Videoclip::getById( $request->get('mid') );
  212.             if ( !$videoClip->getPublished() )
  213.                 $videoClip = null;    
  214.                 
  215.             if ( $videoClip )
  216.             {
  217.                 $videoClip ->setHits( $videoClip->getHits()+1 );
  218.                 $videoClip ->save();
  219.             } 
  220.         }
  221.         
  222.         $videoclips = new \Pimcore\Model\DataObject\Videoclip\Listing();
  223.         $videoclips ->setCondition("o_path LIKE '" . $siteConfig->getSiteMultimediaPath() . "%' && o_id <> '" . $request->get('mid') . "'");
  224.         $videoclips ->setOrderKey("videoclipDate");
  225.         $videoclips ->setOrder("desc");
  226.         $videoclips ->setLimit( LISTINGS_DEFAULT_LIMIT );
  227.         return $this->render('muoservice/mediathek.html.twig', [
  228.             'languages'   => $this->languages,
  229.             'locale'      => $request->getLocale(),
  230.             'siteConfig'  => $siteConfig,
  231.             'videoclip'   => (isset($videoClip)) ? $videoClip : null,
  232.             'videoclips'  => $videoclips
  233.         ]);
  234.     }
  235.     
  236.     
  237.     /**
  238.      *  mediathekAjax action
  239.     */
  240.     #[Route('/ajax/mediathek/load')]
  241.     public function mediathekAjaxAction(
  242.         Request $request
  243.     ) {
  244.         $siteConfig = $this->document->getProperty('_siteConfig');
  245.         if ( $request->get('offset') > 0 )
  246.         {
  247.             $response = new class {};
  248.             $response ->html = '';
  249.             $response ->offset = $request->get('offset') + AJAX_LISTINGS_DEFAULT_LIMIT;
  250.         
  251.             $videoclips = new \Pimcore\Model\DataObject\Videoclip\Listing();
  252.             $videoclips ->setCondition("o_path LIKE '" . $siteConfig->getSiteMultimediaPath() . "%'");
  253.             $videoclips ->setOrderKey("videoclipDate");
  254.             $videoclips ->setOrder("desc");
  255.             $videoclips ->setOffset($request->get('offset'));
  256.             $videoclips ->setLimit( AJAX_LISTINGS_DEFAULT_LIMIT );
  257.         
  258.             foreach ( $videoclips as $clip )
  259.             {
  260.                 $response ->html .= '<div class="col-12 col-sm-6">
  261.                                       <div class="youtube-preview animated" data-animation="animate__slideInUp" data-timing="800" data-delay="100">
  262.                                         ' . $clip->getVideoclipEmbeddingSrc() . '
  263.                                         <h3>' . $clip->getVideoclipTitle() . '</h3>
  264.                                         ' . $clip->getVideoclipShortDescription() . '
  265.                                       </div>
  266.                                     </div>';
  267.             }        
  268.         }  
  269.         return new Response( json_encode($response) );     
  270.     }
  271.     
  272.     
  273.     /**
  274.      *  Renderlet Slider Action
  275.     */
  276.     public function sliderAction (
  277.         Request $request, 
  278.         Translator $translator
  279.     ) { 
  280.         // check for valid object + id
  281.         if ( $request->get('type') == 'object' && $request->get('id') ) 
  282.         {
  283.             $slider = \Pimcore\Model\DataObject\Slider::getById( $request->get('id') );
  284.             if ( $slider instanceof \Pimcore\Model\DataObject\Slider ) 
  285.             {
  286.                 $sliderPanels = $slider->getImages();
  287.                 
  288.                 $sliderBricks = $slider->getImages()->getBrickGetters();
  289.                 $banners      = []; 
  290.                 if ( count($sliderBricks) )
  291.                 {
  292.                     foreach ( $sliderBricks as $key => $getBanner )
  293.                     {
  294.                         $banners[] = call_user_func( array($sliderPanels, $getBanner), false );    
  295.                     }
  296.                 }        
  297.      
  298.                 // $this->view->banners          = $banners;
  299.                 return $this->render('muoservice/slider.html.twig', [
  300.                     'sliderId'          => $slider->getKey(),
  301.                     'sliderPanels'      => $slider->getImages(),
  302.                     'sliderIndicators'  => $slider->getIndicators(),
  303.                     'sliderControls'    => $slider->getControls(),
  304.                     'banners'           => array_filter( $banners ),  // remove empty values
  305.                     'sliderError'       => ''
  306.                 ]);
  307.             }
  308.             else
  309.             {
  310.                 return $this->render('muoservice/slider.html.twig', [
  311.                     'sliderError' => "Slider konnte nicht geladen werden."   
  312.                 ]);
  313.             }
  314.         }     
  315.     }
  316.     
  317.     
  318.     /**
  319.      *  sliderGalleryAction
  320.     */
  321.     public function sliderGalleryAction(
  322.         Request $request
  323.     ) {
  324.         if ('asset' === $request->get('type')) {
  325.             $asset = Asset::getById($request->get('id'));
  326.             if ('folder' === $asset->getType()) {                
  327.                 return $this->render('muoservice/sliderGallery.html.twig', [
  328.                     'assets' => $asset->getChildren(),
  329.                     'editmode' => $request->get('editmode'),
  330.                     'images' => $request->get('images'),
  331.                     'orientation' => $request->get('orientation')
  332.                 ]);
  333.             }
  334.         }    
  335.         return [];
  336.     }
  337.     
  338.     
  339.     /**
  340.      *  Document contact action
  341.     */
  342.     public function contactAction(
  343.         Request $request, 
  344.         Translator $translator
  345.     ) {
  346.         $device = \Pimcore\Tool\DeviceDetector::getInstance();
  347.         $siteConfig = $this->document->getProperty('_siteConfig');
  348.         
  349.         // init vars 
  350.         $message            = [];
  351.         $mailSubmitted      = false;
  352.         $mailRendered       = false;
  353.         $spamTrapTriggered  = false;
  354.         
  355.         // get post form data
  356.         $post_vars  = $request->request->all();
  357.         $formdata = [];
  358.         foreach ($post_vars as $key => $var) {
  359.             $formdata[$key] = $var;
  360.         }
  361.         
  362.         // add logo, name, imprint, ...
  363.         if (isset($siteConfig)) {
  364.             $formdata['website_logo'] = '<img src="' . $siteConfig->getWebsiteLogo() . '" />';
  365.             $formdata['website_name'] = $siteConfig->getWebsiteName();
  366.             $formdata['website_imprint'] = $siteConfig->getWebsiteName();
  367.         }
  368.         
  369.         // check Spam bot trap
  370.         if ( $request->get('email_address') != '' )
  371.             $spamTrapTriggered = true;
  372.         
  373.         // captcha initialize and validate
  374.         $captcha = new Captcha('de'); 
  375.         $captcha_validated = false;
  376.         if ($request->get('captcha_key')) {
  377.             $captcha_validated = $captcha->validateCaptcha($request->get('captcha_key'), $request->get('captcha_answer'));
  378.         }
  379.         
  380.         if (isset($formdata['contact_token']) 
  381.             && filter_var($formdata['contactEmail'], FILTER_VALIDATE_EMAIL)
  382.             && $spamTrapTriggered === false
  383.             && $captcha_validated === true
  384.         ) {
  385.             $mail = new \Pimcore\Mail();
  386.             $mail ->addTo($siteConfig->getWebsiteEmailAddress());
  387.             $mail ->addTo($formdata['contactEmail']);
  388.             // $mail ->addReplyTo($formdata['contactEmail']);
  389.             $mail ->setSubject($siteConfig->getWebsiteName() . ' - Neue Anfrage erhalten');
  390.             $mail ->setDocument(Document::getByPath( '/mo-service/email-templates/contact-default' ));
  391.             $mail ->setParams( $formdata );                         
  392.             $mail ->send(); 
  393.             
  394.             $mailSubmitted = true;
  395.         } elseif (isset($formdata['contact_token'])) {
  396.             $message[] = '<h3 style="color: #c00;"><span class="lsf">trouble</span> Fehler</h3><p style="color: #c00;">Ihre Nachricht konnte nicht gesendet werden.</p>';
  397.             if ( !$captcha_validated )
  398.                 $message[] = '<p style="color: #c00;">Ung&uuml;ltige Captcha-Eingabe.</p>';   
  399.         }
  400.         
  401.         return $this->render('muoservice/contact.html.twig', [
  402.             'languages'     => $this->languages,
  403.             'locale'        => $request->getLocale(),
  404.             'siteConfig'    => $siteConfig,
  405.             'device'        => $device,
  406.             'captcha'       => $captcha->getCaptcha(),
  407.             'formdata'      => $formdata,
  408.             'mailSubmitted' => $mailSubmitted,
  409.             'message'       => $message
  410.         ]);
  411.     }
  412.     
  413.     /**
  414.      *  defaultMailAction
  415.     */
  416.     public function defaultMailAction(
  417.         Request $request, 
  418.         Translator $translator     
  419.     ) {
  420.         $device = \Pimcore\Tool\DeviceDetector::getInstance();
  421.         
  422.         return $this->render('muoservice/defaultMailTemplate.html.twig', [
  423.             'device'        => $device,
  424.             'languages'     => $this->languages,
  425.             'locale'        => $request->getLocale()
  426.         ]);
  427.     }
  428.     
  429.     
  430.     /**
  431.      *  search action
  432.     */
  433.     #[Route('/search-old')]
  434.     public function searchAction(
  435.         Request $request, 
  436.         Translator $translator
  437.     ) {
  438.         $device             = \Pimcore\Tool\DeviceDetector::getInstance();      
  439.         $siteConfig         = $this->document->getProperty('_siteConfig');
  440.         $texts              = [];       
  441.         $searchCount        = 0;
  442.         $resultsNews        = null;
  443.         $resultsVideoclips  = null;
  444.         $resultsDocs        = null;
  445.         $resultsShop        = null;
  446.         if ( $request->get('search')!='' )
  447.         {
  448.             // search in documents
  449.             $docs = new \App\Website\Search\Document( $request->get('search') );
  450.             $docs ->setKeywords( $request->get('search') );
  451.             // search document.title and editables (type=wysiwyg,input) data field
  452.             $docs ->setDocumentFields( ["data"] );         
  453.             
  454.             if ( $resultsDocs = $docs ->search( 'id' ) )
  455.                 foreach ( $resultsDocs as $r)
  456.                     $searchCount++;     
  457.                     
  458.             // search in newsblog
  459.             $news = new \App\Website\Search\Newsblog( $request->get('search') );
  460.             $news ->setKeywords( $request->get('search') );
  461.             $news ->setSearchRootPath( $siteConfig->getSiteNewsblogPath() );
  462.             $news ->setDataObjectFields( ["headline","article","author"] );         
  463.             
  464.             if ( $resultsNews = $news ->search('date', 'desc') )
  465.                 foreach ( $resultsNews as $r)
  466.                     $searchCount++;
  467.                     
  468.             // search in videoclips
  469.             $videoclips = new \App\Website\Search\Mediathek( $request->get('search') );
  470.             $videoclips ->setKeywords( $request->get('search') );
  471.             $videoclips ->setSearchRootPath( $siteConfig->getSiteMultimediaPath() );
  472.             $videoclips ->setDataObjectFields( ["videoclipTitle","videoclipDescription"] );         
  473.             if ( $resultsVideoclips = $videoclips ->search('videoclipDate', 'desc') )
  474.                 foreach ( $resultsVideoclips as $r)
  475.                     $searchCount++;
  476.         }        
  477.         return $this->render('muoservice/search.html.twig', [
  478.             'languages'         => $this->languages,
  479.             'locale'            => $request->getLocale(),
  480.             'device'            => $device,
  481.             'siteConfig'        => $siteConfig,
  482.             'texts'             => $texts,
  483.             'search'            => $request->get('search'),
  484.             'searchCount'       => $searchCount,
  485.             'resultsDocuments'  => $resultsDocs,
  486.             'resultsNews'       => $resultsNews,   
  487.             'resultsVideoclips' => $resultsVideoclips
  488.         ]);
  489.     }
  490.     
  491.     
  492.     /**
  493.      *  xmlSitemapAction 
  494.     */
  495.     public function xmlSitemapAction ()
  496.     {
  497.         $log              = '';
  498.         $xml              = '';
  499.         $shop             = \Pimcore\Model\DataObject\Newsblog::getByPATH( '' ); 
  500.         $sitemaps_path    = './_sitemaps';
  501.         $sitemap_filename = 'sitemap.xml';
  502.         
  503.         if ( !file_exists($sitemaps_path) )
  504.             mkdir($sitemaps_path, 0755);
  505.         
  506.         // open handle
  507.         $handle = fopen( $sitemaps_path . '/' . $sitemap_filename, 'w+' );
  508.         
  509.         if ( $handle )
  510.         {
  511.             $log .= "Start generate XML Sitemap ...\n";
  512.             
  513.             $sitemap  = new \AppBundle\Sitemap\Sitemap();
  514.             $xml      = $sitemap ->generateXmlSitemap ( true, $shop->getShop_path() );
  515.             fputs( $handle, $xml );
  516.             fclose( $handle );            
  517.             
  518.             $log .= "XML Sitemap " . $sitemaps_path . '/' . $sitemap_filename . " ... written.\n";
  519.         }
  520.         
  521.         return new Response( nl2br($log) );
  522.     }
  523.  
  524. }
  525. ?>