public function actionGetObjectParameterSetting() { if (!Yii::app()->authManager->checkObject(DaDbAuthManager::OPERATION_EDIT, Yii::app()->user->id, ObjectParameter::ID_OBJECT)) { throw new Exception('Доступ ограничен.'); } $paramType = HU::post('newType'); $parameter = HU::post('val'); $fieldId = HU::post('field'); $idInstance = intval(HU::post('id')); $object = DaObject::getById(ObjectParameter::ID_OBJECT); $objectParameter = $object->getParameterObjectByField($fieldId); $model = $object->getModel($idInstance === -1); if ($idInstance !== -1) { $model = $model->findByIdInstance($idInstance); } if ($model == null || $objectParameter == null) { echo json_encode(array('error' => 'Переданы неверные параметры')); return; } $form = Yii::app()->getWidgetFactory()->createWidget($this, 'backend.widgets.BackendActiveForm', array('id' => 'aMainForm', 'enableClientValidation' => true, 'clientOptions' => array('validateOnSubmit' => true, 'validateOnChange' => true))); $objectParameter->id_parameter_type = $paramType; if ($paramType == DataType::OBJECT) { $objectParameter->add_parameter = DaObject::ID_OBJECT; $objectParameter->not_null = 1; } else { if ($paramType == DataType::REFERENCE) { $objectParameter->id_parameter_type = DataType::OBJECT; $objectParameter->add_parameter = Reference::ID_OBJECT; $objectParameter->not_null = 1; } else { if ($paramType == DataType::FILE || $paramType == DataType::FILES) { $objectParameter->id_parameter_type = DataType::OBJECT; $objectParameter->add_parameter = FileType::ID_OBJECT; $objectParameter->not_null = 0; } } } $model->{$objectParameter->getFieldName()} = $parameter; $visualElement = VisualElementFactory::getVisualElement($model, $objectParameter); $visualElement->form = $form; $visualElement->layout = false; ob_start(); ob_implicit_flush(false); $visualElement->run(); $data = ob_get_clean(); echo json_encode(array('html' => $data)); }
public function actionIndex() { /** * @var DaActiveRecord $model * @var DaObject $object */ $object = Yii::app()->backend->object; $idObject = $object->id_object; $model = null; $id_v = HU::get(ObjectUrlRule::PARAM_ACTION_VIEW); $id = HU::post('id_instance'); if ($id == null) { $id = HU::get(ObjectUrlRule::PARAM_OBJECT_INSTANCE); } if ($id == null && $id_v == null) { throw new CHttpException(400, 'Bad Request'); } $statusProcess = intval(HU::post('submit_form', ViewController::MODE_VIEW)); if (!in_array($statusProcess, array(ViewController::MODE_VIEW, ViewController::MODE_SAVE_AND_CLOSE, ViewController::MODE_ACCEPT, ViewController::MODE_SAVE_AND_CREATE_NEW))) { throw new CHttpException(400, 'Bad Request'); } $readOnlyInstance = false; if ($id != null) { if ($id == -1) { if (!Yii::app()->authManager->canCreateInstance($idObject, Yii::app()->user->id)) { throw new CHttpException(403, 'Нет прав на создание'); } $id = null; } else { // Редактируют, проверяем доступность текущему пользователю if (!Yii::app()->authManager->checkObjectInstance(DaDbAuthManager::OPERATION_EDIT, Yii::app()->user->id, $idObject, $id)) { throw new CHttpException(403, 'Нет прав на редактирование или объект не существует'); } } } else { if ($id_v != null) { if ($id_v == -1) { throw new CHttpException(403); } else { if (!Yii::app()->authManager->checkObjectInstance(DaDbAuthManager::OPERATION_VIEW, Yii::app()->user->id, $idObject, $id_v)) { throw new CHttpException(403, "Нет прав на просмотр"); } $id = $id_v; $readOnlyInstance = true; } } } if ($id != null) { $model = $object->getModel()->findByIdInstance($id); if ($model == null) { throw new CHttpException(404); } $model->setScenario('backendUpdate'); } else { $model = $object->getModel(true); $model->setIsNewRecord(true); $model->setScenario('backendInsert'); } $visualElementArray = array(); $event = new InstanceAvailableEvent($this, $model); $this->raiseEvent(ViewController::EVENT_ON_INSTANCE_AVAILABLE, $event); $available = $event->status; if ($available == ViewController::ENTITY_STATUS_NOT_VISIBLE) { //Если нет прав на просмотр, то уходим return; // TODO } if ($available == ViewController::ENTITY_STATUS_READ_ONLY) { $readOnlyInstance = true; } $parameters = $object->parameters; foreach ($parameters as $objectParameter) { /** * @var $objectParameter ObjectParameter */ // Детальная обработка: // Если свойство является группирующем, то устанавливаем значение по умолчанию if ($model->isNewRecord && HU::get(ObjectUrlRule::PARAM_GROUP_PARAMETER) == $objectParameter->getIdParameter()) { $model->{$objectParameter->getFieldName()} = HU::get(ObjectUrlRule::PARAM_GROUP_INSTANCE); } // Установка значений свойств экземпляра по умолчанию if ($objectParameter->getType() == DataType::SEQUENCE) { if ($model->isNewRecord) { $model->{$objectParameter->getFieldName()} = 0; } } else { if ($objectParameter->getType() == DataType::ID_PARENT) { if ($model->isNewRecord) { // TODO - сделать проверку, что пользователь может создавать раздел в переданном ИД паренте $model->{$objectParameter->getFieldName()} = HU::get(ObjectUrlRule::PARAM_OBJECT_PARENT); } if ($objectParameter->getAdditionalParameter() != 1) { continue; } } } if (!$objectParameter->isVisible()) { continue; } $event = new ParameterAvailableEvent($this, $model, $objectParameter); $this->raiseEvent(ViewController::EVENT_ON_PARAMETER_AVAILABLE, $event); $availableStatus = $event->status; if ($availableStatus == ViewController::ENTITY_STATUS_NOT_VISIBLE) { //Невидим continue; } $event = new CreateVisualElementEvent($this, $model, $objectParameter); $this->raiseEvent(ViewController::EVENT_ON_CREATE_VISUAL_ELEMENT, $event); $visualElement = $event->visualElement; // Если свойство является группирующем, то пропускаем его. /*if ($visualElement == null && HU::get(ObjectUrlRule::PARAM_GROUP_PARAMETER) == $objectParameter->getIdParameter()) { $visualElement = Yii::app()->controller->createWidget('backend.widgets.hiddenField.HiddenFieldWidget', array( 'model' => $model, 'attributeName' => $objectParameter->getFieldName(), )); $visualElementArray[] = $visualElement; $model->{$objectParameter->getFieldName()} = HU::get(ObjectUrlRule::PARAM_GROUP_INSTANCE); continue; }*/ if ($visualElement == null) { $visualElement = VisualElementFactory::getVisualElement($model, $objectParameter); } if ($visualElement == null) { continue; } if ($availableStatus == ViewController::ENTITY_STATUS_READ_ONLY || $readOnlyInstance) { //Только для чтения $visualElement->setReadOnly(true); } if ($objectParameter->getFieldName() != null && $model instanceof DaInstance && $visualElement instanceof VisualElementBaseWidget) { $model->addValidator(CValidator::createValidator('safe', $model, $objectParameter->getFieldName())); } $visualElementArray[] = $visualElement; } // закончили обрабатывать свойства $modelClass = get_class($model); if (isset($_POST[$modelClass]) || isset($_POST['submit_form'])) { if (isset($_POST[$modelClass])) { $model->attributes = $_POST[$modelClass]; } $event = new PostFormEvent($this, $model); $this->raiseEvent(ViewController::EVENT_ON_POST_FORM, $event); Yii::import('ygin.modules.search.components.SearchComponent', true); if ($model->isNewRecord) { // insert if ($model->save()) { SearchComponent::replaceIndex($model); //$instance->updateObjectInstanceInfo(1); $newIdInstance = $model->getIdInstance(false); $seqKey = $object->getFieldByType(DataType::SEQUENCE); if ($seqKey != null) { $pk = $object->getFieldByType(DataType::PRIMARY_KEY); $max = Yii::app()->db->createCommand('SELECT MAX(' . $seqKey . ') FROM ' . $object->table_name)->queryScalar(); $sql = 'UPDATE ' . $object->table_name . ' SET ' . $seqKey . ' = :max WHERE ' . $pk . '=:id'; Yii::app()->db->createCommand($sql)->execute(array(':max' => $max + 1, ':id' => $newIdInstance)); } Yii::log('Добавлен новый экземпляр (' . $object->getName() . ') id=' . $newIdInstance, CLogger::LEVEL_INFO, 'backend.model.insert'); } else { $statusProcess = ViewController::MODE_ERROR; } } else { if ($model->save()) { SearchComponent::replaceIndex($model); //$instance->updateObjectInstanceInfo(2); Yii::log('Изменение (' . $object->getName() . ') id=' . $model->getIdInstance(), CLogger::LEVEL_INFO, 'backend.model.update'); } else { $statusProcess = ViewController::MODE_ERROR; } } } if ($statusProcess == ViewController::MODE_ERROR || $statusProcess == ViewController::MODE_VIEW) { $this->render('/view', array('model' => $model, 'visualElementArray' => $visualElementArray)); } else { if ($statusProcess == ViewController::MODE_ACCEPT) { $url = ObjectUrlRule::createUrlFromCurrent(BackendModule::ROUTE_INSTANCE_VIEW, array(ObjectUrlRule::PARAM_OBJECT_INSTANCE => $model->getIdInstance())); $this->redirect($url); } else { if ($statusProcess == ViewController::MODE_SAVE_AND_CLOSE) { $url = ObjectUrlRule::createUrlFromCurrent(BackendModule::ROUTE_INSTANCE_LIST, array(), array(ObjectUrlRule::PARAM_OBJECT_INSTANCE, ObjectUrlRule::PARAM_ACTION_VIEW)); $this->redirect($url); } else { if ($statusProcess == ViewController::MODE_SAVE_AND_CREATE_NEW) { $url = ObjectUrlRule::createUrlFromCurrent(BackendModule::ROUTE_INSTANCE_VIEW, array(ObjectUrlRule::PARAM_OBJECT_INSTANCE => -1)); $this->redirect($url); } } } } }
<?php /** * @var $form CActiveForm * @var $this SelectObjectParameterWidget * @var $model DaActiveRecord */ echo $form->dropDownList($model, $attributeName, array(), $this->htmlOption); echo $form->error($model, $attributeName); $elementOfObject = VisualElementFactory::getVisualElement($model, $this->parameterOfObject); $this->parameterOfObjectParameter->widget = null; $elementOfParameter = VisualElementFactory::getVisualElement($model, $this->parameterOfObjectParameter); $ajax = CHtml::ajax(array('url' => Yii::app()->createUrl('backend/engine/getObjectParameters'), 'data' => array('id_object' => 'js:$(this).val()', 'value' => $model->{$attributeName}, 'element_object' => $model->getIdObject(), 'element_parameter' => $this->getObjectParameter()->getIdParameter()), 'type' => 'POST', 'dataType' => 'json', 'success' => 'js:function(data){if (data.error !== undefined) {alert(data.error); return;} element.parent().html(data.html);}')); Yii::app()->clientScript->registerScript('admin.ve.abstract.PermPropVisualElement', '$("select[name=\'' . $elementOfObject->getElementName() . '\']").change(function(){ var element = $("[name=\'' . $elementOfParameter->getElementName() . '\']"); ' . $ajax . ' } ).change();'); /* return; $currentParameter = $model->{$this->parameterOfObjectParameter->getFieldName()}; if ($currentParameter == null) $currentParameter = -1; ?> <script type="text/javascript"> function selectProperties() { var idObject = $("select[name='<?php echo $elementOfObject->getElementName(); ?>'] option:selected").val(); var active = <?php echo $currentParameter; ?>; da_selectProperties(idObject, 'p<?php echo $parameter->getIdParam(); ?>', active, <?php echo intval($visualElement->notNull()); ?>, '<?php echo Utils::processCode4Ajax($parameter->sql); ?>'); } </script>