예제 #1
0
 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);
 }
예제 #2
0
 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;
 }
예제 #3
0
 /**
  *  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');
                             }
                         }
                     }
                 }
             }
         }
     }
 }