src/Package/Openform/Tools/FrontUtil/FrontUtil.php line 109

Open in your IDE?
  1. <?php
  2. namespace App\Package\Openform\Tools\FrontUtil;
  3. use App\Package\Openform\Entity\Page;
  4. use App\Package\Openform\Entity\Config;
  5. use Doctrine\ORM\EntityManagerInterface;
  6. use App\Package\Openform\Entity\PageSection;
  7. // use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;
  8. // use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  9. // use App\Package\Toolkit\Exception\Exception\Exception;
  10. use App\Package\Openform\Entity\GalleryImage;
  11. use Symfony\Component\Routing\RouterInterface;
  12. use Symfony\Component\HttpFoundation\RequestStack;
  13. use App\Package\Toolkit\RouteLocalizer\RouteLocalizer;
  14. use Symfony\Component\DependencyInjection\ContainerInterface;
  15. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  16. use \App\Package\Openform\Entity\News;
  17. use \App\Package\Openform\Entity\MenuPage;
  18. /**
  19.  * FrontUtil
  20.  *  
  21.  * @author     Daniel Balowski <d.balowski@openform.pl> (_creator), j.mroz
  22.  * @copyright  2019 Openform
  23.  * @since      05.2019
  24.  */
  25. class FrontUtil
  26. {
  27.     function isMobileDevice() 
  28.     { 
  29.         return preg_match("/(android|avantgo|blackberry|bolt|boost|cricket|docomo|fone|hiptop|mini|mobi|palm|phone|pie|tablet|up\.browser|up\.link|webos|wos)/i" $_SERVER["HTTP_USER_AGENT"]); 
  30.     } 
  31.     public function getTitleByRangePath($rangePath$locale) {
  32.         $parts explode('_'str_replace('|','',$rangePath));
  33.         
  34.         
  35.         $repo $this->em->getRepository('Openform:'.$parts[0]);
  36.         
  37.         $entity $repo->find($parts[1]);
  38.         
  39.         return $entity->getTranslation()[$locale]->getTitle();
  40.     }
  41.     
  42.     
  43.     public function count($locale$filters$filterName$filterValue
  44.     {
  45.         $filters = clone $filters;
  46.         
  47.         foreach ($filters as $key => $row) {
  48.             if (in_array($key, ['exhibitions','museums','archives','privateCollections','rangeAllExhibition','rangeAllMuseum','rangeAllArchive','rangeAllPrivateCollection'])) {
  49.                 unset($filters->$key);    
  50.             } 
  51.         }
  52.         
  53.         $filters->$filterName $filterValue;
  54.         $this->searchRepo $this->em->getRepository('Openform:Search')->getFrontRepository();
  55.         
  56.         return $this->searchRepo->getVisibleByFilterCount($locale, clone $filters);
  57.     }
  58.     
  59.     /**
  60.      * @var EntityManager
  61.      */
  62.     protected $em;
  63.     /**
  64.      * @var \Symfony\Component\Asset\Packages
  65.      */
  66.     protected $assetsManager;
  67.     protected $container;
  68.     protected $request;
  69.     /**
  70.      * @var RouterInterface
  71.      */
  72.     protected $router;
  73.     /**
  74.      * @var SessionInterface
  75.      */
  76.     protected $session;
  77.     /**
  78.      * @var Config
  79.      */
  80.     public $config;
  81.     /**
  82.      * @param EntityManagerInterface  $em
  83.      */
  84.     public function __construct(
  85.         EntityManagerInterface $em,
  86.         RequestStack $request,
  87.         ContainerInterface $container,
  88.         \Symfony\Component\Asset\Packages $assetsManager,
  89.         RouterInterface $router,
  90.         RouteLocalizer $route_localizer
  91.     ) {
  92.         $this->em $em;
  93.         $this->assetsManager $assetsManager;
  94.         $this->request $request->getCurrentRequest();
  95.         $this->container $container;
  96.         $this->session $request->getMainRequest() ? $request->getSession() : null;
  97.         $this->router $router;
  98.         $this->route_localizer $route_localizer;
  99.     }
  100.     public function getLocale()
  101.     {
  102.         return $this->request->getLocale();
  103.     }
  104.     /**
  105.      * Return , get config
  106.      *
  107.      * @return Config|null
  108.      */
  109.     public function getConfig(): ?Config
  110.     {
  111.         if (!$this->config) {
  112.             /** @var ConfigRepository */
  113.             $repo $this->em->getRepository(Config::class);
  114.             $this->config $repo->createQueryBuilder('e')
  115.                 ->select('e')
  116.                 ->addOrderBy('e.id''ASC')
  117.                 ->leftJoin('e.Translation''t')->addSelect('t')
  118.                 ->getQuery()->useQueryCache(true)->enableResultCache()
  119.                 ->getResult();
  120.             if (count($this->config)) {
  121.                 $this->config $this->config[0];
  122.             }
  123.         }
  124.         return $this->config;
  125.     }
  126.     /**
  127.      * Zwraca route pod guzik zmiany jezyka
  128.      *
  129.      * @param string $newLocale, zmiana z PL->EN, newLocale = en
  130.      * @return string
  131.      */
  132.     public function langChangerPath(string $newLocale): string
  133.     {
  134.         $params $this->request->get('_route_params');
  135.         if ($newLocale !== 'pl') {
  136.             $params['locale'] = $newLocale;
  137.         } else {
  138.             $params['locale'] = null;
  139.         }
  140.         $params['oldlocale'] = $this->request->getLocale();
  141.         return $this->request->get('_route') ?
  142.             $this->router->generate('changer_' str_replace(['_default''changer_'], ''$this->request->get('_route')) . ($newLocale == 'pl' '_default' ''), $params) : '';
  143.     }
  144.     /**
  145.      * Return imagepath by type from thumbs
  146.      *
  147.      * @param string $p, path to file
  148.      * @param string $type, eg. detail,list
  149.      * @return boolean|string
  150.      */
  151.     public function getImagePathByType($thumbsstring $thumbType)
  152.     {
  153.         if (!$thumbs) {
  154.             return false;
  155.         }
  156.         $path false;
  157.         foreach($thumbs as $thumb) {
  158.             if ($thumb->getName() == $thumbType) {
  159.                 $path $thumb->getFilePath();
  160.                 break;
  161.             }
  162.         } 
  163.         
  164.         if (!$path) {
  165.             return false;
  166.         }
  167.         if (is_file('../public_html' $path)) {
  168.             return $path;
  169.         } else {
  170.             return false;
  171.         }
  172.     }
  173.     /**
  174.      * Gets image size
  175.      *
  176.      * @param string  $imagePath
  177.      * 
  178.      * @return array
  179.      */
  180.     public function getImageSize(string $imagePath): array
  181.     {
  182.         if (!is_file(__WEB_DIR__ $imagePath)) {
  183.             return ['width' => 0'height' => 0];
  184.         }
  185.         list($width$height) = getimagesize(__WEB_DIR__ $imagePath);
  186.         return ['width' => $width'height' => $height];
  187.     }
  188.     /**
  189.      * Get message to Admin Operation Status Green Box
  190.      * 
  191.      * @return string
  192.      */
  193.     public function getOperationStatusOnce(): string
  194.     {
  195.         $out $this->session->get('ADMIN_OPERATION_STATUS''');
  196.         $this->setOperationStatus('');
  197.         return $out;
  198.     }
  199.     /**
  200.      * Set message for Admin Operation Status Green Box
  201.      * 
  202.      * @param string $txt
  203.      */
  204.     public function setOperationStatus(string $txt): void
  205.     {
  206.         $this->session->set('ADMIN_OPERATION_STATUS'$txt);
  207.     }
  208.     public function isMourning()
  209.     {
  210.         return $this->getConfig()->getIsMourning();
  211.     }
  212.     public function menuVariant()
  213.     {
  214.         return $this->getConfig()->getMenuVariant() ? 'variant' '';
  215.     }
  216.     /**
  217.      * Get page by id
  218.      *
  219.      * @param int $id
  220.      * @return Page
  221.      */
  222.     public function getPageById(int $id)
  223.     {
  224.         /** @var PageRepository */
  225.         $repo $this->em->getRepository('Openform:Page');
  226.         return $repo->getOneById($id);
  227.     }
  228.     /**
  229.      * Gets page visible by idname
  230.      *
  231.      * @param string  $idname
  232.      * @param string  $locale
  233.      * 
  234.      * @return Page|NULL
  235.      */
  236.     public function getPageByIdname(string $idnamestring $locale): ?Page
  237.     {
  238.         return $this->em->getRepository('Openform:Page')->getFrontRepository()->getByIdname($idname$locale);
  239.     }
  240.     public function pageUrlByIdName(string $idnamestring $locale$params = [])
  241.     {
  242.         try {
  243.             return $this->route_localizer->generate($idname$params$locale);
  244.         } catch (\Exception $e) {
  245.             $page $this->getPageByIdname($idname$locale);
  246.             return $this->route_localizer->generate('page', ['slug' => $page->getTranslation()[$locale]->getSlug()], $locale);
  247.         }
  248.     }
  249.     //    public function pageUrlByIdname(string $idname, string $locale, $params = []) 
  250.     //    {
  251.     //        try {
  252.     //            return $this->route_localizer->generate($idname == 'page' ? 'not_existed_route_here_make_exception' : $idname , $params, $locale);
  253.     //            
  254.     //        } catch (RouteNotFoundException $e) {
  255.     //            
  256.     //            $pageEntity = $this->getPageByIdname($idname, $locale);
  257.     //        
  258.     //            return $this->route_localizer->generate('page', ['slug' => $pageEntity->getTranslation()[$locale]->getSlug()], $locale);
  259.     //        }
  260.     //    }
  261.     /**
  262.      * Get glue string to tag <title> config.title ~ glue ~ entity.title </title>
  263.      */
  264.     public function getMetaTitleGlue(): string
  265.     {
  266.         return ' - ';
  267.     }
  268.     /**
  269.      * Get full menu page structure, eg for sitemap
  270.      * @param string $locale
  271.      * @return array
  272.      */
  273.     public function getFullMenu(string $locale$parentId=false): array
  274.     {
  275.         $menu = array();
  276.         $qb $this->em->createQueryBuilder()->select('p')
  277.             ->from('Openform:Page''p')
  278.             ->leftJoin('p.Translation''t')
  279.             ->addSelect('t')
  280.             ->andWhere('p.stat = 1')
  281.             ->andWhere('p.mainMenu = 1')
  282.             ->andWhere('t.lang = :locale')
  283.             ->andWhere('t.title IS NOT NULL')
  284.             ->andWhere('t.slug IS NOT NULL'
  285.             ->setParameter('locale'$locale);
  286.          if ($parentId) {
  287.             $qb->andWhere('p.Parent = :parentId'
  288.                ->setParameter('parentId'$parentId);
  289.          } else {
  290.              $qb->andWhere('p.Parent IS NULL');
  291.          }
  292.         $qb->addOrderBy('p.ord''DESC');
  293.         $items $qb->getQuery()->useQueryCache(true)->enableResultCache()->getResult();
  294.         foreach ($items as $item) {
  295.             $menu[$item->getId()] = array(
  296.                 'title' => $item->getTranslation()[$locale]->getTitle(),
  297.                 'titleHtml' => $item->getTranslation()[$locale]->getTitleHtml(),
  298.                 'parent' => $item->getParent() ? $item->getParent()->getId() : 0,
  299.                 'id' => $item->getId(),
  300.                 'idname' => $item->getIdname(),
  301.                 'slug' =>  $item->getTranslation()[$locale]->getSlug(),
  302.                 'link' => $item->getTranslation()[$locale]->getLink(),
  303.                 'blank' => $item->getBlank(),
  304.                 'imagepath' => $item->getImagePath(),
  305.                 'column' => $item->getMainMenuColumn(),
  306.                 'children' => $this->getFullMenu($locale$item->getId()),
  307.             );
  308.         }
  309.         return $menu;
  310.     }
  311.     public function getFootMenu(string $locale): array
  312.     {
  313.         return $this->em->createQueryBuilder('e')
  314.             ->select('p, t')
  315.             ->from('Openform:Page''p')
  316.             ->leftJoin('p.Translation''t')
  317.             ->andWhere('p.stat = 1')
  318.             ->andWhere('p.footMenu = 1')
  319.             ->andWhere('t.lang = :locale')->andWhere('t.title IS NOT NULL')->andWhere('t.slug IS NOT NULL')
  320.             ->setParameter('locale'$locale)
  321.             ->addOrderBy('p.footMenuOrd''ASC')
  322.             ->getQuery()
  323.             ->getResult();
  324.     }
  325.     public function getFootMenu2(string $locale): array
  326.     {
  327.         return $this->em->createQueryBuilder('e')
  328.             ->select('p, t')
  329.             ->from('Openform:Page''p')
  330.             ->leftJoin('p.Translation''t')
  331.             ->andWhere('p.stat = 1')
  332.             ->andWhere('p.footMenu2 = 1')
  333.             ->andWhere('t.lang = :locale')->andWhere('t.title IS NOT NULL')->andWhere('t.slug IS NOT NULL')
  334.             ->setParameter('locale'$locale)
  335.             ->addOrderBy('p.footMenu2Ord''ASC')
  336.             ->getQuery()
  337.             ->getResult();
  338.     }
  339.     public function getFooterMenu(string $locale): array
  340.     {
  341.         $qb $this->em->createQueryBuilder()->select('p')
  342.             ->from(Page::class, 'p')
  343.             ->leftJoin('p.Translation''t')
  344.             ->addSelect('t')
  345.             ->andWhere('p.stat = 1')
  346.             ->andWhere('p.footMenu = 1')
  347.             ->andWhere('t.lang = :locale')
  348.             ->andWhere('t.title IS NOT NULL')->andWhere('t.slug IS NOT NULL')
  349.             ->setParameter('locale'$locale)
  350.             ->addOrderBy('p.ord''DESC');
  351.         $items $qb->getQuery()->getResult();
  352.         $menu = array();
  353.         foreach ($items as $item) {
  354.             $menu[$item->getId()] = array(
  355.                 'title' => $item->getTranslation()[$locale]->getTitle(),
  356.                 'titleHtml' => $item->getTranslation()[$locale]->getTitleHtml(),
  357.                 'id' => $item->getId(),
  358.                 'idname' => $item->getIdname(),
  359.                 'slug' =>  $item->getTranslation()[$locale]->getSlug(),
  360.             );
  361.         }
  362.         return $menu;
  363.     }
  364.     /**
  365.      * Set active page top
  366.      * @param integer $pageid
  367.      */
  368.     public function setMenuPageActive(int $pageid)
  369.     {
  370.         $this->session->set('pagetopactive'$pageid);
  371.     }
  372.     public function getMenuPageActive()
  373.     {
  374.         return $this->session->get('pagetopactive'0);
  375.     }
  376.     /**
  377.      * Find and set active page top, if page is children
  378.      *
  379.      * @param Page $entity
  380.      * @return void
  381.      */
  382.     public function setMenuPageFindActive(\App\Package\Openform\Entity\Page $entity)
  383.     {
  384.         while ($entity->getId()) {
  385.             if ($entity->getParent() && $entity->getParent()->getId() > 0)
  386.                 $entity $entity->getParent();
  387.             else
  388.                 break;
  389.         }
  390.         $this->setMenuPageActive($entity->getId());
  391.     }
  392.     /**
  393.      * Helper, to get repo and then use ->find, ->findAll, etc..
  394.      *
  395.      * @param string $repoClass
  396.      * @return void
  397.      */
  398.     public function getRepository(string $repoClass)
  399.     {
  400.         return $this->em->getRepository($repoClass);
  401.     }
  402.     /**
  403.      * Return string json jako obiekt
  404.      * @return object|null
  405.      */
  406.     public function getJsonDecode(string $obj)
  407.     {
  408.         if ($obj) {
  409.             try {
  410.                 $obj \json_decode($obj);
  411.                 return $obj;
  412.             } catch (\Exception $e) {
  413.                 return null;
  414.             }
  415.         } else {
  416.             return null;
  417.         }
  418.     }
  419.     // CRYPTER
  420.     public function crypter($action$string)
  421.     {
  422.         $output false;
  423.         $encrypt_method "AES-256-CBC";
  424.         $secret_key     '8986395b-b8f6-4c48-8c6e-799990090902';
  425.         $secret_iv      'fdcbcf1b-64ec-424d-942c-4e0434ea5543';
  426.         // hash
  427.         $key hash('sha256'$secret_key);
  428.         // iv - encrypt method AES-256-CBC expects 16 bytes - else you will get a warning
  429.         $iv substr(hash('sha256'$secret_iv), 016);
  430.         if ($action == 'encrypt') {
  431.             $output openssl_encrypt($string$encrypt_method$key0$iv);
  432.             $output base64_encode($output);
  433.         } elseif ($action == 'decrypt') {
  434.             $output openssl_decrypt(base64_decode($string), $encrypt_method$key0$iv);
  435.         }
  436.         return $output;
  437.     }
  438.     /**
  439.      * Get mailer email from ulr defined in .env
  440.      * @return string
  441.      */
  442.     public function getMailerEmail(string $mailerUrl): string
  443.     {
  444.         //$mailerUrl = $this->container->getParameter('app.mailer.url');
  445.         $mailerMailPosStart strpos($mailerUrl'://') + 3;
  446.         $mailerMailPosEnd   strpos($mailerUrl':'$mailerMailPosStart);
  447.         $mailerMail =
  448.             $mailerMailPosEnd !== false ?
  449.             substr(
  450.                 $mailerUrl,
  451.                 $mailerMailPosStart,
  452.                 $mailerMailPosEnd $mailerMailPosStart
  453.             ) : substr(
  454.                 $mailerUrl,
  455.                 $mailerMailPosStart
  456.             );
  457.         return $mailerMail;
  458.     }
  459.     /**
  460.      * Zwraca pierwszy slide z galeri + info o ilosci zdjec i filmów w galerii
  461.      *
  462.      * @param object $gallery
  463.      * @return array
  464.      */
  465.     public function GalleryDetail(object $gallery): array
  466.     {
  467.         $photos $movies 0;
  468.         $slides = [];
  469.         if ($gallery->getStat() === true) {
  470.             $slides $this->GalleryVisibleSlides($gallery);
  471.             $photos $movies 0;
  472.             foreach ($slides as $s) {
  473.                 if ($s->getVideoPath() || $s->getYtCode()) {
  474.                     $movies++;
  475.                 } else {
  476.                     $photos++;
  477.                 }
  478.             }
  479.         }
  480.         return ['slide' => count($slides) ? $slides[0] : null'movies' => $movies'photos' => $photos];
  481.     }
  482.     /** helper, zwraca visible slaidy z galerii */
  483.     public function GalleryVisibleSlides(object $gallery): ?array
  484.     {
  485.         if ($gallery->getStat() == 0) return [];
  486.         return $this->em->createQueryBuilder()->select('e')
  487.             ->from(GalleryImage::class, 'e')->where('e.Parent = :id')
  488.             ->andWhere('e.stat = 1')
  489.             ->leftJoin('e.Translation''t')->addSelect('t')
  490.             ->andWhere('t.lang = :locale')
  491.             ->setParameters(['id' => $gallery->getId(), 'locale' => $this->getLocale()])
  492.             ->orderBy('e.ord''DESC')
  493.             ->getQuery()->useQueryCache(true)->enableResultCache()
  494.             ->getResult();
  495.     }
  496.     public function getSectionBlocks($entity)
  497.     {
  498.         if (\method_exists($entity'getBlock')) {
  499.             $sec $this->em->createQueryBuilder()->select('e')
  500.                 ->from(\get_class($entity), 'e')
  501.                 ->andWhere('e.id =:id')
  502.                 ->leftJoin('e.Block''b')->addSelect('b')
  503.                 ->andWhere('b.Section = :id')
  504.                 ->leftJoin('b.Translation''t')->addSelect('t')
  505.                 ->andWhere('t.lang = :locale')
  506.                 ->setParameters(['id' => $entity->getId(), 'locale' => $this->getLocale()])
  507.                 ->orderBy('e.ord''DESC')
  508.                 ->getQuery()->useQueryCache(true)->enableResultCache()
  509.                 ->getResult();
  510.             return count($sec) ? $sec[0]->getBlock() : [];
  511.         }
  512.         return null;
  513.     }
  514.     /**
  515.      * grupuje sekcje sliderów + zwraca sekcje stat = 1
  516.      *
  517.      * @param [type] $entity
  518.      * @return void
  519.      */
  520.     public function getSections($entity
  521.     {
  522.         if (\method_exists($entity'getBlockSection')) {
  523.             $prevtype ='';
  524.             $key 0;
  525.             $out = [];
  526.             foreach( $entity->getBlockSection() as $sec) {
  527.                 if($sec->getStat()) {
  528.                     if($sec->getType() === PageSection::SECTION_TYPE_SLIDER) {
  529.                         if($sec->getType() !== $prevtype ) { 
  530.                             $key++;
  531.                             $out[$key] = [];
  532.                         }
  533.                         $grupped = [];
  534.                         $blocks $this->getSectionBlocks($sec);
  535.                         foreach ($blocks as $block) {
  536.                             $grupped[$block->getType()][] = $block;
  537.                         }
  538.                         
  539.                         $out[$key][] = [
  540.                             'section' => $sec
  541.                             'grupped' => $grupped
  542.                             'all' => self::groupButtonsBlocks($blocks)
  543.                         ];
  544.                     }
  545.                     else {
  546.                         $key++;
  547.                         $out[$key] = $sec;
  548.                     }
  549.                     $prevtype $sec->getType();
  550.                 }
  551.             }
  552.             return $out;
  553.         }
  554.         return [];
  555.     }
  556.     
  557.     private static function groupButtonsBlocks($blocks)
  558.     {
  559.         $res = [];
  560.         $btnBocks = [];
  561.         foreach ($blocks as $block) {
  562.             if ($block->getType() == 'btn') {
  563.                 $btnBocks[] = $block;
  564.             } else {
  565.                 if (!empty($btnBocks)) {
  566.                     $res[] = $btnBocks;
  567.                     $btnBocks = [];
  568.                 }
  569.                 $res[] = $block;
  570.             }
  571.         }
  572.         if (!empty($btnBocks)) {
  573.             $res[] = $btnBocks;
  574.         }
  575.         return $res;
  576.     }
  577.     
  578.     public function getNewestArticles($locale$limit )
  579.     {
  580.         $repo $this->em->getRepository(News::class);
  581.         return $this->em->getRepository('Openform:News')->getFrontRepository()->getVisbleNews($locale6);
  582.     }
  583.     public function isMp3File($filePath) {
  584.         // Pobranie rozszerzenia pliku
  585.         $fileExtension strtolower(pathinfo($filePathPATHINFO_EXTENSION));
  586.         
  587.         return $fileExtension === 'mp3';
  588.     }
  589.     public function getMenuPageItems($rootEntity
  590.     {
  591.         $repo $this->em->getRepository(MenuPage::class);
  592.         $frontRepo $repo->getFrontRepository();
  593.    
  594.         return $frontRepo->getMenuByRootEntity($rootEntity$this->getLocale());
  595.     }
  596.     public function getMenuPageFooterItems($rootEntity
  597.     {
  598.         $repo $this->em->getRepository(MenuPage::class);
  599.         $frontRepo $repo->getFrontRepository();
  600.    
  601.         return $frontRepo->getFooterMenuByRootEntity($rootEntity$this->getLocale());
  602.     }
  603.     
  604.     
  605.     public function getItemsForSearch(string $entityNamestring $locale): array
  606.     {
  607.         return $this->em->createQueryBuilder('e')
  608.             ->select('p, t')
  609.             ->from('Openform:'.$entityName'p')
  610.             ->leftJoin('p.Translation''t')
  611.             ->andWhere('p.stat = 1')
  612.             ->andWhere('t.lang = :locale AND t.title IS NOT NULL AND t.slug IS NOT NULL')
  613.             ->setParameter('locale'$locale)
  614.             ->addOrderBy('t.title''ASC')
  615.             ->getQuery()
  616.             ->getResult();
  617.     }
  618.     public function getLatestNews($limitstring $locale): array
  619.     {
  620.         return $this->em->createQueryBuilder('e')
  621.             ->select('p, t')
  622.             ->from('Openform:News''p')
  623.             ->leftJoin('p.Translation''t')
  624.                 
  625.             ->andWhere('p.stat = 1')
  626.             ->andWhere('t.lang = :locale')
  627.             ->andWhere('t.title IS NOT NULL AND t.slug IS NOT NULL')
  628.             ->andWhere('p.publishDate <= :now' )           
  629.                 
  630.             ->setParameter('locale'$locale)
  631.             ->setParameter('now'date('Y-m-d 00:00:00'time()))
  632.                 
  633.             ->addOrderBy('p.publishDate''DESC')
  634.             ->setMaxResults(intval($limit))
  635.                 
  636.             ->getQuery()
  637.             ->getResult();
  638.     }
  639. }