vendor/codefog/contao-news_categories/src/Model/NewsCategoryModel.php line 302

Open in your IDE?
  1. <?php
  2. /*
  3.  * News Categories bundle for Contao Open Source CMS.
  4.  *
  5.  * @copyright  Copyright (c) 2017, Codefog
  6.  * @author     Codefog <https://codefog.pl>
  7.  * @license    MIT
  8.  */
  9. namespace Codefog\NewsCategoriesBundle\Model;
  10. use Codefog\NewsCategoriesBundle\MultilingualHelper;
  11. use Contao\Database;
  12. use Contao\Date;
  13. use Contao\FilesModel;
  14. use Contao\Model\Collection;
  15. use Contao\NewsModel;
  16. use Haste\Model\Model;
  17. use Haste\Model\Relations;
  18. /*
  19.  * Use the multilingual model if available
  20.  */
  21. if (MultilingualHelper::isActive()) {
  22.     class ParentModel extends \Terminal42\DcMultilingualBundle\Model\Multilingual
  23.     {
  24.     }
  25. } else {
  26.     class ParentModel extends \Contao\Model
  27.     {
  28.     }
  29. }
  30. class NewsCategoryModel extends ParentModel
  31. {
  32.     /**
  33.      * Table name.
  34.      *
  35.      * @var string
  36.      */
  37.     protected static $strTable 'tl_news_category';
  38.     /**
  39.      * @inheritDoc
  40.      */
  41.     public function __get($name)
  42.     {
  43.         // Fix the compatibility with DC_Multilingual v4 (#184)
  44.         if ($name === 'id' && MultilingualHelper::isActive() && $this->lid) {
  45.             return $this->lid;
  46.         }
  47.         return parent::__get($name);
  48.     }
  49.     /**
  50.      * Get the CSS class.
  51.      *
  52.      * @return string
  53.      */
  54.     public function getCssClass()
  55.     {
  56.         $cssClasses = [
  57.             'news_category_'.$this->id,
  58.             'category_'.$this->id,
  59.         ];
  60.         if ($this->cssClass) {
  61.             $cssClasses[] = $this->cssClass;
  62.         }
  63.         return \implode(' ', \array_unique($cssClasses));
  64.     }
  65.     /**
  66.      * Get the image.
  67.      *
  68.      * @return FilesModel|null
  69.      */
  70.     public function getImage()
  71.     {
  72.         return $this->image FilesModel::findByPk($this->image) : null;
  73.     }
  74.     /**
  75.      * Get the title.
  76.      *
  77.      * @return string
  78.      */
  79.     public function getTitle()
  80.     {
  81.         return $this->frontendTitle ?: $this->title;
  82.     }
  83.     /**
  84.      * Find published news categories by news criteria.
  85.      *
  86.      * @param array $archives
  87.      * @param array $ids
  88.      * @param array $aliases
  89.      * @param array $excludedIds
  90.      *
  91.      * @return Collection|null
  92.      */
  93.     public static function findPublishedByArchives(array $archives, array $ids = [], array $aliases = [], array $excludedIds = [])
  94.     {
  95.         if (=== \count($archives) || false === ($relation Relations::getRelation('tl_news''categories'))) {
  96.             return null;
  97.         }
  98.         $t = static::getTableAlias();
  99.         $values = [];
  100.         // Start sub select query for relations
  101.         $subSelect "SELECT {$relation['related_field']} 
  102. FROM {$relation['table']} 
  103. WHERE {$relation['reference_field']} IN (SELECT id FROM tl_news WHERE pid IN (".\implode(',', \array_map('intval'$archives)).')';
  104.         // Include only the published news items
  105.         if (!BE_USER_LOGGED_IN) {
  106.             $time Date::floorToMinute();
  107.             $subSelect .= ' AND (start=? OR start<=?) AND (stop=? OR stop>?) AND published=?';
  108.             $values = \array_merge($values, [''$time''$time 601]);
  109.         }
  110.         // Finish sub select query for relations
  111.         $subSelect .= ')';
  112.         // Columns definition start
  113.         $columns = ["$t.id IN ($subSelect)"];
  114.         // Filter by custom categories
  115.         if (\count($ids) > 0) {
  116.             $columns[] = "$t.id IN (".\implode(',', \array_map('intval'$ids)).')';
  117.         }
  118.         // Filter by excluded IDs
  119.         if (\count($excludedIds) > 0) {
  120.             $columns[] = "$t.id NOT IN (".\implode(',', \array_map('intval'$excludedIds)).')';
  121.         }
  122.         // Filter by custom aliases
  123.         if (\count($aliases) > 0) {
  124.             if (MultilingualHelper::isActive()) {
  125.                 $columns[] = "($t.alias IN ('".\implode("','"$aliases)."') OR translation.alias IN ('".\implode("','"$aliases)."'))";
  126.             } else {
  127.                 $columns[] = "$t.alias IN ('".\implode("','"$aliases)."')";
  128.             }
  129.         }
  130.         if (!BE_USER_LOGGED_IN) {
  131.             $columns[] = "$t.published=?";
  132.             $values[] = 1;
  133.         }
  134.         return static::findBy($columns$values, ['order' => "$t.sorting"]);
  135.     }
  136.     /**
  137.      * Find published category by ID or alias.
  138.      *
  139.      * @param string $idOrAlias
  140.      *
  141.      * @return NewsCategoryModel|null
  142.      */
  143.     public static function findPublishedByIdOrAlias($idOrAlias)
  144.     {
  145.         $values = [];
  146.         $columns = [];
  147.         $t = static::getTableAlias();
  148.         // Determine the alias condition
  149.         if (is_numeric($idOrAlias)) {
  150.             $columns[] = "$t.id=?";
  151.             $values[] = (int) $idOrAlias;
  152.         } else {
  153.             if (MultilingualHelper::isActive()) {
  154.                 $columns[] = "($t.alias=? OR translation.alias=?)";
  155.                 $values[] = $idOrAlias;
  156.                 $values[] = $idOrAlias;
  157.             } else {
  158.                 $columns[] = "$t.alias=?";
  159.                 $values[] = $idOrAlias;
  160.             }
  161.         }
  162.         if (!BE_USER_LOGGED_IN) {
  163.             $columns[] = "$t.published=?";
  164.             $values[] = 1;
  165.         }
  166.         return static::findOneBy($columns$values);
  167.     }
  168.     /**
  169.      * Find published news categories.
  170.      *
  171.      * @return Collection|null
  172.      */
  173.     public static function findPublished()
  174.     {
  175.         $t = static::getTableAlias();
  176.         $options = ['order' => "$t.sorting"];
  177.         if (BE_USER_LOGGED_IN) {
  178.             return static::findAll($options);
  179.         }
  180.         return static::findBy('published'1$options);
  181.     }
  182.     /**
  183.      * Find published news categories by parent ID and IDs.
  184.      *
  185.      * @param array    $ids
  186.      * @param int|null $pid
  187.      *
  188.      * @return Collection|null
  189.      */
  190.     public static function findPublishedByIds(array $ids$pid null)
  191.     {
  192.         if (=== \count($ids)) {
  193.             return null;
  194.         }
  195.         $t = static::getTableAlias();
  196.         $columns = ["$t.id IN (".\implode(',', \array_map('intval'$ids)).')'];
  197.         $values = [];
  198.         // Filter by pid
  199.         if (null !== $pid) {
  200.             $columns[] = "$t.pid=?";
  201.             $values[] = $pid;
  202.         }
  203.         if (!BE_USER_LOGGED_IN) {
  204.             $columns[] = "$t.published=?";
  205.             $values[] = 1;
  206.         }
  207.         return static::findBy($columns$values, ['order' => "$t.sorting"]);
  208.     }
  209.     /**
  210.      * Find published news categories by parent ID.
  211.      *
  212.      * @param int $pid
  213.      *
  214.      * @return Collection|null
  215.      */
  216.     public static function findPublishedByPid($pid)
  217.     {
  218.         $t = static::getTableAlias();
  219.         $columns = ["$t.pid=?"];
  220.         $values = [$pid];
  221.         if (!BE_USER_LOGGED_IN) {
  222.             $columns[] = "$t.published=?";
  223.             $values[] = 1;
  224.         }
  225.         return static::findBy($columns$values, ['order' => "$t.sorting"]);
  226.     }
  227.     /**
  228.      * Find the published categories by news.
  229.      *
  230.      * @param int|array $newsId
  231.      *
  232.      * @return Collection|null
  233.      */
  234.     public static function findPublishedByNews($newsId)
  235.     {
  236.         if (=== \count($ids Model::getRelatedValues('tl_news''categories'$newsId))) {
  237.             return null;
  238.         }
  239.         $t = static::getTableAlias();
  240.         $columns = ["$t.id IN (".\implode(',', \array_map('intval', \array_unique($ids))).')'];
  241.         $values = [];
  242.         if (!BE_USER_LOGGED_IN) {
  243.             $columns[] = "$t.published=?";
  244.             $values[] = 1;
  245.         }
  246.         return static::findBy($columns$values, ['order' => "$t.sorting"]);
  247.     }
  248.     /**
  249.      * Count the published news by archives.
  250.      *
  251.      * @param array    $archives
  252.      * @param int|null $category
  253.      * @param bool     $includeSubcategories
  254.      * @param array    $cumulativeCategories
  255.      * @param bool     $unionFiltering
  256.      *
  257.      * @return int
  258.      */
  259.     public static function getUsage(array $archives = [], $category null$includeSubcategories false, array $cumulativeCategories = [], $unionFiltering false)
  260.     {
  261.         $t NewsModel::getTable();
  262.         // Include the subcategories
  263.         if (null !== $category && $includeSubcategories) {
  264.             $category = static::getAllSubcategoriesIds($category);
  265.         }
  266.         $ids Model::getReferenceValues($t'categories'$category);
  267.         $ids array_map('intval'$ids);
  268.         // Also filter by cumulative categories
  269.         if (count($cumulativeCategories) > 0) {
  270.             $cumulativeIds null;
  271.             foreach ($cumulativeCategories as $cumulativeCategory) {
  272.                 // Include the subcategories
  273.                 if ($includeSubcategories) {
  274.                     $cumulativeCategory = static::getAllSubcategoriesIds($cumulativeCategory);
  275.                 }
  276.                 $newsIds Model::getReferenceValues($t'categories'$cumulativeCategory);
  277.                 $newsIds array_map('intval'$newsIds);
  278.                 if ($cumulativeIds === null) {
  279.                     $cumulativeIds $newsIds;
  280.                 } else {
  281.                     $cumulativeIds $unionFiltering array_merge($cumulativeIds$newsIds) : array_intersect($cumulativeIds$newsIds);
  282.                 }
  283.             }
  284.             $ids $unionFiltering array_merge($ids$cumulativeIds) : array_intersect($ids$cumulativeIds);
  285.         }
  286.         if (=== \count($ids)) {
  287.             return 0;
  288.         }
  289.         $columns = ["$t.id IN (".\implode(',', \array_unique($ids)).')'];
  290.         $values = [];
  291.         // Filter by archives
  292.         if (\count($archives)) {
  293.             $columns[] = "$t.pid IN (".\implode(',', \array_map('intval'$archives)).')';
  294.         }
  295.         if (!BE_USER_LOGGED_IN) {
  296.             $time Date::floorToMinute();
  297.             $columns[] = "($t.start=? OR $t.start<=?) AND ($t.stop=? OR $t.stop>?) AND $t.published=?";
  298.             $values = \array_merge($values, [''$time''$time 601]);
  299.         }
  300.         return NewsModel::countBy($columns$values);
  301.     }
  302.     /**
  303.      * Get all subcategory IDs.
  304.      *
  305.      * @param array|int $category
  306.      *
  307.      * @return array
  308.      */
  309.     public static function getAllSubcategoriesIds($category)
  310.     {
  311.         $ids Database::getInstance()->getChildRecords($category, static::$strTablefalse, (array) $category, (!BE_USER_LOGGED_IN 'published=1' ''));
  312.         $ids = \array_map('intval'$ids);
  313.         return $ids;
  314.     }
  315.     /**
  316.      * {@inheritdoc}
  317.      */
  318.     public static function findMultipleByIds($arrIds, array $arrOptions = [])
  319.     {
  320.         if (!MultilingualHelper::isActive()) {
  321.             return parent::findMultipleByIds($arrIds$arrOptions);
  322.         }
  323.         $t = static::getTableAlias();
  324.         if (!isset($arrOptions['order'])) {
  325.             $arrOptions['order'] = Database::getInstance()->findInSet("$t.id"$arrIds);
  326.         }
  327.         return static::findBy(["$t.id IN (".\implode(',', \array_map('intval'$arrIds)).')'], null);
  328.     }
  329.     /**
  330.      * Get the table alias.
  331.      *
  332.      * @return string
  333.      */
  334.     public static function getTableAlias()
  335.     {
  336.         return static::$strTable;
  337.     }
  338. }