/** * Search products * @param $data ShopCategory|string * @param string $view */ public function doSearch($data, $view) { $this->query = new ShopProduct(null); $this->query->attachBehaviors($this->query->behaviors()); $this->query->applyAttributes($this->activeAttributes)->active(); if ($data instanceof ShopCategory) { $this->query->applyCategories($this->model); } else { $cr = new CDbCriteria(); $cr->with = array('translate' => array('together' => true)); $cr->addSearchCondition('translate.name', $data); $this->query->getDbCriteria()->mergeWith($cr); } // Filter by manufacturer if (Yii::app()->request->getQuery('manufacturer')) { $manufacturers = explode(',', Yii::app()->request->getParam('manufacturer', '')); // ; $this->query->applyManufacturers($manufacturers); } // Create clone of the current query to use later to get min and max prices. $this->currentQuery = clone $this->query->getDbCriteria(); // Filter products by price range if we have min_price or max_price in request $this->applyPricesFilter(); $per_page = $this->allowedPageLimit[0]; if (isset($_GET['per_page']) && in_array((int) $_GET['per_page'], $this->allowedPageLimit)) { $per_page = (int) $_GET['per_page']; } $this->provider = new ActiveDataProvider($this->query, array('id' => false, 'pagination' => array('pageSize' => $per_page))); $this->provider->sort = ShopProduct::getCSort(); if ($view != 'search') { $this->pageKeywords = $this->model->keywords(); $this->pageDescription = $this->model->description(); $this->pageTitle = $this->model->title(); // Create breadcrumbs $ancestors = $this->model->cache($this->cacheTime)->excludeRoot()->ancestors()->findAll(); // $this->breadcrumbs = array(Yii::t('ShopModule.default', 'BC_SHOP') => '/shop'); foreach ($ancestors as $c) { $this->breadcrumbs[$c->name] = $c->getViewUrl(); } $this->breadcrumbs[] = $this->model->name; } if (isset($_GET['view'])) { if ($_GET['view'] == 'list') { $itemView = '_view_list'; } elseif ($_GET['view'] == 'table') { $itemView = '_view_table'; } else { $itemView = '_view_grid'; } } else { $itemView = '_view_grid'; } $this->render($view, array('provider' => $this->provider, 'itemView' => $itemView)); }
/** * Display products by manufacturer * * @param $seo_alias * @throws CHttpException */ public function actionIndex($seo_alias) { $this->model = ShopManufacturer::model()->findByAttributes(array('seo_alias' => $seo_alias)); if (!$this->model) { throw new CHttpException(404, Yii::t('ShopModule.admin', 'NO_FOUND_BRAND')); } $this->pageTitle = $this->model->seo_title ? $this->model->seo_title : $this->model->name; $this->pageKeywords = $this->model->seo_keywords; $this->pageDescription = $this->model->seo_description; $query = new ShopProduct(null); $query->attachBehaviors($query->behaviors()); $query->active(); $query->applyManufacturers($this->model->id); $provider = new ActiveDataProvider($query, array('id' => false, 'pagination' => array('pageSize' => $this->allowedPageLimit[0]))); $this->render('index', array('provider' => $provider)); }
/** * Count products by attribute and option * @param ShopAttribute $attribute * @param string $option option id to search * @todo Optimize attributes merging * @return string */ public function countAttributeProducts($attribute, $option) { if ($this->countAttr) { $model = new ShopProduct(null); $model->attachBehaviors($model->behaviors()); $model->active()->cache($this->controller->cacheTime)->applyCategories($this->model)->applyMinPrice($this->convertCurrency(Yii::app()->request->getQuery('min_price')))->applyMaxPrice($this->convertCurrency(Yii::app()->request->getQuery('max_price'))); if (Yii::app()->request->getParam('manufacturer')) { $model->applyManufacturers(explode(',', Yii::app()->request->getParam('manufacturer'))); } $data = array($attribute->name => $option->id); $current = $this->getOwner()->activeAttributes; $newData = array(); foreach ($current as $key => $row) { if (!isset($newData[$key])) { $newData[$key] = array(); } if (is_array($row)) { foreach ($row as $v) { $newData[$key][] = $v; } } else { $newData[$key][] = $row; } } $newData[$attribute->name][] = $option->id; return $model->withEavAttributes($newData)->count(); } }