src/Notaris/AdminBundle/Entity/GlossaryRepository.php line 225

Open in your IDE?
  1. <?php
  2. namespace Notaris\AdminBundle\Entity;
  3. use Doctrine\ORM\EntityRepository;
  4. /**
  5.  * GlossaryRepository
  6.  *
  7.  * This class was generated by the Doctrine ORM. Add your own custom
  8.  * repository methods below.
  9.  */
  10. class GlossaryRepository extends EntityRepository
  11. {
  12.     /**
  13.      * @param $locale
  14.      * @param $filterLetter
  15.      * @param int $offset
  16.      * @param array $sort_arr
  17.      * @param int $limit
  18.      * @return array|bool
  19.      * @throws \Doctrine\DBAL\DBALException
  20.      */
  21.     public function getAllGlossaries($locale, $filterLetter, $offset = 0, $sort_arr = array(), $limit = 50)
  22.     {
  23.         //start orders
  24.         $orders_arr = array();
  25.         $order_type = $sort_arr['type'];
  26.         $order_columns = array(
  27.             0 => 'g.pub_date',
  28.             'g.term',
  29.             'subsites',
  30.             'is_active',
  31.         );
  32.         if (isset($order_columns[$sort_arr['column']]) && $order_columns[$sort_arr['column']]) {
  33.             $orders_arr[] = $order_columns[$sort_arr['column']] . ' ' . $order_type;
  34.         }
  35.         //end orders
  36.         $where_arr = array(1);
  37.         //filter letter
  38.         if ($filterLetter) {
  39.             $where_arr[] = 'g.letter = :letter';
  40.         }
  41.         $em = $this->getEntityManager();
  42.         $con = $em->getConnection();
  43.         $sql = "SELECT g.id, g.pub_date, g.term,
  44.                   IF (g.is_active = 1,(IF(g.pub_date <= NOW(), g.is_active, 2)),g.is_active) AS is_active,
  45.                   g.slug,
  46.                   GROUP_CONCAT(DISTINCT s.name ORDER BY s.position ASC SEPARATOR '|') as subsites
  47.                   FROM glossary g
  48.                   LEFT JOIN glossary_subsite gs ON gs.glossary_id = g.id
  49.                   LEFT JOIN subsite s ON s.id = gs.subsite_id and s.is_active = 1
  50.                   WHERE g.locale = :locale AND " . implode(' AND ', $where_arr) . "
  51.                   GROUP BY g.id
  52.                   ORDER BY " . implode(', ', $orders_arr) . '
  53.                   LIMIT ' . $offset . ', ' . $limit;
  54.         $stmt = $con->prepare($sql);
  55.         $stmt->bindValue('locale', $locale);
  56.         if ($filterLetter) {
  57.             $stmt->bindValue('letter', $filterLetter);
  58.         }
  59.         $stmt = $stmt->execute();
  60.         $result = $stmt->fetchAll();
  61.         //all count
  62.         $sql = "SELECT count(*) as count FROM glossary g WHERE g.locale = :locale AND " . implode(' AND ', $where_arr);
  63.         $stmt = $con->prepare($sql);
  64.         $stmt->bindValue('locale', $locale);
  65.         if ($filterLetter) {
  66.             $stmt->bindValue('letter', $filterLetter);
  67.         }
  68.         $stmt = $stmt->execute();
  69.         $count = $stmt->fetchOne();
  70.         $AvailableLetters = array();
  71.         $online = $offline = $scheduled = 0;
  72.         if ($count) {
  73.             $time = new \DateTime('now');
  74.             $now = $time->format('Y-m-d 00:00:00');
  75.             //online
  76.             $sql = "SELECT count(*) as count FROM glossary g WHERE g.is_active = 1 AND g.pub_date <= :now AND g.locale = :locale AND " . implode(
  77.                     ' AND ',
  78.                     $where_arr
  79.                 );
  80.             $stmt = $con->prepare($sql);
  81.             $stmt->bindValue('now', $now);
  82.             $stmt->bindValue('locale', $locale);
  83.             if ($filterLetter) {
  84.                 $stmt->bindValue('letter', $filterLetter);
  85.             }
  86.             $stmt = $stmt->execute();
  87.             $online = $stmt->fetchOne();
  88.             //scheduled
  89.             $sql = "SELECT count(*) as count FROM glossary g WHERE g.is_active = 1 AND g.pub_date > :now AND g.locale = :locale AND " . implode(
  90.                     ' AND ',
  91.                     $where_arr
  92.                 );
  93.             $stmt = $con->prepare($sql);
  94.             $stmt->bindValue('now', $now);
  95.             $stmt->bindValue('locale', $locale);
  96.             if ($filterLetter) {
  97.                 $stmt->bindValue('letter', $filterLetter);
  98.             }
  99.             $stmt = $stmt->execute();
  100.             $scheduled = $stmt->fetchOne();
  101.             //offline
  102.             $sql = "SELECT count(*) as count FROM glossary g WHERE g.is_active = 0 AND g.locale = :locale AND " . implode(
  103.                     ' AND ',
  104.                     $where_arr
  105.                 );
  106.             $stmt = $con->prepare($sql);
  107.             $stmt->bindValue('locale', $locale);
  108.             if ($filterLetter) {
  109.                 $stmt->bindValue('letter', $filterLetter);
  110.             }
  111.             $stmt = $stmt->execute();
  112.             $offline = $stmt->fetchOne();
  113.         }
  114.         //first init
  115.         //available letters
  116.         $sql = "SELECT DISTINCT g.letter FROM glossary g WHERE g.locale = :locale ORDER BY g.letter ASC";
  117.         $stmt = $con->prepare($sql);
  118.         $stmt->bindValue('locale', $locale);
  119.         $stmt = $stmt->execute();
  120.         $AvailableLetters = $stmt->fetchAll();
  121.         return array(
  122.             'result' => $result,
  123.             'count' => $count,
  124.             'online' => $online,
  125.             'offline' => $offline,
  126.             'scheduled' => $scheduled,
  127.             'AvailableLetters' => $AvailableLetters,
  128.         );
  129.     }
  130.     public function getLetters($locale)
  131.     {
  132.         $em = $this->getEntityManager();
  133.         $conn = $em->getConnection();
  134.         $stmt = $conn->prepare('SELECT DISTINCT letter FROM glossary WHERE locale like :locale ORDER BY letter');
  135.         $stmt->bindValue('locale', $locale);
  136.         $stmt = $stmt->execute();
  137.         $letters = $stmt->fetchAll();
  138.         if (sizeof($letters) > 0):
  139.             $new_letters = array();
  140.             foreach ($letters as $l):
  141.                 $new_letters[] = $l['letter'];
  142.             endforeach;
  143.             return $new_letters;
  144.         endif;
  145.         return false;
  146.     }
  147.     public function getAllGlossariesByLetter($locale, $letter= 'A')
  148.     {
  149.         if(!$letter){
  150.             $letter= 'A';
  151.         }
  152.         $glossaries = $this->createQueryBuilder('g')
  153.             ->select('g')
  154.             ->where('g.locale = :locale AND g.letter like :letter')
  155.             ->andWhere('g.isActive = true')
  156.             ->andWhere('g.publicationDate <= :now')
  157.             ->setParameter('now', new \DateTime('now'))
  158.             ->setParameter('locale', $locale)
  159.             ->setParameter('letter', $letter)
  160.             ->orderBy("g.term", "ASC")
  161.             ->getQuery()
  162.             ->getResult();
  163.         if ($glossaries) {
  164.             return $glossaries;
  165.         }
  166.         return false;
  167.     }
  168.     public function getAllGlossarieItems($locale)
  169.     {
  170.         $glossaries = $this->createQueryBuilder('g')
  171.             ->select('g')
  172.             ->where('g.locale = :locale AND g.isActive = true')
  173.             ->andWhere('g.publicationDate <= :now')
  174.             ->setParameter('now', new \DateTime('now'))
  175.             ->setParameter('locale', $locale)
  176.             ->orderBy("g.term", "ASC")
  177.             ->getQuery()
  178.             ->getResult();
  179.         if ($glossaries) {
  180.             return $glossaries;
  181.         }
  182.         return false;
  183.     }
  184.     public function getRandomGlossaryFromSubsite($locale, Subsite $subsite)
  185.     {
  186.         $glossaries = $this->createQueryBuilder('g')
  187.             ->select('g')
  188.             ->innerJoin('g.subsites', 's', 'WITH', 's.id = :subsite')
  189.             ->where('g.locale = :locale')
  190.             ->andWhere('g.isActive = true')
  191.             ->andWhere('g.publicationDate <= :now')
  192.             ->setParameter('locale', $locale)
  193.             ->setParameter('now', new \DateTime('now'))
  194.             ->setParameter('subsite', $subsite->getId())
  195.             ->orderBy("g.term", "ASC")
  196.             ->getQuery()
  197.             ->getResult();
  198.         if ($glossaries) {
  199.             shuffle($glossaries);
  200.             return array_shift($glossaries);
  201.         }
  202.         return false;
  203.     }
  204.     public function getGlossaryFromSubsite(Subsite $subsite)
  205.     {
  206.         $glossaries = $this->createQueryBuilder('g')
  207.             ->select('g')
  208.             ->innerJoin('g.subsites', 's', 'WITH', 's.id = :subsite')
  209.             ->setParameter('subsite', $subsite->getId())
  210.             ->getQuery()
  211.             ->getResult();
  212.         if ($glossaries) {
  213.             return $glossaries;
  214.         }
  215.         return false;
  216.     }
  217.     public function search($keyword, $locale='nl') {
  218.         $searchResults = $this->createQueryBuilder('g')
  219.             ->addSelect("MATCH_AGAINST (g.term, g.description, :address 'IN BOOLEAN MODE') as score")
  220.             ->where('g.locale = :locale AND g.publicationDate <= :now AND g.isActive = 1')
  221.             ->andWhere("MATCH_AGAINST(g.term, g.description, :address 'IN BOOLEAN MODE') > 0.2")
  222.             ->setParameter('address', $keyword)
  223.             ->setParameter('locale', $locale)
  224.             ->setParameter('now', new \DateTime('now'))
  225.             ->orderBy('score', 'desc')
  226.             ->getQuery()
  227.             ->getResult();
  228.         if($searchResults){
  229.             return $searchResults;
  230.         }
  231.         return false;
  232.     }
  233. }