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); }
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; }
/** * @return DaObject */ private function getObjectOfParameter() { if ($this->_object_ !== null) { return $this->_object_; } $this->_object_ = DaObject::getById($this->getObjectParameter()->getAdditionalParameter()); return $this->_object_; }
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; }
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)); }
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.'); } }
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; }
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 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; }
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(); } }
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(); }
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'; } }
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(); }
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; }
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; }
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(); }
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()); } } } } }
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); */ } }
/** * @return DaActiveRecord */ public function getObject() { $object = DaObject::getById($this->objectId); return $object; }
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; } } }
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; // не применяем данное правило }
<?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(); ?>
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)); } }
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; }
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); }
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)); }
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; }