Ejemplo n.º 1
0
 /**
  * @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'));
 }
Ejemplo n.º 2
0
 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();
 }
Ejemplo n.º 3
0
 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;
 }
Ejemplo n.º 4
0
 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()));
         }
     }
 }
Ejemplo n.º 5
0
 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);
         }
     }
 }
Ejemplo n.º 6
0
 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;
 }
Ejemplo n.º 7
0
 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;
 }
Ejemplo n.º 8
0
 /**
  * @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;
 }
Ejemplo n.º 9
0
 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();
 }