Пример #1
0
 /**
  * Delete relations
  * @return bool
  */
 public function cleanUpRelations()
 {
     if (!is_subclass_of($this->owner, '\\yii\\db\\ActiveRecord')) {
         return false;
     }
     if (isset($this->owner->is_deleted) && 0 === intval($this->owner->is_deleted)) {
         return false;
     }
     if (null === ($object = Object::getForClass($this->owner->className()))) {
         return false;
     }
     $whereDelete = ['object_id' => $object->id, 'object_model_id' => $this->owner->id];
     ObjectPropertyGroup::deleteAll($whereDelete);
     ObjectStaticValues::deleteAll($whereDelete);
     Image::deleteAll($whereDelete);
     ViewObject::deleteAll($whereDelete);
     try {
         Yii::$app->db->createCommand()->delete($object->categories_table_name, ['object_model_id' => $this->owner->id])->execute();
         Yii::$app->db->createCommand()->delete($object->column_properties_table_name, ['object_model_id' => $this->owner->id])->execute();
         Yii::$app->db->createCommand()->delete($object->eav_table_name, ['object_model_id' => $this->owner->id])->execute();
     } catch (Exception $e) {
         // do nothing
     }
     return true;
 }
Пример #2
0
 public function actionClearDeleted()
 {
     $time = new \DateTime();
     $days = Yii::$app->getModule('core')->daysToStoreSubmissions;
     $time->sub(new \DateInterval("P{$days}D"));
     /** @var Object $object */
     $object = Object::getForClass(Submission::className());
     if ($object !== null) {
         $submissionIds = Submission::find()->select(['id'])->where('UNIX_TIMESTAMP(`date_received`) < ' . $time->getTimestamp() . ' AND `is_deleted` = \'1\'')->column();
         Review::deleteAll(['submission_id' => $submissionIds]);
         Yii::$app->db->createCommand()->delete($object->column_properties_table_name, ['object_model_id' => $submissionIds]);
         Yii::$app->db->createCommand()->delete($object->eav_table_name, ['object_model_id' => $submissionIds]);
         Yii::$app->db->createCommand()->delete($object->categories_table_name, ['object_model_id' => $submissionIds]);
         ObjectStaticValues::deleteAll(['object_id' => $object->id, 'object_model_id' => $submissionIds]);
         Submission::deleteAll(['id' => $submissionIds]);
     }
 }
Пример #3
0
 public function updateValues($new_values, $object_id, $object_model_id)
 {
     $column_type_updates = ['object_model_id' => $object_model_id];
     $osv_psv_ids = [];
     $new_eav_values = [];
     $eav_ids_to_delete = [];
     foreach ($new_values as $key => $values) {
         $property = Property::findById($values->property_id);
         if ($property->captcha == 1) {
             continue;
         }
         if (!isset($this->values_by_property_key[$key])) {
             // нужно добавить
             if ($property->is_column_type_stored) {
                 $column_type_updates[$key] = (string) $values;
             } elseif ($property->has_static_values) {
                 foreach ($values->values as $val) {
                     $osv_psv_ids[] = $val['value'];
                 }
             } elseif ($property->is_eav) {
                 $new_eav_values[$key] = $values;
             }
         } else {
             if ($property->is_column_type_stored) {
                 $column_type_updates[$key] = (string) $values;
             } elseif ($property->has_static_values) {
                 foreach ($values->values as $val) {
                     $osv_psv_ids[] = $val['value'];
                 }
             } elseif ($property->is_eav) {
                 // добавим новые
                 foreach ($values->values as $val) {
                     $exist_in_old = false;
                     foreach ($this->values_by_property_key[$key]->values as $old_val) {
                         if ($old_val['value'] == $val['value']) {
                             $exist_in_old = true;
                             break;
                         }
                     }
                     if ($exist_in_old == false) {
                         $new_eav_values[] = [$object_model_id, $values->property_group_id, $key, $val['value'], 0];
                     }
                 }
                 // теперь добавим на удаление
                 foreach ($this->values_by_property_key[$key]->values as $old_val) {
                     $exist_in_new = false;
                     foreach ($values->values as $new_val) {
                         if ($old_val['value'] == $new_val['value']) {
                             $exist_in_new = true;
                             break;
                         }
                     }
                     if ($exist_in_new == false) {
                         // @todo find why sometimes it isn't exist
                         if (isset($old_val['eav_id'])) {
                             $eav_ids_to_delete[] = $old_val['eav_id'];
                         }
                     }
                 }
             }
         }
     }
     $osv_psv_ids_to_delete = [];
     foreach ($this->values_by_property_key as $key => $values) {
         $property = Property::findById($values->property_id);
         if (in_array($key, array_keys($new_values)) === false) {
             // if in incoming array there was no specification for this property - skip it
             continue;
         }
         if ($property->has_static_values) {
             foreach ($values->values as $val) {
                 if (in_array($val['psv_id'], $osv_psv_ids) === false) {
                     // в новых значениях нет
                     $osv_psv_ids_to_delete[] = $val['psv_id'];
                 } else {
                     // удалим, чтобы заново не добавлять
                     unset($osv_psv_ids[array_search($val['psv_id'], $osv_psv_ids)]);
                 }
             }
         }
     }
     if (count($osv_psv_ids_to_delete) > 0) {
         ObjectStaticValues::deleteAll(['and', '`object_id` = :objectId', ['and', '`object_model_id` = :objectModelId', ['in', '`property_static_value_id`', $osv_psv_ids_to_delete]]], [':objectId' => $object_id, ':objectModelId' => $object_model_id]);
     }
     if (count($osv_psv_ids) > 0) {
         $rows = [];
         foreach ($osv_psv_ids as $psv_id) {
             // 0 - Not Selected Field. Такие значения в базу не сохраняем
             if ($psv_id == 0) {
                 continue;
             }
             $rows[] = [$object_id, $object_model_id, $psv_id];
         }
         if (!empty($rows)) {
             Yii::$app->db->createCommand()->batchInsert(ObjectStaticValues::tableName(), ['object_id', 'object_model_id', 'property_static_value_id'], $rows)->execute();
         }
     }
     Yii::$app->cache->delete("PSV:" . $object_id . ":" . $object_model_id);
     if (count($column_type_updates) > 1) {
         $table_name = Object::findById($object_id)->column_properties_table_name;
         $exists = Yii::$app->db->createCommand('select object_model_id from ' . $table_name . ' where object_model_id=:object_model_id')->bindValue(':object_model_id', $object_model_id)->queryScalar();
         if ($exists) {
             Yii::$app->db->createCommand()->update($table_name, $column_type_updates, 'object_model_id = :object_model_id', [':object_model_id' => $object_model_id])->execute();
         } else {
             Yii::$app->db->createCommand()->insert($table_name, $column_type_updates)->execute();
         }
     }
     if (count($new_eav_values) > 0) {
         $table_name = Object::findById($object_id)->eav_table_name;
         Yii::$app->db->createCommand()->batchInsert($table_name, ['object_model_id', 'property_group_id', 'key', 'value', 'sort_order'], $new_eav_values)->execute();
     }
     if (count($eav_ids_to_delete) > 0) {
         $table_name = Object::findById($object_id)->eav_table_name;
         Yii::$app->db->createCommand()->delete($table_name, ['in', 'id', $eav_ids_to_delete])->execute();
     }
     Yii::$app->cache->delete("TIR:" . $object_id . ':' . $object_model_id);
     $this->values_by_property_key = $new_values;
 }
Пример #4
0
 public function afterDelete()
 {
     ObjectStaticValues::deleteAll(['property_static_value_id' => $this->id]);
     parent::afterDelete();
 }
Пример #5
0
 public function actionAddStaticValue($key, $value, $returnUrl, $objectId = null, $objectModelId = null)
 {
     $model = new PropertyStaticValues();
     /** @var Property $property */
     $property = Property::findOne(['key' => $key]);
     if (is_null($property)) {
         throw new NotFoundHttpException();
     }
     $model->property_id = $property->id;
     if (Yii::$app->request->isPost) {
         if ($model->load(Yii::$app->request->post()) && $model->save()) {
             $tags = [ActiveRecordHelper::getCommonTag(Property::className()), ActiveRecordHelper::getObjectTag(Property::className(), $property->id), ActiveRecordHelper::getCommonTag(PropertyGroup::className()), ActiveRecordHelper::getObjectTag(PropertyGroup::className(), $property->property_group_id)];
             if (!is_null($objectId) && !is_null($objectModelId)) {
                 if ($property->multiple == 0) {
                     $propertyStaticValueIds = PropertyStaticValues::find()->select('id')->where(['property_id' => $property->id])->column();
                     ObjectStaticValues::deleteAll(['object_id' => $objectId, 'object_model_id' => $objectModelId, 'property_static_value_id' => $propertyStaticValueIds]);
                 }
                 $objectStaticValues = new ObjectStaticValues();
                 $objectStaticValues->attributes = ['object_id' => $objectId, 'object_model_id' => $objectModelId, 'property_static_value_id' => $model->id];
                 $objectStaticValues->save();
                 $tags[] = ActiveRecordHelper::getCommonTag(Object::findById($objectId)->object_class);
                 $tags[] = ActiveRecordHelper::getObjectTag(Object::findById($objectId)->object_class, $objectModelId);
             }
             TagDependency::invalidate(Yii::$app->cache, $tags);
             return $this->redirect($returnUrl);
         }
     } elseif ($value !== "") {
         $model->name = $value;
         $model->value = $value;
         $model->slug = Helper::createSlug($value);
         $model->sort_order = 0;
     }
     return $this->renderAjax('ajax-static-value', ['model' => $model]);
 }