/**
  * Fill the object's arrProducts array
  *
  * @param array|null $arrCacheIds
  *
  * @return array
  */
 protected function findProducts($arrCacheIds = null)
 {
     $t = Product::getTable();
     $arrColumns = array();
     $arrCategories = $this->findCategories();
     $arrProductIds = \Database::getInstance()->query("\n                SELECT pid\n                FROM tl_iso_product_category\n                WHERE page_id IN (" . implode(',', $arrCategories) . ")\n            ")->fetchEach('pid');
     $arrTypes = \Database::getInstance()->query("SELECT id FROM tl_iso_producttype WHERE variants='1'")->fetchEach('id');
     if (empty($arrProductIds)) {
         return array();
     }
     $queryBuilder = new FilterQueryBuilder(Isotope::getRequestCache()->getFiltersForModules($this->iso_filterModules));
     $arrColumns[] = "(\n            ({$t}.id IN (" . implode(',', $arrProductIds) . ") AND {$t}.type NOT IN (" . implode(',', $arrTypes) . "))\n            OR {$t}.pid IN (" . implode(',', $arrProductIds) . ")\n        )";
     if (!empty($arrCacheIds) && is_array($arrCacheIds)) {
         $arrColumns[] = Product::getTable() . ".id IN (" . implode(',', $arrCacheIds) . ")";
     }
     // Apply new/old product filter
     if ($this->iso_newFilter == 'show_new') {
         $arrColumns[] = Product::getTable() . ".dateAdded>=" . Isotope::getConfig()->getNewProductLimit();
     } elseif ($this->iso_newFilter == 'show_old') {
         $arrColumns[] = Product::getTable() . ".dateAdded<" . Isotope::getConfig()->getNewProductLimit();
     }
     if ($this->iso_list_where != '') {
         $arrColumns[] = $this->iso_list_where;
     }
     if ($queryBuilder->hasSqlCondition()) {
         $arrColumns[] = $queryBuilder->getSqlWhere();
     }
     $arrSorting = Isotope::getRequestCache()->getSortingsForModules($this->iso_filterModules);
     if (empty($arrSorting) && $this->iso_listingSortField != '') {
         $direction = $this->iso_listingSortDirection == 'DESC' ? Sort::descending() : Sort::ascending();
         $arrSorting[$this->iso_listingSortField] = $direction;
     }
     $objProducts = Product::findAvailableBy($arrColumns, $queryBuilder->getSqlValues(), array('order' => 'c.sorting', 'filters' => $queryBuilder->getFilters(), 'sorting' => $arrSorting));
     return null === $objProducts ? array() : $objProducts->getModels();
 }
 /**
  * Generate query string for native filters
  *
  * @param array $arrFilters
  *
  * @return array
  *
  * @deprecated Deprecated since Isotope 2.3, to be removed in 3.0.
  *             Use Isotope\RequestCache\FilterQueryBuilder instead.
  */
 public static function buildSqlFilters(array $arrFilters)
 {
     $queryBuilder = new FilterQueryBuilder($arrFilters);
     return array($queryBuilder->getFilters(), $queryBuilder->getSqlWhere(), $queryBuilder->getSqlValues());
 }
 private function countProductsForFilter(array $filters)
 {
     $arrColumns = array();
     $arrCategories = $this->findCategories();
     $queryBuilder = new FilterQueryBuilder($filters);
     $arrColumns[] = "c.page_id IN (" . implode(',', $arrCategories) . ")";
     // Apply new/old product filter
     if ($this->iso_newFilter == self::FILTER_NEW) {
         $arrColumns[] = Product::getTable() . ".dateAdded>=" . Isotope::getConfig()->getNewProductLimit();
     } elseif ($this->iso_newFilter == self::FILTER_OLD) {
         $arrColumns[] = Product::getTable() . ".dateAdded<" . Isotope::getConfig()->getNewProductLimit();
     }
     if ($this->iso_list_where != '') {
         $arrColumns[] = $this->iso_list_where;
     }
     if ($queryBuilder->hasSqlCondition()) {
         $arrColumns[] = $queryBuilder->getSqlWhere();
     }
     return Product::countPublishedBy($arrColumns, $queryBuilder->getSqlValues());
 }
 /**
  * Get filter & sorting configuration
  *
  * @param boolean
  *
  * @return array
  *
  * @deprecated Deprecated since Isotope 2.3, to be removed in 3.0.
  *             Use Isotope\RequestCache\FilterQueryBuilder instead.
  */
 protected function getFiltersAndSorting($blnNativeSQL = true)
 {
     $arrFilters = Isotope::getRequestCache()->getFiltersForModules($this->iso_filterModules);
     $arrSorting = Isotope::getRequestCache()->getSortingsForModules($this->iso_filterModules);
     if (empty($arrSorting) && $this->iso_listingSortField != '') {
         $direction = $this->iso_listingSortDirection == 'DESC' ? Sort::descending() : Sort::ascending();
         $arrSorting[$this->iso_listingSortField] = $direction;
     }
     if (!$blnNativeSQL) {
         return array($arrFilters, $arrSorting);
     }
     $queryBuilder = new FilterQueryBuilder($arrFilters);
     return array($queryBuilder->getFilters(), $arrSorting, $queryBuilder->getSqlWhere(), $queryBuilder->getSqlValues());
 }