Example #1
0
 public function init()
 {
     $currentView = Yii::app()->backend->objectView;
     $currentObject = Yii::app()->backend->object;
     if ($this->idObjectCurrent == null && $currentObject != null) {
         $this->idObjectCurrent = $currentObject->id_object;
     }
     if ($this->idObjectViewCurrent == null && $currentView != null) {
         $this->idObjectViewCurrent = $currentView->id_object_view;
     }
     // Получаем все доступные для просмотра объекты
     $availableObjects = Yii::app()->authManager->checkObject(DaDbAuthManager::OPERATION_LIST, Yii::app()->user->id);
     if (count($availableObjects) == 0) {
         return;
     }
     // Загружаем объекты первого уровня
     $cr = new CDbCriteria();
     $cr->condition = 't.parent_object IS NULL';
     $cr->select = 't.name, t.id_object, t.table_name';
     $objects = DaObject::model()->orderBySeq()->with(array('child' => array('with' => 'countChild', 'select' => 'child.id_object, child.name, child.object_type, child.table_name'), 'child.views' => array('scopes' => 'selectName')))->findAll($cr);
     foreach ($objects as $object) {
         if (count($object->child) == 0) {
             continue;
         }
         $this->items[] = array('active' => false, 'label' => $object->name, 'url' => null, 'id_object' => $object->id_object, 'items' => $this->fillItems($object->child, 1, $availableObjects));
     }
     //print_r($this->items);exit;
     Yii::app()->clientScript->registerScript('menu.run', '
   $(".b-menu-side-main .panel-heading.active").click().parents(".panel").removeClass("panel-default").addClass("panel-primary");
   if ($(".b-menu-side-main .active").length == 0) $(".b-menu-side-main .panel-heading:eq(0).collapsed").click();
 ', CClientScript::POS_LOAD);
 }
Example #2
0
 public function actionIndex()
 {
     $model = new ExportForm();
     $modelClass = get_class($model);
     $this->performAjaxValidation($model);
     if (isset($_POST[$modelClass])) {
         //HU::dump($_POST);exit;
         $model->setAttributes($_POST[$modelClass], false);
         $valid = true;
         foreach ($_POST[$modelClass] as $i => $item) {
             if (isset($_POST[$modelClass][$i]) && is_array($_POST[$modelClass][$i])) {
                 $model->checkAttributes[] = $item['checkAttributes'];
                 $model->newObjectParameters[] = $item['newObjectParameters'];
                 $model->objectParameters[] = $item['objectParameters'];
             }
             $valid = $model->validate() && $valid;
         }
         if ($model->validate() && $valid) {
             $sqlDump = $model->getDump();
             echo $sqlDump;
             Yii::app()->end();
         } else {
             HU::dump($model->errors);
             exit;
         }
     }
     $objects = DaObject::model()->findAll(array('condition' => 'table_name IS NOT NULL', 'order' => 'name ASC'));
     $this->render('index', array('model' => $model, 'objects' => $objects));
 }
 public function loadOwnerObjectModel($objectId, $instanceId)
 {
     $ownerObject = DaObject::getById($objectId);
     $this->throw404IfNull($ownerObject);
     $ownerModel = $ownerObject->getModel()->findByPk($instanceId);
     $this->throw404IfNull($ownerModel);
     return $ownerModel;
 }
Example #4
0
 /**
  * @return DaObject
  */
 private function getObjectOfParameter()
 {
     if ($this->_object_ !== null) {
         return $this->_object_;
     }
     $this->_object_ = DaObject::getById($this->getObjectParameter()->getAdditionalParameter());
     return $this->_object_;
 }
Example #5
0
 protected function getFileObjectParameters()
 {
     if ($this->_objectParameters === null) {
         $object = DaObject::getById($this->owner->getIdObject(), true);
         foreach ($object->parameters as $objectParam) {
             if ($objectParam->id_parameter_type == DataType::FILE || $objectParam->id_parameter_type == DataType::FILES) {
                 $this->_objectParameters[] = $objectParam;
             }
         }
     }
     return $this->_objectParameters;
 }
Example #6
0
 public function actionIndex()
 {
     $model = new ExportObject();
     if (isset($_POST['ExportObject'])) {
         $model->attributes = $_POST['ExportObject'];
         if ($model->validate()) {
             echo $model->getDump();
             Yii::app()->end();
         }
     }
     $objects = DaObject::model()->findAll('table_name IS NOT NULL');
     $this->render('index', array('model' => $model, 'objects' => $objects));
 }
Example #7
0
 public function actionGetDateAttributes($db, $tableName)
 {
     if (Yii::app()->getRequest()->getIsAjaxRequest() && $tableName) {
         $object = DaObject::model()->with('parameters')->findByAttributes(array('table_name' => $tableName));
         $result = array();
         foreach ($object->parameters as $parameter) {
             if ($parameter->id_parameter_type == DataType::TIMESTAMP) {
                 $result[] = $parameter->field_name;
             }
         }
         echo json_encode($result);
     } else {
         throw new CHttpException(404, 'The requested page does not exist.');
     }
 }
Example #8
0
 public function getSearchCriteria()
 {
     $criteria = new CDbCriteria();
     if (!($objParameter = $this->getSearchObjectParamter())) {
         return $criteria;
     }
     switch ($objParameter->getType()) {
         case DataType::VARCHAR:
         case DataType::EDITOR:
         case DataType::TEXTAREA:
             $criteria->compare($objParameter->getFieldName(), $this->value, true);
             break;
         case DataType::INT:
         case DataType::PRIMARY_KEY:
             $criteria->compare($objParameter->getFieldName(), $this->value);
             break;
         case DataType::OBJECT:
             $objS = DaObject::getById($objParameter->getAdditionalParameter());
             $primParamS = $objS->getFieldByType(DataType::PRIMARY_KEY);
             $parametersSearch = $objS->parameters;
             $whereSearch = null;
             $i = 0;
             foreach ($parametersSearch as $param) {
                 $type = $param->getType();
                 if ($type == DataType::VARCHAR) {
                     $i++;
                     $whereSearch = HText::addCondition($whereSearch, $param->getFieldName() . ' LIKE :search' . $i, 'OR');
                     $criteria->params[':search' . $i] = '%' . $this->value . '%';
                 }
             }
             if ($whereSearch != null) {
                 $condition = HText::addCondition('', "t." . $objParameter->getFieldName() . " IN (SELECT " . $primParamS . " FROM " . $objS->table_name . " WHERE (" . $whereSearch . ") )");
                 $criteria->addCondition($condition, $condition);
             }
             break;
         case DataType::TIMESTAMP:
             if ($this->_tsBeginValue && $this->_tsEndValue) {
                 $criteria->addBetweenCondition($objParameter->getFieldName(), $this->_tsBeginValue, $this->_tsEndValue);
             } else {
                 $criteria->compare($objParameter->getFieldName(), $this->_tsOperator . $this->_tsBeginValue);
             }
             break;
     }
     return $criteria;
 }
Example #9
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;
 }
Example #10
0
 protected function beforeAction($action)
 {
     if (parent::beforeAction($action)) {
         $object = Yii::app()->backend->object;
         if ($object == null) {
             $object = DaObject::getById($this->idObject, false);
             Yii::app()->backend->object = $object;
         }
         if (!Yii::app()->authManager->checkObject(DaDbAuthManager::OPERATION_LIST, Yii::app()->user->id, $object->id_object)) {
             // нет прав
             throw new CHttpException(403);
         }
         $objectView = Yii::app()->backend->objectView;
         if ($objectView != null) {
             $object->registerYiiEventHandler($this);
         }
         $title = Yii::app()->backend->objectView == null ? $object->name : $objectView->name;
         $this->setPageTitle($title);
         $this->caption = $title;
     }
     return true;
 }
Example #11
0
 public function init()
 {
     if ($this->objectParameter == null) {
         throw new Exception("Не указан параметр объекта у колонки с типом Объект");
     }
     $data = $this->grid->dataProvider->getData();
     $field = $this->name;
     foreach ($data as $row) {
         $val = $row[$field];
         if ($val != null && !in_array($val, $this->_assocData)) {
             $this->_assocData[] = $row[$field];
         }
         //      $this->_assocData[$row[$field]] = $row[$field];
     }
     $idObject = $this->objectParameter->getAdditionalParameter();
     $object = DaObject::getById($idObject, false);
     $model = $object->getModel();
     //$rows = $model->findAllByPkArray($this->_assocData);
     $rows = $model->findAllByAttributes(array($object->getFieldByType(DataType::PRIMARY_KEY) => $this->_assocData));
     $this->_assocData = array();
     foreach ($rows as $model) {
         $this->_assocData[$model->getIdInstance()] = $model->getInstanceCaption();
     }
 }
Example #12
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();
 }
Example #13
0
 public function beforeRender()
 {
     $criteria = $this->getCriteria();
     $idObject = $this->getIdObjectSelectInstance();
     // Выясняем кол-во записей, которые доступны на выбор.
     // Если таких мало, то рисуем чекБоксы.
     $c = DaObject::getById($idObject)->getModel()->count($criteria);
     if ($c > $this->limit) {
         $this->indexView = 'backend.widgets.multiSelect.views.indexModal';
     }
 }
Example #14
0
 protected function handleDelete()
 {
     $this->beforeDelete();
     $fileId = Yii::app()->request->getQuery($this->fileIdVar);
     if (empty($fileId)) {
         throw new CHttpException(400, 'Не указан fileId.');
     }
     if (($file = File::model()->findByPk($fileId)) == null) {
         throw new CHttpException(404, 'Файл с id_file = ' . $fileId . ' не найден.');
     }
     if (!$this->checkAccess($file)) {
         throw new CHttpException(403, 'Вы не можете выполнить данную операцию.');
     }
     $object = DaObject::getById($file->id_object);
     $objectParameter = $object->getParameterObjectByIdParameter($file->id_parameter);
     //если свойство NOT NULL, то нельзя удалять файл
     if ($objectParameter->not_null) {
         throw new CHttpException(500, 'Не возможно удалить NOT NULL свойство.');
     }
     if (!$file->delete()) {
         throw new CHttpException(500, 'Не удалось удалить файл с id_file = ' . $fileId . '.');
     }
     if ($objectParameter->id_parameter_type == DataType::FILE && $file->id_instance) {
         //если это свойство типа Файл, то нужно занулить соответсвующее поле у модели
         $instanceModel = $object->getModel()->findByIdInstance($file->id_instance);
         $instanceModel->{$objectParameter->field_name} = null;
         $instanceModel->save(false, array($objectParameter->field_name));
     }
     $this->_deletedFile = $file;
     $this->afterDelete();
 }
Example #15
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);
         }
     }
 }
Example #16
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;
 }
Example #17
0
 public function checkObjectParameter($userId, $idObject, $idInstance, $idParameter)
 {
     if ($idObject == null) {
         return false;
     }
     if ($idParameter == null) {
         return false;
     }
     $object = DaObject::getById($idObject);
     $model = null;
     if (is_null($idInstance)) {
         if (!self::canCreateInstance($idObject, $userId)) {
             return false;
         }
     } else {
         if ($idInstance == null) {
             return false;
         }
         if (Yii::app()->authManager->checkObjectInstance(DaDbAuthManager::OPERATION_EDIT, $userId, $idObject, $idInstance)) {
             $model = $object->getModel()->findByIdInstance($idInstance);
         } else {
             return false;
         }
     }
     $event = new InstanceAvailableEvent(Yii::app()->controller, $model);
     Yii::app()->controller->raiseEvent(ViewController::EVENT_ON_INSTANCE_AVAILABLE, $event);
     if ($event->status != ViewController::ENTITY_STATUS_AVAILABLE) {
         return false;
     }
     $param = $object->getParameterObjectByIdParameter($idParameter);
     $event = new ParameterAvailableEvent(Yii::app()->controller, $model, $param);
     Yii::app()->controller->raiseEvent(ViewController::EVENT_ON_PARAMETER_AVAILABLE, $event);
     if ($event->status == ViewController::ENTITY_STATUS_NOT_VISIBLE) {
         return false;
     }
     return true;
 }
Example #18
0
 protected function beforeSave()
 {
     if (!$this->isNewRecord) {
         $idObject = $this->id_object;
         //echo 'id='.$idObject;HU::dump($this);exit;
         $objectCurrent = DaObject::getById($idObject);
         if ($objectCurrent != null && $objectCurrent->object_type == self::OBJECT_TYPE_TABLE && $objectCurrent->table_name != null) {
             $tableNotExists = Yii::app()->db->createCommand('SHOW TABLES LIKE :t')->queryScalar(array(':t' => $objectCurrent->table_name)) == null;
             if ($tableNotExists) {
                 if (Yii::app()->isBackend) {
                     Yii::app()->addMessage('Таблица ' . $objectCurrent->table_name . ' не существует, невозможно выполнить переименование в базе данных', BackendApplication::MESSAGE_TYPE_ERROR, true);
                 }
             } else {
                 $report = '';
                 if ($objectCurrent->table_name != "" && $objectCurrent->table_name != $this->table_name) {
                     $sql = 'RENAME TABLE `' . $objectCurrent->table_name . '` TO `' . $this->table_name . '`';
                     Yii::app()->db->createCommand($sql)->execute();
                     $report = $sql . '<br>';
                 }
                 if ($objectCurrent->name != "" && $objectCurrent->name != $this->name) {
                     $sql = 'ALTER TABLE `' . $this->table_name . '` COMMENT=' . $this->dbConnection->quoteValue($this->name);
                     Yii::app()->db->createCommand($sql)->execute();
                     $report .= $sql;
                 }
                 if (Yii::app()->isBackend) {
                     Yii::app()->addMessage('Выполнено ' . $report, BackendApplication::MESSAGE_TYPE_SUCCESS, true);
                 }
             }
         }
     }
     return parent::beforeSave();
 }
Example #19
0
 public function processModel(CEvent $event)
 {
     $permissionsNew = HU::post('setPermission') == null ? array() : HU::post('setPermission');
     $idObject = $this->model->getIdInstance();
     $oldIdObject = $this->model->getPkBeforeSave();
     $roles = Yii::app()->authManager->getAuthItems(CAuthItem::TYPE_ROLE);
     if ($idObject != $oldIdObject) {
         $items = Yii::app()->authManager->getAuthItemByIdObject($oldIdObject);
         foreach ($items as $name => $item) {
             Yii::app()->authManager->removeAuthItem($name);
         }
     }
     $permissionsOld = array();
     if ($idObject != '') {
         $permissions = array(DaDbAuthManager::OPERATION_VIEW => 'просмотра', DaDbAuthManager::OPERATION_EDIT => 'изменения', DaDbAuthManager::OPERATION_DELETE => 'удаления', DaDbAuthManager::OPERATION_CREATE => 'создания');
         foreach ($roles as $roleName => $role) {
             /**
              * @var CAuthItem $role
              */
             foreach ($permissions as $permId => $perm) {
                 $op = Yii::app()->authManager->getAuthItemObject($permId, $idObject);
                 if ($op != null && Yii::app()->authManager->hasItemChild($roleName, $op->getName())) {
                     $permissionsOld[] = $roleName . '-' . $permId;
                 }
             }
         }
     }
     $object = DaObject::getById($idObject);
     $createPermissions = array_diff($permissionsNew, $permissionsOld);
     foreach ($createPermissions as $info) {
         list($roleName, $action) = explode('-', $info);
         if (!isset($permissions[$action])) {
             continue;
         }
         $op = Yii::app()->authManager->getAuthItemObject($action, $idObject);
         if ($op == null) {
             $op = Yii::app()->authManager->createOperationForObject($action, $idObject, 'Операция ' . $permissions[$action] . ' для объекта ' . $object->getName());
         }
         $role = Yii::app()->authManager->getAuthItem($roleName);
         if (!Yii::app()->authManager->hasItemChild($role->getName(), $op->getName())) {
             $role->addChild($op->getName());
         }
     }
     $deletePermissions = array_diff($permissionsOld, $permissionsNew);
     foreach ($deletePermissions as $info) {
         list($roleName, $action) = explode('-', $info);
         if (!isset($permissions[$action])) {
             continue;
         }
         $op = Yii::app()->authManager->getAuthItemObject($action, $idObject);
         if ($op == null) {
             continue;
         }
         Yii::app()->authManager->removeItemChild($roleName, $op->getName());
     }
     // права на общий доступ работы с объектом (доступ к объекту в общем меню)
     foreach ($roles as $roleName => $role) {
         /**
          * @var CAuthItem $role
          */
         $exists = false;
         foreach ($permissions as $permId => $perm) {
             $op = Yii::app()->authManager->getAuthItemObject($permId, $idObject);
             if ($op != null && Yii::app()->authManager->hasItemChild($roleName, $op->getName())) {
                 $exists = true;
                 break;
             }
         }
         $op = Yii::app()->authManager->getAuthItemObject(DaDbAuthManager::OPERATION_LIST, $idObject);
         if ($exists) {
             // создаем
             if ($op == null) {
                 $op = Yii::app()->authManager->createOperationForObject(DaDbAuthManager::OPERATION_LIST, $idObject, 'Просмотр списка данных объекта ' . $object->getName());
             }
             if (!Yii::app()->authManager->hasItemChild($role->getName(), $op->getName())) {
                 $role->addChild($op->getName());
             }
         } else {
             if ($op != null && !$exists) {
                 // удаляем
                 if (Yii::app()->authManager->hasItemChild($role->getName(), $op->getName())) {
                     Yii::app()->authManager->removeItemChild($roleName, $op->getName());
                 }
             }
         }
     }
 }
Example #20
0
    public function init()
    {
        parent::init();
        $arrayOfId = $this->grid->dataProvider->getKeys();
        if (count($arrayOfId) == 0) {
            return;
        }
        $availableObjects = array();
        $singleStatus = 0;
        foreach ($this->childData as $param) {
            if ($param->isRelation() == false) {
                continue;
            }
            $idObject = $param->getIdObjectParameter();
            // Смотрим, может ли пользователь работать с подчинённым объектом
            if (isset($availableObjects[$idObject]) && $availableObjects[$idObject] === null) {
                continue;
            }
            if (!Yii::app()->authManager->checkObject(DaDbAuthManager::OPERATION_LIST, Yii::app()->user->id, $idObject)) {
                $availableObjects[$idObject] = null;
                continue;
            } else {
                $singleStatus = $singleStatus == 0 ? 1 : 2;
                $availableObjects[$idObject][$param->getIdParameter()]['field'] = $param->getFieldName();
            }
        }
        if ($singleStatus == 2) {
            $this->single = false;
            $this->htmlOptions = array('class' => 'col-ref action-sub-data');
        } else {
            $this->htmlOptions = array('class' => 'col-ref-one action-sub-data');
        }
        foreach ($availableObjects as $idObject => $params) {
            if ($params === null) {
                unset($availableObjects[$idObject]);
                continue;
            }
            $object = null;
            if (count($params) == 1) {
                $object = DaObject::getById($idObject, false);
                foreach ($params as $idParameter => $caption) {
                    $availableObjects[$idObject][$idParameter]['caption'] = $object->name;
                }
            } else {
                $object = DaObject::getById($idObject, true);
                foreach ($params as $idParameter => $caption) {
                    $param = $object->getParameterObjectByIdParameter($idParameter);
                    $availableObjects[$idObject][$idParameter]['caption'] = $object->name . ' (' . $param->caption . ')';
                }
            }
            $model = $object->getModel();
            foreach ($params as $idParameter => $config) {
                $cr = new CDbCriteria();
                $cr->addColumnCondition(array('t.id_object' => $idObject));
                $cr->order = 't.order_no';
                $objectView = DaObjectView::model()->find($cr);
                $dataProvider = Yii::app()->controller->buildDataProvider($objectView, $model);
                $where = $dataProvider->criteria->condition;
                $params = $dataProvider->criteria->params;
                $whereConfig = array('and');
                if ($where != null) {
                    $whereConfig[] = $where;
                }
                $whereConfig[] = array('in', $config['field'], $arrayOfId);
                $data = Yii::app()->db->createCommand()->select($config['field'] . ' AS id, count(*) AS cnt')->from($model->tableName())->where($whereConfig, $params)->group($config['field'])->queryAll();
                /*
                        // многообъектая поддержка
                        $iq = new InstanceQuery($where);
                        $arrayOfIdObject = Object::getCommonObjectBySingle($idObjectTmp);
                        if (count($arrayOfIdObject) > 1) {
                          $iq->setUsedObjects(array($idObjectTmp));
                        }*/
                $assocData = array();
                foreach ($data as $row) {
                    $assocData[$row['id']] = $row['cnt'];
                }
                $availableObjects[$idObject][$idParameter]['data'] = $assocData;
            }
        }
        $this->prepareData = $availableObjects;
        // TODO: Поменять скрипт, когда будет применяться PopOver
        if (!$this->single) {
            Yii::app()->clientScript->registerScript('admin.subData.init', '$(".action-sub-data").daSubData();
$(document).on("afterGridUpdate", function(e) {  $(".action-sub-data").daSubData(); });
', CClientScript::POS_READY);
            /*
                    Yii::app()->clientScript->registerScript('admin.subData.init', '
                    $("[rel=\'popover-sub-data\']").popover({
                      placement: "left",
                      trigger:   "hover",
                      template:  "<div class=\'popover\'><div class=\'arrow\'></div><div class=\'popover-inner\'><div class=\'popover-content\'></div></div></div>"
                    });', CClientScript::POS_READY);
            */
        }
    }
Example #21
0
 /**
  * @return DaActiveRecord
  */
 public function getObject()
 {
     $object = DaObject::getById($this->objectId);
     return $object;
 }
Example #22
0
 public static function recreateIndex($idLang = 1, $arrayWithBadObject = array())
 {
     // Удаляем старые данные
     Yii::app()->db->createCommand('DELETE FROM da_search_data WHERE id_lang=:id_lang')->execute(array(':id_lang' => $idLang));
     // По каким свойствам нужно искать
     $ids = Yii::app()->db->createCommand()->selectDistinct('id_object')->from('da_object_parameters')->where('search=1')->queryColumn();
     $searchDataPortion = Yii::app()->getModule('search')->searchDataPortion;
     if (intval($searchDataPortion) < 1) {
         $searchDataPortion = 1000;
     }
     foreach ($ids as $idObject) {
         $obj = DaObject::getById($idObject);
         $model = DaInstance::forObject($obj);
         $startRecord = 0;
         while (true) {
             $data = $model->findAll(array('limit' => $searchDataPortion, 'offset' => $startRecord));
             foreach ($data as $instance) {
                 self::replaceIndex($instance, $idLang);
             }
             if (count($data) == 0 || count($data) < $searchDataPortion) {
                 break;
             }
             $startRecord += $searchDataPortion;
         }
     }
 }
Example #23
0
 public function parseUrl($manager, $request, $pathInfo, $rawPathInfo)
 {
     $pathInfo .= '/';
     if (preg_match('~^page/([\\da-zA-Z\\-\\_]+)(.*)~', $pathInfo, $matches)) {
         $idObject = $matches[1];
         $remainUrl = $matches[2];
         self::$_currentUrlParams[self::PARAM_OBJECT] = $idObject;
         $idInstance = null;
         $idView = null;
         if (preg_match('~^page/[\\da-zA-Z\\-\\_]+/([\\d\\-]+|[a-zA-Z\\d\\_]+\\-[a-zA-Z\\d\\-\\_]+)(/.*)~', $pathInfo, $matches)) {
             $idInstance = trim($matches[1]);
             $remainUrl = $matches[2];
             if ($idInstance == '') {
                 $idInstance = null;
             }
         }
         if ($idInstance != null) {
             self::$_currentUrlParams[self::PARAM_OBJECT_INSTANCE] = $idInstance;
             $_GET[self::PARAM_OBJECT_INSTANCE] = $idInstance;
         }
         preg_match_all('~([a-zA-z\\-\\_0-9]+)/(.+?)(?:/|$)~', $remainUrl, $matches);
         if (is_array($matches) && is_array($matches[1]) && count($matches[1]) > 0) {
             $count = count($matches[1]);
             for ($i = 0; $i < $count; $i++) {
                 $param = $matches[1][$i];
                 if ($param == self::PARAM_OBJECT) {
                     continue;
                 }
                 $value = $matches[2][$i];
                 self::$_currentUrlParams[$param] = $value;
                 $_GET[$param] = $value;
             }
             $idView = HArray::val(self::$_currentUrlParams, self::PARAM_OBJECT_VIEW);
         }
         // пока тут определяем текущий объект и представление
         if ($idView != null) {
             $objectView = DaObjectView::model()->with('columns:onlyVisible')->findByPk($idView);
             if ($objectView == null) {
                 throw new CHttpException(404);
             }
             Yii::app()->backend->objectView = $objectView;
             Yii::app()->backend->object = DaObject::getById($objectView->id_object);
         } else {
             $object = DaObject::getById($idObject);
             if ($object == null || $object->table_name == null) {
                 throw new CHttpException(404);
             }
             Yii::app()->backend->object = $object;
             if ($object->object_type == DaObject::OBJECT_TYPE_CONTROLLER) {
                 return $object->table_name;
             }
             $cr = new CDbCriteria();
             $cr->addColumnCondition(array('t.id_object' => $idObject));
             $cr->order = 't.order_no';
             $objectView = DaObjectView::model()->with('columns:onlyVisible')->find($cr);
             if ($objectView == null) {
                 return false;
             }
             $objectView->object = $object;
             Yii::app()->backend->objectView = $objectView;
         }
         if ($idInstance != null || isset(self::$_currentUrlParams[self::PARAM_ACTION_VIEW])) {
             return BackendModule::ROUTE_INSTANCE_VIEW;
         }
         if (isset(self::$_currentUrlParams[self::PARAM_GROUP_OBJECT])) {
             return BackendModule::ROUTE_INSTANCE_LIST_GROUP;
         }
         return BackendModule::ROUTE_INSTANCE_LIST;
     }
     return false;
     // не применяем данное правило
 }
Example #24
0
<?php

/**
 * @var $form CActiveForm
 * @var $this DropDownListWidget
 * @var $model DaActiveRecord
 */
echo $form->dropDownList($model, $attributeName, $this->data, $this->htmlOption);
echo $form->error($model, $attributeName);
$object = DaObject::getById(ObjectParameter::ID_OBJECT);
$fieldParam = $object->getParameterObjectByField('field_name');
$parameterParam = $object->getParameterObjectByField('add_parameter');
$sqlParam = $object->getParameterObjectByField('sql_parameter');
$modelName = get_class($model);
?>
<script type="text/javascript">
/**
 * В этой функции можно задать взаимосвязь между выбранным типом свойства и поведением других полей
 * Сейчас можно задать изменение заголовка и изменение типа поля
 * Однако, пока реализована генерация не всех типов (см. файл ajaxScripts/loadFormElement.php)
 */
function getDataByType(parameterType) {
  var caption = [];
  var type    = [];
  var visible = [];
  var value = [];

  // здесь обязательно указываются значения по умолчанию для полей
  caption['field_name'] = '<?php 
echo $fieldParam->getCaption();
?>
Example #25
0
 public function actionBooleanColumn()
 {
     $idObject = HU::post('idObject', null);
     $idInstance = HU::post('idInstance', null);
     $idObjectParameter = HU::post('idObjectParameter', null);
     $value = HU::post('value', -1);
     try {
         $object = DaObject::getById($idObject);
         $object->registerYiiEventHandler();
         if ($object == null) {
             throw new Exception('Некорректные параметры запроса (объект).');
         }
         $model = $object->getModel()->findByIdInstance($idInstance);
         if ($model == null) {
             throw new Exception('Некорректные параметры запроса (экземпляр).');
         }
         $objectParam = $object->getParameterObjectByIdParameter($idObjectParameter);
         if ($objectParam == null) {
             throw new Exception('Некорректные параметры запроса (параметр).');
         }
         if (!Yii::app()->authManager->checkObjectParameter(Yii::app()->user->id, $idObject, $idInstance, $idObjectParameter)) {
             throw new Exception('Доступ на изменение ограничен.');
         }
         $field = $objectParam->getFieldName();
         $value = intval($model->{$field});
         $model->{$field} = $value === 1 ? 0 : 1;
         $model->update(array($field));
         $value = $model->{$field};
         echo CJSON::encode(array('message' => 'Данные успешно обновлены', 'value' => $value, 'idInstance' => $idInstance, 'idObjectParameter' => $idObjectParameter));
     } catch (Exception $e) {
         echo CJSON::encode(array('error' => $e->getMessage(), 'value' => $value, 'idInstance' => $idInstance, 'idObjectParameter' => $idObjectParameter));
     }
 }
Example #26
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;
 }
Example #27
0
 public function actionAutocomplete()
 {
     $query = HU::post('query');
     $idObject = HU::post('idObject');
     $object = DaObject::getById($idObject);
     $idCaptionField = $object == null ? null : $object->id_field_caption;
     if ($idCaptionField == null) {
         return json_encode(array());
     }
     $parameter = $object->getParameterObjectByIdParameter($idCaptionField);
     $captionField = $parameter->getFieldName();
     $where = $captionField . ' LIKE :q';
     $data = $object->getModel()->findAll(array('condition' => $where, 'params' => array(':q' => $query . '%'), 'limit' => 10));
     $result = array();
     foreach ($data as $instance) {
         /**
          * @var $instance DaActiveRecord
          */
         array_push($result, array("label" => $instance->getInstanceCaption(), "value" => $instance->getIdInstance()));
     }
     echo json_encode($result);
 }
Example #28
0
 public function actionIndex()
 {
     // объекты, по которым идет поиск
     // SELECT DISTINCT a.id_object, a.name FROM `da_object` a JOIN da_object_parameters b ON a.id_object = b.id_object WHERE b.search =1
     $query = HU::get('query');
     $error = null;
     $searchResult = array();
     $total = 0;
     try {
         $search = new SearchComponent();
         $search->logQuery = true;
         $search->criteria = $this->criteria;
         $paginator = new CPagination();
         $paginator->setPageSize($this->module->pageSize);
         $paginator->validateCurrentPage = false;
         $search->paginator = $paginator;
         $searchMode = SearchComponent::SEARCH_MODE_SOFT;
         if ($this->module->searchModeEnable) {
             $searchMode = HU::get('search_mode', SearchComponent::SEARCH_MODE_SOFT);
         }
         $search->setSearchMode($searchMode);
         $search->setMinQuery($this->module->queryMin);
         $search->setMaxQuery($this->module->queryMax);
         $search->setLenPreviewText($this->module->lengthPreview);
         $search->setHighlightTemplate($this->module->highlight);
         // TODO доработать поиск. Чтоб учитывалось отключение и подключение плагинов
         /*if (!Yii::app()->hasModule('news')) {
             $notSearch[] =
           }*/
         $search->setObjectNotSearchList($this->module->objectNotSearch);
         // объекты, по которым пока не поддерживается работа
         $search->setObjectSearchList($this->module->objectSearchList);
         $searchResult = $search->startSearch($query);
         $total = $search->getTotalResult();
     } catch (ErrorException $e) {
         $error = $e->getMessage();
     }
     $results = array();
     foreach ($searchResult as $cur) {
         $results[$cur->id_object][$cur->id_instance] = $cur->id_instance;
     }
     $menu = Menu::getAll();
     foreach (array_keys($results) as $idObject) {
         $data = array();
         $model = null;
         switch ($idObject) {
             case Menu::ID_OBJECT:
                 foreach ($results[$idObject] as $id) {
                     $item = $menu->getById($id);
                     if ($item != null) {
                         $data[] = $item;
                     }
                 }
                 break;
                 /*        case News::ID_OBJECT:
                           $model = News::model();
                           break;
                         case Product::ID_OBJECT:
                           $model = Product::model();
                           break;
                         case ProductCategory::ID_OBJECT:
                           $model = ProductCategory::model();
                           break;*/
             /*        case News::ID_OBJECT:
                       $model = News::model();
                       break;
                     case Product::ID_OBJECT:
                       $model = Product::model();
                       break;
                     case ProductCategory::ID_OBJECT:
                       $model = ProductCategory::model();
                       break;*/
             default:
                 $object = DaObject::getById($idObject, false);
                 $model = $object->getModel();
                 if (!$model instanceof ISearchable) {
                     throw new Exception("Ошибка поиска данных по объекту " . $idObject . ", обратитесь к разработчикам.");
                 }
         }
         if ($model != null) {
             $cr = new CDbCriteria();
             $cr->addInCondition($model->getPKName(), $results[$idObject]);
             $data = $model->findAll($cr);
         }
         $results[$idObject] = array();
         foreach ($data as $r) {
             $results[$idObject][$r->getPrimaryKey()] = $r;
         }
     }
     foreach ($searchResult as $cur) {
         if (isset($results[$cur->id_object][$cur->id_instance])) {
             $model = $results[$cur->id_object][$cur->id_instance];
             $cur->model = $model;
             $cur->link = $model->getSearchUrl();
             $cur->title = $model->getSearchTitle();
             /*        switch ($cur->id_object) {
                       case Menu::ID_OBJECT:
                         $cur->link = $model->getUrl();
                         $cur->title = $model->name;
                         break;
                       case News::ID_OBJECT:
                         $cur->link = $model->getUrl();
                         $cur->title = $model->title;
                         break;
                       case Product::ID_OBJECT:
                         $cur->link = $model->getUrl();
                         $cur->title = $model->name;
                         break;
                       case ProductCategory::ID_OBJECT:
                         $cur->link = $model->getUrl();
                         $cur->title = 'Группа товаров: '.$model->name;
                         break;
                     }*/
         }
     }
     $this->render('/index', array('query' => $query, 'error' => $error, 'searchResult' => $searchResult, 'total' => $total, 'paginator' => $search->paginator, 'searchMode' => $searchMode));
 }
Example #29
0
 public function getDataForSearch()
 {
     $object = DaObject::getById($this->getIdObject());
     $params = $object->parameters;
     $data = '';
     foreach ($params as $p) {
         /**
          * @var $p ObjectParameter
          */
         if ($p->isSearch()) {
             $val = $this->{$p->getFieldName()};
             if ($val != null) {
                 $data .= $val . ' ';
             }
         }
     }
     return $data;
 }