Ejemplo n.º 1
0
 public function run()
 {
     $id = null;
     $modelClass = $this->modelClass;
     /** @var yii\db\BaseActiveRecord $model */
     $model = new $modelClass(['scenario' => $this->scenario]);
     if ($this->checkAccess) {
         call_user_func($this->checkAccess, $this->id, null, ['newModel' => $model]);
     }
     $session = Yii::$app->getSession();
     $successMessage = $session->getFlash('success');
     $errorMessage = $session->getFlash('error');
     $request = Yii::$app->getRequest();
     if ($request->getIsPost()) {
         $model->load($request->getBodyParams());
         // validation
         if ($request->getIsAjax() && $request->getQueryParam('validation')) {
             Yii::$app->getResponse()->format = Response::FORMAT_JSON;
             return ActiveForm::validate($model);
         }
         // processing
         $saved = $model->validate() && $model->save();
         if ($saved) {
             $id = ModelHelper::getPrimaryKey($model);
             $successMessage = Yii::t('mozayka', 'Record "{record}" has been successfully saved.', ['record' => ModelHelper::getDisplayField($model)]);
             if (!$request->getIsAjax()) {
                 $session->setFlash('success', $successMessage);
                 if (ModelHelper::canUpdate($model)) {
                     $url = ['update-form', 'id' => $id];
                 } elseif (ModelHelper::canRead($model)) {
                     $url = ['read-form', 'id' => $id];
                 } elseif (ModelHelper::canList($modelClass)) {
                     $url = ['list'];
                 } else {
                     $url = Yii::$app->getHomeUrl();
                 }
                 return $this->controller->redirect($url);
             }
         } else {
             ModelHelper::log($model);
             $errorMessage = Yii::t('mozayka', 'Record "{record}" has not been saved.', ['record' => ModelHelper::getDisplayField($model)]);
         }
         if ($request->getIsAjax()) {
             Yii::$app->getResponse()->format = Response::FORMAT_JSON;
             return ['ok' => $saved, 'message' => $saved ? $successMessage : $errorMessage, 'id' => $saved ? $id : false];
         }
     }
     // rendering
     $viewParams = ['canList' => ModelHelper::canList($modelClass), 'pluralHumanName' => ModelHelper::pluralHumanName($modelClass), 'successMessage' => $successMessage, 'errorMessage' => $errorMessage, 'model' => $model, 'fields' => $this->prepareFields($model), 'formClass' => $this->formClass, 'formConfig' => array_merge($this->formConfig, ['validationUrl' => [$this->id, 'validation' => 1]])];
     if ($request->getIsAjax()) {
         return $this->controller->renderPartial($this->view, $viewParams);
     } else {
         return $this->controller->render($this->view, $viewParams);
     }
 }
Ejemplo n.º 2
0
 protected function renderDataCellContent($model, $key, $index)
 {
     $dropdownId = $this->grid->getId() . '-dropdown2-menu-' . $index;
     $this->template = implode(' ', array_keys(array_filter(['<li>{view}</li>' => ModelHelper::canRead($model), '<li>{update}</li>' => ModelHelper::canUpdate($model), '<li>{delete}</li>' => ModelHelper::canDelete($model)])));
     $fix = ['~(glyphicon\\-eye\\-open"\\>\\</span\\>)(\\</a\\>)~i' => '$1 ' . Yii::t('mozayka', 'View') . '$2', '~(glyphicon\\-pencil"\\>\\</span\\>)(\\</a\\>)~i' => '$1 ' . Yii::t('mozayka', 'Update') . '$2', '~(glyphicon\\-trash"\\>\\</span\\>)(\\</a\\>)~i' => '$1 ' . Yii::t('mozayka', 'Delete') . '$2', '~\\s+title\\="[^"]*"~i' => '', '~\\s+data\\-confirm\\="[^"]*"~i' => '', '~\\s+data\\-method\\="[^"]*"~i' => ''];
     $cellContent = preg_replace(array_keys($fix), array_values($fix), parent::renderDataCellContent($model, $key, $index));
     // dropdown2-menu
     if ($cellContent && $cellContent != $this->grid->emptyCell) {
         $cellContent = Html::button('<span class="glyphicon glyphicon-cog"></span>', ['title' => Yii::t('mozayka', 'Actions'), 'class' => 'btn btn-default btn-xs', 'data-dropdown2' => '#' . $dropdownId]) . Html::tag('div', Html::tag('ul', $cellContent, ['class' => 'dropdown2-menu']), ['id' => $dropdownId, 'class' => 'dropdown2 dropdown2-tip' . (array_search($this, $this->grid->columns) + 1 > count($this->grid->columns) / 2 ? ' dropdown2-anchor-right' : '')]);
     }
     return $cellContent;
 }
 public function run($id = null)
 {
     //$modelClass = $this->modelClass;
     /** @var yii\db\BaseActiveRecord $model */
     $model = $this->findModel($id);
     if (is_null($id)) {
         $id = ModelHelper::getPrimaryKey($model);
     }
     if ($this->checkAccess) {
         call_user_func($this->checkAccess, $this->id, $model, ['id' => $id]);
     }
     return __METHOD__;
 }
Ejemplo n.º 4
0
 public function run()
 {
     $filterModel = null;
     $filterFields = [];
     $dataProvider = null;
     $request = Yii::$app->getRequest();
     if ($this->filterModelClass) {
         $filterModelClass = $this->filterModelClass;
         /** @var yii\db\BaseActiveRecord $filterModel */
         $filterModel = new $filterModelClass(['scenario' => $this->searchScenario]);
         if ($request->getIsPost()) {
             $filterModel->load($request->getBodyParams());
         } else {
             $filterModel->load($request->getQueryParams());
         }
         // validation
         if ($request->getIsAjax() && $request->getQueryParam('validation')) {
             Yii::$app->getResponse()->format = Response::FORMAT_JSON;
             return ActiveForm::validate($filterModel);
         }
         // processing
         $filterFields = $this->prepareFields($filterModel);
         if ($filterModel->beforeSave(false)) {
             $dataProvider = $filterModel->search([$filterModel->formName() => []]);
             $filterModel->afterSave(false, []);
         }
     }
     $modelClass = $this->modelClass;
     if (!$dataProvider) {
         $dataProvider = new ActiveDataProvider(['query' => $modelClass::find()]);
     }
     Yii::configure($dataProvider, $this->dataProviderConfig);
     if ($this->checkAccess) {
         call_user_func($this->checkAccess, $this->id, null, ['query' => $dataProvider->query]);
     }
     $session = Yii::$app->getSession();
     $successMessage = $session->getFlash('success');
     $errorMessage = $session->getFlash('error');
     //
     $formConfig = array_merge($this->formConfig, ['validationUrl' => [$this->id, 'validation' => 1], 'action' => ['list'], 'method' => 'get']);
     // rendering
     $viewParams = ['canCreate' => ModelHelper::canCreate($modelClass), 'pluralHumanName' => ModelHelper::pluralHumanName($modelClass), 'successMessage' => $successMessage, 'errorMessage' => $errorMessage, 'filterModel' => $filterModel, 'filterFields' => $filterFields, 'formClass' => $this->formClass, 'formConfig' => $formConfig, 'gridClass' => $this->gridClass, 'gridConfig' => array_merge(ModelHelper::gridConfig($modelClass), $this->gridConfig, ['dataProvider' => $dataProvider, 'columns' => $this->prepareColumns($modelClass), 'filterModel' => $filterModel, 'filterFields' => $filterFields, 'formClass' => $this->formClass, 'formConfig' => $formConfig])];
     if ($request->getIsAjax()) {
         return $this->controller->renderPartial($this->view, $viewParams);
     } else {
         return $this->controller->render($this->view, $viewParams);
     }
 }
Ejemplo n.º 5
0
 public function run($id = null)
 {
     $modelClass = $this->modelClass;
     /** @var yii\db\BaseActiveRecord $model */
     $model = $this->findModel($id);
     if (is_null($id)) {
         $id = ModelHelper::getPrimaryKey($model);
     }
     if ($this->checkAccess) {
         call_user_func($this->checkAccess, $this->id, $model, ['id' => $id]);
     }
     // rendering
     $viewParams = ['canList' => ModelHelper::canList($modelClass), 'pluralHumanName' => ModelHelper::pluralHumanName($modelClass), 'model' => $model, 'id' => $id, 'displayField' => ModelHelper::getDisplayField($model), 'fields' => $this->prepareFields($model), 'formClass' => $this->formClass, 'formConfig' => array_merge($this->formConfig, ['readOnly' => true])];
     if (Yii::$app->getRequest()->getIsAjax()) {
         return $this->controller->renderPartial($this->view, $viewParams);
     } else {
         return $this->controller->render($this->view, $viewParams);
     }
 }
Ejemplo n.º 6
0
 public function checkAccess($action, $model = null, $params = [])
 {
     $newModel = null;
     if (array_key_exists('newModel', $params)) {
         $newModel = $params['newModel'];
         unset($params['newModel']);
     }
     $query = null;
     if (array_key_exists('query', $params)) {
         $query = $params['query'];
         unset($params['query']);
     }
     switch ($action) {
         case 'create':
         case 'create-form':
             $allowed = ModelHelper::canCreate($this->modelClass, $params, $newModel);
             break;
         case 'view':
         case 'read-form':
             $allowed = ModelHelper::canRead($model);
             break;
         case 'update':
         case 'update-form':
             $allowed = ModelHelper::canUpdate($model);
             break;
         case 'delete':
         case 'delete-form':
             $allowed = ModelHelper::canDelete($model);
             break;
         case 'index':
         case 'list':
             $allowed = ModelHelper::canList($this->modelClass, $params, $query);
             break;
         case 'change-position':
             $allowed = ModelHelper::canChangePosition($model);
             break;
         default:
             $allowed = false;
     }
     if (!$allowed) {
         $user = Yii::$app->getUser();
         throw new ForbiddenHttpException(Yii::t('mozayka', 'Permission denied for user "{user}" to perform action "{action}".', ['user' => $user->getIsGuest() ? Yii::t('mozayka', 'Guest') : $user->getIdentity()->username, 'action' => $this->id . '/' . $action]));
     }
 }
Ejemplo n.º 7
0
 protected function prepareFields(BaseActiveRecord $model)
 {
     $modelClass = get_class($model);
     $validKeys = $model->attributes();
     $fields = ModelHelper::normalizeBrackets(ModelHelper::expandBrackets($this->fields ?: ModelHelper::formFields($model), $validKeys), $validKeys);
     foreach ($model->getBehaviors() as $behavior) {
         if ($behavior instanceof DatetimeBehavior) {
             foreach ($behavior->attributes as $datetimeAttribute) {
                 if (array_key_exists($datetimeAttribute, $fields) && !array_key_exists('type', $fields[$datetimeAttribute])) {
                     $fields[$datetimeAttribute]['type'] = 'datetime';
                 }
             }
         } elseif ($behavior instanceof SoftDeleteBehavior) {
             if (array_key_exists($behavior->deletedAttribute, $fields)) {
                 $fields[$behavior->deletedAttribute]['visible'] = false;
             }
         } elseif ($behavior instanceof TimeDeleteBehavior) {
             if (array_key_exists($behavior->deletedAtAttribute, $fields)) {
                 $fields[$behavior->deletedAtAttribute]['visible'] = false;
             }
         } elseif ($behavior instanceof TimestampBehavior) {
             if (array_key_exists($behavior->createdAtAttribute, $fields)) {
                 $fields[$behavior->createdAtAttribute]['readOnly'] = true;
             }
             if (array_key_exists($behavior->updatedAtAttribute, $fields)) {
                 $fields[$behavior->updatedAtAttribute]['readOnly'] = true;
             }
             if (array_key_exists($behavior->timestampAttribute, $fields)) {
                 $fields[$behavior->timestampAttribute]['readOnly'] = true;
             }
         }
     }
     $tableSchema = $modelClass::getTableSchema();
     foreach ($tableSchema->foreignKeys as $foreignKey) {
         if (count($foreignKey) == 2) {
             $relatedQueryMethod = 'get' . Inflector::classify($foreignKey[0]);
             if (method_exists($model, $relatedQueryMethod) && is_callable([$model, $relatedQueryMethod])) {
                 $relatedAttribute = array_keys($foreignKey)[1];
                 $fields[$relatedAttribute]['type'] = 'dropDownList';
                 $fields[$relatedAttribute]['items'] = ModelHelper::listItems($model->{$relatedQueryMethod}());
             }
         }
     }
     foreach ($fields as $attribute => $options) {
         if (!array_key_exists('type', $options)) {
             $listItemsMethod = Inflector::variablize($attribute) . 'ListItems';
             if (method_exists($modelClass, $listItemsMethod) && is_callable([$modelClass, $listItemsMethod])) {
                 $options['type'] = 'dropDownList';
                 $options['items'] = $modelClass::$listItemsMethod($model);
             }
         }
         $columnSchema = $tableSchema->getColumn($attribute);
         if ($columnSchema) {
             if ($columnSchema->isPrimaryKey && !method_exists($model, 'search')) {
                 if (!$model->getIsNewRecord()) {
                     $options['readOnly'] = true;
                 } elseif ($columnSchema->autoIncrement) {
                     $options['visible'] = false;
                 }
             }
             if (!array_key_exists('type', $options)) {
                 $options['type'] = $columnSchema->type;
                 if (in_array($columnSchema->type, ['tinyint', 'smallint', 'integer', 'bigint'])) {
                     if ($columnSchema->size == 1 && $columnSchema->unsigned) {
                         $options['type'] = 'boolean';
                     } else {
                         $options['size'] = $columnSchema->size;
                         $options['unsigned'] = $columnSchema->unsigned;
                     }
                 } elseif (in_array($columnSchema->type, ['decimal', 'numeric', 'money'])) {
                     $options['size'] = $columnSchema->size;
                     $options['scale'] = $columnSchema->scale;
                     $options['unsigned'] = $columnSchema->unsigned;
                 } elseif ($columnSchema->type == 'string') {
                     $options['size'] = $columnSchema->size;
                 }
             }
         }
         if (array_key_exists('type', $options)) {
             if ($options['type'] && is_string($options['type'])) {
                 if ($options['type'] == 'invisible') {
                     $options['visible'] = false;
                 } elseif (!array_key_exists('class', $options)) {
                     $fieldClass = 'yii\\mozayka\\form\\' . Inflector::id2camel($options['type']) . 'Field';
                     if (class_exists($fieldClass)) {
                         $options['class'] = $fieldClass;
                     }
                 }
             }
             unset($options['type']);
         }
         $fields[$attribute] = $options;
     }
     return array_filter($fields, function ($options) {
         return !array_key_exists('visible', $options) || $options['visible'];
     });
 }
Ejemplo n.º 8
0
 public function getDisplayField()
 {
     return ModelHelper::generateDisplayField($this);
 }