ProductRepository::getByFilter PHP Method

getByFilter() public method

public getByFilter ( array $mainSearchAttributes, array $typeSearchAttributes ) : CActiveDataProvider
$mainSearchAttributes array
$typeSearchAttributes array
return CActiveDataProvider
    public function getByFilter(array $mainSearchAttributes, array $typeSearchAttributes)
    {
        $criteria = new CDbCriteria(['select' => 't.*', 'distinct' => true, 'params' => []]);
        $criteria->addCondition('t.status = :status');
        $criteria->params['status'] = Product::STATUS_ACTIVE;
        //поиск по категории, производителю и цене
        foreach ($this->attributeFilter->getMainSearchParams() as $param => $field) {
            if (empty($mainSearchAttributes[$param])) {
                continue;
            }
            if ('category' === $param) {
                $categories = [];
                foreach ($mainSearchAttributes[$param] as $categoryId) {
                    $categories[] = (int) $categoryId;
                    $categories = CMap::mergeArray($categories, StoreCategory::model()->getChildsArray($categoryId));
                }
                $builder = new CDbCommandBuilder(Yii::app()->getDb()->getSchema());
                $criteria->addInCondition('t.category_id', array_unique($categories));
                $criteria->addCondition(sprintf('t.id IN (SELECT product_id FROM {{store_product_category}} WHERE %s)', $builder->createInCondition('{{store_product_category}}', 'category_id', $categories)), 'OR');
                continue;
            }
            if (isset($mainSearchAttributes[$param]['from'], $mainSearchAttributes[$param]['to'])) {
                $criteria->addBetweenCondition("t." . $field, $mainSearchAttributes[$param]['from'], $mainSearchAttributes[$param]['to']);
            } elseif (isset($mainSearchAttributes[$param]['from']) && !isset($mainSearchAttributes[$param]['to'])) {
                $criteria->addCondition("t.{$field} >= :attr_{$field}");
                $criteria->params[":attr_{$field}"] = $mainSearchAttributes[$param]['from'];
            } elseif (isset($mainSearchAttributes[$param]['to']) && !isset($mainSearchAttributes[$param]['from'])) {
                $criteria->addCondition("t.{$field} <= :attr_{$field}");
                $criteria->params[":attr_{$field}"] = $mainSearchAttributes[$param]['to'];
            } else {
                $criteria->addInCondition("t." . $field, $mainSearchAttributes[$param]);
            }
        }
        //поиск по названию и артикулу
        if (!empty($mainSearchAttributes[AttributeFilter::MAIN_SEARCH_PARAM_NAME])) {
            $criteria->addSearchCondition('name', $mainSearchAttributes[AttributeFilter::MAIN_SEARCH_PARAM_NAME], true);
            $criteria->addSearchCondition('sku', $mainSearchAttributes[AttributeFilter::MAIN_SEARCH_PARAM_NAME], true, 'OR');
        }
        $criteria->mergeWith($this->buildCriteriaForTypeAttributes($typeSearchAttributes));
        return new CActiveDataProvider('Product', ['criteria' => $criteria, 'pagination' => ['pageSize' => (int) Yii::app()->getModule('store')->itemsPerPage, 'pageVar' => 'page'], 'sort' => ['sortVar' => 'sort', 'defaultOrder' => 't.position']]);
    }

Usage Example

Example #1
0
 /**
  * @param $path
  * @throws CHttpException
  */
 public function actionView($path)
 {
     $category = StoreCategory::model()->published()->findByPath($path);
     if (null === $category) {
         throw new CHttpException(404);
     }
     $data = Yii::app()->getRequest()->getQueryString() ? $this->productRepository->getByFilter($this->attributeFilter->getMainAttributesForSearchFromQuery(Yii::app()->getRequest(), [AttributeFilter::MAIN_SEARCH_PARAM_CATEGORY => [$category->id]]), $this->attributeFilter->getTypeAttributesForSearchFromQuery(Yii::app()->getRequest())) : $this->productRepository->getListForCategory($category);
     $this->render('view', ['dataProvider' => $data, 'category' => $category]);
 }
All Usage Examples Of ProductRepository::getByFilter