public function actionIndex($category_id = null) { $searchModel = new Category(); $searchModel->active = 1; $params = Yii::$app->request->get(); $dataProvider = $searchModel->search($params); $selectedCategory = null; if ($category_id !== null) { $selectedCategory = Category::findById($category_id); } if ($selectedCategory !== null) { if (Yii::$app->request->isPost === true) { $newProperty = isset($_GET['add_property_id']) ? Property::findById($_GET['add_property_id']) : null; if ($newProperty !== null) { $filterSet = new FilterSets(); $filterSet->category_id = $selectedCategory->id; $filterSet->property_id = $newProperty->id; $filterSet->sort_order = 65535; $filterSet->save(); } } } $groups = PropertyGroup::getForObjectId(Object::getForClass(Product::className())->id, false); $propertiesDropdownItems = []; foreach ($groups as $group) { $item = ['label' => $group->name, 'url' => '#', 'items' => []]; $properties = Property::getForGroupId($group->id); foreach ($properties as $prop) { $item['items'][] = ['label' => $prop->name, 'url' => '?category_id=' . $category_id . '&add_property_id=' . $prop->id, 'linkOptions' => ['class' => 'add-property-to-filter-set', 'data-property-id' => $prop->id, 'data-action' => 'post']]; } $propertiesDropdownItems[] = $item; } return $this->render('index', ['dataProvider' => $dataProvider, 'searchModel' => $searchModel, 'selectedCategory' => $selectedCategory, 'propertiesDropdownItems' => $propertiesDropdownItems]); }
/** * @param $objectId * @return array */ protected static function getProperties($objectId) { $properties = []; $groups = PropertyGroup::getForObjectId($objectId); foreach ($groups as $group) { $props = Property::getForGroupId($group->id); foreach ($props as $prop) { $properties[] = $prop; } } return $properties; }
public function getPropertyGroups($force = false, $getByObjectId = false, $createAbstractModel = false) { $message = "getPropertyGroups " . $this->owner->className() . ':' . $this->owner->id . " force:" . ($force ? 'true' : 'false') . " getByObjectId:" . ($getByObjectId ? 'true' : 'false') . " createAbstractModel:" . ($createAbstractModel ? 'true' : 'false'); Yii::trace($message, 'properties'); $cacheKey = $message; if ($this->properties === null && $force === false) { // try to get from cache $data = Yii::$app->cache->get($message); if ($data !== false) { Yii::trace("Properties from cache", 'properties'); $this->abstract_model = isset($data['abstract_model']) ? $data['abstract_model'] : []; $this->properties = $data['properties']; $this->property_key_to_id = $data['property_key_to_id']; $this->property_id_to_group_id = $data['property_id_to_group_id']; } } if ($createAbstractModel === true && is_null($this->abstract_model)) { // force creating abstract model if it is null and needed $force = true; } if ($this->properties === null || $force === true) { $tags = [ActiveRecordHelper::getObjectTag($this->owner->className(), $this->owner->id)]; $this->properties = []; if ($getByObjectId === true) { $groups = PropertyGroup::getForObjectId($this->getObject()->id); } else { $groups = PropertyGroup::getForModel($this->getObject()->id, $this->owner->id); } $values_for_abstract = []; $properties_models = []; $rules = []; /** @var PropertyGroup $group */ foreach ($groups as $group) { $tags[] = ActiveRecordHelper::getObjectTag(PropertyGroup::className(), $group->id); $this->properties[$group->id] = []; $props = Property::getForGroupId($group->id); foreach ($props as $p) { $values = $this->getPropertyValues($p); $this->properties[$group->id][$p->key] = $values; if ($createAbstractModel === true) { $values_for_abstract[$p->key] = $values; } $properties_models[$p->key] = $p; $this->property_key_to_id[$p->key] = $p->id; if (!isset($this->property_id_to_group_id[$group->id])) { $this->property_id_to_group_id[$group->id] = [$p->key]; } else { $this->property_id_to_group_id[$group->id][] = $p->key; } if ($createAbstractModel === true) { $handlerAdditionalParams = Json::decode($p->handler_additional_params); if (isset($handlerAdditionalParams['rules']) && is_array($handlerAdditionalParams['rules'])) { foreach ($handlerAdditionalParams['rules'] as $rule) { if (is_array($rule)) { $rules[] = ArrayHelper::merge([$p->key], $rule); } else { $rules[] = [$p->key, $rule]; } } } } } } if ($createAbstractModel === true) { $this->abstract_model = new AbstractModel([], $this->owner); $this->abstract_model->setPropertiesModels($properties_models); $this->abstract_model->setAttributes($values_for_abstract); $this->abstract_model->setFormName('Properties_' . $this->owner->formName() . '_' . $this->owner->id); $this->abstract_model->addRules($rules); } $res = Yii::$app->cache->set($cacheKey, ['properties' => $this->properties, 'abstract_model' => $this->abstract_model, 'property_id_to_group_id' => $this->property_id_to_group_id, 'property_key_to_id' => $this->property_key_to_id], 86400, new TagDependency(['tags' => $tags])); Yii::trace('putting props to cache: ' . ($res ? 'true' : 'false') . ' key:' . $cacheKey, 'properties'); } return $this->properties; }
/** * @param Order $order * @param boolean $dummyObject Empty object, non saved to database * @return OrderDeliveryInformation|null * @throws \Exception */ public static function createNewOrderDeliveryInformation(Order $order, $dummyObject = true) { /** @var OrderDeliveryInformation|HasProperties $model */ $model = new static(); $model->order_id = $order->id; $model->loadDefaultValues(); $groups = PropertyGroup::getForObjectId($model->getObject()->id, true); $group = array_shift($groups); if (null !== $group) { $model->setPropertyGroup($group); $abstractModel = new AbstractModel(); $abstractModel->setPropertiesModels(array_reduce($group->properties, function ($result, $item) { /** @var Property $item */ $result[$item->key] = $item; return $result; }, [])); $abstractModel->setAttributes(array_reduce($group->properties, function ($result, $item) use($model) { /** @var Property $item */ $result[$item->key] = new PropertyValue([], $item->id, $model->getObject()->id, null); return $result; }, [])); $abstractModel->setFormName('OrderDeliveryInformationNew'); $model->setAbstractModel($abstractModel); } if (!$dummyObject) { $model->shipping_option_id = 0; if ($model->save()) { if (!empty($model->getPropertyGroup())) { $model->getPropertyGroup()->appendToObjectModel($model); } } else { return null; } } return $model; }
<div class="col-md-12"> <?php echo $form->field($model, 'file')->fileInput(); ?> </div> </div> <div class="form-group row"> <div class="col-md-12"> <fieldset> <legend> <?php echo Yii::t('app', 'Add property groups to each new object: '); ?> </legend> <?php echo $form->field($model, 'addPropertyGroups')->checkboxList(\yii\helpers\ArrayHelper::map(\app\models\PropertyGroup::getForObjectId($object->id), 'id', 'name'), ['item' => function ($index, $label, $name, $checked, $value) { $line = Html::beginTag('div', ['class' => 'checkbox']); $line .= Html::checkbox($name, $checked, ['value' => $value, 'label' => Html::encode($label)]); $line .= '</div>'; return $line; }])->label(''); ?> </fieldset> </div> </div> <?php } ?> <?php if (!$importMode) {
/** * @param int $user_id * @param bool $dummyObject * @return Customer|null */ public static function createEmptyCustomer($user_id = 0, $dummyObject = true) { $model = new static(); $model->user_id = intval($user_id); $model->loadDefaultValues(); if ($model->user_id === 0 && (int) Yii::$app->getModule('shop')->registrationGuestUserInCart === 1) { $model->setScenario('registerUser'); } $groups = PropertyGroup::getForObjectId($model->getObject()->id, true); $group = array_shift($groups); if (null !== $group) { $model->setPropertyGroup($group); $abstractModel = new AbstractModel(); $abstractModel->setPropertiesModels(array_reduce($group->properties, function ($result, $item) { /** @var Property $item */ $result[$item->key] = $item; return $result; }, [])); $abstractModel->setAttributes(array_reduce($group->properties, function ($result, $item) use($model) { /** @var Property $item */ $result[$item->key] = new PropertyValue([], $item->id, $model->getObject()->id, null); return $result; }, [])); $abstractModel->setFormName('CustomerNew'); $model->setAbstractModel($abstractModel); } if (!$dummyObject) { $model->first_name = 'Имя'; if ($model->save()) { if (!empty($model->getPropertyGroup())) { $model->getPropertyGroup()->appendToObjectModel($model); } } else { return null; } } return $model; }
public function getPossibleSelections() { $data = ['propertyIds' => [], 'propertyStaticValueIds' => []]; if ($this->onlyAvailableFilters) { Yii::beginProfile("onlyAvailableFilters"); $object = Object::findById($this->objectId); if (!is_null($object) && isset($this->currentSelections['last_category_id'])) { $cacheKey = 'FilterWidget: ' . $object->id . ':' . $this->currentSelections['last_category_id'] . ':' . Json::encode($this->currentSelections['properties']); $data = Yii::$app->cache->get($cacheKey); if ($data === false) { $data = []; Yii::beginProfile("ObjectIds for this category"); $query = new Query(); $query = $query->select($object->categories_table_name . '.object_model_id')->distinct()->from($object->categories_table_name)->join("JOIN", Product::tableName(), sprintf("%s.`id` = %s.`object_model_id`", Product::tableName(), $object->categories_table_name))->andWhere([Product::tableName() . ".`active`" => 1])->andWhere(['category_id' => $this->currentSelections['last_category_id']]); if (count($this->currentSelections['properties']) > 0) { Yii::beginProfile("Apply currency selections(properties)"); foreach ($this->currentSelections['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]); $query->andWhere(['in', '`' . $joinTableName . '`.`property_static_value_id`', $values]); } Yii::endProfile("Apply currency selections(properties)"); } Yii::endProfile("ObjectIds for this category"); $ids = array_map('intval', $query->column()); $query = null; Yii::beginProfile("all PSV ids"); $data['propertyStaticValueIds'] = []; if (count($ids) !== 0) { $q4psv = (new Query())->select('property_static_value_id')->from(ObjectStaticValues::tableName())->distinct()->where(['object_id' => $object->id])->andWhere('object_model_id in (' . implode(',', $ids) . ')'); $data['propertyStaticValueIds'] = array_map('intval', $q4psv->column()); } Yii::endProfile("all PSV ids"); $ids = null; Yii::beginProfile("Property ids from PSV ids"); $data['propertyIds'] = []; if (count($data['propertyStaticValueIds']) !== 0) { $data['propertyIds'] = PropertyStaticValues::find()->select('property_id')->distinct()->where(['dont_filter' => 0])->andWhere('id IN (' . implode(',', $data['propertyStaticValueIds']) . ')')->asArray()->column(); } Yii::endProfile("Property ids from PSV ids"); Yii::$app->cache->set($cacheKey, $data, 86400, new TagDependency(['tags' => [\devgroup\TagDependencyHelper\ActiveRecordHelper::getCommonTag($object->object_class)]])); $object = null; } } Yii::endProfile("onlyAvailableFilters"); } $this->possibleSelections = []; $groups = PropertyGroup::getForObjectId($this->objectId); foreach ($groups as $group) { if ($this->onlyGroupsIds !== null) { if (in_array($group->id, $this->onlyGroupsIds) === false) { // skip this group continue; } } if ($group->is_internal) { continue; } $this->possibleSelections[$group->id] = ['group' => $group, 'selections' => [], 'static_selections' => [], 'dynamic_selections' => []]; $props = Property::getForGroupId($group->id); foreach ($props as $p) { if ($this->onlyAvailableFilters && !in_array($p->id, $data['propertyIds'])) { if ($this->disableInsteadOfHide === false) { continue; } } if ($p->dont_filter) { continue; } if ($p->has_static_values) { $propertyStaticValues = PropertyStaticValues::getValuesForPropertyId($p->id); foreach ($propertyStaticValues as $key => $propertyStaticValue) { if ($propertyStaticValue['dont_filter']) { unset($propertyStaticValues[$key]); } } if ($this->onlyAvailableFilters) { foreach ($propertyStaticValues as $key => $propertyStaticValue) { if (!in_array($propertyStaticValue['id'], $data['propertyStaticValueIds'])) { if ($this->disableInsteadOfHide === true) { $this->disabled_ids[] = $propertyStaticValue['id']; } else { unset($propertyStaticValues[$key]); } } } } $this->possibleSelections[$group->id]['static_selections'][$p->id] = $propertyStaticValues; } elseif ($p->is_column_type_stored && $p->value_type == 'NUMBER') { $this->possibleSelections[$group->id]['dynamic_selections'][] = $p->id; } } if (count($this->possibleSelections[$group->id]) === 0) { unset($this->possibleSelections[$group->id]); } } }