/** * Apply selected product sort order to ARSelectFilter instance */ private function applySortOrder(ARSelectFilter $selectFilter, $order) { $dir = array_pop(explode('_', $order)) == 'asc' ? 'ASC' : 'DESC'; if (substr($order, 0, 12) == 'product_name') { $selectFilter->setOrder(Product::getLangOrderHandle(new ARFieldHandle('Product', 'name')), $dir); } else { if (substr($order, 0, 5) == 'price') { $selectFilter->setOrder(new ARFieldHandle('ProductPrice', 'price'), $dir); $selectFilter->joinTable('ProductPrice', 'Product', 'productID AND (ProductPrice.currencyID = "' . $this->application->getDefaultCurrencyCode() . '")', 'ID'); } else { if (substr($order, 0, 3) == 'sku') { $selectFilter->setOrder(new ARFieldHandle('ProductPrice', 'price'), $dir); $selectFilter->joinTable('ProductPrice', 'Product', 'productID AND (ProductPrice.currencyID = "' . $this->application->getDefaultCurrencyCode() . '")', 'ID'); } else { if ('newest_arrivals' == $order) { $selectFilter->setOrder(new ARFieldHandle('Product', 'dateCreated'), 'DESC'); } else { if (in_array($order, array('rating', 'sku'))) { $selectFilter->setOrder(new ARFieldHandle('Product', $order), $dir); } else { if ('sales_rank' == $order) { Product::updateSalesRank(); $selectFilter->setOrder(new ARFieldHandle('Product', 'salesRank'), 'DESC'); } else { if (is_numeric($fieldID = array_shift(explode('-', $order))) && !SpecField::getInstanceByID($fieldID, true)->isMultiValue->get()) { $field = SpecField::getInstanceByID($fieldID); $field->defineJoin($selectFilter); $f = $field->getJoinAlias() . ($field->isSelector() ? '_value' : '') . '.value'; $selectFilter->setOrder(new ARExpressionHandle($f . ' IS NOT NULL'), 'DESC'); $selectFilter->setOrder(new ARExpressionHandle($f . ' != ""'), 'DESC'); $f = new ARExpressionHandle($f); if ($field->isSelector()) { $f = MultiLingualObject::getLangOrderHandle($f); } $selectFilter->setOrder($f, array_pop(explode('_', $order)) == 'desc' ? 'DESC' : 'ASC'); } else { $selectFilter->setOrder(new ARFieldHandle('Product', 'isFeatured'), 'DESC'); $selectFilter->setOrder(new ARFieldHandle('Product', 'salesRank'), 'DESC'); $selectFilter->setOrder(new ARFieldHandle('Product', 'position'), 'DESC'); } } } } } } } }