src/Controller/DocumentController.php line 24

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