/** * Загружает резюме по идентификатору и токену * @param int $id * @return \app\models\cv\Cv */ protected function loadCv($id, $token) { $cv = Cv::find()->byId($id)->withRelated()->active()->one(); //задаем язык сайта на основе языка резюме if ($cv->language) { Yii::$app->language = $cv->language; } if (!$cv) { throw new NotFoundHttpException('Запись не найдена'); } //проверяем права на доступ к резюме if (Yii::$app->user->isGuest || !Yii::$app->user->can('*/*/*') && !Yii::$app->user->can('cv/*') && !Yii::$app->user->can('cv/index')) { //пробуем проверить токен //ищем юзера по его токену $user = User::find()->byCvToken($token)->one(); if (!$user) { throw new NotFoundHttpException('Запись не найдена'); } //перебираем все разрешенные юзеру резюме, чтобы найти заданное $canAccess = false; foreach ($user->cv as $allowed) { if ($allowed->id !== $cv->id) { continue; } $canAccess = true; break; } if (!$canAccess) { throw new NotFoundHttpException('Запись не найдена'); } //отмечаем посещение для неавторизованного пользователя $user->visitCv($cv); } return $cv; }
/** * Возвращает модель по ее идентификатору * @param int $id * @return Cv */ protected function findModel($id) { if (($model = Cv::findOne($id)) !== null) { return $model; } else { throw new NotFoundHttpException('Запись не найдена'); } }
<?php use yii\helpers\Html; use yii\helpers\ArrayHelper; use yii\bootstrap\ActiveForm; use yii\helpers\Url; use app\models\cv\Cv; //роли пользователей $roles = ArrayHelper::map(Yii::$app->authManager->getRoles(), 'name', 'description'); //резюме $cv = ArrayHelper::map(Cv::find()->all(), 'id', 'title'); $form = ActiveForm::begin(['method' => 'post', 'enableClientScript' => false, 'options' => []]); ?> <?php echo $form->field($model, 'is_active')->checkbox(); ?> <?php echo $form->field($model, 'email'); ?> <?php echo $form->field($model, 'new_password'); ?> <?php echo $form->field($model, 'cv_access_token'); ?> <?php
/** * @inheritdoc */ public function afterSave($insert, $changedAttributes) { //сохраняем роли пользователя if ($this->_roles !== null) { Yii::$app->authManager->revokeAll($this->id); foreach ($this->_roles as $roleName) { $role = Yii::$app->authManager->getRole($roleName); Yii::$app->authManager->assign($role, $this->id); } } //сохраняем привязки к доступным резюме if ($this->_cvIds !== null) { $this->unlinkAll('cv', true); $list = Cv::find()->where(['id' => $this->_cvIds])->all(); foreach ($list as $item) { $this->link('cv', $item); } } return parent::afterSave($insert, $changedAttributes); }
/** * Резюме * @return \app\models\cv\Cv */ public function getCv() { return $this->hasOne(Cv::className(), ['id' => 'cv_id']); }