/**
  * 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();
 }
 public function modifyDC(&$arrDca = null)
 {
     // get the product
     switch ($this->iso_direct_checkout_product_mode) {
         case 'product_type':
             if (($objTypes = FieldPaletteModel::findByPidAndTableAndField($this->objModule->id, 'tl_module', 'iso_direct_checkout_product_types')) !== null) {
                 while ($objTypes->next()) {
                     $arrColumns = array('type=?');
                     $arrValues = array($objTypes->iso_direct_checkout_product_type);
                     if ($this->iso_listingSortField) {
                         $arrSorting = array($this->iso_listingSortField => $this->iso_listingSortDirection == 'DESC' ? Sort::descending() : Sort::ascending());
                     } else {
                         $arrSorting = array();
                     }
                     $objProducts = Product::findPublishedBy($arrColumns, $arrValues, array('sorting' => $arrSorting));
                     if ($objProducts->count() > 0) {
                         $objProduct = $objProducts->current();
                         $this->arrProducts[] = array('product' => $objProduct, 'useQuantity' => $objTypes->iso_use_quantity);
                         $this->addProductFields($objProduct, $objTypes->iso_use_quantity, $objTypes->iso_addSubscriptionCheckbox, $arrDca);
                     }
                 }
             }
             break;
         default:
             if (($objProducts = FieldPaletteModel::findByPidAndTableAndField($this->objModule->id, 'tl_module', 'iso_direct_checkout_products')) !== null) {
                 while ($objProducts->next()) {
                     $objProduct = Product::findByPk($objProducts->iso_direct_checkout_product);
                     $this->arrProducts[] = array('product' => $objProduct, 'useQuantity' => $objProducts->iso_use_quantity);
                     $this->addProductFields($objProduct, $objProducts->iso_use_quantity, $objProducts->iso_addSubscriptionCheckbox, $arrDca);
                 }
             }
             break;
     }
     // add address fields
     \Controller::loadDataContainer('tl_iso_address');
     \System::loadLanguageFile('tl_iso_address');
     $arrAddressFields = deserialize(Config::findByPk($this->iso_config_id)->address_fields, true);
     // add billing address fields
     foreach ($arrAddressFields as $strName => $arrAddressField) {
         $arrData = $GLOBALS['TL_DCA']['tl_iso_address']['fields'][$strName];
         if (!is_array($arrData) || $arrAddressField['billing'] == 'disabled') {
             continue;
         }
         $arrData['eval']['mandatory'] = $arrAddressField['billing'] == 'mandatory';
         $this->arrBillingAddressFields[] = $strName;
         $this->addEditableField($strName, $arrData);
     }
     if ($this->iso_use_notes) {
         $this->addEditableField('notes', array('label' => &$GLOBALS['TL_LANG']['MSC']['iso_note'], 'exclude' => true, 'inputType' => 'textarea', 'eval' => array('tl_class' => 'clr w50'), 'sql' => "text NULL"));
     }
     $this->addEditableField('shippingaddress', array('label' => array($GLOBALS['TL_LANG']['MSC']['differentShippingAddress'], $GLOBALS['TL_LANG']['MSC']['differentShippingAddress']), 'inputType' => 'checkbox', 'eval' => array('submitOnChange' => true)));
     // add shipping address fields
     $arrShippingAddressFields = array();
     foreach ($arrAddressFields as $strName => $arrAddressField) {
         $arrData = $GLOBALS['TL_DCA']['tl_iso_address']['fields'][$strName];
         if (!is_array($arrData) || $arrAddressField['shipping'] == 'disabled') {
             continue;
         }
         $arrData['eval']['mandatory'] = $arrAddressField['shipping'] == 'mandatory';
         $this->addEditableField('shippingaddress_' . $strName, $arrData);
         $arrShippingAddressFields[] = 'shippingaddress_' . $strName;
     }
     $this->dca['palettes']['__selector__'][] = 'shippingaddress';
     $this->dca['subpalettes']['shippingaddress'] = implode(',', $arrShippingAddressFields);
     $this->arrShippingAddressFields = $arrShippingAddressFields;
 }
 /**
  * Generate a sorting form
  */
 protected function generateSorting()
 {
     $this->Template->hasSorting = false;
     if (is_array($this->iso_sortingFields) && count($this->iso_sortingFields)) {
         $arrOptions = array();
         // Cache new request value
         // @todo should support multiple sorting fields
         list($sortingField, $sortingDirection) = explode(':', \Input::post('sorting'));
         if ($this->blnUpdateCache && in_array($sortingField, $this->iso_sortingFields)) {
             Isotope::getRequestCache()->setSortingForModule($sortingField, $sortingDirection == 'DESC' ? Sort::descending() : Sort::ascending(), $this->id);
         } elseif (array_diff(array_keys(Isotope::getRequestCache()->getSortingsForModules(array($this->id))), $this->iso_sortingFields)) {
             // Request cache contains wrong value, delete it!
             $this->blnUpdateCache = true;
             Isotope::getRequestCache()->unsetSortingsForModule($this->id);
             RequestCache::deleteById(\Input::get('isorc'));
         } elseif (!$this->blnUpdateCache) {
             // No need to generate options if we reload anyway
             $first = Isotope::getRequestCache()->getFirstSortingFieldForModule($this->id);
             foreach ($this->iso_sortingFields as $field) {
                 list($asc, $desc) = $this->getSortingLabels($field);
                 $objSorting = $first == $field ? Isotope::getRequestCache()->getSortingForModule($field, $this->id) : null;
                 if ($field === "releaseDate") {
                     $arrOptions[] = array('label' => $desc, 'value' => $field . ':DESC', 'default' => null !== $objSorting && $objSorting->isDescending() ? '1' : '');
                     $arrOptions[] = array('label' => $asc, 'value' => $field . ':ASC', 'default' => null !== $objSorting && $objSorting->isAscending() ? '1' : '');
                 } else {
                     $arrOptions[] = array('label' => $asc, 'value' => $field . ':ASC', 'default' => null !== $objSorting && $objSorting->isAscending() ? '1' : '');
                     $arrOptions[] = array('label' => $desc, 'value' => $field . ':DESC', 'default' => null !== $objSorting && $objSorting->isDescending() ? '1' : '');
                 }
             }
         }
         $this->Template->hasSorting = true;
         $this->Template->sortingLabel = $GLOBALS['TL_LANG']['MSC']['orderByLabel'];
         $this->Template->sortingOptions = $arrOptions;
     }
 }
Example #4
0
 /**
  * Get filter & sorting configuration
  * @param boolean
  * @return array
  */
 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 != '') {
         $arrSorting[$this->iso_listingSortField] = $this->iso_listingSortDirection == 'DESC' ? Sort::descending() : Sort::ascending();
     }
     if ($blnNativeSQL) {
         list($arrFilters, $strWhere, $arrValues) = RequestCache::buildSqlFilters($arrFilters);
         return array($arrFilters, $arrSorting, $strWhere, $arrValues);
     }
     return array($arrFilters, $arrSorting);
 }
 /**
  * Get sorting configuration
  * @param boolean
  * @return array
  */
 protected function getSorting()
 {
     $arrSorting = array();
     if ($this->iso_listingSortField != '') {
         $arrSorting[$this->iso_listingSortField] = $this->iso_listingSortDirection == 'DESC' ? Sort::descending() : Sort::ascending();
     }
     return $arrSorting;
 }
 /**
  * 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());
 }