/** * @param string $objectId * Свойства клонируемого объекта * return ObjectParameter[] */ public function actionObjectParameters($objectId) { $model = new ExportForm(); $objectParameters = ObjectParameter::model()->findAll('`id_object` = ?', array($objectId)); $this->renderPartial('paramsList', array('objectParameters' => $objectParameters, 'model' => $model)); //$objectParameters = CHtml::listData($objectParameters,'id_parameter','caption'); //echo CHtml::activeCheckBoxList($model, 'objectParameters', $objectParameters, array('checked')); }
protected function afterSave() { if (!$this->isNewRecord) { $idOldReference = $this->getPkBeforeSave(); if ($this->id_reference != $idOldReference) { ReferenceElement::model()->updateAll(array('id_reference' => $this->id_reference), 'id_reference=:id', array(':id' => $idOldReference)); ObjectParameter::model()->updateAll(array('add_parameter' => $this->id_reference), 'id_parameter_type=6 AND add_parameter=:id', array(':id' => $idOldReference)); } } return parent::afterSave(); }
public function getDump() { $object = DaObject::model()->findByPk($this->objectId); $fields = ObjectParameter::model()->findAll('`id_object` = ?', array($this->objectId)); $str = "START TRANSACTION;\n"; $fieldNames = array('name', 'id_field_order', 'order_type', 'table_name', 'id_field_caption', 'object_type', 'folder_name', 'parent_object', 'sequence', 'use_domain_isolation', 'field_caption', 'yii_model'); $str .= $this->getInsertStatement('da_object', $this->getPopulatedData($fieldNames, $object, array('id_field_caption' => 'NULL', 'id_field_order' => 'NULL'))); $str .= "SET @objectId = LAST_INSERT_ID();\n"; $fieldNames = array('id_object', 'id_parameter_type', 'sequence', 'name', 'caption', 'field_name', 'add_parameter', 'default_value', 'not_null', 'sql_parameter', 'is_unique', 'group_type', 'need_locale', 'search', 'is_additional', 'hint'); foreach ($fields as $field) { $str .= $this->getInsertStatement('da_object_parameters', $this->getPopulatedData($fieldNames, $field, array('id_object' => '@objectId'))); if ($field->id_parameter == $object->id_field_order) { $str .= "UPDATE `da_object` SET `id_field_order` = LAST_INSERT_ID() WHERE `id_object` = @objectId;\n"; } elseif ($field->id_parameter == $object->id_field_caption) { $str .= "UPDATE `da_object` SET `id_field_caption` = LAST_INSERT_ID() WHERE `id_object` = @objectId;\n"; } } $str .= 'COMMIT;'; return $str; }
protected function afterSave() { parent::afterSave(); if ($this->isNewRecord) { $idObject = $this->id_object; if ($this->object_type == self::OBJECT_TYPE_TABLE && $this->table_name != "") { // Если создается объект у которого тип=Таблица, то создаем свойство Первичного ключа $p = ObjectParameter::newModel('ObjectParameter'); $p->id_object = $idObject; $p->id_parameter_type = DataType::PRIMARY_KEY; $p->caption = 'id'; $fieldName = 'id_' . str_replace(array('da_', 'pr_'), '', $this->table_name); $p->field_name = $fieldName; $p->id_parameter = $idObject . '-' . str_replace('_', '-', $fieldName); $p->setIsRequired(true); $p->save(); } } else { if ($this->id_object != $this->getPkBeforeSave()) { ObjectParameter::model()->updateAll(array('id_object' => $this->id_object), 'id_object=:obj', array(':obj' => $this->getPkBeforeSave())); ObjectParameter::model()->updateAll(array('add_parameter' => $this->id_object), 'id_parameter_type=7 AND add_parameter=:obj', array(':obj' => $this->getPkBeforeSave())); DaObjectView::model()->updateAll(array('id_object' => $this->id_object), 'id_object=:obj', array(':obj' => $this->getPkBeforeSave())); DaObjectViewColumn::model()->updateAll(array('id_object' => $this->id_object), 'id_object=:obj', array(':obj' => $this->getPkBeforeSave())); File::model()->updateAll(array('id_object' => $this->id_object), 'id_object=:obj', array(':obj' => $this->getPkBeforeSave())); Search::model()->updateAll(array('id_object' => $this->id_object), 'id_object=:obj', array(':obj' => $this->getPkBeforeSave())); } } }
private function sqlChange(ObjectParameter $instance, $mode = null) { $idObject = $instance->id_object; if ($idObject == null) { return false; } $isDelete = $mode == 'delete'; $isInsert = $mode == 'insert'; $objectCurrent = DaObject::getById($idObject); $table = $objectCurrent->table_name; $type = $instance->getDataType(); $fieldName = $instance->getFieldName(); if ($objectCurrent->object_type != DaObject::OBJECT_TYPE_TABLE) { return false; } if ($table == null) { if (Yii::app()->isBackend) { Yii::app()->addMessage('Свойство не было ' . ($isDelete ? 'удалено' : ($isInsert ? 'создано' : 'изменено')) . ' в базе данных, т.к. у объекта не указано имя таблицы', BackendApplication::MESSAGE_TYPE_ERROR, true); } return false; } $tableNotExists = Yii::app()->db->createCommand('SHOW TABLES LIKE :t')->queryScalar(array(':t' => $objectCurrent->table_name)) == null; $sqls = array(); $allowQuery = true; $abstractCurrent = DataType::getSqlType($type) == null; $instanceOld = null; if ($isDelete) { $instanceOld = $instance; } else { if (!$isInsert) { $instanceOld = ObjectParameter::model()->findByIdInstance($instance->getIdInstance()); if ($instanceOld == null) { // такой вариант может быть только в случае, если у параметра поменяли ИД. Тогда мы не можем найти старый параметр и не можем понять какие были данные. Поэтому ничего не делаем. return; } } } // Если поле меняется, загружаем старые данные и проверяем, поменялось ли что-то if (!$isInsert && !$isDelete) { $isTypeChange = DataType::getSqlType($instanceOld->getDataType()) != DataType::getSqlType($type); $allowQuery = $instanceOld->getFieldName() != $fieldName || $isTypeChange || $instanceOld->getDefaultValue() != $instance->getDefaultValue() || $instanceOld->isRequired() != $instance->isRequired(); if ($isTypeChange) { // если тип поля меняется с SQL на абстрактный - удаляем поле if ($abstractCurrent && DataType::getSqlType($instanceOld->getDataType()) != null) { $sqls[] = 'ALTER TABLE `' . $table . '` DROP `' . $instanceOld->getFieldName() . '`'; // наоборот, если тип поля меняется с абстрактного на SQL - добавляем поле } else { if (!$abstractCurrent && DataType::getSqlType($instanceOld->getDataType()) == null) { $isInsert = true; } } } } $msg = ''; // Составляем запросы if ($allowQuery && !$abstractCurrent) { $fieldExists = false; $countFields = 0; if (!$tableNotExists) { $columns = Yii::app()->db->createCommand('SHOW COLUMNS FROM ' . $table)->queryAll(); if ($instanceOld != null) { $fieldName = $instanceOld->getFieldName(); } foreach ($columns as $column) { if ($column['Field'] == $fieldName) { $fieldExists = true; } $countFields++; } } if ((!$isInsert || $isDelete) && !$fieldExists) { $allowQuery = false; $msg = 'В таблице ' . $table . ' не существует поля "' . $instanceOld->getFieldName() . '"'; } if ($isInsert && $fieldExists) { $allowQuery = false; $msg = 'В таблице ' . $table . ' уже существует поле "' . $instance->getFieldName() . '"'; } // TODO проверки еще [Field] => person_type [Type] => int(8) [Null] => YES [Key] => [Default] => [Extra] => if ($allowQuery) { if ($isDelete) { if ($countFields == 1) { $sqls[] = 'DROP TABLE `' . $table . '`'; } else { $sqls[] = 'ALTER TABLE `' . $table . '` DROP `' . $instance->getFieldName() . '`'; } } else { $definition = '`' . $instance->getFieldName() . '` ' . DataType::getSqlType($type); if ($instance->isRequired()) { $definition .= ' NOT NULL'; } if ($instance->getDefaultValue() != null && !in_array($type, array(DataType::TEXTAREA, DataType::EDITOR))) { $definition .= ' default \'' . $instance->getDefaultValue() . '\''; } if ($type == DataType::PRIMARY_KEY) { $definition .= ' AUTO_INCREMENT'; } $definition .= ' COMMENT ' . $this->dbConnection->quoteValue($instance->getCaption()); // Создаем таблицу с полем if ($tableNotExists) { $sqls[] = $objectCurrent->getCreateTableSql(); // Таблица уже существует } else { $sql = 'ALTER TABLE `' . $table . '`'; if ($isInsert) { $sql .= ' ADD ' . $definition . ' '; } else { $sql .= ' CHANGE `' . $instanceOld->getFieldName() . '` ' . $definition . ' '; } $sqls[] = $sql; if ($isInsert) { if ($type == DataType::PRIMARY_KEY) { $sqls[] = 'ALTER TABLE `' . $table . '` ADD PRIMARY KEY (`' . $fieldName . '`)'; } if ($instance->isUnique()) { $sqls[] = 'ALTER TABLE `' . $table . '` ADD UNIQUE (`' . $fieldName . '`)'; } } } } } } foreach ($sqls as $sql) { Yii::app()->db->createCommand($sql)->execute(); $msg .= 'Выполнено: ' . $sql . '<br>'; } if ($msg != '') { if (Yii::app()->isBackend) { Yii::app()->addMessage($msg); } } }
public function generateRelations() { $relations = parent::generateRelations(); $className = $this->generateClassName($this->tableName); foreach ($this->getObject()->parameters as $parameter) { //Формируем relations для свойства "Объект (внешний ключ)" if ($parameter->id_parameter_type == DataType::OBJECT) { $refObject = DaObject::getById($parameter->add_parameter); $refClassName = $this->generateClassName($this->removeTablePrefix($refObject->table_name)); $relationName = $this->generateRelationName($refObject->table_name, $this->removeFieldNamePrefix($parameter->field_name), false); if (!isset($relations[$className][$relationName])) { $relations[$className][$relationName] = "array(self::BELONGS_TO, '{$refClassName}', '{$parameter->field_name}')"; } } elseif ($parameter->id_parameter_type == DataType::FILE) { $refClassName = 'File'; $relationName = $this->generateRelationName('da_files', $this->removeFieldNamePrefix($parameter->field_name), false); if ($relationName == $this->removeFieldNamePrefix($parameter->field_name)) { $relationName .= 'File'; } if (!isset($relations[$className][$relationName])) { $relations[$className][$relationName] = "array(self::BELONGS_TO, '{$refClassName}', '{$parameter->field_name}')"; } } elseif ($parameter->id_parameter_type == DataType::REFERENCE) { //TODO Подумать нужно ли? /* $refClassName = 'ReferenceElement'; $relationName = $this->generateRelationName('da_reference_element', $this->removeFieldNamePrefix($parameter->field_name), false); if (!isset($relations[$className][$relationName])) { $relations[$className][$relationName]="array(self::BELONGS_TO, '$refClassName', '$parameter->field_name'), 'on' => 'id_reference = $parameter->add_parameter'"; } */ } } //формируем relations для подчиненных таблиц $parameters = ObjectParameter::model()->findAllByAttributes(array('id_parameter_type' => DataType::OBJECT, 'add_parameter' => $this->getObject()->id_object)); foreach ($parameters as $parameter) { $refObject = DaObject::getById($parameter->id_object); $refClassName = $this->generateClassName($this->removeTablePrefix($refObject->table_name)); $relationName = $this->generateRelationName($refObject->table_name, $this->removeTablePrefix($refObject->table_name), true); if (!isset($relations[$className][$relationName])) { $relations[$className][$relationName] = "array(self::HAS_MANY, '{$refClassName}', '{$parameter->field_name}')"; } } return $relations; }
private function getInsertTableData() { $sql = ""; $oldListFields = array(); $newListFields = array(); foreach ($this->checkAttributes as $i => $checkValue) { if (!($parameterName = $this->newObjectParameters[$i])) { continue; } $objectParameter = ObjectParameter::model()->find(array('condition' => 'id_object = :obj AND id_parameter = :param', 'params' => array(':obj' => $this->objectId, ':param' => $this->objectParameters[$i]))); $oldListFields[] = $objectParameter->field_name; $newListFields[] = $parameterName; } $count = count($oldListFields); //$sql .= "INSERT IGNORE INTO `" .$this->tableName . "`(`".implode("`, `", $newListFields)."`)\n"; $model = DaObject::model()->findByPk($this->objectId)->getModel(); $models = $model->findAll(); foreach ($models as $model) { $sql .= "INSERT IGNORE INTO `" . $this->tableName . "`(`" . implode("`, `", $newListFields) . "`)\n"; $sql .= "VALUES("; foreach ($oldListFields as $i => $field) { if ($model->{$field} == null || !$model->{$field}) { $sql .= 'NULL'; } else { $sql .= "'" . $model->{$field} . "'"; } if ($count != $i + 1) { $sql .= ","; } } $sql .= ");\n"; } return $sql; }
/** * @static * @param ObjectParameter $objectParameter * @param DaActiveRecord $model * @return VisualElementBaseWidget|null */ public static function getVisualElement(DaActiveRecord $model, ObjectParameter $objectParameter) { if (mb_strpos($objectParameter->widget, '.') !== false) { $className = Yii::import($objectParameter->widget, true); $visualElement = Yii::app()->controller->createWidget($className, array('model' => $model, 'objectParameter' => $objectParameter, 'attributeName' => $objectParameter->getFieldName())); return $visualElement; } $type = $objectParameter->getType(); $visualElement = null; switch ($type) { case DataType::HIDDEN: $visualElement = Yii::app()->controller->createWidget('backend.widgets.hiddenField.HiddenFieldWidget', array('model' => $model, 'attributeName' => $objectParameter->getFieldName())); break; case DataType::VARCHAR: case DataType::INT: $visualElement = Yii::app()->controller->createWidget('backend.widgets.textField.TextFieldWidget', array('model' => $model, 'attributeName' => $objectParameter->getFieldName())); break; case DataType::PRIMARY_KEY: if ($objectParameter->getAdditionalParameter() == 1 && Yii::app()->user->checkAccess(DaWebUser::ROLE_DEV)) { $objectParameter->setIsRequired(false); if ($model->isNewRecord) { //$objectParameter->caption .= " (НЕ заполнять - автозаполнение)"; if ($objectParameter->hint == null) { $objectParameter->hint = "Поле следует заполнять вручную в редких случаях, когда идет работа с первичным ключом строкой и нет автоинкремента"; } } else { //$objectParameter->caption .= " (НЕ изменять - зависимости)"; if ($objectParameter->hint == null) { $objectParameter->hint = "Поле следует менять крайне осторожно, т.к. не контролируются зависимости данных"; } } $visualElement = Yii::app()->controller->createWidget('backend.widgets.textField.TextFieldWidget', array('model' => $model, 'attributeName' => $objectParameter->getFieldName(), 'objectParameter' => $objectParameter)); } break; case DataType::BOOLEAN: $visualElement = Yii::app()->controller->createWidget('backend.widgets.checkBox.CheckBoxWidget', array('model' => $model, 'attributeName' => $objectParameter->getFieldName())); break; case DataType::ABSTRACTIVE: $className = Yii::import($objectParameter->widget, true); $visualElement = Yii::app()->controller->createWidget($className, array('model' => $model, 'objectParameter' => $objectParameter, 'attributeName' => $objectParameter->getFieldName())); break; case DataType::TEXTAREA: $visualElement = Yii::app()->controller->createWidget('backend.widgets.textarea.TextareaWidget', array('model' => $model, 'attributeName' => $objectParameter->getFieldName())); break; case DataType::EDITOR: $visualElement = Yii::app()->controller->createWidget('backend.widgets.tinymce.TinymceWidget', array('model' => $model, 'attributeName' => $objectParameter->getFieldName())); break; case DataType::ID_PARENT: $visualElement = Yii::app()->controller->createWidget('backend.widgets.dropDownList.DropDownParentWidget', array('model' => $model, 'attributeName' => $objectParameter->getFieldName())); break; case DataType::OBJECT: $visualElement = Yii::app()->controller->createWidget('backend.widgets.dropDownList.DropDownObjectWidget', array('model' => $model, 'attributeName' => $objectParameter->getFieldName(), 'objectParameter' => $objectParameter)); break; case DataType::REFERENCE: $visualElement = Yii::app()->controller->createWidget('backend.widgets.dropDownList.DropDownReferenceWidget', array('model' => $model, 'attributeName' => $objectParameter->getFieldName())); break; case DataType::TIMESTAMP: $visualElement = Yii::app()->controller->createWidget('backend.widgets.dateTime.DateTimeWidget', array('model' => $model, 'attributeName' => $objectParameter->getFieldName())); break; case DataType::FILE: $visualElement = Yii::app()->controller->createWidget('backend.widgets.upload.singleFileUpload.SingleFileUploadWidget', array('model' => $model, 'attributeName' => $objectParameter->getFieldName())); break; case DataType::FILES: $visualElement = Yii::app()->controller->createWidget('backend.widgets.upload.listFileUpload.ListFileUploadWidget', array('model' => $model, 'objectParameter' => $objectParameter)); break; } return $visualElement; }
public function actionIndexGroup() { $grpObject = HU::get(ObjectUrlRule::PARAM_GROUP_OBJECT); $grpInst = HU::get(ObjectUrlRule::PARAM_GROUP_INSTANCE); $object = DaObject::getById($grpObject); $this->_groupInstance = $object == null ? null : $object->getModel()->findByIdInstance($grpInst); if ($this->_groupInstance != null) { $this->_groupInstance->setObjectInstance($object); $this->_groupParameter = ObjectParameter::model()->findByIdInstance(HU::get(ObjectUrlRule::PARAM_GROUP_PARAMETER)); } $this->main(); }