public function filter($emptyListIsException = false) { $request = $this->application->getRequest(); $parser = $this->getParser(); $apiFieldNames = $parser->getApiFieldNames(); $parser->loadDataInRequest($request); $f = new ARSelectFilter(); $id = $request->get('ID'); if (intval($id) > 0) { $f->mergeCondition(new EqualsCond(new ARFieldHandle('Category', 'ID'), $id)); } $f->setOrder(MultiLingualObject::getLangOrderHandle(new ARFieldHandle('Category', 'name'))); $categories = ActiveRecordModel::getRecordSetArray('Category', $f); $response = new LiveCartSimpleXMLElement('<response datetime="' . date('c') . '"></response>'); if ($emptyListIsException && count($categories) == 0) { throw new Exception('Category not found'); } while ($category = array_shift($categories)) { $xmlCategory = $response->addChild('category'); foreach ($category as $k => $v) { if (in_array($k, $apiFieldNames)) { $xmlCategory->addChild($k, htmlentities($v)); } } } return new SimpleXMLResponse($response); }
private function getFieldHandle($field, $handleType) { // aliases if (!strpos($field, '.')) { return f($field); } list($schemaName, $fieldName) = explode('.', $field); if ($this->getEavTableAlias() == $schemaName) { $fieldID = $fieldName; $fieldName = 'value'; $specField = call_user_func(array($this->getEavFieldClass(), 'getInstanceByID'), $fieldID); if ($specField->isSelector()) { if ($specField->isMultiValue->get()) { return $specField; } else { if (self::FILTER_HANDLE == $handleType) { $fieldName = 'ID'; } } } } $handle = null; if ($schemaName) { $schema = $this->getSchemaInstance($field); if ($field = $schema->getField($fieldName)) { $handle = $schema->getHandle($fieldName); if ($this->getEavTableAlias() == $schemaName) { $handle->setTable('specField_' . $fieldID . ($schema->getName() == $this->getEavValueClass() ? '_value' : '')); } // language fields if ($field->getDataType() instanceof ARArray) { if (self::SORT_HANDLE == $handleType) { $handle = MultiLingualObject::getLangOrderHandle($handle); } else { $handleres = array(); $defLang = $this->application->getDefaultLanguageCode(); $locale = $this->application->getLocaleCode(); $handleres[] = MultiLingualObject::getLangSearchHandle($handle, $locale); if ($locale != $defLang) { $handleres[] = MultiLingualObject::getLangSearchHandle($handle, $defLang); } $handle = $handleres; } } } } else { $handle = new ARExpressionHandle($fieldName); } return $handle; }
/** * 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'); } } } } } } } }