public function getPossibleSelections() { $allowed_category_ids = []; if ($this->onlyAvailableProducts) { $object = Object::getForClass(Product::className()); if (!is_null($object) && isset($this->current_selections['last_category_id'])) { $cacheKey = 'CategoriesFilterWidget: ' . $object->id . ':' . $this->current_selections['last_category_id'] . ':' . Json::encode($this->current_selections['properties']); $allowed_category_ids = Yii::$app->cache->get($cacheKey); if ($allowed_category_ids === false) { $query = new Query(); $query = $query->select($object->categories_table_name . '.category_id')->distinct()->from($object->categories_table_name); if (count($this->current_selections['properties']) > 0) { foreach ($this->current_selections['properties'] as $property_id => $values) { $joinTableName = 'OSVJoinTable' . $property_id; $query->join('JOIN', ObjectStaticValues::tableName() . ' ' . $joinTableName, $joinTableName . '.object_id = :objectId AND ' . $joinTableName . '.object_model_id = ' . $object->categories_table_name . '.object_model_id ', [':objectId' => $object->id]); $imploded_values = implode(', ', array_map('intval', $values)); $query->andWhere(new Expression('`' . $joinTableName . '`.`property_static_value_id`' . ' in (' . $imploded_values . ')')); } } $allowed_category_ids = $query->column(); Yii::$app->cache->set($cacheKey, $allowed_category_ids, 86400, new \yii\caching\TagDependency(['tags' => [\devgroup\TagDependencyHelper\ActiveRecordHelper::getCommonTag($object->object_class), \devgroup\TagDependencyHelper\ActiveRecordHelper::getCommonTag(Category::className())]])); $object = null; } } } $this->possible_selections = []; $models = Category::getByLevel($this->category_group_id); if (isset($models[0]) && $this->omit_root == true) { $models = Category::getByParentId($models[0]->id); } $this->possible_selections = []; foreach ($models as $model) { if ($this->onlyAvailableProducts === true && !in_array($model->id, $allowed_category_ids)) { continue; } $this->possible_selections[] = $this->recursiveGetTree($model, $allowed_category_ids); } return $this->possible_selections; }